blob: 240feb74e1f6947a00dec8f25ee92d5b18b7b2a2 [file] [log] [blame]
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001/* Socket module */
2
3/*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005This module provides an interface to Berkeley socket IPC.
6
7Limitations:
8
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00009- Only AF_INET, AF_INET6 and AF_UNIX address families are supported in a
Christian Heimes043d6f62008-01-07 17:19:16 +000010 portable manner, though AF_PACKET, AF_NETLINK and AF_TIPC are supported
11 under Linux.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000012- No read/write operations (use sendall/recv or makefile instead).
13- Additional restrictions apply on some non-Unix platforms (compensated
14 for by socket.py).
Guido van Rossum6574b3e1991-06-25 21:36:08 +000015
Guido van Rossum27e177d1995-03-16 15:43:47 +000016Module interface:
Guido van Rossum6574b3e1991-06-25 21:36:08 +000017
Guido van Rossum27e177d1995-03-16 15:43:47 +000018- socket.error: exception raised for socket specific errors
Martin v. Löwis2d8d4272001-07-21 18:05:31 +000019- socket.gaierror: exception raised for getaddrinfo/getnameinfo errors,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000020 a subclass of socket.error
Martin v. Löwis2d8d4272001-07-21 18:05:31 +000021- socket.herror: exception raised for gethostby* errors,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000022 a subclass of socket.error
Guido van Rossum30a685f1991-06-27 15:51:29 +000023- socket.gethostbyname(hostname) --> host IP address (string: 'dd.dd.dd.dd')
Guido van Rossum3bbc62e1995-01-02 19:30:30 +000024- socket.gethostbyaddr(IP address) --> (hostname, [alias, ...], [IP addr, ...])
Guido van Rossum27e177d1995-03-16 15:43:47 +000025- socket.gethostname() --> host name (string: 'spam' or 'spam.domain.com')
Guido van Rossum25405c71996-12-19 16:42:52 +000026- socket.getprotobyname(protocolname) --> protocol number
Barry Warsaw11b91a02004-06-28 00:50:43 +000027- socket.getservbyname(servicename[, protocolname]) --> port number
28- socket.getservbyport(portnumber[, protocolname]) --> service name
Guido van Rossum7d0a8262007-05-21 23:13:11 +000029- socket.socket([family[, type [, proto, fileno]]]) --> new socket object
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000030 (fileno specifies a pre-existing socket file descriptor)
Dave Cole331708b2004-08-09 04:51:41 +000031- socket.socketpair([family[, type [, proto]]]) --> (socket, socket)
Guido van Rossum006bf911996-06-12 04:04:55 +000032- socket.ntohs(16 bit value) --> new int object
33- socket.ntohl(32 bit value) --> new int object
34- socket.htons(16 bit value) --> new int object
35- socket.htonl(32 bit value) --> new int object
Martin v. Löwis2d8d4272001-07-21 18:05:31 +000036- socket.getaddrinfo(host, port [, family, socktype, proto, flags])
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000037 --> List of (family, socktype, proto, canonname, sockaddr)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +000038- socket.getnameinfo(sockaddr, flags) --> (host, port)
Guido van Rossum27e177d1995-03-16 15:43:47 +000039- socket.AF_INET, socket.SOCK_STREAM, etc.: constants from <socket.h>
Guido van Rossum47dfa4a2003-04-25 05:48:32 +000040- socket.has_ipv6: boolean value indicating if IPv6 is supported
Guido van Rossum5c9eb211999-08-20 18:21:51 +000041- socket.inet_aton(IP address) -> 32-bit packed IP representation
42- socket.inet_ntoa(packed IP) -> IP address string
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +000043- socket.getdefaulttimeout() -> None | float
44- socket.setdefaulttimeout(None | float)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -070045- socket.if_nameindex() -> list of tuples (if_index, if_name)
46- socket.if_nametoindex(name) -> corresponding interface index
47- socket.if_indextoname(index) -> corresponding interface name
Guido van Rossum6574b3e1991-06-25 21:36:08 +000048- an Internet socket address is a pair (hostname, port)
49 where hostname can be anything recognized by gethostbyname()
50 (including the dd.dd.dd.dd notation) and port is in host byte order
51- where a hostname is returned, the dd.dd.dd.dd notation is used
Guido van Rossum27e177d1995-03-16 15:43:47 +000052- a UNIX domain socket address is a string specifying the pathname
Jeremy Hylton22308652001-02-02 03:23:09 +000053- an AF_PACKET socket address is a tuple containing a string
54 specifying the ethernet interface and an integer specifying
55 the Ethernet protocol number to be received. For example:
Jeremy Hyltondbfb6622001-02-02 19:55:17 +000056 ("eth0",0x1234). Optional 3rd,4th,5th elements in the tuple
Andrew M. Kuchlingb8e17172004-07-10 23:39:35 +000057 specify packet-type and ha-type/addr.
Christian Heimes043d6f62008-01-07 17:19:16 +000058- an AF_TIPC socket address is expressed as
59 (addr_type, v1, v2, v3 [, scope]); where addr_type can be one of:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000060 TIPC_ADDR_NAMESEQ, TIPC_ADDR_NAME, and TIPC_ADDR_ID;
Christian Heimes043d6f62008-01-07 17:19:16 +000061 and scope can be one of:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000062 TIPC_ZONE_SCOPE, TIPC_CLUSTER_SCOPE, and TIPC_NODE_SCOPE.
Christian Heimes043d6f62008-01-07 17:19:16 +000063 The meaning of v1, v2 and v3 depends on the value of addr_type:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000064 if addr_type is TIPC_ADDR_NAME:
65 v1 is the server type
66 v2 is the port identifier
67 v3 is ignored
68 if addr_type is TIPC_ADDR_NAMESEQ:
69 v1 is the server type
70 v2 is the lower port number
71 v3 is the upper port number
72 if addr_type is TIPC_ADDR_ID:
73 v1 is the node
74 v2 is the ref
75 v3 is ignored
Christian Heimes043d6f62008-01-07 17:19:16 +000076
Guido van Rossum6574b3e1991-06-25 21:36:08 +000077
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000078Local naming conventions:
Guido van Rossum6574b3e1991-06-25 21:36:08 +000079
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000080- names starting with sock_ are socket object methods
81- names starting with socket_ are module-level functions
82- names starting with PySocket are exported through socketmodule.h
Guido van Rossum30a685f1991-06-27 15:51:29 +000083
Guido van Rossum6574b3e1991-06-25 21:36:08 +000084*/
85
Thomas Wouters477c8d52006-05-27 19:21:47 +000086#ifdef __APPLE__
87 /*
88 * inet_aton is not available on OSX 10.3, yet we want to use a binary
89 * that was build on 10.4 or later to work on that release, weak linking
90 * comes to the rescue.
91 */
92# pragma weak inet_aton
93#endif
94
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000095#include "Python.h"
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000096#include "structmember.h"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000097
Guido van Rossum47dfa4a2003-04-25 05:48:32 +000098#undef MAX
99#define MAX(x, y) ((x) < (y) ? (y) : (x))
100
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000101/* Socket object documentation */
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000102PyDoc_STRVAR(sock_doc,
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000103"socket([family[, type[, proto]]]) -> socket object\n\
104\n\
105Open a socket of the given type. The family argument specifies the\n\
106address family; it defaults to AF_INET. The type argument specifies\n\
107whether this is a stream (SOCK_STREAM, this is the default)\n\
108or datagram (SOCK_DGRAM) socket. The protocol argument defaults to 0,\n\
109specifying the default protocol. Keyword arguments are accepted.\n\
110\n\
111A socket object represents one endpoint of a network connection.\n\
112\n\
113Methods of socket objects (keyword arguments not allowed):\n\
114\n\
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000115_accept() -- accept connection, returning new socket fd and client address\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000116bind(addr) -- bind the socket to a local address\n\
117close() -- close the socket\n\
118connect(addr) -- connect the socket to a remote address\n\
119connect_ex(addr) -- connect, return an error code instead of an exception\n\
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000120_dup() -- return a new socket fd duplicated from fileno()\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000121fileno() -- return underlying file descriptor\n\
122getpeername() -- return remote address [*]\n\
123getsockname() -- return local address\n\
124getsockopt(level, optname[, buflen]) -- get socket options\n\
125gettimeout() -- return timeout or None\n\
126listen(n) -- start listening for incoming connections\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000127recv(buflen[, flags]) -- receive data\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000128recv_into(buffer[, nbytes[, flags]]) -- receive data (into a buffer)\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +0000129recvfrom(buflen[, flags]) -- receive data and sender\'s address\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000130recvfrom_into(buffer[, nbytes, [, flags])\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +0000131 -- receive data and sender\'s address (into a buffer)\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000132sendall(data[, flags]) -- send all data\n\
133send(data[, flags]) -- send data, may not send all of it\n\
134sendto(data[, flags], addr) -- send data to a given address\n\
135setblocking(0 | 1) -- set or clear the blocking I/O flag\n\
136setsockopt(level, optname, value) -- set socket options\n\
137settimeout(None | float) -- set or clear the timeout\n\
138shutdown(how) -- shut down traffic in one or both directions\n\
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700139if_nameindex() -- return all network interface indices and names\n\
Gregory P. Smithb6471db2011-05-22 22:47:55 -0700140if_nametoindex(name) -- return the corresponding interface index\n\
141if_indextoname(index) -- return the corresponding interface name\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000142\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000143 [*] not available on all platforms!");
Guido van Rossum3baaa131999-03-22 21:44:51 +0000144
Walter Dörwaldf0dfc7a2003-10-20 14:01:56 +0000145/* XXX This is a terrible mess of platform-dependent preprocessor hacks.
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000146 I hope some day someone can clean this up please... */
147
Guido van Rossum9376b741999-09-15 22:01:40 +0000148/* Hacks for gethostbyname_r(). On some non-Linux platforms, the configure
149 script doesn't get this right, so we hardcode some platform checks below.
150 On the other hand, not all Linux versions agree, so there the settings
151 computed by the configure script are needed! */
152
153#ifndef linux
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000154# undef HAVE_GETHOSTBYNAME_R_3_ARG
155# undef HAVE_GETHOSTBYNAME_R_5_ARG
156# undef HAVE_GETHOSTBYNAME_R_6_ARG
Guido van Rossum9376b741999-09-15 22:01:40 +0000157#endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000158
Victor Stinner710d27e2011-08-23 10:57:32 +0200159#if defined(__OpenBSD__)
160# include <sys/uio.h>
161#endif
162
Guido van Rossum7a122991999-04-13 04:07:32 +0000163#ifndef WITH_THREAD
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000164# undef HAVE_GETHOSTBYNAME_R
Guido van Rossum7a122991999-04-13 04:07:32 +0000165#endif
166
Guido van Rossume7de2061999-03-24 17:24:33 +0000167#ifdef HAVE_GETHOSTBYNAME_R
Jesus Cea736e7fc2011-03-14 17:36:54 +0100168# if defined(_AIX)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000169# define HAVE_GETHOSTBYNAME_R_3_ARG
170# elif defined(__sun) || defined(__sgi)
171# define HAVE_GETHOSTBYNAME_R_5_ARG
172# elif defined(linux)
Guido van Rossum9376b741999-09-15 22:01:40 +0000173/* Rely on the configure script */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000174# else
175# undef HAVE_GETHOSTBYNAME_R
176# endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000177#endif
178
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000179#if !defined(HAVE_GETHOSTBYNAME_R) && defined(WITH_THREAD) && \
180 !defined(MS_WINDOWS)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000181# define USE_GETHOSTBYNAME_LOCK
Guido van Rossum3baaa131999-03-22 21:44:51 +0000182#endif
183
Hye-Shik Chang9ceebd52005-09-24 14:58:47 +0000184/* To use __FreeBSD_version */
185#ifdef HAVE_SYS_PARAM_H
186#include <sys/param.h>
187#endif
Just van Rossum1040d2c2003-05-09 07:53:18 +0000188/* On systems on which getaddrinfo() is believed to not be thread-safe,
Just van Rossum09aecd72003-05-09 08:03:44 +0000189 (this includes the getaddrinfo emulation) protect access with a lock. */
Hye-Shik Chang9ceebd52005-09-24 14:58:47 +0000190#if defined(WITH_THREAD) && (defined(__APPLE__) || \
191 (defined(__FreeBSD__) && __FreeBSD_version+0 < 503000) || \
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000192 defined(__OpenBSD__) || defined(__NetBSD__) || \
193 defined(__VMS) || !defined(HAVE_GETADDRINFO))
Just van Rossum1040d2c2003-05-09 07:53:18 +0000194#define USE_GETADDRINFO_LOCK
195#endif
196
197#ifdef USE_GETADDRINFO_LOCK
198#define ACQUIRE_GETADDRINFO_LOCK PyThread_acquire_lock(netdb_lock, 1);
199#define RELEASE_GETADDRINFO_LOCK PyThread_release_lock(netdb_lock);
200#else
201#define ACQUIRE_GETADDRINFO_LOCK
202#define RELEASE_GETADDRINFO_LOCK
203#endif
204
205#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000206# include "pythread.h"
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000207#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000208
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000209#if defined(PYCC_VACPP)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000210# include <types.h>
211# include <io.h>
212# include <sys/ioctl.h>
213# include <utils.h>
214# include <ctype.h>
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000215#endif
216
Martin v. Löwis9e437302002-12-06 12:57:26 +0000217#if defined(__VMS)
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000218# include <ioctl.h>
219#endif
220
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000221#if defined(PYOS_OS2)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000222# define INCL_DOS
223# define INCL_DOSERRORS
224# define INCL_NOPMAPI
225# include <os2.h>
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000226#endif
227
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000228#if defined(__sgi) && _COMPILER_VERSION>700 && !_SGIAPI
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000229/* make sure that the reentrant (gethostbyaddr_r etc)
230 functions are declared correctly if compiling with
231 MIPSPro 7.x in ANSI C mode (default) */
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000232
Thomas Wouters477c8d52006-05-27 19:21:47 +0000233/* XXX Using _SGIAPI is the wrong thing,
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000234 but I don't know what the right thing is. */
Trent Mick8ea5bdf2004-09-13 17:48:41 +0000235#undef _SGIAPI /* to avoid warning */
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000236#define _SGIAPI 1
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000237
Trent Mick8ea5bdf2004-09-13 17:48:41 +0000238#undef _XOPEN_SOURCE
239#include <sys/socket.h>
240#include <sys/types.h>
241#include <netinet/in.h>
242#ifdef _SS_ALIGNSIZE
243#define HAVE_GETADDRINFO 1
244#define HAVE_GETNAMEINFO 1
245#endif
246
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000247#define HAVE_INET_PTON
248#include <netdb.h>
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000249#endif
250
Thomas Wouters477c8d52006-05-27 19:21:47 +0000251/* Irix 6.5 fails to define this variable at all. This is needed
252 for both GCC and SGI's compiler. I'd say that the SGI headers
Georg Brandldbd83392006-02-20 09:42:33 +0000253 are just busted. Same thing for Solaris. */
254#if (defined(__sgi) || defined(sun)) && !defined(INET_ADDRSTRLEN)
Anthony Baxterbab23cf2003-10-04 08:00:49 +0000255#define INET_ADDRSTRLEN 16
256#endif
257
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000258/* Generic includes */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000259#ifdef HAVE_SYS_TYPES_H
Guido van Rossumb6775db1994-08-01 11:34:53 +0000260#include <sys/types.h>
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000261#endif
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000262
Gregory P. Smith3b1f2c32011-05-15 12:18:23 -0700263#ifdef HAVE_SYS_SOCKET_H
264#include <sys/socket.h>
265#endif
266
267#ifdef HAVE_NET_IF_H
268#include <net/if.h>
269#endif
270
Marc-André Lemburg976ade62002-02-16 18:47:07 +0000271/* Generic socket object definitions and includes */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000272#define PySocket_BUILDING_SOCKET
Marc-André Lemburgbb8b78b2002-02-16 18:44:52 +0000273#include "socketmodule.h"
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000274
275/* Addressing includes */
276
Guido van Rossum6f489d91996-06-28 20:15:15 +0000277#ifndef MS_WINDOWS
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000278
279/* Non-MS WINDOWS includes */
280# include <netdb.h>
Nick Coghlan4ecf6cf2011-08-22 15:45:19 +1000281# include <unistd.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000282
Guido van Rossum9376b741999-09-15 22:01:40 +0000283/* Headers needed for inet_ntoa() and inet_addr() */
Skip Montanaroeb33e5a2007-08-17 12:57:41 +0000284# if defined(PYOS_OS2) && defined(PYCC_VACPP)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000285# include <netdb.h>
Tim Peters603c6832001-11-05 02:45:59 +0000286typedef size_t socklen_t;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000287# else
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000288# include <arpa/inet.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000289# endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000290
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000291# include <fcntl.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000292
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000293#else
Guido van Rossum48a680c2001-03-02 06:34:14 +0000294
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000295/* MS_WINDOWS includes */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000296# ifdef HAVE_FCNTL_H
297# include <fcntl.h>
298# endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000299
Jeremy Hylton22308652001-02-02 03:23:09 +0000300#endif
301
Skip Montanaro7befb992004-02-10 16:50:21 +0000302#include <stddef.h>
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000303
304#ifndef offsetof
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000305# define offsetof(type, member) ((size_t)(&((type *)0)->member))
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000306#endif
307
Neal Norwitz39d22e52002-11-02 19:55:21 +0000308#ifndef O_NONBLOCK
309# define O_NONBLOCK O_NDELAY
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000310#endif
311
Trent Micka708d6e2004-09-07 17:48:26 +0000312/* include Python's addrinfo.h unless it causes trouble */
313#if defined(__sgi) && _COMPILER_VERSION>700 && defined(_SS_ALIGNSIZE)
314 /* Do not include addinfo.h on some newer IRIX versions.
315 * _SS_ALIGNSIZE is defined in sys/socket.h by 6.5.21,
316 * for example, but not by 6.5.10.
317 */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000318#elif defined(_MSC_VER) && _MSC_VER>1201
Trent Micka708d6e2004-09-07 17:48:26 +0000319 /* Do not include addrinfo.h for MSVC7 or greater. 'addrinfo' and
320 * EAI_* constants are defined in (the already included) ws2tcpip.h.
321 */
322#else
323# include "addrinfo.h"
324#endif
Jason Tishlerc246cb72004-08-09 13:25:59 +0000325
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000326#ifndef HAVE_INET_PTON
Christian Heimes96e7b3d2007-11-20 06:51:17 +0000327#if !defined(NTDDI_VERSION) || (NTDDI_VERSION < NTDDI_LONGHORN)
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000328int inet_pton(int af, const char *src, void *dst);
Martin v. Löwisc925b1532001-07-21 09:42:15 +0000329const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000330#endif
Christian Heimesb6150692007-11-15 23:37:07 +0000331#endif
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000332
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000333#ifdef __APPLE__
334/* On OS X, getaddrinfo returns no error indication of lookup
335 failure, so we must use the emulation instead of the libinfo
336 implementation. Unfortunately, performing an autoconf test
337 for this bug would require DNS access for the machine performing
338 the configuration, which is not acceptable. Therefore, we
339 determine the bug just by checking for __APPLE__. If this bug
340 gets ever fixed, perhaps checking for sys/version.h would be
341 appropriate, which is 10/0 on the system with the bug. */
Jack Jansen84262fb2002-07-02 14:40:42 +0000342#ifndef HAVE_GETNAMEINFO
343/* This bug seems to be fixed in Jaguar. Ths easiest way I could
344 Find to check for Jaguar is that it has getnameinfo(), which
345 older releases don't have */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000346#undef HAVE_GETADDRINFO
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000347#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +0000348
349#ifdef HAVE_INET_ATON
350#define USE_INET_ATON_WEAKLINK
351#endif
352
Jack Jansen84262fb2002-07-02 14:40:42 +0000353#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000354
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000355/* I know this is a bad practice, but it is the easiest... */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000356#if !defined(HAVE_GETADDRINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000357/* avoid clashes with the C library definition of the symbol. */
358#define getaddrinfo fake_getaddrinfo
359#define gai_strerror fake_gai_strerror
360#define freeaddrinfo fake_freeaddrinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000361#include "getaddrinfo.c"
362#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000363#if !defined(HAVE_GETNAMEINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000364#define getnameinfo fake_getnameinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000365#include "getnameinfo.c"
366#endif
367
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000368#ifdef MS_WINDOWS
369/* On Windows a socket is really a handle not an fd */
370static SOCKET
371dup_socket(SOCKET handle)
372{
Daniel Stutzbach6c765282010-09-03 12:38:33 +0000373 WSAPROTOCOL_INFO info;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000374
Daniel Stutzbach6c765282010-09-03 12:38:33 +0000375 if (WSADuplicateSocket(handle, GetCurrentProcessId(), &info))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000376 return INVALID_SOCKET;
Daniel Stutzbach6c765282010-09-03 12:38:33 +0000377
378 return WSASocket(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
379 FROM_PROTOCOL_INFO, &info, 0, 0);
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000380}
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000381#define SOCKETCLOSE closesocket
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000382#else
383/* On Unix we can use dup to duplicate the file descriptor of a socket*/
384#define dup_socket(fd) dup(fd)
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000385#endif
386
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000387#ifdef MS_WIN32
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000388#define EAFNOSUPPORT WSAEAFNOSUPPORT
389#define snprintf _snprintf
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000390#endif
Fred Drakea04eaad2000-06-30 02:46:07 +0000391
Andrew MacIntyreba43e872002-03-03 03:03:52 +0000392#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000393#define SOCKETCLOSE soclose
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000394#define NO_DUP /* Sockets are Not Actual File Handles under OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000395#endif
396
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000397#ifndef SOCKETCLOSE
398#define SOCKETCLOSE close
399#endif
400
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000401#if (defined(HAVE_BLUETOOTH_H) || defined(HAVE_BLUETOOTH_BLUETOOTH_H)) && !defined(__NetBSD__) && !defined(__DragonFly__)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000402#define USE_BLUETOOTH 1
403#if defined(__FreeBSD__)
404#define BTPROTO_L2CAP BLUETOOTH_PROTO_L2CAP
405#define BTPROTO_RFCOMM BLUETOOTH_PROTO_RFCOMM
Thomas Wouterscf297e42007-02-23 15:07:44 +0000406#define BTPROTO_HCI BLUETOOTH_PROTO_HCI
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000407#define SOL_HCI SOL_HCI_RAW
408#define HCI_FILTER SO_HCI_RAW_FILTER
Hye-Shik Chang81268602004-02-02 06:05:24 +0000409#define sockaddr_l2 sockaddr_l2cap
410#define sockaddr_rc sockaddr_rfcomm
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000411#define hci_dev hci_node
Hye-Shik Chang81268602004-02-02 06:05:24 +0000412#define _BT_L2_MEMB(sa, memb) ((sa)->l2cap_##memb)
413#define _BT_RC_MEMB(sa, memb) ((sa)->rfcomm_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000414#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000415#elif defined(__NetBSD__) || defined(__DragonFly__)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000416#define sockaddr_l2 sockaddr_bt
417#define sockaddr_rc sockaddr_bt
Thomas Wouterscf297e42007-02-23 15:07:44 +0000418#define sockaddr_hci sockaddr_bt
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000419#define sockaddr_sco sockaddr_bt
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000420#define SOL_HCI BTPROTO_HCI
421#define HCI_DATA_DIR SO_HCI_DIRECTION
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000422#define _BT_L2_MEMB(sa, memb) ((sa)->bt_##memb)
423#define _BT_RC_MEMB(sa, memb) ((sa)->bt_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000424#define _BT_HCI_MEMB(sa, memb) ((sa)->bt_##memb)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000425#define _BT_SCO_MEMB(sa, memb) ((sa)->bt_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000426#else
Hye-Shik Chang81268602004-02-02 06:05:24 +0000427#define _BT_L2_MEMB(sa, memb) ((sa)->l2_##memb)
428#define _BT_RC_MEMB(sa, memb) ((sa)->rc_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000429#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000430#define _BT_SCO_MEMB(sa, memb) ((sa)->sco_##memb)
431#endif
432#endif
433
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000434#ifdef __VMS
435/* TCP/IP Services for VMS uses a maximum send/recv buffer length */
436#define SEGMENT_SIZE (32 * 1024 -1)
437#endif
438
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000439#define SAS2SA(x) ((struct sockaddr *)(x))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000440
Martin v. Löwise9416172003-05-03 10:12:45 +0000441/*
442 * Constants for getnameinfo()
443 */
444#if !defined(NI_MAXHOST)
445#define NI_MAXHOST 1025
446#endif
447#if !defined(NI_MAXSERV)
448#define NI_MAXSERV 32
449#endif
450
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000451#ifndef INVALID_SOCKET /* MS defines this */
452#define INVALID_SOCKET (-1)
453#endif
454
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000455/* XXX There's a problem here: *static* functions are not supposed to have
456 a Py prefix (or use CapitalizedWords). Later... */
457
Guido van Rossum30a685f1991-06-27 15:51:29 +0000458/* Global variable holding the exception type for errors detected
459 by this module (but not argument type or memory errors, etc.). */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000460static PyObject *socket_herror;
461static PyObject *socket_gaierror;
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000462static PyObject *socket_timeout;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000463
Tim Peters643a7fc2002-02-17 04:13:21 +0000464/* A forward reference to the socket type object.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000465 The sock_type variable contains pointers to various functions,
466 some of which call new_sockobject(), which uses sock_type, so
Tim Peters643a7fc2002-02-17 04:13:21 +0000467 there has to be a circular reference. */
Jeremy Hylton938ace62002-07-17 16:30:39 +0000468static PyTypeObject sock_type;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000469
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000470#if defined(HAVE_POLL_H)
471#include <poll.h>
472#elif defined(HAVE_SYS_POLL_H)
473#include <sys/poll.h>
474#endif
475
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000476/* Largest value to try to store in a socklen_t (used when handling
477 ancillary data). POSIX requires socklen_t to hold at least
478 (2**31)-1 and recommends against storing larger values, but
479 socklen_t was originally int in the BSD interface, so to be on the
480 safe side we use the smaller of (2**31)-1 and INT_MAX. */
481#if INT_MAX > 0x7fffffff
482#define SOCKLEN_T_LIMIT 0x7fffffff
483#else
484#define SOCKLEN_T_LIMIT INT_MAX
485#endif
486
Charles-François Nataliaa26b272011-08-28 17:51:43 +0200487#ifdef HAVE_POLL
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000488/* Instead of select(), we'll use poll() since poll() works on any fd. */
489#define IS_SELECTABLE(s) 1
490/* Can we call select() with this socket without a buffer overrun? */
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000491#else
Charles-François Nataliaa26b272011-08-28 17:51:43 +0200492/* If there's no timeout left, we don't have to call select, so it's a safe,
493 * little white lie. */
494#define IS_SELECTABLE(s) (_PyIsSelectable_fd((s)->sock_fd) || (s)->sock_timeout <= 0.0)
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000495#endif
Neal Norwitz082b2df2006-02-07 07:04:46 +0000496
497static PyObject*
498select_error(void)
499{
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200500 PyErr_SetString(PyExc_OSError, "unable to select on socket");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000501 return NULL;
Neal Norwitz082b2df2006-02-07 07:04:46 +0000502}
503
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000504#ifdef MS_WINDOWS
Antoine Pitrouc8f01962010-09-28 22:03:27 +0000505#ifndef WSAEAGAIN
506#define WSAEAGAIN WSAEWOULDBLOCK
507#endif
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000508#define CHECK_ERRNO(expected) \
509 (WSAGetLastError() == WSA ## expected)
510#else
511#define CHECK_ERRNO(expected) \
512 (errno == expected)
513#endif
514
Guido van Rossum30a685f1991-06-27 15:51:29 +0000515/* Convenience function to raise an error according to errno
516 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000517
Guido van Rossum73624e91994-10-10 17:59:00 +0000518static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000519set_error(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000520{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000521#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000522 int err_no = WSAGetLastError();
523 /* PyErr_SetExcFromWindowsErr() invokes FormatMessage() which
524 recognizes the error codes used by both GetLastError() and
525 WSAGetLastError */
526 if (err_no)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200527 return PyErr_SetExcFromWindowsErr(PyExc_OSError, err_no);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000528#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000529
Andrew MacIntyreba43e872002-03-03 03:03:52 +0000530#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000531 if (sock_errno() != NO_ERROR) {
532 APIRET rc;
533 ULONG msglen;
534 char outbuf[100];
535 int myerrorcode = sock_errno();
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000536
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000537 /* Retrieve socket-related error message from MPTN.MSG file */
538 rc = DosGetMessage(NULL, 0, outbuf, sizeof(outbuf),
539 myerrorcode - SOCBASEERR + 26,
540 "mptn.msg",
541 &msglen);
542 if (rc == NO_ERROR) {
543 PyObject *v;
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000544
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000545 /* OS/2 doesn't guarantee a terminator */
546 outbuf[msglen] = '\0';
547 if (strlen(outbuf) > 0) {
548 /* If non-empty msg, trim CRLF */
549 char *lastc = &outbuf[ strlen(outbuf)-1 ];
550 while (lastc > outbuf &&
551 isspace(Py_CHARMASK(*lastc))) {
552 /* Trim trailing whitespace (CRLF) */
553 *lastc-- = '\0';
554 }
555 }
556 v = Py_BuildValue("(is)", myerrorcode, outbuf);
557 if (v != NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200558 PyErr_SetObject(PyExc_OSError, v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000559 Py_DECREF(v);
560 }
561 return NULL;
562 }
563 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000564#endif
565
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200566 return PyErr_SetFromErrno(PyExc_OSError);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000567}
568
Guido van Rossum30a685f1991-06-27 15:51:29 +0000569
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000570static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000571set_herror(int h_error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000572{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000573 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000574
575#ifdef HAVE_HSTRERROR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000576 v = Py_BuildValue("(is)", h_error, (char *)hstrerror(h_error));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000577#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000578 v = Py_BuildValue("(is)", h_error, "host not found");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000579#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000580 if (v != NULL) {
581 PyErr_SetObject(socket_herror, v);
582 Py_DECREF(v);
583 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000584
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000585 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000586}
587
588
589static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000590set_gaierror(int error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000591{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000592 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000593
Martin v. Löwis272cb402002-03-01 08:31:07 +0000594#ifdef EAI_SYSTEM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000595 /* EAI_SYSTEM is not available on Windows XP. */
596 if (error == EAI_SYSTEM)
597 return set_error();
Martin v. Löwis272cb402002-03-01 08:31:07 +0000598#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000599
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000600#ifdef HAVE_GAI_STRERROR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000601 v = Py_BuildValue("(is)", error, gai_strerror(error));
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000602#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000603 v = Py_BuildValue("(is)", error, "getaddrinfo failed");
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000604#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000605 if (v != NULL) {
606 PyErr_SetObject(socket_gaierror, v);
607 Py_DECREF(v);
608 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000609
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000610 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000611}
612
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000613#ifdef __VMS
614/* Function to send in segments */
615static int
616sendsegmented(int sock_fd, char *buf, int len, int flags)
617{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000618 int n = 0;
619 int remaining = len;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000620
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000621 while (remaining > 0) {
622 unsigned int segment;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000623
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000624 segment = (remaining >= SEGMENT_SIZE ? SEGMENT_SIZE : remaining);
625 n = send(sock_fd, buf, segment, flags);
626 if (n < 0) {
627 return n;
628 }
629 remaining -= segment;
630 buf += segment;
631 } /* end while */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000632
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000633 return len;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000634}
635#endif
636
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000637/* Function to perform the setting of socket blocking mode
638 internally. block = (1 | 0). */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000639static int
640internal_setblocking(PySocketSockObject *s, int block)
641{
Guido van Rossum67f7a382002-06-06 21:08:16 +0000642#ifndef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000643 int delay_flag;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000644#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +0000645#ifdef SOCK_NONBLOCK
646 if (block)
647 s->sock_type &= (~SOCK_NONBLOCK);
648 else
649 s->sock_type |= SOCK_NONBLOCK;
650#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +0000651
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000652 Py_BEGIN_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000653#ifndef MS_WINDOWS
654#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000655 block = !block;
656 ioctl(s->sock_fd, FIONBIO, (caddr_t)&block, sizeof(block));
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000657#elif defined(__VMS)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000658 block = !block;
659 ioctl(s->sock_fd, FIONBIO, (unsigned int *)&block);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000660#else /* !PYOS_OS2 && !__VMS */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000661 delay_flag = fcntl(s->sock_fd, F_GETFL, 0);
662 if (block)
663 delay_flag &= (~O_NONBLOCK);
664 else
665 delay_flag |= O_NONBLOCK;
666 fcntl(s->sock_fd, F_SETFL, delay_flag);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000667#endif /* !PYOS_OS2 */
668#else /* MS_WINDOWS */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000669 block = !block;
670 ioctlsocket(s->sock_fd, FIONBIO, (u_long*)&block);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000671#endif /* MS_WINDOWS */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000672 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000673
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000674 /* Since these don't return anything */
675 return 1;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000676}
677
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000678/* Do a select()/poll() on the socket, if necessary (sock_timeout > 0).
Guido van Rossum11ba0942002-06-13 15:07:44 +0000679 The argument writing indicates the direction.
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000680 This does not raise an exception; we'll let our caller do that
681 after they've reacquired the interpreter lock.
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000682 Returns 1 on timeout, -1 on error, 0 otherwise. */
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000683static int
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000684internal_select_ex(PySocketSockObject *s, int writing, double interval)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000685{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000686 int n;
Guido van Rossum11ba0942002-06-13 15:07:44 +0000687
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000688 /* Nothing to do unless we're in timeout mode (not non-blocking) */
689 if (s->sock_timeout <= 0.0)
690 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000691
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000692 /* Guard against closed socket */
693 if (s->sock_fd < 0)
694 return 0;
Guido van Rossumad654902002-07-19 12:44:59 +0000695
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000696 /* Handling this condition here simplifies the select loops */
697 if (interval < 0.0)
698 return 1;
699
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000700 /* Prefer poll, if available, since you can poll() any fd
701 * which can't be done with select(). */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000702#ifdef HAVE_POLL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000703 {
704 struct pollfd pollfd;
705 int timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000706
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000707 pollfd.fd = s->sock_fd;
708 pollfd.events = writing ? POLLOUT : POLLIN;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000709
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000710 /* s->sock_timeout is in seconds, timeout in ms */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000711 timeout = (int)(interval * 1000 + 0.5);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000712 n = poll(&pollfd, 1, timeout);
713 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000714#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000715 {
716 /* Construct the arguments to select */
717 fd_set fds;
718 struct timeval tv;
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000719 tv.tv_sec = (int)interval;
720 tv.tv_usec = (int)((interval - tv.tv_sec) * 1e6);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000721 FD_ZERO(&fds);
722 FD_SET(s->sock_fd, &fds);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000723
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000724 /* See if the socket is ready */
725 if (writing)
Antoine Pitrou19467d22010-08-17 19:33:30 +0000726 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
727 NULL, &fds, NULL, &tv);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000728 else
Antoine Pitrou19467d22010-08-17 19:33:30 +0000729 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
730 &fds, NULL, NULL, &tv);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000731 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000732#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000733
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000734 if (n < 0)
735 return -1;
736 if (n == 0)
737 return 1;
738 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000739}
740
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000741static int
742internal_select(PySocketSockObject *s, int writing)
743{
744 return internal_select_ex(s, writing, s->sock_timeout);
745}
746
747/*
748 Two macros for automatic retry of select() in case of false positives
749 (for example, select() could indicate a socket is ready for reading
750 but the data then discarded by the OS because of a wrong checksum).
751 Here is an example of use:
752
753 BEGIN_SELECT_LOOP(s)
754 Py_BEGIN_ALLOW_THREADS
755 timeout = internal_select_ex(s, 0, interval);
756 if (!timeout)
757 outlen = recv(s->sock_fd, cbuf, len, flags);
758 Py_END_ALLOW_THREADS
759 if (timeout == 1) {
760 PyErr_SetString(socket_timeout, "timed out");
761 return -1;
762 }
763 END_SELECT_LOOP(s)
764*/
765
766#define BEGIN_SELECT_LOOP(s) \
767 { \
768 _PyTime_timeval now, deadline = {0, 0}; \
769 double interval = s->sock_timeout; \
770 int has_timeout = s->sock_timeout > 0.0; \
771 if (has_timeout) { \
772 _PyTime_gettimeofday(&now); \
773 deadline = now; \
774 _PyTime_ADD_SECONDS(deadline, s->sock_timeout); \
775 } \
776 while (1) { \
777 errno = 0; \
778
779#define END_SELECT_LOOP(s) \
780 if (!has_timeout || \
781 (!CHECK_ERRNO(EWOULDBLOCK) && !CHECK_ERRNO(EAGAIN))) \
782 break; \
783 _PyTime_gettimeofday(&now); \
784 interval = _PyTime_INTERVAL(now, deadline); \
785 } \
786 } \
787
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000788/* Initialize a new socket object. */
789
Tim Petersa12b4cf2002-07-18 22:38:44 +0000790static double defaulttimeout = -1.0; /* Default timeout for new sockets */
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000791
Martin v. Löwis1a214512008-06-11 05:26:20 +0000792static void
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000793init_sockobject(PySocketSockObject *s,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000794 SOCKET_T fd, int family, int type, int proto)
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000795{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000796 s->sock_fd = fd;
797 s->sock_family = family;
798 s->sock_type = type;
799 s->sock_proto = proto;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000800
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000801 s->errorhandler = &set_error;
Antoine Pitroub1c54962010-10-14 15:05:38 +0000802#ifdef SOCK_NONBLOCK
803 if (type & SOCK_NONBLOCK)
804 s->sock_timeout = 0.0;
805 else
806#endif
807 {
808 s->sock_timeout = defaulttimeout;
809 if (defaulttimeout >= 0.0)
810 internal_setblocking(s, 0);
811 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000812
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000813}
814
815
Guido van Rossum30a685f1991-06-27 15:51:29 +0000816/* Create a new socket object.
817 This just creates the object and initializes it.
818 If the creation fails, return NULL and set an exception (implicit
819 in NEWOBJ()). */
820
Guido van Rossum73624e91994-10-10 17:59:00 +0000821static PySocketSockObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000822new_sockobject(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000823{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000824 PySocketSockObject *s;
825 s = (PySocketSockObject *)
826 PyType_GenericNew(&sock_type, NULL, NULL);
827 if (s != NULL)
828 init_sockobject(s, fd, family, type, proto);
829 return s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000830}
831
Guido van Rossum30a685f1991-06-27 15:51:29 +0000832
Guido van Rossum48a680c2001-03-02 06:34:14 +0000833/* Lock to allow python interpreter to continue, but only allow one
Just van Rossum1040d2c2003-05-09 07:53:18 +0000834 thread to be in gethostbyname or getaddrinfo */
835#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
836PyThread_type_lock netdb_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000837#endif
838
839
Guido van Rossum30a685f1991-06-27 15:51:29 +0000840/* Convert a string specifying a host name or one of a few symbolic
841 names to a numeric IP address. This usually calls gethostbyname()
842 to do the work; the names "" and "<broadcast>" are special.
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000843 Return the length (IPv4 should be 4 bytes), or negative if
Guido van Rossum30a685f1991-06-27 15:51:29 +0000844 an error occurred; then an exception is raised. */
845
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000846static int
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000847setipaddr(char *name, struct sockaddr *addr_ret, size_t addr_ret_size, int af)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000848{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000849 struct addrinfo hints, *res;
850 int error;
851 int d1, d2, d3, d4;
852 char ch;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000853
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000854 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
855 if (name[0] == '\0') {
856 int siz;
857 memset(&hints, 0, sizeof(hints));
858 hints.ai_family = af;
859 hints.ai_socktype = SOCK_DGRAM; /*dummy*/
860 hints.ai_flags = AI_PASSIVE;
861 Py_BEGIN_ALLOW_THREADS
862 ACQUIRE_GETADDRINFO_LOCK
863 error = getaddrinfo(NULL, "0", &hints, &res);
864 Py_END_ALLOW_THREADS
865 /* We assume that those thread-unsafe getaddrinfo() versions
866 *are* safe regarding their return value, ie. that a
867 subsequent call to getaddrinfo() does not destroy the
868 outcome of the first call. */
869 RELEASE_GETADDRINFO_LOCK
870 if (error) {
871 set_gaierror(error);
872 return -1;
873 }
874 switch (res->ai_family) {
875 case AF_INET:
876 siz = 4;
877 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000878#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000879 case AF_INET6:
880 siz = 16;
881 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000882#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000883 default:
884 freeaddrinfo(res);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200885 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000886 "unsupported address family");
887 return -1;
888 }
889 if (res->ai_next) {
890 freeaddrinfo(res);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200891 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000892 "wildcard resolved to multiple address");
893 return -1;
894 }
895 if (res->ai_addrlen < addr_ret_size)
896 addr_ret_size = res->ai_addrlen;
897 memcpy(addr_ret, res->ai_addr, addr_ret_size);
898 freeaddrinfo(res);
899 return siz;
900 }
901 if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
902 struct sockaddr_in *sin;
903 if (af != AF_INET && af != AF_UNSPEC) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200904 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000905 "address family mismatched");
906 return -1;
907 }
908 sin = (struct sockaddr_in *)addr_ret;
909 memset((void *) sin, '\0', sizeof(*sin));
910 sin->sin_family = AF_INET;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000911#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000912 sin->sin_len = sizeof(*sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000913#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000914 sin->sin_addr.s_addr = INADDR_BROADCAST;
915 return sizeof(sin->sin_addr);
916 }
917 if (sscanf(name, "%d.%d.%d.%d%c", &d1, &d2, &d3, &d4, &ch) == 4 &&
918 0 <= d1 && d1 <= 255 && 0 <= d2 && d2 <= 255 &&
919 0 <= d3 && d3 <= 255 && 0 <= d4 && d4 <= 255) {
920 struct sockaddr_in *sin;
921 sin = (struct sockaddr_in *)addr_ret;
922 sin->sin_addr.s_addr = htonl(
923 ((long) d1 << 24) | ((long) d2 << 16) |
924 ((long) d3 << 8) | ((long) d4 << 0));
925 sin->sin_family = AF_INET;
Anthony Baxter0e85f9d2003-05-02 15:40:46 +0000926#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000927 sin->sin_len = sizeof(*sin);
Anthony Baxter0e85f9d2003-05-02 15:40:46 +0000928#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000929 return 4;
930 }
931 memset(&hints, 0, sizeof(hints));
932 hints.ai_family = af;
933 Py_BEGIN_ALLOW_THREADS
934 ACQUIRE_GETADDRINFO_LOCK
935 error = getaddrinfo(name, NULL, &hints, &res);
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000936#if defined(__digital__) && defined(__unix__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000937 if (error == EAI_NONAME && af == AF_UNSPEC) {
938 /* On Tru64 V5.1, numeric-to-addr conversion fails
939 if no address family is given. Assume IPv4 for now.*/
940 hints.ai_family = AF_INET;
941 error = getaddrinfo(name, NULL, &hints, &res);
942 }
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000943#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000944 Py_END_ALLOW_THREADS
945 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
946 if (error) {
947 set_gaierror(error);
948 return -1;
949 }
950 if (res->ai_addrlen < addr_ret_size)
951 addr_ret_size = res->ai_addrlen;
952 memcpy((char *) addr_ret, res->ai_addr, addr_ret_size);
953 freeaddrinfo(res);
954 switch (addr_ret->sa_family) {
955 case AF_INET:
956 return 4;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000957#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000958 case AF_INET6:
959 return 16;
Guido van Rossum955becc1999-03-22 20:14:53 +0000960#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000961 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200962 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000963 return -1;
964 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000965}
966
Guido van Rossum30a685f1991-06-27 15:51:29 +0000967
Guido van Rossum30a685f1991-06-27 15:51:29 +0000968/* Create a string object representing an IP address.
969 This is always a string of the form 'dd.dd.dd.dd' (with variable
970 size numbers). */
971
Guido van Rossum73624e91994-10-10 17:59:00 +0000972static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000973makeipaddr(struct sockaddr *addr, int addrlen)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000974{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000975 char buf[NI_MAXHOST];
976 int error;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000977
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000978 error = getnameinfo(addr, addrlen, buf, sizeof(buf), NULL, 0,
979 NI_NUMERICHOST);
980 if (error) {
981 set_gaierror(error);
982 return NULL;
983 }
984 return PyUnicode_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000985}
986
987
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000988#ifdef USE_BLUETOOTH
989/* Convert a string representation of a Bluetooth address into a numeric
990 address. Returns the length (6), or raises an exception and returns -1 if
991 an error occurred. */
992
993static int
994setbdaddr(char *name, bdaddr_t *bdaddr)
995{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000996 unsigned int b0, b1, b2, b3, b4, b5;
997 char ch;
998 int n;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000999
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001000 n = sscanf(name, "%X:%X:%X:%X:%X:%X%c",
1001 &b5, &b4, &b3, &b2, &b1, &b0, &ch);
1002 if (n == 6 && (b0 | b1 | b2 | b3 | b4 | b5) < 256) {
1003 bdaddr->b[0] = b0;
1004 bdaddr->b[1] = b1;
1005 bdaddr->b[2] = b2;
1006 bdaddr->b[3] = b3;
1007 bdaddr->b[4] = b4;
1008 bdaddr->b[5] = b5;
1009 return 6;
1010 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001011 PyErr_SetString(PyExc_OSError, "bad bluetooth address");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001012 return -1;
1013 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001014}
1015
1016/* Create a string representation of the Bluetooth address. This is always a
1017 string of the form 'XX:XX:XX:XX:XX:XX' where XX is a two digit hexadecimal
1018 value (zero padded if necessary). */
1019
1020static PyObject *
1021makebdaddr(bdaddr_t *bdaddr)
1022{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001023 char buf[(6 * 2) + 5 + 1];
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001024
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001025 sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X",
1026 bdaddr->b[5], bdaddr->b[4], bdaddr->b[3],
1027 bdaddr->b[2], bdaddr->b[1], bdaddr->b[0]);
1028 return PyUnicode_FromString(buf);
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001029}
1030#endif
1031
1032
Guido van Rossum30a685f1991-06-27 15:51:29 +00001033/* Create an object representing the given socket address,
1034 suitable for passing it back to bind(), connect() etc.
1035 The family field of the sockaddr structure is inspected
1036 to determine what kind of address it really is. */
1037
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001038/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001039static PyObject *
Antoine Pitrou19467d22010-08-17 19:33:30 +00001040makesockaddr(SOCKET_T sockfd, struct sockaddr *addr, size_t addrlen, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001041{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001042 if (addrlen == 0) {
1043 /* No address -- may be recvfrom() from known socket */
1044 Py_INCREF(Py_None);
1045 return Py_None;
1046 }
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001047
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001048 switch (addr->sa_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001049
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001050 case AF_INET:
1051 {
1052 struct sockaddr_in *a;
1053 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
1054 PyObject *ret = NULL;
1055 if (addrobj) {
1056 a = (struct sockaddr_in *)addr;
1057 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
1058 Py_DECREF(addrobj);
1059 }
1060 return ret;
1061 }
Guido van Rossum30a685f1991-06-27 15:51:29 +00001062
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001063#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001064 case AF_UNIX:
1065 {
1066 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001067#ifdef linux
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001068 if (a->sun_path[0] == 0) { /* Linux abstract namespace */
1069 addrlen -= offsetof(struct sockaddr_un, sun_path);
1070 return PyBytes_FromStringAndSize(a->sun_path, addrlen);
1071 }
1072 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001073#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001074 {
1075 /* regular NULL-terminated string */
1076 return PyUnicode_FromString(a->sun_path);
1077 }
1078 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001079#endif /* AF_UNIX */
1080
Martin v. Löwis11017b12006-01-14 18:12:57 +00001081#if defined(AF_NETLINK)
1082 case AF_NETLINK:
1083 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001084 struct sockaddr_nl *a = (struct sockaddr_nl *) addr;
1085 return Py_BuildValue("II", a->nl_pid, a->nl_groups);
Martin v. Löwis11017b12006-01-14 18:12:57 +00001086 }
1087#endif /* AF_NETLINK */
1088
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001089#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001090 case AF_INET6:
1091 {
1092 struct sockaddr_in6 *a;
1093 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
1094 PyObject *ret = NULL;
1095 if (addrobj) {
1096 a = (struct sockaddr_in6 *)addr;
1097 ret = Py_BuildValue("Oiii",
1098 addrobj,
1099 ntohs(a->sin6_port),
1100 a->sin6_flowinfo,
1101 a->sin6_scope_id);
1102 Py_DECREF(addrobj);
1103 }
1104 return ret;
1105 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001106#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001107
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001108#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001109 case AF_BLUETOOTH:
1110 switch (proto) {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001111
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001112 case BTPROTO_L2CAP:
1113 {
1114 struct sockaddr_l2 *a = (struct sockaddr_l2 *) addr;
1115 PyObject *addrobj = makebdaddr(&_BT_L2_MEMB(a, bdaddr));
1116 PyObject *ret = NULL;
1117 if (addrobj) {
1118 ret = Py_BuildValue("Oi",
1119 addrobj,
1120 _BT_L2_MEMB(a, psm));
1121 Py_DECREF(addrobj);
1122 }
1123 return ret;
1124 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001125
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001126 case BTPROTO_RFCOMM:
1127 {
1128 struct sockaddr_rc *a = (struct sockaddr_rc *) addr;
1129 PyObject *addrobj = makebdaddr(&_BT_RC_MEMB(a, bdaddr));
1130 PyObject *ret = NULL;
1131 if (addrobj) {
1132 ret = Py_BuildValue("Oi",
1133 addrobj,
1134 _BT_RC_MEMB(a, channel));
1135 Py_DECREF(addrobj);
1136 }
1137 return ret;
1138 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001139
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001140 case BTPROTO_HCI:
1141 {
1142 struct sockaddr_hci *a = (struct sockaddr_hci *) addr;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001143#if defined(__NetBSD__) || defined(__DragonFly__)
1144 return makebdaddr(&_BT_HCI_MEMB(a, bdaddr));
1145#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001146 PyObject *ret = NULL;
1147 ret = Py_BuildValue("i", _BT_HCI_MEMB(a, dev));
1148 return ret;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001149#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001150 }
Thomas Wouterscf297e42007-02-23 15:07:44 +00001151
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001152#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001153 case BTPROTO_SCO:
1154 {
1155 struct sockaddr_sco *a = (struct sockaddr_sco *) addr;
1156 return makebdaddr(&_BT_SCO_MEMB(a, bdaddr));
1157 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001158#endif
1159
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001160 default:
1161 PyErr_SetString(PyExc_ValueError,
1162 "Unknown Bluetooth protocol");
1163 return NULL;
1164 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001165#endif
1166
Antoine Pitroub156a462010-10-27 20:13:57 +00001167#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFNAME)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001168 case AF_PACKET:
1169 {
1170 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
1171 char *ifname = "";
1172 struct ifreq ifr;
1173 /* need to look up interface name give index */
1174 if (a->sll_ifindex) {
1175 ifr.ifr_ifindex = a->sll_ifindex;
1176 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1177 ifname = ifr.ifr_name;
1178 }
1179 return Py_BuildValue("shbhy#",
1180 ifname,
1181 ntohs(a->sll_protocol),
1182 a->sll_pkttype,
1183 a->sll_hatype,
1184 a->sll_addr,
1185 a->sll_halen);
1186 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001187#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001188
Christian Heimes043d6f62008-01-07 17:19:16 +00001189#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001190 case AF_TIPC:
1191 {
1192 struct sockaddr_tipc *a = (struct sockaddr_tipc *) addr;
1193 if (a->addrtype == TIPC_ADDR_NAMESEQ) {
1194 return Py_BuildValue("IIIII",
1195 a->addrtype,
1196 a->addr.nameseq.type,
1197 a->addr.nameseq.lower,
1198 a->addr.nameseq.upper,
1199 a->scope);
1200 } else if (a->addrtype == TIPC_ADDR_NAME) {
1201 return Py_BuildValue("IIIII",
1202 a->addrtype,
1203 a->addr.name.name.type,
1204 a->addr.name.name.instance,
1205 a->addr.name.name.instance,
1206 a->scope);
1207 } else if (a->addrtype == TIPC_ADDR_ID) {
1208 return Py_BuildValue("IIIII",
1209 a->addrtype,
1210 a->addr.id.node,
1211 a->addr.id.ref,
1212 0,
1213 a->scope);
1214 } else {
1215 PyErr_SetString(PyExc_ValueError,
1216 "Invalid address type");
1217 return NULL;
1218 }
1219 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001220#endif
1221
Charles-François Natali30589c92011-10-07 22:47:08 +02001222#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02001223 case AF_CAN:
1224 {
1225 struct sockaddr_can *a = (struct sockaddr_can *)addr;
1226 char *ifname = "";
1227 struct ifreq ifr;
1228 /* need to look up interface name given index */
1229 if (a->can_ifindex) {
1230 ifr.ifr_ifindex = a->can_ifindex;
1231 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1232 ifname = ifr.ifr_name;
1233 }
1234
1235 return Py_BuildValue("O&h", PyUnicode_DecodeFSDefault,
1236 ifname,
1237 a->can_family);
1238 }
1239#endif
1240
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001241 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001242
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001243 default:
1244 /* If we don't know the address family, don't raise an
1245 exception -- return it as an (int, bytes) tuple. */
1246 return Py_BuildValue("iy#",
1247 addr->sa_family,
1248 addr->sa_data,
1249 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001250
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001251 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001252}
1253
Guido van Rossum30a685f1991-06-27 15:51:29 +00001254
1255/* Parse a socket address argument according to the socket object's
1256 address family. Return 1 if the address was in the proper format,
1257 0 of not. The address is returned through addr_ret, its length
1258 through len_ret. */
1259
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001260static int
Guido van Rossum48a680c2001-03-02 06:34:14 +00001261getsockaddrarg(PySocketSockObject *s, PyObject *args,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001262 struct sockaddr *addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001263{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001264 switch (s->sock_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001265
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001266#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001267 case AF_UNIX:
1268 {
1269 struct sockaddr_un* addr;
1270 char *path;
1271 int len;
1272 if (!PyArg_Parse(args, "s#", &path, &len))
1273 return 0;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001274
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001275 addr = (struct sockaddr_un*)addr_ret;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001276#ifdef linux
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001277 if (len > 0 && path[0] == 0) {
1278 /* Linux abstract namespace extension */
1279 if (len > sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001280 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001281 "AF_UNIX path too long");
1282 return 0;
1283 }
1284 }
1285 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001286#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001287 {
1288 /* regular NULL-terminated string */
1289 if (len >= sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001290 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001291 "AF_UNIX path too long");
1292 return 0;
1293 }
1294 addr->sun_path[len] = 0;
1295 }
1296 addr->sun_family = s->sock_family;
1297 memcpy(addr->sun_path, path, len);
Andrew MacIntyredaedf212004-04-11 12:03:57 +00001298#if defined(PYOS_OS2)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001299 *len_ret = sizeof(*addr);
Andrew MacIntyredaedf212004-04-11 12:03:57 +00001300#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001301 *len_ret = len + offsetof(struct sockaddr_un, sun_path);
Andrew MacIntyredaedf212004-04-11 12:03:57 +00001302#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001303 return 1;
1304 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001305#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001306
Martin v. Löwis11017b12006-01-14 18:12:57 +00001307#if defined(AF_NETLINK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001308 case AF_NETLINK:
1309 {
1310 struct sockaddr_nl* addr;
1311 int pid, groups;
1312 addr = (struct sockaddr_nl *)addr_ret;
1313 if (!PyTuple_Check(args)) {
1314 PyErr_Format(
1315 PyExc_TypeError,
1316 "getsockaddrarg: "
1317 "AF_NETLINK address must be tuple, not %.500s",
1318 Py_TYPE(args)->tp_name);
1319 return 0;
1320 }
1321 if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &pid, &groups))
1322 return 0;
1323 addr->nl_family = AF_NETLINK;
1324 addr->nl_pid = pid;
1325 addr->nl_groups = groups;
1326 *len_ret = sizeof(*addr);
1327 return 1;
1328 }
Martin v. Löwis11017b12006-01-14 18:12:57 +00001329#endif
1330
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001331#ifdef AF_RDS
1332 case AF_RDS:
1333 /* RDS sockets use sockaddr_in: fall-through */
1334#endif
1335
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001336 case AF_INET:
1337 {
1338 struct sockaddr_in* addr;
1339 char *host;
1340 int port, result;
1341 if (!PyTuple_Check(args)) {
1342 PyErr_Format(
1343 PyExc_TypeError,
1344 "getsockaddrarg: "
1345 "AF_INET address must be tuple, not %.500s",
1346 Py_TYPE(args)->tp_name);
1347 return 0;
1348 }
1349 if (!PyArg_ParseTuple(args, "eti:getsockaddrarg",
1350 "idna", &host, &port))
1351 return 0;
1352 addr=(struct sockaddr_in*)addr_ret;
1353 result = setipaddr(host, (struct sockaddr *)addr,
1354 sizeof(*addr), AF_INET);
1355 PyMem_Free(host);
1356 if (result < 0)
1357 return 0;
1358 if (port < 0 || port > 0xffff) {
1359 PyErr_SetString(
1360 PyExc_OverflowError,
1361 "getsockaddrarg: port must be 0-65535.");
1362 return 0;
1363 }
1364 addr->sin_family = AF_INET;
1365 addr->sin_port = htons((short)port);
1366 *len_ret = sizeof *addr;
1367 return 1;
1368 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001369
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001370#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001371 case AF_INET6:
1372 {
1373 struct sockaddr_in6* addr;
1374 char *host;
1375 int port, flowinfo, scope_id, result;
1376 flowinfo = scope_id = 0;
1377 if (!PyTuple_Check(args)) {
1378 PyErr_Format(
1379 PyExc_TypeError,
1380 "getsockaddrarg: "
1381 "AF_INET6 address must be tuple, not %.500s",
1382 Py_TYPE(args)->tp_name);
1383 return 0;
1384 }
1385 if (!PyArg_ParseTuple(args, "eti|ii",
1386 "idna", &host, &port, &flowinfo,
1387 &scope_id)) {
1388 return 0;
1389 }
1390 addr = (struct sockaddr_in6*)addr_ret;
1391 result = setipaddr(host, (struct sockaddr *)addr,
1392 sizeof(*addr), AF_INET6);
1393 PyMem_Free(host);
1394 if (result < 0)
1395 return 0;
1396 if (port < 0 || port > 0xffff) {
1397 PyErr_SetString(
1398 PyExc_OverflowError,
1399 "getsockaddrarg: port must be 0-65535.");
1400 return 0;
1401 }
1402 addr->sin6_family = s->sock_family;
1403 addr->sin6_port = htons((short)port);
1404 addr->sin6_flowinfo = flowinfo;
1405 addr->sin6_scope_id = scope_id;
1406 *len_ret = sizeof *addr;
1407 return 1;
1408 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001409#endif
1410
Hye-Shik Chang81268602004-02-02 06:05:24 +00001411#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001412 case AF_BLUETOOTH:
1413 {
1414 switch (s->sock_proto) {
1415 case BTPROTO_L2CAP:
1416 {
1417 struct sockaddr_l2 *addr;
1418 char *straddr;
Martin v. Löwis12af0482004-01-31 12:34:17 +00001419
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001420 addr = (struct sockaddr_l2 *)addr_ret;
1421 memset(addr, 0, sizeof(struct sockaddr_l2));
1422 _BT_L2_MEMB(addr, family) = AF_BLUETOOTH;
1423 if (!PyArg_ParseTuple(args, "si", &straddr,
1424 &_BT_L2_MEMB(addr, psm))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001425 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001426 "wrong format");
1427 return 0;
1428 }
1429 if (setbdaddr(straddr, &_BT_L2_MEMB(addr, bdaddr)) < 0)
1430 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001431
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001432 *len_ret = sizeof *addr;
1433 return 1;
1434 }
1435 case BTPROTO_RFCOMM:
1436 {
1437 struct sockaddr_rc *addr;
1438 char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001439
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001440 addr = (struct sockaddr_rc *)addr_ret;
1441 _BT_RC_MEMB(addr, family) = AF_BLUETOOTH;
1442 if (!PyArg_ParseTuple(args, "si", &straddr,
1443 &_BT_RC_MEMB(addr, channel))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001444 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001445 "wrong format");
1446 return 0;
1447 }
1448 if (setbdaddr(straddr, &_BT_RC_MEMB(addr, bdaddr)) < 0)
1449 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001450
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001451 *len_ret = sizeof *addr;
1452 return 1;
1453 }
1454 case BTPROTO_HCI:
1455 {
1456 struct sockaddr_hci *addr = (struct sockaddr_hci *)addr_ret;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001457#if defined(__NetBSD__) || defined(__DragonFly__)
Alexander Belopolskye239d232010-12-08 23:31:48 +00001458 char *straddr = PyBytes_AS_STRING(args);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001459
Alexander Belopolskye239d232010-12-08 23:31:48 +00001460 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001461 if (straddr == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001462 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001463 "wrong format");
1464 return 0;
1465 }
1466 if (setbdaddr(straddr, &_BT_HCI_MEMB(addr, bdaddr)) < 0)
1467 return 0;
1468#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001469 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
1470 if (!PyArg_ParseTuple(args, "i", &_BT_HCI_MEMB(addr, dev))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001471 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001472 "wrong format");
1473 return 0;
1474 }
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001475#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001476 *len_ret = sizeof *addr;
1477 return 1;
1478 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001479#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001480 case BTPROTO_SCO:
1481 {
1482 struct sockaddr_sco *addr;
1483 char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001484
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001485 addr = (struct sockaddr_sco *)addr_ret;
1486 _BT_SCO_MEMB(addr, family) = AF_BLUETOOTH;
1487 if (!PyBytes_Check(args)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001488 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001489 "wrong format");
1490 return 0;
1491 }
1492 straddr = PyBytes_AS_STRING(args);
1493 if (setbdaddr(straddr, &_BT_SCO_MEMB(addr, bdaddr)) < 0)
1494 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001495
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001496 *len_ret = sizeof *addr;
1497 return 1;
1498 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001499#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001500 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001501 PyErr_SetString(PyExc_OSError, "getsockaddrarg: unknown Bluetooth protocol");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001502 return 0;
1503 }
1504 }
Martin v. Löwis12af0482004-01-31 12:34:17 +00001505#endif
1506
Antoine Pitroub156a462010-10-27 20:13:57 +00001507#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFINDEX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001508 case AF_PACKET:
1509 {
1510 struct sockaddr_ll* addr;
1511 struct ifreq ifr;
1512 char *interfaceName;
1513 int protoNumber;
1514 int hatype = 0;
1515 int pkttype = 0;
1516 char *haddr = NULL;
1517 unsigned int halen = 0;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001518
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001519 if (!PyTuple_Check(args)) {
1520 PyErr_Format(
1521 PyExc_TypeError,
1522 "getsockaddrarg: "
1523 "AF_PACKET address must be tuple, not %.500s",
1524 Py_TYPE(args)->tp_name);
1525 return 0;
1526 }
1527 if (!PyArg_ParseTuple(args, "si|iiy#", &interfaceName,
1528 &protoNumber, &pkttype, &hatype,
1529 &haddr, &halen))
1530 return 0;
1531 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
1532 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
1533 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1534 s->errorhandler();
1535 return 0;
1536 }
1537 if (halen > 8) {
1538 PyErr_SetString(PyExc_ValueError,
1539 "Hardware address must be 8 bytes or less");
1540 return 0;
1541 }
1542 if (protoNumber < 0 || protoNumber > 0xffff) {
1543 PyErr_SetString(
1544 PyExc_OverflowError,
1545 "getsockaddrarg: protoNumber must be 0-65535.");
1546 return 0;
1547 }
1548 addr = (struct sockaddr_ll*)addr_ret;
1549 addr->sll_family = AF_PACKET;
1550 addr->sll_protocol = htons((short)protoNumber);
1551 addr->sll_ifindex = ifr.ifr_ifindex;
1552 addr->sll_pkttype = pkttype;
1553 addr->sll_hatype = hatype;
1554 if (halen != 0) {
1555 memcpy(&addr->sll_addr, haddr, halen);
1556 }
1557 addr->sll_halen = halen;
1558 *len_ret = sizeof *addr;
1559 return 1;
1560 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00001561#endif
1562
Christian Heimes043d6f62008-01-07 17:19:16 +00001563#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001564 case AF_TIPC:
1565 {
1566 unsigned int atype, v1, v2, v3;
1567 unsigned int scope = TIPC_CLUSTER_SCOPE;
1568 struct sockaddr_tipc *addr;
Christian Heimes043d6f62008-01-07 17:19:16 +00001569
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001570 if (!PyTuple_Check(args)) {
1571 PyErr_Format(
1572 PyExc_TypeError,
1573 "getsockaddrarg: "
1574 "AF_TIPC address must be tuple, not %.500s",
1575 Py_TYPE(args)->tp_name);
1576 return 0;
1577 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001578
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001579 if (!PyArg_ParseTuple(args,
1580 "IIII|I;Invalid TIPC address format",
1581 &atype, &v1, &v2, &v3, &scope))
1582 return 0;
Christian Heimes043d6f62008-01-07 17:19:16 +00001583
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001584 addr = (struct sockaddr_tipc *) addr_ret;
1585 memset(addr, 0, sizeof(struct sockaddr_tipc));
Christian Heimes043d6f62008-01-07 17:19:16 +00001586
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001587 addr->family = AF_TIPC;
1588 addr->scope = scope;
1589 addr->addrtype = atype;
Christian Heimes043d6f62008-01-07 17:19:16 +00001590
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001591 if (atype == TIPC_ADDR_NAMESEQ) {
1592 addr->addr.nameseq.type = v1;
1593 addr->addr.nameseq.lower = v2;
1594 addr->addr.nameseq.upper = v3;
1595 } else if (atype == TIPC_ADDR_NAME) {
1596 addr->addr.name.name.type = v1;
1597 addr->addr.name.name.instance = v2;
1598 } else if (atype == TIPC_ADDR_ID) {
1599 addr->addr.id.node = v1;
1600 addr->addr.id.ref = v2;
1601 } else {
1602 /* Shouldn't happen */
1603 PyErr_SetString(PyExc_TypeError, "Invalid address type");
1604 return 0;
1605 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001606
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001607 *len_ret = sizeof(*addr);
Christian Heimes043d6f62008-01-07 17:19:16 +00001608
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001609 return 1;
1610 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001611#endif
1612
Charles-François Natali30589c92011-10-07 22:47:08 +02001613#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02001614 case AF_CAN:
1615 switch (s->sock_proto) {
1616 case CAN_RAW:
1617 {
1618 struct sockaddr_can *addr;
1619 PyObject *interfaceName;
1620 struct ifreq ifr;
1621 addr = (struct sockaddr_can *)addr_ret;
1622 Py_ssize_t len;
1623
1624 if (!PyArg_ParseTuple(args, "O&", PyUnicode_FSConverter,
1625 &interfaceName))
1626 return 0;
1627
1628 len = PyBytes_GET_SIZE(interfaceName);
1629
1630 if (len == 0) {
1631 ifr.ifr_ifindex = 0;
1632 } else if (len < sizeof(ifr.ifr_name)) {
1633 strcpy(ifr.ifr_name, PyBytes_AS_STRING(interfaceName));
1634 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1635 s->errorhandler();
1636 Py_DECREF(interfaceName);
1637 return 0;
1638 }
1639 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001640 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02001641 "AF_CAN interface name too long");
1642 Py_DECREF(interfaceName);
1643 return 0;
1644 }
1645
1646 addr->can_family = AF_CAN;
1647 addr->can_ifindex = ifr.ifr_ifindex;
1648
1649 *len_ret = sizeof(*addr);
1650 Py_DECREF(interfaceName);
1651 return 1;
1652 }
1653 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001654 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02001655 "getsockaddrarg: unsupported CAN protocol");
1656 return 0;
1657 }
1658#endif
1659
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001660 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001661
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001662 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001663 PyErr_SetString(PyExc_OSError, "getsockaddrarg: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001664 return 0;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001665
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001666 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001667}
1668
Guido van Rossum30a685f1991-06-27 15:51:29 +00001669
Guido van Rossum48a680c2001-03-02 06:34:14 +00001670/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +00001671 Return 1 if the family is known, 0 otherwise. The length is returned
1672 through len_ret. */
1673
1674static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +00001675getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +00001676{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001677 switch (s->sock_family) {
Guido van Rossum710e1df1992-06-12 10:39:36 +00001678
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001679#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001680 case AF_UNIX:
1681 {
1682 *len_ret = sizeof (struct sockaddr_un);
1683 return 1;
1684 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001685#endif /* AF_UNIX */
Martin v. Löwis11017b12006-01-14 18:12:57 +00001686#if defined(AF_NETLINK)
1687 case AF_NETLINK:
1688 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001689 *len_ret = sizeof (struct sockaddr_nl);
1690 return 1;
Martin v. Löwis11017b12006-01-14 18:12:57 +00001691 }
1692#endif
Guido van Rossum710e1df1992-06-12 10:39:36 +00001693
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001694#ifdef AF_RDS
1695 case AF_RDS:
1696 /* RDS sockets use sockaddr_in: fall-through */
1697#endif
1698
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001699 case AF_INET:
1700 {
1701 *len_ret = sizeof (struct sockaddr_in);
1702 return 1;
1703 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00001704
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001705#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001706 case AF_INET6:
1707 {
1708 *len_ret = sizeof (struct sockaddr_in6);
1709 return 1;
1710 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001711#endif
1712
Hye-Shik Chang81268602004-02-02 06:05:24 +00001713#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001714 case AF_BLUETOOTH:
1715 {
1716 switch(s->sock_proto)
1717 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001718
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001719 case BTPROTO_L2CAP:
1720 *len_ret = sizeof (struct sockaddr_l2);
1721 return 1;
1722 case BTPROTO_RFCOMM:
1723 *len_ret = sizeof (struct sockaddr_rc);
1724 return 1;
1725 case BTPROTO_HCI:
1726 *len_ret = sizeof (struct sockaddr_hci);
1727 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00001728#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001729 case BTPROTO_SCO:
1730 *len_ret = sizeof (struct sockaddr_sco);
1731 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00001732#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001733 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001734 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001735 "unknown BT protocol");
1736 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001737
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001738 }
1739 }
Martin v. Löwis12af0482004-01-31 12:34:17 +00001740#endif
1741
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00001742#ifdef HAVE_NETPACKET_PACKET_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001743 case AF_PACKET:
1744 {
1745 *len_ret = sizeof (struct sockaddr_ll);
1746 return 1;
1747 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001748#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001749
Christian Heimes043d6f62008-01-07 17:19:16 +00001750#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001751 case AF_TIPC:
1752 {
1753 *len_ret = sizeof (struct sockaddr_tipc);
1754 return 1;
1755 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001756#endif
1757
Charles-François Natali30589c92011-10-07 22:47:08 +02001758#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02001759 case AF_CAN:
1760 {
1761 *len_ret = sizeof (struct sockaddr_can);
1762 return 1;
1763 }
1764#endif
1765
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001766 /* More cases here... */
Guido van Rossum710e1df1992-06-12 10:39:36 +00001767
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001768 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001769 PyErr_SetString(PyExc_OSError, "getsockaddrlen: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001770 return 0;
Guido van Rossum710e1df1992-06-12 10:39:36 +00001771
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001772 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00001773}
1774
1775
Nick Coghlan96fe56a2011-08-22 11:55:57 +10001776/* Support functions for the sendmsg() and recvmsg[_into]() methods.
1777 Currently, these methods are only compiled if the RFC 2292/3542
1778 CMSG_LEN() macro is available. Older systems seem to have used
1779 sizeof(struct cmsghdr) + (length) where CMSG_LEN() is used now, so
1780 it may be possible to define CMSG_LEN() that way if it's not
1781 provided. Some architectures might need extra padding after the
1782 cmsghdr, however, and CMSG_LEN() would have to take account of
1783 this. */
1784#ifdef CMSG_LEN
1785/* If length is in range, set *result to CMSG_LEN(length) and return
1786 true; otherwise, return false. */
1787static int
1788get_CMSG_LEN(size_t length, size_t *result)
1789{
1790 size_t tmp;
1791
1792 if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0)))
1793 return 0;
1794 tmp = CMSG_LEN(length);
1795 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
1796 return 0;
1797 *result = tmp;
1798 return 1;
1799}
1800
1801#ifdef CMSG_SPACE
1802/* If length is in range, set *result to CMSG_SPACE(length) and return
1803 true; otherwise, return false. */
1804static int
1805get_CMSG_SPACE(size_t length, size_t *result)
1806{
1807 size_t tmp;
1808
1809 /* Use CMSG_SPACE(1) here in order to take account of the padding
1810 necessary before *and* after the data. */
1811 if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1)))
1812 return 0;
1813 tmp = CMSG_SPACE(length);
1814 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
1815 return 0;
1816 *result = tmp;
1817 return 1;
1818}
1819#endif
1820
1821/* Return true iff msg->msg_controllen is valid, cmsgh is a valid
1822 pointer in msg->msg_control with at least "space" bytes after it,
1823 and its cmsg_len member inside the buffer. */
1824static int
1825cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space)
1826{
1827 size_t cmsg_offset;
1828 static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) +
1829 sizeof(cmsgh->cmsg_len));
1830
Charles-François Natali466517d2011-08-28 18:23:43 +02001831 /* Note that POSIX allows msg_controllen to be of signed type. */
1832 if (cmsgh == NULL || msg->msg_control == NULL || msg->msg_controllen < 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10001833 return 0;
1834 if (space < cmsg_len_end)
1835 space = cmsg_len_end;
1836 cmsg_offset = (char *)cmsgh - (char *)msg->msg_control;
1837 return (cmsg_offset <= (size_t)-1 - space &&
1838 cmsg_offset + space <= msg->msg_controllen);
1839}
1840
1841/* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set
1842 *space to number of bytes following it in the buffer and return
1843 true; otherwise, return false. Assumes cmsgh, msg->msg_control and
1844 msg->msg_controllen are valid. */
1845static int
1846get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space)
1847{
1848 size_t data_offset;
1849 char *data_ptr;
1850
1851 if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL)
1852 return 0;
1853 data_offset = data_ptr - (char *)msg->msg_control;
1854 if (data_offset > msg->msg_controllen)
1855 return 0;
1856 *space = msg->msg_controllen - data_offset;
1857 return 1;
1858}
1859
1860/* If cmsgh is invalid or not contained in the buffer pointed to by
1861 msg->msg_control, return -1. If cmsgh is valid and its associated
1862 data is entirely contained in the buffer, set *data_len to the
1863 length of the associated data and return 0. If only part of the
1864 associated data is contained in the buffer but cmsgh is otherwise
1865 valid, set *data_len to the length contained in the buffer and
1866 return 1. */
1867static int
1868get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len)
1869{
1870 size_t space, cmsg_data_len;
1871
1872 if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) ||
1873 cmsgh->cmsg_len < CMSG_LEN(0))
1874 return -1;
1875 cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0);
1876 if (!get_cmsg_data_space(msg, cmsgh, &space))
1877 return -1;
1878 if (space >= cmsg_data_len) {
1879 *data_len = cmsg_data_len;
1880 return 0;
1881 }
1882 *data_len = space;
1883 return 1;
1884}
1885#endif /* CMSG_LEN */
1886
1887
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001888/* s._accept() -> (fd, address) */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001889
Guido van Rossum73624e91994-10-10 17:59:00 +00001890static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001891sock_accept(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001892{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001893 sock_addr_t addrbuf;
1894 SOCKET_T newfd = INVALID_SOCKET;
1895 socklen_t addrlen;
1896 PyObject *sock = NULL;
1897 PyObject *addr = NULL;
1898 PyObject *res = NULL;
1899 int timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001900 if (!getsockaddrlen(s, &addrlen))
1901 return NULL;
1902 memset(&addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001903
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001904 if (!IS_SELECTABLE(s))
1905 return select_error();
Neal Norwitz082b2df2006-02-07 07:04:46 +00001906
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00001907 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001908 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00001909 timeout = internal_select_ex(s, 0, interval);
Antoine Pitroub1c54962010-10-14 15:05:38 +00001910 if (!timeout) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001911 newfd = accept(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
Antoine Pitroub1c54962010-10-14 15:05:38 +00001912 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001913 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001914
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001915 if (timeout == 1) {
1916 PyErr_SetString(socket_timeout, "timed out");
1917 return NULL;
1918 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00001919 END_SELECT_LOOP(s)
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001920
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001921 if (newfd == INVALID_SOCKET)
1922 return s->errorhandler();
Barry Warsaw752300b1997-01-03 17:18:10 +00001923
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001924 sock = PyLong_FromSocket_t(newfd);
1925 if (sock == NULL) {
1926 SOCKETCLOSE(newfd);
1927 goto finally;
1928 }
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001929
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001930 addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
1931 addrlen, s->sock_proto);
1932 if (addr == NULL)
1933 goto finally;
Barry Warsaw752300b1997-01-03 17:18:10 +00001934
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001935 res = PyTuple_Pack(2, sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00001936
Guido van Rossum67f7a382002-06-06 21:08:16 +00001937finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001938 Py_XDECREF(sock);
1939 Py_XDECREF(addr);
1940 return res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001941}
1942
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001943PyDoc_STRVAR(accept_doc,
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001944"_accept() -> (integer, address info)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00001945\n\
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001946Wait for an incoming connection. Return a new socket file descriptor\n\
1947representing the connection, and the address of the client.\n\
1948For IP sockets, the address info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001949
Guido van Rossum11ba0942002-06-13 15:07:44 +00001950/* s.setblocking(flag) method. Argument:
1951 False -- non-blocking mode; same as settimeout(0)
1952 True -- blocking mode; same as settimeout(None)
1953*/
Guido van Rossume4485b01994-09-07 14:32:49 +00001954
Guido van Rossum73624e91994-10-10 17:59:00 +00001955static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001956sock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00001957{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001958 int block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001959
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001960 block = PyLong_AsLong(arg);
1961 if (block == -1 && PyErr_Occurred())
1962 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001963
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001964 s->sock_timeout = block ? -1.0 : 0.0;
1965 internal_setblocking(s, block);
Guido van Rossume4485b01994-09-07 14:32:49 +00001966
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001967 Py_INCREF(Py_None);
1968 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +00001969}
Guido van Rossume4485b01994-09-07 14:32:49 +00001970
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001971PyDoc_STRVAR(setblocking_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001972"setblocking(flag)\n\
1973\n\
1974Set the socket to blocking (flag is true) or non-blocking (false).\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00001975setblocking(True) is equivalent to settimeout(None);\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001976setblocking(False) is equivalent to settimeout(0.0).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001977
Guido van Rossum11ba0942002-06-13 15:07:44 +00001978/* s.settimeout(timeout) method. Argument:
1979 None -- no timeout, blocking mode; same as setblocking(True)
1980 0.0 -- non-blocking mode; same as setblocking(False)
1981 > 0 -- timeout mode; operations time out after timeout seconds
1982 < 0 -- illegal; raises an exception
1983*/
Guido van Rossum67f7a382002-06-06 21:08:16 +00001984static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001985sock_settimeout(PySocketSockObject *s, PyObject *arg)
Guido van Rossum67f7a382002-06-06 21:08:16 +00001986{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001987 double timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001988
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001989 if (arg == Py_None)
1990 timeout = -1.0;
1991 else {
1992 timeout = PyFloat_AsDouble(arg);
1993 if (timeout < 0.0) {
1994 if (!PyErr_Occurred())
1995 PyErr_SetString(PyExc_ValueError,
1996 "Timeout value out of range");
1997 return NULL;
1998 }
1999 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002000
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002001 s->sock_timeout = timeout;
2002 internal_setblocking(s, timeout < 0.0);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002003
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002004 Py_INCREF(Py_None);
2005 return Py_None;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002006}
2007
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002008PyDoc_STRVAR(settimeout_doc,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002009"settimeout(timeout)\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002010\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002011Set a timeout on socket operations. 'timeout' can be a float,\n\
2012giving in seconds, or None. Setting a timeout of None disables\n\
2013the timeout feature and is equivalent to setblocking(1).\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002014Setting a timeout of zero is the same as setblocking(0).");
Guido van Rossum67f7a382002-06-06 21:08:16 +00002015
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002016/* s.gettimeout() method.
2017 Returns the timeout associated with a socket. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00002018static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002019sock_gettimeout(PySocketSockObject *s)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002020{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002021 if (s->sock_timeout < 0.0) {
2022 Py_INCREF(Py_None);
2023 return Py_None;
2024 }
2025 else
2026 return PyFloat_FromDouble(s->sock_timeout);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002027}
2028
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002029PyDoc_STRVAR(gettimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002030"gettimeout() -> timeout\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002031\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03002032Returns the timeout in seconds (float) associated with socket \n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002033operations. A timeout of None indicates that timeouts on socket \n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002034operations are disabled.");
Guido van Rossume4485b01994-09-07 14:32:49 +00002035
Guido van Rossumaee08791992-09-08 09:05:33 +00002036/* s.setsockopt() method.
2037 With an integer third argument, sets an integer option.
2038 With a string third argument, sets an option from a buffer;
2039 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002040
Guido van Rossum73624e91994-10-10 17:59:00 +00002041static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002042sock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002043{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002044 int level;
2045 int optname;
2046 int res;
2047 char *buf;
2048 int buflen;
2049 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002050
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002051 if (PyArg_ParseTuple(args, "iii:setsockopt",
2052 &level, &optname, &flag)) {
2053 buf = (char *) &flag;
2054 buflen = sizeof flag;
2055 }
2056 else {
2057 PyErr_Clear();
2058 if (!PyArg_ParseTuple(args, "iiy#:setsockopt",
2059 &level, &optname, &buf, &buflen))
2060 return NULL;
2061 }
2062 res = setsockopt(s->sock_fd, level, optname, (void *)buf, buflen);
2063 if (res < 0)
2064 return s->errorhandler();
2065 Py_INCREF(Py_None);
2066 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002067}
2068
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002069PyDoc_STRVAR(setsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002070"setsockopt(level, option, value)\n\
2071\n\
2072Set a socket option. See the Unix manual for level and option.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002073The value argument can either be an integer or a string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002074
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002075
Guido van Rossumaee08791992-09-08 09:05:33 +00002076/* s.getsockopt() method.
2077 With two arguments, retrieves an integer option.
2078 With a third integer argument, retrieves a string buffer of that size;
2079 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002080
Guido van Rossum73624e91994-10-10 17:59:00 +00002081static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002082sock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002083{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002084 int level;
2085 int optname;
2086 int res;
2087 PyObject *buf;
2088 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002089
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002090 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
2091 &level, &optname, &buflen))
2092 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002093
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002094 if (buflen == 0) {
2095 int flag = 0;
2096 socklen_t flagsize = sizeof flag;
2097 res = getsockopt(s->sock_fd, level, optname,
2098 (void *)&flag, &flagsize);
2099 if (res < 0)
2100 return s->errorhandler();
2101 return PyLong_FromLong(flag);
2102 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002103#ifdef __VMS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002104 /* socklen_t is unsigned so no negative test is needed,
2105 test buflen == 0 is previously done */
2106 if (buflen > 1024) {
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002107#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002108 if (buflen <= 0 || buflen > 1024) {
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002109#endif
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002110 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002111 "getsockopt buflen out of range");
2112 return NULL;
2113 }
2114 buf = PyBytes_FromStringAndSize((char *)NULL, buflen);
2115 if (buf == NULL)
2116 return NULL;
2117 res = getsockopt(s->sock_fd, level, optname,
2118 (void *)PyBytes_AS_STRING(buf), &buflen);
2119 if (res < 0) {
2120 Py_DECREF(buf);
2121 return s->errorhandler();
2122 }
2123 _PyBytes_Resize(&buf, buflen);
2124 return buf;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002125}
2126
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002127PyDoc_STRVAR(getsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002128"getsockopt(level, option[, buffersize]) -> value\n\
2129\n\
2130Get a socket option. See the Unix manual for level and option.\n\
2131If a nonzero buffersize argument is given, the return value is a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002132string of that length; otherwise it is an integer.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002133
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002134
Fred Drake728819a2000-07-01 03:40:12 +00002135/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002136
Guido van Rossum73624e91994-10-10 17:59:00 +00002137static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002138sock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002139{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002140 sock_addr_t addrbuf;
2141 int addrlen;
2142 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002143
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002144 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2145 return NULL;
2146 Py_BEGIN_ALLOW_THREADS
2147 res = bind(s->sock_fd, SAS2SA(&addrbuf), addrlen);
2148 Py_END_ALLOW_THREADS
2149 if (res < 0)
2150 return s->errorhandler();
2151 Py_INCREF(Py_None);
2152 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002153}
2154
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002155PyDoc_STRVAR(bind_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002156"bind(address)\n\
2157\n\
2158Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00002159pair (host, port); the host must refer to the local host. For raw packet\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002160sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002161
Guido van Rossum30a685f1991-06-27 15:51:29 +00002162
2163/* s.close() method.
2164 Set the file descriptor to -1 so operations tried subsequently
2165 will surely fail. */
2166
Guido van Rossum73624e91994-10-10 17:59:00 +00002167static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002168sock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002169{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002170 SOCKET_T fd;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002171
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002172 if ((fd = s->sock_fd) != -1) {
2173 s->sock_fd = -1;
2174 Py_BEGIN_ALLOW_THREADS
2175 (void) SOCKETCLOSE(fd);
2176 Py_END_ALLOW_THREADS
2177 }
2178 Py_INCREF(Py_None);
2179 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002180}
2181
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002182PyDoc_STRVAR(close_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002183"close()\n\
2184\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002185Close the socket. It cannot be used after this call.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002186
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002187static PyObject *
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002188sock_detach(PySocketSockObject *s)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002189{
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002190 SOCKET_T fd = s->sock_fd;
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002191 s->sock_fd = -1;
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002192 return PyLong_FromSocket_t(fd);
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002193}
2194
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002195PyDoc_STRVAR(detach_doc,
2196"detach()\n\
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002197\n\
2198Close the socket object without closing the underlying file descriptor.\
2199The object cannot be used after this call, but the file descriptor\
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002200can be reused for other purposes. The file descriptor is returned.");
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002201
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002202static int
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002203internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002204 int *timeoutp)
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002205{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002206 int res, timeout;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002207
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002208 timeout = 0;
2209 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002210
2211#ifdef MS_WINDOWS
2212
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002213 if (s->sock_timeout > 0.0) {
2214 if (res < 0 && WSAGetLastError() == WSAEWOULDBLOCK &&
2215 IS_SELECTABLE(s)) {
2216 /* This is a mess. Best solution: trust select */
2217 fd_set fds;
2218 fd_set fds_exc;
2219 struct timeval tv;
2220 tv.tv_sec = (int)s->sock_timeout;
2221 tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6);
2222 FD_ZERO(&fds);
2223 FD_SET(s->sock_fd, &fds);
2224 FD_ZERO(&fds_exc);
2225 FD_SET(s->sock_fd, &fds_exc);
Antoine Pitrou19467d22010-08-17 19:33:30 +00002226 res = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
2227 NULL, &fds, &fds_exc, &tv);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002228 if (res == 0) {
2229 res = WSAEWOULDBLOCK;
2230 timeout = 1;
2231 } else if (res > 0) {
2232 if (FD_ISSET(s->sock_fd, &fds))
2233 /* The socket is in the writable set - this
2234 means connected */
2235 res = 0;
2236 else {
2237 /* As per MS docs, we need to call getsockopt()
2238 to get the underlying error */
2239 int res_size = sizeof res;
2240 /* It must be in the exception set */
2241 assert(FD_ISSET(s->sock_fd, &fds_exc));
2242 if (0 == getsockopt(s->sock_fd, SOL_SOCKET, SO_ERROR,
2243 (char *)&res, &res_size))
2244 /* getsockopt also clears WSAGetLastError,
2245 so reset it back. */
2246 WSASetLastError(res);
2247 else
2248 res = WSAGetLastError();
2249 }
2250 }
2251 /* else if (res < 0) an error occurred */
2252 }
2253 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002254
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002255 if (res < 0)
2256 res = WSAGetLastError();
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002257
2258#else
2259
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002260 if (s->sock_timeout > 0.0) {
2261 if (res < 0 && errno == EINPROGRESS && IS_SELECTABLE(s)) {
2262 timeout = internal_select(s, 1);
2263 if (timeout == 0) {
2264 /* Bug #1019808: in case of an EINPROGRESS,
2265 use getsockopt(SO_ERROR) to get the real
2266 error. */
2267 socklen_t res_size = sizeof res;
2268 (void)getsockopt(s->sock_fd, SOL_SOCKET,
2269 SO_ERROR, &res, &res_size);
2270 if (res == EISCONN)
2271 res = 0;
2272 errno = res;
2273 }
2274 else if (timeout == -1) {
2275 res = errno; /* had error */
2276 }
2277 else
2278 res = EWOULDBLOCK; /* timed out */
2279 }
2280 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002281
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002282 if (res < 0)
2283 res = errno;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002284
2285#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002286 *timeoutp = timeout;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002287
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002288 return res;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002289}
Guido van Rossum30a685f1991-06-27 15:51:29 +00002290
Fred Drake728819a2000-07-01 03:40:12 +00002291/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002292
Guido van Rossum73624e91994-10-10 17:59:00 +00002293static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002294sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002295{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002296 sock_addr_t addrbuf;
2297 int addrlen;
2298 int res;
2299 int timeout;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002300
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002301 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2302 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002303
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002304 Py_BEGIN_ALLOW_THREADS
2305 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, &timeout);
2306 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002307
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002308 if (timeout == 1) {
2309 PyErr_SetString(socket_timeout, "timed out");
2310 return NULL;
2311 }
2312 if (res != 0)
2313 return s->errorhandler();
2314 Py_INCREF(Py_None);
2315 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002316}
2317
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002318PyDoc_STRVAR(connect_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002319"connect(address)\n\
2320\n\
2321Connect the socket to a remote address. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002322is a pair (host, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002323
Guido van Rossum30a685f1991-06-27 15:51:29 +00002324
Fred Drake728819a2000-07-01 03:40:12 +00002325/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002326
2327static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002328sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002329{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002330 sock_addr_t addrbuf;
2331 int addrlen;
2332 int res;
2333 int timeout;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002334
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002335 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2336 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002337
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002338 Py_BEGIN_ALLOW_THREADS
2339 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, &timeout);
2340 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002341
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002342 /* Signals are not errors (though they may raise exceptions). Adapted
2343 from PyErr_SetFromErrnoWithFilenameObject(). */
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002344#ifdef EINTR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002345 if (res == EINTR && PyErr_CheckSignals())
2346 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002347#endif
2348
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002349 return PyLong_FromLong((long) res);
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002350}
2351
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002352PyDoc_STRVAR(connect_ex_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002353"connect_ex(address) -> errno\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002354\n\
2355This is like connect(address), but returns an error code (the errno value)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002356instead of raising an exception when an error occurs.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002357
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002358
Guido van Rossumed233a51992-06-23 09:07:03 +00002359/* s.fileno() method */
2360
Guido van Rossum73624e91994-10-10 17:59:00 +00002361static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002362sock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00002363{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002364 return PyLong_FromSocket_t(s->sock_fd);
Guido van Rossumed233a51992-06-23 09:07:03 +00002365}
2366
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002367PyDoc_STRVAR(fileno_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002368"fileno() -> integer\n\
2369\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002370Return the integer file descriptor of the socket.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002371
Guido van Rossumed233a51992-06-23 09:07:03 +00002372
Guido van Rossumc89705d1992-11-26 08:54:07 +00002373/* s.getsockname() method */
2374
Guido van Rossum73624e91994-10-10 17:59:00 +00002375static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002376sock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002377{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002378 sock_addr_t addrbuf;
2379 int res;
2380 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002381
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002382 if (!getsockaddrlen(s, &addrlen))
2383 return NULL;
2384 memset(&addrbuf, 0, addrlen);
2385 Py_BEGIN_ALLOW_THREADS
2386 res = getsockname(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2387 Py_END_ALLOW_THREADS
2388 if (res < 0)
2389 return s->errorhandler();
2390 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2391 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002392}
2393
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002394PyDoc_STRVAR(getsockname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002395"getsockname() -> address info\n\
2396\n\
2397Return the address of the local endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002398info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002399
Guido van Rossumc89705d1992-11-26 08:54:07 +00002400
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002401#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002402/* s.getpeername() method */
2403
Guido van Rossum73624e91994-10-10 17:59:00 +00002404static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002405sock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002406{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002407 sock_addr_t addrbuf;
2408 int res;
2409 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002410
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002411 if (!getsockaddrlen(s, &addrlen))
2412 return NULL;
2413 memset(&addrbuf, 0, addrlen);
2414 Py_BEGIN_ALLOW_THREADS
2415 res = getpeername(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2416 Py_END_ALLOW_THREADS
2417 if (res < 0)
2418 return s->errorhandler();
2419 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2420 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002421}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002422
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002423PyDoc_STRVAR(getpeername_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002424"getpeername() -> address info\n\
2425\n\
2426Return the address of the remote endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002427info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002428
Guido van Rossumb6775db1994-08-01 11:34:53 +00002429#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002430
2431
Guido van Rossum30a685f1991-06-27 15:51:29 +00002432/* s.listen(n) method */
2433
Guido van Rossum73624e91994-10-10 17:59:00 +00002434static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002435sock_listen(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002436{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002437 int backlog;
2438 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002439
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002440 backlog = PyLong_AsLong(arg);
2441 if (backlog == -1 && PyErr_Occurred())
2442 return NULL;
2443 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou1be815a2011-05-10 19:16:29 +02002444 /* To avoid problems on systems that don't allow a negative backlog
2445 * (which doesn't make sense anyway) we force a minimum value of 0. */
2446 if (backlog < 0)
2447 backlog = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002448 res = listen(s->sock_fd, backlog);
2449 Py_END_ALLOW_THREADS
2450 if (res < 0)
2451 return s->errorhandler();
2452 Py_INCREF(Py_None);
2453 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002454}
2455
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002456PyDoc_STRVAR(listen_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002457"listen(backlog)\n\
2458\n\
2459Enable a server to accept connections. The backlog argument must be at\n\
Antoine Pitrou1be815a2011-05-10 19:16:29 +02002460least 0 (if it is lower, it is set to 0); it specifies the number of\n\
2461unaccepted connections that the system will allow before refusing new\n\
2462connections.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002463
2464
Thomas Wouters477c8d52006-05-27 19:21:47 +00002465/*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002466 * This is the guts of the recv() and recv_into() methods, which reads into a
Thomas Wouters902d6eb2007-01-09 23:18:33 +00002467 * char buffer. If you have any inc/dec ref to do to the objects that contain
Thomas Wouters477c8d52006-05-27 19:21:47 +00002468 * the buffer, do it in the caller. This function returns the number of bytes
Ezio Melotti13925002011-03-16 11:05:33 +02002469 * successfully read. If there was an error, it returns -1. Note that it is
Thomas Wouters477c8d52006-05-27 19:21:47 +00002470 * also possible that we return a number of bytes smaller than the request
2471 * bytes.
2472 */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002473
Antoine Pitrou19467d22010-08-17 19:33:30 +00002474static Py_ssize_t
2475sock_recv_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002476{
Antoine Pitrou19467d22010-08-17 19:33:30 +00002477 Py_ssize_t outlen = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002478 int timeout;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002479#ifdef __VMS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002480 int remaining;
2481 char *read_buf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002482#endif
2483
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002484 if (!IS_SELECTABLE(s)) {
2485 select_error();
2486 return -1;
2487 }
2488 if (len == 0) {
2489 /* If 0 bytes were requested, do nothing. */
2490 return 0;
2491 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002492
2493#ifndef __VMS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002494 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002495 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002496 timeout = internal_select_ex(s, 0, interval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002497 if (!timeout)
2498 outlen = recv(s->sock_fd, cbuf, len, flags);
2499 Py_END_ALLOW_THREADS
Thomas Wouters477c8d52006-05-27 19:21:47 +00002500
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002501 if (timeout == 1) {
2502 PyErr_SetString(socket_timeout, "timed out");
2503 return -1;
2504 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002505 END_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002506 if (outlen < 0) {
2507 /* Note: the call to errorhandler() ALWAYS indirectly returned
2508 NULL, so ignore its return value */
2509 s->errorhandler();
2510 return -1;
2511 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002512#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002513 read_buf = cbuf;
2514 remaining = len;
2515 while (remaining != 0) {
2516 unsigned int segment;
2517 int nread = -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002518
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002519 segment = remaining /SEGMENT_SIZE;
2520 if (segment != 0) {
2521 segment = SEGMENT_SIZE;
2522 }
2523 else {
2524 segment = remaining;
2525 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002526
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002527 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002528 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002529 timeout = internal_select_ex(s, 0, interval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002530 if (!timeout)
2531 nread = recv(s->sock_fd, read_buf, segment, flags);
2532 Py_END_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002533 if (timeout == 1) {
2534 PyErr_SetString(socket_timeout, "timed out");
2535 return -1;
2536 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002537 END_SELECT_LOOP(s)
2538
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002539 if (nread < 0) {
2540 s->errorhandler();
2541 return -1;
2542 }
2543 if (nread != remaining) {
2544 read_buf += nread;
2545 break;
2546 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002547
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002548 remaining -= segment;
2549 read_buf += segment;
2550 }
2551 outlen = read_buf - cbuf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002552#endif /* !__VMS */
2553
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002554 return outlen;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002555}
2556
Guido van Rossum48a680c2001-03-02 06:34:14 +00002557
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002558/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002559
Guido van Rossum73624e91994-10-10 17:59:00 +00002560static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002561sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002562{
Antoine Pitrou19467d22010-08-17 19:33:30 +00002563 Py_ssize_t recvlen, outlen;
2564 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002565 PyObject *buf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002566
Antoine Pitrou19467d22010-08-17 19:33:30 +00002567 if (!PyArg_ParseTuple(args, "n|i:recv", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002568 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002569
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002570 if (recvlen < 0) {
2571 PyErr_SetString(PyExc_ValueError,
2572 "negative buffersize in recv");
2573 return NULL;
2574 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002575
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002576 /* Allocate a new string. */
2577 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
2578 if (buf == NULL)
2579 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002580
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002581 /* Call the guts */
2582 outlen = sock_recv_guts(s, PyBytes_AS_STRING(buf), recvlen, flags);
2583 if (outlen < 0) {
2584 /* An error occurred, release the string and return an
2585 error. */
2586 Py_DECREF(buf);
2587 return NULL;
2588 }
2589 if (outlen != recvlen) {
2590 /* We did not read as many bytes as we anticipated, resize the
2591 string if possible and be successful. */
2592 _PyBytes_Resize(&buf, outlen);
2593 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002594
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002595 return buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002596}
2597
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002598PyDoc_STRVAR(recv_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002599"recv(buffersize[, flags]) -> data\n\
2600\n\
2601Receive up to buffersize bytes from the socket. For the optional flags\n\
2602argument, see the Unix manual. When no data is available, block until\n\
2603at least one byte is available or until the remote end is closed. When\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002604the remote end is closed and all data is read, return the empty string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002605
Guido van Rossum30a685f1991-06-27 15:51:29 +00002606
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002607/* s.recv_into(buffer, [nbytes [,flags]]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002608
Thomas Wouters477c8d52006-05-27 19:21:47 +00002609static PyObject*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002610sock_recv_into(PySocketSockObject *s, PyObject *args, PyObject *kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002611{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002612 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00002613
Antoine Pitrou19467d22010-08-17 19:33:30 +00002614 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002615 Py_buffer pbuf;
2616 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002617 Py_ssize_t buflen, readlen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002618
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002619 /* Get the buffer's memory */
Antoine Pitrou19467d22010-08-17 19:33:30 +00002620 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recv_into", kwlist,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002621 &pbuf, &recvlen, &flags))
2622 return NULL;
2623 buf = pbuf.buf;
2624 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002625
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002626 if (recvlen < 0) {
2627 PyBuffer_Release(&pbuf);
2628 PyErr_SetString(PyExc_ValueError,
2629 "negative buffersize in recv_into");
2630 return NULL;
2631 }
2632 if (recvlen == 0) {
2633 /* If nbytes was not specified, use the buffer's length */
2634 recvlen = buflen;
2635 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002636
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002637 /* Check if the buffer is large enough */
2638 if (buflen < recvlen) {
2639 PyBuffer_Release(&pbuf);
2640 PyErr_SetString(PyExc_ValueError,
2641 "buffer too small for requested bytes");
2642 return NULL;
2643 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002644
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002645 /* Call the guts */
2646 readlen = sock_recv_guts(s, buf, recvlen, flags);
2647 if (readlen < 0) {
2648 /* Return an error. */
2649 PyBuffer_Release(&pbuf);
2650 return NULL;
2651 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002652
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002653 PyBuffer_Release(&pbuf);
2654 /* Return the number of bytes read. Note that we do not do anything
2655 special here in the case that readlen < recvlen. */
2656 return PyLong_FromSsize_t(readlen);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002657}
2658
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002659PyDoc_STRVAR(recv_into_doc,
2660"recv_into(buffer, [nbytes[, flags]]) -> nbytes_read\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00002661\n\
2662A version of recv() that stores its data into a buffer rather than creating \n\
2663a new string. Receive up to buffersize bytes from the socket. If buffersize \n\
2664is not specified (or 0), receive up to the size available in the given buffer.\n\
2665\n\
2666See recv() for documentation about the flags.");
2667
2668
2669/*
Christian Heimes99170a52007-12-19 02:07:34 +00002670 * This is the guts of the recvfrom() and recvfrom_into() methods, which reads
2671 * into a char buffer. If you have any inc/def ref to do to the objects that
2672 * contain the buffer, do it in the caller. This function returns the number
Ezio Melotti13925002011-03-16 11:05:33 +02002673 * of bytes successfully read. If there was an error, it returns -1. Note
Christian Heimes99170a52007-12-19 02:07:34 +00002674 * that it is also possible that we return a number of bytes smaller than the
2675 * request bytes.
Thomas Wouters477c8d52006-05-27 19:21:47 +00002676 *
2677 * 'addr' is a return value for the address object. Note that you must decref
2678 * it yourself.
2679 */
Antoine Pitrou19467d22010-08-17 19:33:30 +00002680static Py_ssize_t
2681sock_recvfrom_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002682 PyObject** addr)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002683{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002684 sock_addr_t addrbuf;
2685 int timeout;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002686 Py_ssize_t n = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002687 socklen_t addrlen;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002688
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002689 *addr = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002690
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002691 if (!getsockaddrlen(s, &addrlen))
2692 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002693
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002694 if (!IS_SELECTABLE(s)) {
2695 select_error();
2696 return -1;
2697 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00002698
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002699 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002700 Py_BEGIN_ALLOW_THREADS
2701 memset(&addrbuf, 0, addrlen);
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002702 timeout = internal_select_ex(s, 0, interval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002703 if (!timeout) {
Guido van Rossum8d665e61996-06-26 18:22:49 +00002704#ifndef MS_WINDOWS
Andrew MacIntyreba43e872002-03-03 03:03:52 +00002705#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002706 n = recvfrom(s->sock_fd, cbuf, len, flags,
2707 SAS2SA(&addrbuf), &addrlen);
Guido van Rossum32c575d1997-12-02 20:37:32 +00002708#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002709 n = recvfrom(s->sock_fd, cbuf, len, flags,
2710 (void *) &addrbuf, &addrlen);
Guido van Rossum32c575d1997-12-02 20:37:32 +00002711#endif
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002712#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002713 n = recvfrom(s->sock_fd, cbuf, len, flags,
2714 SAS2SA(&addrbuf), &addrlen);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002715#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002716 }
2717 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002718
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002719 if (timeout == 1) {
2720 PyErr_SetString(socket_timeout, "timed out");
2721 return -1;
2722 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002723 END_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002724 if (n < 0) {
2725 s->errorhandler();
2726 return -1;
2727 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002728
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002729 if (!(*addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
2730 addrlen, s->sock_proto)))
2731 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002732
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002733 return n;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002734}
2735
2736/* s.recvfrom(nbytes [,flags]) method */
2737
2738static PyObject *
2739sock_recvfrom(PySocketSockObject *s, PyObject *args)
2740{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002741 PyObject *buf = NULL;
2742 PyObject *addr = NULL;
2743 PyObject *ret = NULL;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002744 int flags = 0;
2745 Py_ssize_t recvlen, outlen;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002746
Antoine Pitrou19467d22010-08-17 19:33:30 +00002747 if (!PyArg_ParseTuple(args, "n|i:recvfrom", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002748 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002749
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002750 if (recvlen < 0) {
2751 PyErr_SetString(PyExc_ValueError,
2752 "negative buffersize in recvfrom");
2753 return NULL;
2754 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00002755
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002756 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
2757 if (buf == NULL)
2758 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002759
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002760 outlen = sock_recvfrom_guts(s, PyBytes_AS_STRING(buf),
2761 recvlen, flags, &addr);
2762 if (outlen < 0) {
2763 goto finally;
2764 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002765
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002766 if (outlen != recvlen) {
2767 /* We did not read as many bytes as we anticipated, resize the
Ezio Melotti13925002011-03-16 11:05:33 +02002768 string if possible and be successful. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002769 if (_PyBytes_Resize(&buf, outlen) < 0)
Ezio Melotti13925002011-03-16 11:05:33 +02002770 /* Oopsy, not so successful after all. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002771 goto finally;
2772 }
Barry Warsaw752300b1997-01-03 17:18:10 +00002773
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002774 ret = PyTuple_Pack(2, buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002775
2776finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002777 Py_XDECREF(buf);
2778 Py_XDECREF(addr);
2779 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002780}
2781
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002782PyDoc_STRVAR(recvfrom_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002783"recvfrom(buffersize[, flags]) -> (data, address info)\n\
2784\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002785Like recv(buffersize, flags) but also return the sender's address info.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002786
Thomas Wouters477c8d52006-05-27 19:21:47 +00002787
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002788/* s.recvfrom_into(buffer[, nbytes [,flags]]) method */
Thomas Wouters477c8d52006-05-27 19:21:47 +00002789
2790static PyObject *
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002791sock_recvfrom_into(PySocketSockObject *s, PyObject *args, PyObject* kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002792{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002793 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00002794
Antoine Pitrou19467d22010-08-17 19:33:30 +00002795 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002796 Py_buffer pbuf;
2797 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002798 Py_ssize_t readlen, buflen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002799
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002800 PyObject *addr = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002801
Antoine Pitrou19467d22010-08-17 19:33:30 +00002802 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recvfrom_into",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002803 kwlist, &pbuf,
2804 &recvlen, &flags))
2805 return NULL;
2806 buf = pbuf.buf;
2807 buflen = pbuf.len;
2808 assert(buf != 0 && buflen > 0);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002809
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002810 if (recvlen < 0) {
2811 PyBuffer_Release(&pbuf);
2812 PyErr_SetString(PyExc_ValueError,
2813 "negative buffersize in recvfrom_into");
2814 return NULL;
2815 }
2816 if (recvlen == 0) {
2817 /* If nbytes was not specified, use the buffer's length */
2818 recvlen = buflen;
2819 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002820
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002821 readlen = sock_recvfrom_guts(s, buf, recvlen, flags, &addr);
2822 if (readlen < 0) {
2823 PyBuffer_Release(&pbuf);
2824 /* Return an error */
2825 Py_XDECREF(addr);
2826 return NULL;
2827 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002828
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002829 PyBuffer_Release(&pbuf);
2830 /* Return the number of bytes read and the address. Note that we do
2831 not do anything special here in the case that readlen < recvlen. */
Antoine Pitrou19467d22010-08-17 19:33:30 +00002832 return Py_BuildValue("nN", readlen, addr);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002833}
2834
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002835PyDoc_STRVAR(recvfrom_into_doc,
2836"recvfrom_into(buffer[, nbytes[, flags]]) -> (nbytes, address info)\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00002837\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002838Like recv_into(buffer[, nbytes[, flags]]) but also return the sender's address info.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00002839
2840
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002841/* The sendmsg() and recvmsg[_into]() methods require a working
2842 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
2843#ifdef CMSG_LEN
2844/*
2845 * Call recvmsg() with the supplied iovec structures, flags, and
2846 * ancillary data buffer size (controllen). Returns the tuple return
2847 * value for recvmsg() or recvmsg_into(), with the first item provided
2848 * by the supplied makeval() function. makeval() will be called with
2849 * the length read and makeval_data as arguments, and must return a
2850 * new reference (which will be decrefed if there is a subsequent
2851 * error). On error, closes any file descriptors received via
2852 * SCM_RIGHTS.
2853 */
2854static PyObject *
2855sock_recvmsg_guts(PySocketSockObject *s, struct iovec *iov, int iovlen,
2856 int flags, Py_ssize_t controllen,
2857 PyObject *(*makeval)(ssize_t, void *), void *makeval_data)
2858{
2859 ssize_t bytes_received = -1;
2860 int timeout;
2861 sock_addr_t addrbuf;
2862 socklen_t addrbuflen;
Charles-François Natalie9e95ae2011-08-24 21:40:53 +02002863 struct msghdr msg = {0};
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002864 PyObject *cmsg_list = NULL, *retval = NULL;
2865 void *controlbuf = NULL;
2866 struct cmsghdr *cmsgh;
2867 size_t cmsgdatalen = 0;
2868 int cmsg_status;
2869
2870 /* XXX: POSIX says that msg_name and msg_namelen "shall be
2871 ignored" when the socket is connected (Linux fills them in
2872 anyway for AF_UNIX sockets at least). Normally msg_namelen
2873 seems to be set to 0 if there's no address, but try to
2874 initialize msg_name to something that won't be mistaken for a
2875 real address if that doesn't happen. */
2876 if (!getsockaddrlen(s, &addrbuflen))
2877 return NULL;
2878 memset(&addrbuf, 0, addrbuflen);
2879 SAS2SA(&addrbuf)->sa_family = AF_UNSPEC;
2880
2881 if (controllen < 0 || controllen > SOCKLEN_T_LIMIT) {
2882 PyErr_SetString(PyExc_ValueError,
2883 "invalid ancillary data buffer length");
2884 return NULL;
2885 }
2886 if (controllen > 0 && (controlbuf = PyMem_Malloc(controllen)) == NULL)
2887 return PyErr_NoMemory();
2888
2889 /* Make the system call. */
2890 if (!IS_SELECTABLE(s)) {
2891 select_error();
2892 goto finally;
2893 }
2894
2895 BEGIN_SELECT_LOOP(s)
2896 Py_BEGIN_ALLOW_THREADS;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002897 msg.msg_name = SAS2SA(&addrbuf);
2898 msg.msg_namelen = addrbuflen;
2899 msg.msg_iov = iov;
2900 msg.msg_iovlen = iovlen;
2901 msg.msg_control = controlbuf;
2902 msg.msg_controllen = controllen;
2903 timeout = internal_select_ex(s, 0, interval);
2904 if (!timeout)
2905 bytes_received = recvmsg(s->sock_fd, &msg, flags);
2906 Py_END_ALLOW_THREADS;
2907 if (timeout == 1) {
2908 PyErr_SetString(socket_timeout, "timed out");
2909 goto finally;
2910 }
2911 END_SELECT_LOOP(s)
2912
2913 if (bytes_received < 0) {
2914 s->errorhandler();
2915 goto finally;
2916 }
2917
2918 /* Make list of (level, type, data) tuples from control messages. */
2919 if ((cmsg_list = PyList_New(0)) == NULL)
2920 goto err_closefds;
2921 /* Check for empty ancillary data as old CMSG_FIRSTHDR()
2922 implementations didn't do so. */
2923 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
2924 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
2925 PyObject *bytes, *tuple;
2926 int tmp;
2927
2928 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
2929 if (cmsg_status != 0) {
2930 if (PyErr_WarnEx(PyExc_RuntimeWarning,
2931 "received malformed or improperly-truncated "
2932 "ancillary data", 1) == -1)
2933 goto err_closefds;
2934 }
2935 if (cmsg_status < 0)
2936 break;
2937 if (cmsgdatalen > PY_SSIZE_T_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002938 PyErr_SetString(PyExc_OSError, "control message too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002939 goto err_closefds;
2940 }
2941
2942 bytes = PyBytes_FromStringAndSize((char *)CMSG_DATA(cmsgh),
2943 cmsgdatalen);
2944 tuple = Py_BuildValue("iiN", (int)cmsgh->cmsg_level,
2945 (int)cmsgh->cmsg_type, bytes);
2946 if (tuple == NULL)
2947 goto err_closefds;
2948 tmp = PyList_Append(cmsg_list, tuple);
2949 Py_DECREF(tuple);
2950 if (tmp != 0)
2951 goto err_closefds;
2952
2953 if (cmsg_status != 0)
2954 break;
2955 }
2956
2957 retval = Py_BuildValue("NOiN",
2958 (*makeval)(bytes_received, makeval_data),
2959 cmsg_list,
2960 (int)msg.msg_flags,
2961 makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
2962 ((msg.msg_namelen > addrbuflen) ?
2963 addrbuflen : msg.msg_namelen),
2964 s->sock_proto));
2965 if (retval == NULL)
2966 goto err_closefds;
2967
2968finally:
2969 Py_XDECREF(cmsg_list);
2970 PyMem_Free(controlbuf);
2971 return retval;
2972
2973err_closefds:
2974#ifdef SCM_RIGHTS
2975 /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */
2976 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
2977 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
2978 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
2979 if (cmsg_status < 0)
2980 break;
2981 if (cmsgh->cmsg_level == SOL_SOCKET &&
2982 cmsgh->cmsg_type == SCM_RIGHTS) {
2983 size_t numfds;
2984 int *fdp;
2985
2986 numfds = cmsgdatalen / sizeof(int);
2987 fdp = (int *)CMSG_DATA(cmsgh);
2988 while (numfds-- > 0)
2989 close(*fdp++);
2990 }
2991 if (cmsg_status != 0)
2992 break;
2993 }
2994#endif /* SCM_RIGHTS */
2995 goto finally;
2996}
2997
2998
2999static PyObject *
3000makeval_recvmsg(ssize_t received, void *data)
3001{
3002 PyObject **buf = data;
3003
3004 if (received < PyBytes_GET_SIZE(*buf))
3005 _PyBytes_Resize(buf, received);
3006 Py_XINCREF(*buf);
3007 return *buf;
3008}
3009
3010/* s.recvmsg(bufsize[, ancbufsize[, flags]]) method */
3011
3012static PyObject *
3013sock_recvmsg(PySocketSockObject *s, PyObject *args)
3014{
3015 Py_ssize_t bufsize, ancbufsize = 0;
3016 int flags = 0;
3017 struct iovec iov;
3018 PyObject *buf = NULL, *retval = NULL;
3019
3020 if (!PyArg_ParseTuple(args, "n|ni:recvmsg", &bufsize, &ancbufsize, &flags))
3021 return NULL;
3022
3023 if (bufsize < 0) {
3024 PyErr_SetString(PyExc_ValueError, "negative buffer size in recvmsg()");
3025 return NULL;
3026 }
3027 if ((buf = PyBytes_FromStringAndSize(NULL, bufsize)) == NULL)
3028 return NULL;
3029 iov.iov_base = PyBytes_AS_STRING(buf);
3030 iov.iov_len = bufsize;
3031
3032 /* Note that we're passing a pointer to *our pointer* to the bytes
3033 object here (&buf); makeval_recvmsg() may incref the object, or
3034 deallocate it and set our pointer to NULL. */
3035 retval = sock_recvmsg_guts(s, &iov, 1, flags, ancbufsize,
3036 &makeval_recvmsg, &buf);
3037 Py_XDECREF(buf);
3038 return retval;
3039}
3040
3041PyDoc_STRVAR(recvmsg_doc,
3042"recvmsg(bufsize[, ancbufsize[, flags]]) -> (data, ancdata, msg_flags, address)\n\
3043\n\
3044Receive normal data (up to bufsize bytes) and ancillary data from the\n\
3045socket. The ancbufsize argument sets the size in bytes of the\n\
3046internal buffer used to receive the ancillary data; it defaults to 0,\n\
3047meaning that no ancillary data will be received. Appropriate buffer\n\
3048sizes for ancillary data can be calculated using CMSG_SPACE() or\n\
3049CMSG_LEN(), and items which do not fit into the buffer might be\n\
3050truncated or discarded. The flags argument defaults to 0 and has the\n\
3051same meaning as for recv().\n\
3052\n\
3053The return value is a 4-tuple: (data, ancdata, msg_flags, address).\n\
3054The data item is a bytes object holding the non-ancillary data\n\
3055received. The ancdata item is a list of zero or more tuples\n\
3056(cmsg_level, cmsg_type, cmsg_data) representing the ancillary data\n\
3057(control messages) received: cmsg_level and cmsg_type are integers\n\
3058specifying the protocol level and protocol-specific type respectively,\n\
3059and cmsg_data is a bytes object holding the associated data. The\n\
3060msg_flags item is the bitwise OR of various flags indicating\n\
3061conditions on the received message; see your system documentation for\n\
3062details. If the receiving socket is unconnected, address is the\n\
3063address of the sending socket, if available; otherwise, its value is\n\
3064unspecified.\n\
3065\n\
3066If recvmsg() raises an exception after the system call returns, it\n\
3067will first attempt to close any file descriptors received via the\n\
3068SCM_RIGHTS mechanism.");
3069
3070
3071static PyObject *
3072makeval_recvmsg_into(ssize_t received, void *data)
3073{
3074 return PyLong_FromSsize_t(received);
3075}
3076
3077/* s.recvmsg_into(buffers[, ancbufsize[, flags]]) method */
3078
3079static PyObject *
3080sock_recvmsg_into(PySocketSockObject *s, PyObject *args)
3081{
3082 Py_ssize_t ancbufsize = 0;
3083 int flags = 0;
3084 struct iovec *iovs = NULL;
3085 Py_ssize_t i, nitems, nbufs = 0;
3086 Py_buffer *bufs = NULL;
3087 PyObject *buffers_arg, *fast, *retval = NULL;
3088
3089 if (!PyArg_ParseTuple(args, "O|ni:recvmsg_into",
3090 &buffers_arg, &ancbufsize, &flags))
3091 return NULL;
3092
3093 if ((fast = PySequence_Fast(buffers_arg,
3094 "recvmsg_into() argument 1 must be an "
3095 "iterable")) == NULL)
3096 return NULL;
3097 nitems = PySequence_Fast_GET_SIZE(fast);
3098 if (nitems > INT_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003099 PyErr_SetString(PyExc_OSError, "recvmsg_into() argument 1 is too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003100 goto finally;
3101 }
3102
3103 /* Fill in an iovec for each item, and save the Py_buffer
3104 structs to release afterwards. */
3105 if (nitems > 0 && ((iovs = PyMem_New(struct iovec, nitems)) == NULL ||
3106 (bufs = PyMem_New(Py_buffer, nitems)) == NULL)) {
3107 PyErr_NoMemory();
3108 goto finally;
3109 }
3110 for (; nbufs < nitems; nbufs++) {
3111 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(fast, nbufs),
3112 "w*;recvmsg_into() argument 1 must be an iterable "
3113 "of single-segment read-write buffers",
3114 &bufs[nbufs]))
3115 goto finally;
3116 iovs[nbufs].iov_base = bufs[nbufs].buf;
3117 iovs[nbufs].iov_len = bufs[nbufs].len;
3118 }
3119
3120 retval = sock_recvmsg_guts(s, iovs, nitems, flags, ancbufsize,
3121 &makeval_recvmsg_into, NULL);
3122finally:
3123 for (i = 0; i < nbufs; i++)
3124 PyBuffer_Release(&bufs[i]);
3125 PyMem_Free(bufs);
3126 PyMem_Free(iovs);
3127 Py_DECREF(fast);
3128 return retval;
3129}
3130
3131PyDoc_STRVAR(recvmsg_into_doc,
3132"recvmsg_into(buffers[, ancbufsize[, flags]]) -> (nbytes, ancdata, msg_flags, address)\n\
3133\n\
3134Receive normal data and ancillary data from the socket, scattering the\n\
3135non-ancillary data into a series of buffers. The buffers argument\n\
3136must be an iterable of objects that export writable buffers\n\
3137(e.g. bytearray objects); these will be filled with successive chunks\n\
3138of the non-ancillary data until it has all been written or there are\n\
3139no more buffers. The ancbufsize argument sets the size in bytes of\n\
3140the internal buffer used to receive the ancillary data; it defaults to\n\
31410, meaning that no ancillary data will be received. Appropriate\n\
3142buffer sizes for ancillary data can be calculated using CMSG_SPACE()\n\
3143or CMSG_LEN(), and items which do not fit into the buffer might be\n\
3144truncated or discarded. The flags argument defaults to 0 and has the\n\
3145same meaning as for recv().\n\
3146\n\
3147The return value is a 4-tuple: (nbytes, ancdata, msg_flags, address).\n\
3148The nbytes item is the total number of bytes of non-ancillary data\n\
3149written into the buffers. The ancdata item is a list of zero or more\n\
3150tuples (cmsg_level, cmsg_type, cmsg_data) representing the ancillary\n\
3151data (control messages) received: cmsg_level and cmsg_type are\n\
3152integers specifying the protocol level and protocol-specific type\n\
3153respectively, and cmsg_data is a bytes object holding the associated\n\
3154data. The msg_flags item is the bitwise OR of various flags\n\
3155indicating conditions on the received message; see your system\n\
3156documentation for details. If the receiving socket is unconnected,\n\
3157address is the address of the sending socket, if available; otherwise,\n\
3158its value is unspecified.\n\
3159\n\
3160If recvmsg_into() raises an exception after the system call returns,\n\
3161it will first attempt to close any file descriptors received via the\n\
3162SCM_RIGHTS mechanism.");
3163#endif /* CMSG_LEN */
3164
3165
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003166/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003167
Guido van Rossum73624e91994-10-10 17:59:00 +00003168static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003169sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003170{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003171 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003172 Py_ssize_t len, n = -1;
3173 int flags = 0, timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003174 Py_buffer pbuf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003175
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003176 if (!PyArg_ParseTuple(args, "y*|i:send", &pbuf, &flags))
3177 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003178
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003179 if (!IS_SELECTABLE(s)) {
3180 PyBuffer_Release(&pbuf);
3181 return select_error();
3182 }
3183 buf = pbuf.buf;
3184 len = pbuf.len;
Neal Norwitz082b2df2006-02-07 07:04:46 +00003185
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003186 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003187 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003188 timeout = internal_select_ex(s, 1, interval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003189 if (!timeout)
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003190#ifdef __VMS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003191 n = sendsegmented(s->sock_fd, buf, len, flags);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003192#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003193 n = send(s->sock_fd, buf, len, flags);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003194#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003195 Py_END_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003196 if (timeout == 1) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003197 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003198 PyErr_SetString(socket_timeout, "timed out");
3199 return NULL;
3200 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003201 END_SELECT_LOOP(s)
3202
3203 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003204 if (n < 0)
3205 return s->errorhandler();
Antoine Pitrou19467d22010-08-17 19:33:30 +00003206 return PyLong_FromSsize_t(n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00003207}
3208
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003209PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003210"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003211\n\
3212Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003213argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003214sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003215
3216
3217/* s.sendall(data [,flags]) method */
3218
3219static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003220sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003221{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003222 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003223 Py_ssize_t len, n = -1;
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003224 int flags = 0, timeout, saved_errno;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003225 Py_buffer pbuf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003226
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003227 if (!PyArg_ParseTuple(args, "y*|i:sendall", &pbuf, &flags))
3228 return NULL;
3229 buf = pbuf.buf;
3230 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003231
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003232 if (!IS_SELECTABLE(s)) {
3233 PyBuffer_Release(&pbuf);
3234 return select_error();
3235 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003236
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003237 do {
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003238 Py_BEGIN_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003239 timeout = internal_select(s, 1);
3240 n = -1;
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003241 if (!timeout) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003242#ifdef __VMS
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003243 n = sendsegmented(s->sock_fd, buf, len, flags);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003244#else
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003245 n = send(s->sock_fd, buf, len, flags);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003246#endif
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003247 }
3248 Py_END_ALLOW_THREADS
3249 if (timeout == 1) {
3250 PyBuffer_Release(&pbuf);
3251 PyErr_SetString(socket_timeout, "timed out");
3252 return NULL;
3253 }
3254 /* PyErr_CheckSignals() might change errno */
3255 saved_errno = errno;
3256 /* We must run our signal handlers before looping again.
3257 send() can return a successful partial write when it is
3258 interrupted, so we can't restrict ourselves to EINTR. */
3259 if (PyErr_CheckSignals()) {
3260 PyBuffer_Release(&pbuf);
3261 return NULL;
3262 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003263 if (n < 0) {
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003264 /* If interrupted, try again */
3265 if (saved_errno == EINTR)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003266 continue;
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003267 else
3268 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003269 }
3270 buf += n;
3271 len -= n;
3272 } while (len > 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003273 PyBuffer_Release(&pbuf);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003274
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003275 if (n < 0)
3276 return s->errorhandler();
Guido van Rossum67f7a382002-06-06 21:08:16 +00003277
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003278 Py_INCREF(Py_None);
3279 return Py_None;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003280}
3281
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003282PyDoc_STRVAR(sendall_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003283"sendall(data[, flags])\n\
3284\n\
3285Send a data string to the socket. For the optional flags\n\
3286argument, see the Unix manual. This calls send() repeatedly\n\
3287until all data is sent. If an error occurs, it's impossible\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003288to tell how much data has been sent.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003289
Guido van Rossum30a685f1991-06-27 15:51:29 +00003290
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003291/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003292
Guido van Rossum73624e91994-10-10 17:59:00 +00003293static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003294sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003295{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003296 Py_buffer pbuf;
3297 PyObject *addro;
3298 char *buf;
Antoine Pitrou5e981412011-03-17 22:38:37 +01003299 Py_ssize_t len, arglen;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003300 sock_addr_t addrbuf;
3301 int addrlen, n = -1, flags, timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003302
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003303 flags = 0;
Antoine Pitrou5e981412011-03-17 22:38:37 +01003304 arglen = PyTuple_Size(args);
3305 switch (arglen) {
3306 case 2:
3307 PyArg_ParseTuple(args, "y*O:sendto", &pbuf, &addro);
3308 break;
3309 case 3:
3310 PyArg_ParseTuple(args, "y*iO:sendto",
3311 &pbuf, &flags, &addro);
3312 break;
3313 default:
3314 PyErr_Format(PyExc_TypeError,
3315 "sendto() takes 2 or 3 arguments (%d given)",
3316 arglen);
Victor Stinner77af1722011-05-26 14:05:59 +02003317 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003318 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01003319 if (PyErr_Occurred())
3320 return NULL;
3321
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003322 buf = pbuf.buf;
3323 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003324
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003325 if (!IS_SELECTABLE(s)) {
3326 PyBuffer_Release(&pbuf);
3327 return select_error();
3328 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003329
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003330 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen)) {
3331 PyBuffer_Release(&pbuf);
3332 return NULL;
3333 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003334
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003335 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003336 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003337 timeout = internal_select_ex(s, 1, interval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003338 if (!timeout)
3339 n = sendto(s->sock_fd, buf, len, flags, SAS2SA(&addrbuf), addrlen);
3340 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00003341
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003342 if (timeout == 1) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003343 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003344 PyErr_SetString(socket_timeout, "timed out");
3345 return NULL;
3346 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003347 END_SELECT_LOOP(s)
3348 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003349 if (n < 0)
3350 return s->errorhandler();
Antoine Pitrou19467d22010-08-17 19:33:30 +00003351 return PyLong_FromSsize_t(n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003352}
3353
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003354PyDoc_STRVAR(sendto_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003355"sendto(data[, flags], address) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003356\n\
3357Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003358For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003359
Guido van Rossum30a685f1991-06-27 15:51:29 +00003360
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003361/* The sendmsg() and recvmsg[_into]() methods require a working
3362 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
3363#ifdef CMSG_LEN
3364/* s.sendmsg(buffers[, ancdata[, flags[, address]]]) method */
3365
3366static PyObject *
3367sock_sendmsg(PySocketSockObject *s, PyObject *args)
3368{
3369 Py_ssize_t i, ndataparts, ndatabufs = 0, ncmsgs, ncmsgbufs = 0;
3370 Py_buffer *databufs = NULL;
3371 struct iovec *iovs = NULL;
3372 sock_addr_t addrbuf;
Charles-François Natalie9e95ae2011-08-24 21:40:53 +02003373 struct msghdr msg = {0};
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003374 struct cmsginfo {
3375 int level;
3376 int type;
3377 Py_buffer data;
3378 } *cmsgs = NULL;
3379 void *controlbuf = NULL;
3380 size_t controllen, controllen_last;
3381 ssize_t bytes_sent = -1;
3382 int addrlen, timeout, flags = 0;
3383 PyObject *data_arg, *cmsg_arg = NULL, *addr_arg = NULL, *data_fast = NULL,
3384 *cmsg_fast = NULL, *retval = NULL;
3385
3386 if (!PyArg_ParseTuple(args, "O|OiO:sendmsg",
3387 &data_arg, &cmsg_arg, &flags, &addr_arg))
3388 return NULL;
3389
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003390 /* Parse destination address. */
3391 if (addr_arg != NULL && addr_arg != Py_None) {
3392 if (!getsockaddrarg(s, addr_arg, SAS2SA(&addrbuf), &addrlen))
3393 goto finally;
3394 msg.msg_name = &addrbuf;
3395 msg.msg_namelen = addrlen;
3396 }
3397
3398 /* Fill in an iovec for each message part, and save the Py_buffer
3399 structs to release afterwards. */
3400 if ((data_fast = PySequence_Fast(data_arg,
3401 "sendmsg() argument 1 must be an "
3402 "iterable")) == NULL)
3403 goto finally;
3404 ndataparts = PySequence_Fast_GET_SIZE(data_fast);
3405 if (ndataparts > INT_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003406 PyErr_SetString(PyExc_OSError, "sendmsg() argument 1 is too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003407 goto finally;
3408 }
3409 msg.msg_iovlen = ndataparts;
3410 if (ndataparts > 0 &&
3411 ((msg.msg_iov = iovs = PyMem_New(struct iovec, ndataparts)) == NULL ||
3412 (databufs = PyMem_New(Py_buffer, ndataparts)) == NULL)) {
3413 PyErr_NoMemory();
3414 goto finally;
3415 }
3416 for (; ndatabufs < ndataparts; ndatabufs++) {
3417 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(data_fast, ndatabufs),
3418 "y*;sendmsg() argument 1 must be an iterable of "
3419 "buffer-compatible objects",
3420 &databufs[ndatabufs]))
3421 goto finally;
3422 iovs[ndatabufs].iov_base = databufs[ndatabufs].buf;
3423 iovs[ndatabufs].iov_len = databufs[ndatabufs].len;
3424 }
3425
3426 if (cmsg_arg == NULL)
3427 ncmsgs = 0;
3428 else {
3429 if ((cmsg_fast = PySequence_Fast(cmsg_arg,
3430 "sendmsg() argument 2 must be an "
3431 "iterable")) == NULL)
3432 goto finally;
3433 ncmsgs = PySequence_Fast_GET_SIZE(cmsg_fast);
3434 }
3435
3436#ifndef CMSG_SPACE
3437 if (ncmsgs > 1) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003438 PyErr_SetString(PyExc_OSError,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003439 "sending multiple control messages is not supported "
3440 "on this system");
3441 goto finally;
3442 }
3443#endif
3444 /* Save level, type and Py_buffer for each control message,
3445 and calculate total size. */
3446 if (ncmsgs > 0 && (cmsgs = PyMem_New(struct cmsginfo, ncmsgs)) == NULL) {
3447 PyErr_NoMemory();
3448 goto finally;
3449 }
3450 controllen = controllen_last = 0;
3451 while (ncmsgbufs < ncmsgs) {
3452 size_t bufsize, space;
3453
3454 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(cmsg_fast, ncmsgbufs),
3455 "(iiy*):[sendmsg() ancillary data items]",
3456 &cmsgs[ncmsgbufs].level,
3457 &cmsgs[ncmsgbufs].type,
3458 &cmsgs[ncmsgbufs].data))
3459 goto finally;
3460 bufsize = cmsgs[ncmsgbufs++].data.len;
3461
3462#ifdef CMSG_SPACE
3463 if (!get_CMSG_SPACE(bufsize, &space)) {
3464#else
3465 if (!get_CMSG_LEN(bufsize, &space)) {
3466#endif
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003467 PyErr_SetString(PyExc_OSError, "ancillary data item too large");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003468 goto finally;
3469 }
3470 controllen += space;
3471 if (controllen > SOCKLEN_T_LIMIT || controllen < controllen_last) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003472 PyErr_SetString(PyExc_OSError, "too much ancillary data");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003473 goto finally;
3474 }
3475 controllen_last = controllen;
3476 }
3477
3478 /* Construct ancillary data block from control message info. */
3479 if (ncmsgbufs > 0) {
3480 struct cmsghdr *cmsgh = NULL;
3481
3482 if ((msg.msg_control = controlbuf =
3483 PyMem_Malloc(controllen)) == NULL) {
3484 PyErr_NoMemory();
3485 goto finally;
3486 }
3487 msg.msg_controllen = controllen;
3488
3489 /* Need to zero out the buffer as a workaround for glibc's
3490 CMSG_NXTHDR() implementation. After getting the pointer to
3491 the next header, it checks its (uninitialized) cmsg_len
3492 member to see if the "message" fits in the buffer, and
3493 returns NULL if it doesn't. Zero-filling the buffer
3494 ensures that that doesn't happen. */
3495 memset(controlbuf, 0, controllen);
3496
3497 for (i = 0; i < ncmsgbufs; i++) {
3498 size_t msg_len, data_len = cmsgs[i].data.len;
3499 int enough_space = 0;
3500
3501 cmsgh = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsgh);
3502 if (cmsgh == NULL) {
3503 PyErr_Format(PyExc_RuntimeError,
3504 "unexpected NULL result from %s()",
3505 (i == 0) ? "CMSG_FIRSTHDR" : "CMSG_NXTHDR");
3506 goto finally;
3507 }
3508 if (!get_CMSG_LEN(data_len, &msg_len)) {
3509 PyErr_SetString(PyExc_RuntimeError,
3510 "item size out of range for CMSG_LEN()");
3511 goto finally;
3512 }
3513 if (cmsg_min_space(&msg, cmsgh, msg_len)) {
3514 size_t space;
3515
3516 cmsgh->cmsg_len = msg_len;
3517 if (get_cmsg_data_space(&msg, cmsgh, &space))
3518 enough_space = (space >= data_len);
3519 }
3520 if (!enough_space) {
3521 PyErr_SetString(PyExc_RuntimeError,
3522 "ancillary data does not fit in calculated "
3523 "space");
3524 goto finally;
3525 }
3526 cmsgh->cmsg_level = cmsgs[i].level;
3527 cmsgh->cmsg_type = cmsgs[i].type;
3528 memcpy(CMSG_DATA(cmsgh), cmsgs[i].data.buf, data_len);
3529 }
3530 }
3531
3532 /* Make the system call. */
3533 if (!IS_SELECTABLE(s)) {
3534 select_error();
3535 goto finally;
3536 }
3537
3538 BEGIN_SELECT_LOOP(s)
3539 Py_BEGIN_ALLOW_THREADS;
3540 timeout = internal_select_ex(s, 1, interval);
3541 if (!timeout)
3542 bytes_sent = sendmsg(s->sock_fd, &msg, flags);
3543 Py_END_ALLOW_THREADS;
3544 if (timeout == 1) {
3545 PyErr_SetString(socket_timeout, "timed out");
3546 goto finally;
3547 }
3548 END_SELECT_LOOP(s)
3549
3550 if (bytes_sent < 0) {
3551 s->errorhandler();
3552 goto finally;
3553 }
3554 retval = PyLong_FromSsize_t(bytes_sent);
3555
3556finally:
3557 PyMem_Free(controlbuf);
3558 for (i = 0; i < ncmsgbufs; i++)
3559 PyBuffer_Release(&cmsgs[i].data);
3560 PyMem_Free(cmsgs);
3561 Py_XDECREF(cmsg_fast);
3562 for (i = 0; i < ndatabufs; i++)
3563 PyBuffer_Release(&databufs[i]);
3564 PyMem_Free(databufs);
3565 PyMem_Free(iovs);
3566 Py_XDECREF(data_fast);
3567 return retval;
3568}
3569
3570PyDoc_STRVAR(sendmsg_doc,
3571"sendmsg(buffers[, ancdata[, flags[, address]]]) -> count\n\
3572\n\
3573Send normal and ancillary data to the socket, gathering the\n\
3574non-ancillary data from a series of buffers and concatenating it into\n\
3575a single message. The buffers argument specifies the non-ancillary\n\
3576data as an iterable of buffer-compatible objects (e.g. bytes objects).\n\
3577The ancdata argument specifies the ancillary data (control messages)\n\
3578as an iterable of zero or more tuples (cmsg_level, cmsg_type,\n\
3579cmsg_data), where cmsg_level and cmsg_type are integers specifying the\n\
3580protocol level and protocol-specific type respectively, and cmsg_data\n\
3581is a buffer-compatible object holding the associated data. The flags\n\
3582argument defaults to 0 and has the same meaning as for send(). If\n\
3583address is supplied and not None, it sets a destination address for\n\
3584the message. The return value is the number of bytes of non-ancillary\n\
3585data sent.");
3586#endif /* CMSG_LEN */
3587
3588
Guido van Rossum30a685f1991-06-27 15:51:29 +00003589/* s.shutdown(how) method */
3590
Guido van Rossum73624e91994-10-10 17:59:00 +00003591static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003592sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003593{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003594 int how;
3595 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003596
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003597 how = PyLong_AsLong(arg);
3598 if (how == -1 && PyErr_Occurred())
3599 return NULL;
3600 Py_BEGIN_ALLOW_THREADS
3601 res = shutdown(s->sock_fd, how);
3602 Py_END_ALLOW_THREADS
3603 if (res < 0)
3604 return s->errorhandler();
3605 Py_INCREF(Py_None);
3606 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003607}
3608
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003609PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003610"shutdown(flag)\n\
3611\n\
Martin v. Löwis94681fc2003-11-27 19:40:22 +00003612Shut down the reading side of the socket (flag == SHUT_RD), the writing side\n\
3613of the socket (flag == SHUT_WR), or both ends (flag == SHUT_RDWR).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003614
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00003615#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Christian Heimesfaf2f632008-01-06 16:59:19 +00003616static PyObject*
3617sock_ioctl(PySocketSockObject *s, PyObject *arg)
3618{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003619 unsigned long cmd = SIO_RCVALL;
3620 PyObject *argO;
3621 DWORD recv;
Christian Heimesfaf2f632008-01-06 16:59:19 +00003622
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003623 if (!PyArg_ParseTuple(arg, "kO:ioctl", &cmd, &argO))
3624 return NULL;
Christian Heimesfaf2f632008-01-06 16:59:19 +00003625
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003626 switch (cmd) {
3627 case SIO_RCVALL: {
3628 unsigned int option = RCVALL_ON;
3629 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
3630 return NULL;
3631 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
3632 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
3633 return set_error();
3634 }
3635 return PyLong_FromUnsignedLong(recv); }
3636 case SIO_KEEPALIVE_VALS: {
3637 struct tcp_keepalive ka;
3638 if (!PyArg_ParseTuple(arg, "k(kkk):ioctl", &cmd,
3639 &ka.onoff, &ka.keepalivetime, &ka.keepaliveinterval))
3640 return NULL;
3641 if (WSAIoctl(s->sock_fd, cmd, &ka, sizeof(ka),
3642 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
3643 return set_error();
3644 }
3645 return PyLong_FromUnsignedLong(recv); }
3646 default:
3647 PyErr_Format(PyExc_ValueError, "invalid ioctl command %d", cmd);
3648 return NULL;
3649 }
Christian Heimesfaf2f632008-01-06 16:59:19 +00003650}
3651PyDoc_STRVAR(sock_ioctl_doc,
3652"ioctl(cmd, option) -> long\n\
3653\n\
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00003654Control the socket with WSAIoctl syscall. Currently supported 'cmd' values are\n\
3655SIO_RCVALL: 'option' must be one of the socket.RCVALL_* constants.\n\
3656SIO_KEEPALIVE_VALS: 'option' is a tuple of (onoff, timeout, interval).");
Christian Heimesfaf2f632008-01-06 16:59:19 +00003657
3658#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00003659
3660/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003661
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003662static PyMethodDef sock_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003663 {"_accept", (PyCFunction)sock_accept, METH_NOARGS,
3664 accept_doc},
3665 {"bind", (PyCFunction)sock_bind, METH_O,
3666 bind_doc},
3667 {"close", (PyCFunction)sock_close, METH_NOARGS,
3668 close_doc},
3669 {"connect", (PyCFunction)sock_connect, METH_O,
3670 connect_doc},
3671 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
3672 connect_ex_doc},
Antoine Pitrou6e451df2010-08-09 20:39:54 +00003673 {"detach", (PyCFunction)sock_detach, METH_NOARGS,
3674 detach_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003675 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
3676 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00003677#ifdef HAVE_GETPEERNAME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003678 {"getpeername", (PyCFunction)sock_getpeername,
3679 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00003680#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003681 {"getsockname", (PyCFunction)sock_getsockname,
3682 METH_NOARGS, getsockname_doc},
3683 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
3684 getsockopt_doc},
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00003685#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003686 {"ioctl", (PyCFunction)sock_ioctl, METH_VARARGS,
3687 sock_ioctl_doc},
Christian Heimesfaf2f632008-01-06 16:59:19 +00003688#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003689 {"listen", (PyCFunction)sock_listen, METH_O,
3690 listen_doc},
3691 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
3692 recv_doc},
3693 {"recv_into", (PyCFunction)sock_recv_into, METH_VARARGS | METH_KEYWORDS,
3694 recv_into_doc},
3695 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
3696 recvfrom_doc},
3697 {"recvfrom_into", (PyCFunction)sock_recvfrom_into, METH_VARARGS | METH_KEYWORDS,
3698 recvfrom_into_doc},
3699 {"send", (PyCFunction)sock_send, METH_VARARGS,
3700 send_doc},
3701 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
3702 sendall_doc},
3703 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
3704 sendto_doc},
3705 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
3706 setblocking_doc},
3707 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
3708 settimeout_doc},
3709 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
3710 gettimeout_doc},
3711 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
3712 setsockopt_doc},
3713 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
3714 shutdown_doc},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003715#ifdef CMSG_LEN
3716 {"recvmsg", (PyCFunction)sock_recvmsg, METH_VARARGS,
3717 recvmsg_doc},
3718 {"recvmsg_into", (PyCFunction)sock_recvmsg_into, METH_VARARGS,
3719 recvmsg_into_doc,},
3720 {"sendmsg", (PyCFunction)sock_sendmsg, METH_VARARGS,
3721 sendmsg_doc},
3722#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003723 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003724};
3725
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003726/* SockObject members */
3727static PyMemberDef sock_memberlist[] = {
3728 {"family", T_INT, offsetof(PySocketSockObject, sock_family), READONLY, "the socket family"},
3729 {"type", T_INT, offsetof(PySocketSockObject, sock_type), READONLY, "the socket type"},
3730 {"proto", T_INT, offsetof(PySocketSockObject, sock_proto), READONLY, "the socket protocol"},
3731 {"timeout", T_DOUBLE, offsetof(PySocketSockObject, sock_timeout), READONLY, "the socket timeout"},
3732 {0},
3733};
Guido van Rossum30a685f1991-06-27 15:51:29 +00003734
Guido van Rossum73624e91994-10-10 17:59:00 +00003735/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00003736 First close the file description. */
3737
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003738static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003739sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003740{
Antoine Pitroue033e062010-10-29 10:38:18 +00003741 if (s->sock_fd != -1) {
3742 PyObject *exc, *val, *tb;
3743 Py_ssize_t old_refcount = Py_REFCNT(s);
3744 ++Py_REFCNT(s);
3745 PyErr_Fetch(&exc, &val, &tb);
3746 if (PyErr_WarnFormat(PyExc_ResourceWarning, 1,
3747 "unclosed %R", s))
3748 /* Spurious errors can appear at shutdown */
3749 if (PyErr_ExceptionMatches(PyExc_Warning))
3750 PyErr_WriteUnraisable((PyObject *) s);
3751 PyErr_Restore(exc, val, tb);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003752 (void) SOCKETCLOSE(s->sock_fd);
Antoine Pitroue033e062010-10-29 10:38:18 +00003753 Py_REFCNT(s) = old_refcount;
3754 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003755 Py_TYPE(s)->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003756}
3757
Guido van Rossum30a685f1991-06-27 15:51:29 +00003758
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003759static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003760sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003761{
Fred Drakea04eaad2000-06-30 02:46:07 +00003762#if SIZEOF_SOCKET_T > SIZEOF_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003763 if (s->sock_fd > LONG_MAX) {
3764 /* this can occur on Win64, and actually there is a special
3765 ugly printf formatter for decimal pointer length integer
3766 printing, only bother if necessary*/
3767 PyErr_SetString(PyExc_OverflowError,
3768 "no printf formatter to display "
3769 "the socket descriptor in decimal");
3770 return NULL;
3771 }
Fred Drakea04eaad2000-06-30 02:46:07 +00003772#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003773 return PyUnicode_FromFormat(
3774 "<socket object, fd=%ld, family=%d, type=%d, proto=%d>",
3775 (long)s->sock_fd, s->sock_family,
3776 s->sock_type,
3777 s->sock_proto);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003778}
3779
3780
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003781/* Create a new, uninitialized socket object. */
3782
3783static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003784sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003785{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003786 PyObject *new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003787
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003788 new = type->tp_alloc(type, 0);
3789 if (new != NULL) {
3790 ((PySocketSockObject *)new)->sock_fd = -1;
3791 ((PySocketSockObject *)new)->sock_timeout = -1.0;
3792 ((PySocketSockObject *)new)->errorhandler = &set_error;
3793 }
3794 return new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003795}
3796
3797
3798/* Initialize a new socket object. */
3799
3800/*ARGSUSED*/
3801static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00003802sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003803{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003804 PySocketSockObject *s = (PySocketSockObject *)self;
3805 PyObject *fdobj = NULL;
3806 SOCKET_T fd = INVALID_SOCKET;
3807 int family = AF_INET, type = SOCK_STREAM, proto = 0;
3808 static char *keywords[] = {"family", "type", "proto", "fileno", 0};
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003809
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003810 if (!PyArg_ParseTupleAndKeywords(args, kwds,
3811 "|iiiO:socket", keywords,
3812 &family, &type, &proto, &fdobj))
3813 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003814
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003815 if (fdobj != NULL && fdobj != Py_None) {
3816 fd = PyLong_AsSocket_t(fdobj);
3817 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
3818 return -1;
3819 if (fd == INVALID_SOCKET) {
3820 PyErr_SetString(PyExc_ValueError,
3821 "can't use invalid socket value");
3822 return -1;
3823 }
3824 }
3825 else {
3826 Py_BEGIN_ALLOW_THREADS
3827 fd = socket(family, type, proto);
3828 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00003829
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003830 if (fd == INVALID_SOCKET) {
3831 set_error();
3832 return -1;
3833 }
3834 }
3835 init_sockobject(s, fd, family, type, proto);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003836
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003837 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003838
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003839}
3840
3841
Guido van Rossumb6775db1994-08-01 11:34:53 +00003842/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003843
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003844static PyTypeObject sock_type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003845 PyVarObject_HEAD_INIT(0, 0) /* Must fill in type value later */
3846 "_socket.socket", /* tp_name */
3847 sizeof(PySocketSockObject), /* tp_basicsize */
3848 0, /* tp_itemsize */
3849 (destructor)sock_dealloc, /* tp_dealloc */
3850 0, /* tp_print */
3851 0, /* tp_getattr */
3852 0, /* tp_setattr */
3853 0, /* tp_reserved */
3854 (reprfunc)sock_repr, /* tp_repr */
3855 0, /* tp_as_number */
3856 0, /* tp_as_sequence */
3857 0, /* tp_as_mapping */
3858 0, /* tp_hash */
3859 0, /* tp_call */
3860 0, /* tp_str */
3861 PyObject_GenericGetAttr, /* tp_getattro */
3862 0, /* tp_setattro */
3863 0, /* tp_as_buffer */
3864 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
3865 sock_doc, /* tp_doc */
3866 0, /* tp_traverse */
3867 0, /* tp_clear */
3868 0, /* tp_richcompare */
3869 0, /* tp_weaklistoffset */
3870 0, /* tp_iter */
3871 0, /* tp_iternext */
3872 sock_methods, /* tp_methods */
3873 sock_memberlist, /* tp_members */
3874 0, /* tp_getset */
3875 0, /* tp_base */
3876 0, /* tp_dict */
3877 0, /* tp_descr_get */
3878 0, /* tp_descr_set */
3879 0, /* tp_dictoffset */
3880 sock_initobj, /* tp_init */
3881 PyType_GenericAlloc, /* tp_alloc */
3882 sock_new, /* tp_new */
3883 PyObject_Del, /* tp_free */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003884};
3885
Guido van Rossum30a685f1991-06-27 15:51:29 +00003886
Guido van Rossum81194471991-07-27 21:42:02 +00003887/* Python interface to gethostname(). */
3888
3889/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00003890static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00003891socket_gethostname(PyObject *self, PyObject *unused)
Guido van Rossum81194471991-07-27 21:42:02 +00003892{
Martin v. Löwis72f48422010-10-29 18:20:08 +00003893#ifdef MS_WINDOWS
3894 /* Don't use winsock's gethostname, as this returns the ANSI
3895 version of the hostname, whereas we need a Unicode string.
3896 Otherwise, gethostname apparently also returns the DNS name. */
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00003897 wchar_t buf[MAX_COMPUTERNAME_LENGTH + 1];
Victor Stinner63941882011-09-29 00:42:28 +02003898 DWORD size = Py_ARRAY_LENGTH(buf);
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00003899 PyObject *result;
Martin v. Löwis72f48422010-10-29 18:20:08 +00003900 if (!GetComputerNameExW(ComputerNamePhysicalDnsHostname, buf, &size)) {
3901 if (GetLastError() == ERROR_MORE_DATA) {
3902 /* MSDN says this may occur "because DNS allows longer names */
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00003903 if (size == 0) /* XXX: I'm not sure how to handle this */
3904 return PyUnicode_FromUnicode(NULL, 0);
3905 result = PyUnicode_FromUnicode(NULL, size - 1);
Martin v. Löwis72f48422010-10-29 18:20:08 +00003906 if (!result)
3907 return NULL;
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00003908 if (GetComputerNameExW(ComputerNamePhysicalDnsHostname,
3909 PyUnicode_AS_UNICODE(result),
3910 &size))
Martin v. Löwis72f48422010-10-29 18:20:08 +00003911 return result;
Benjamin Petersone857b292010-10-29 21:37:26 +00003912 Py_DECREF(result);
Martin v. Löwis72f48422010-10-29 18:20:08 +00003913 }
3914 return PyErr_SetExcFromWindowsErr(PyExc_WindowsError, GetLastError());
3915 }
Victor Stinner77af1722011-05-26 14:05:59 +02003916 return PyUnicode_FromUnicode(buf, size);
Martin v. Löwis72f48422010-10-29 18:20:08 +00003917#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003918 char buf[1024];
3919 int res;
3920 Py_BEGIN_ALLOW_THREADS
3921 res = gethostname(buf, (int) sizeof buf - 1);
3922 Py_END_ALLOW_THREADS
3923 if (res < 0)
3924 return set_error();
3925 buf[sizeof buf - 1] = '\0';
3926 return PyUnicode_FromString(buf);
Martin v. Löwis72f48422010-10-29 18:20:08 +00003927#endif
Guido van Rossum81194471991-07-27 21:42:02 +00003928}
Guido van Rossumff4949e1992-08-05 19:58:53 +00003929
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003930PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003931"gethostname() -> string\n\
3932\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003933Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003934
Antoine Pitrou061cfb52011-02-28 22:25:22 +00003935#ifdef HAVE_SETHOSTNAME
3936PyDoc_STRVAR(sethostname_doc,
3937"sethostname(name)\n\n\
3938Sets the hostname to name.");
3939
3940static PyObject *
3941socket_sethostname(PyObject *self, PyObject *args)
3942{
3943 PyObject *hnobj;
3944 Py_buffer buf;
3945 int res, flag = 0;
3946
3947 if (!PyArg_ParseTuple(args, "S:sethostname", &hnobj)) {
3948 PyErr_Clear();
3949 if (!PyArg_ParseTuple(args, "O&:sethostname",
3950 PyUnicode_FSConverter, &hnobj))
3951 return NULL;
3952 flag = 1;
3953 }
3954 res = PyObject_GetBuffer(hnobj, &buf, PyBUF_SIMPLE);
3955 if (!res) {
3956 res = sethostname(buf.buf, buf.len);
3957 PyBuffer_Release(&buf);
3958 }
3959 if (flag)
3960 Py_DECREF(hnobj);
3961 if (res)
3962 return set_error();
3963 Py_RETURN_NONE;
3964}
3965#endif
Guido van Rossumff4949e1992-08-05 19:58:53 +00003966
Guido van Rossum30a685f1991-06-27 15:51:29 +00003967/* Python interface to gethostbyname(name). */
3968
3969/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00003970static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003971socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003972{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003973 char *name;
3974 sock_addr_t addrbuf;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00003975 PyObject *ret = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003976
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00003977 if (!PyArg_ParseTuple(args, "et:gethostbyname", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003978 return NULL;
3979 if (setipaddr(name, SAS2SA(&addrbuf), sizeof(addrbuf), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00003980 goto finally;
3981 ret = makeipaddr(SAS2SA(&addrbuf), sizeof(struct sockaddr_in));
3982finally:
3983 PyMem_Free(name);
3984 return ret;
Guido van Rossum30a685f1991-06-27 15:51:29 +00003985}
3986
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003987PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003988"gethostbyname(host) -> address\n\
3989\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003990Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003991
3992
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003993/* Convenience function common to gethostbyname_ex and gethostbyaddr */
3994
3995static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003996gethost_common(struct hostent *h, struct sockaddr *addr, int alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003997{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003998 char **pch;
3999 PyObject *rtn_tuple = (PyObject *)NULL;
4000 PyObject *name_list = (PyObject *)NULL;
4001 PyObject *addr_list = (PyObject *)NULL;
4002 PyObject *tmp;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004003
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004004 if (h == NULL) {
4005 /* Let's get real error message to return */
4006 set_herror(h_errno);
4007 return NULL;
4008 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004009
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004010 if (h->h_addrtype != af) {
4011 /* Let's get real error message to return */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004012 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004013 (char *)strerror(EAFNOSUPPORT));
Christian Heimesada8c3b2008-03-18 18:26:33 +00004014
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004015 return NULL;
4016 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004017
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004018 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00004019
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004020 case AF_INET:
4021 if (alen < sizeof(struct sockaddr_in))
4022 return NULL;
4023 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004024
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004025#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004026 case AF_INET6:
4027 if (alen < sizeof(struct sockaddr_in6))
4028 return NULL;
4029 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004030#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00004031
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004032 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004033
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004034 if ((name_list = PyList_New(0)) == NULL)
4035 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004036
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004037 if ((addr_list = PyList_New(0)) == NULL)
4038 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004039
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004040 /* SF #1511317: h_aliases can be NULL */
4041 if (h->h_aliases) {
4042 for (pch = h->h_aliases; *pch != NULL; pch++) {
4043 int status;
4044 tmp = PyUnicode_FromString(*pch);
4045 if (tmp == NULL)
4046 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004047
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004048 status = PyList_Append(name_list, tmp);
4049 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004050
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004051 if (status)
4052 goto err;
4053 }
4054 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004055
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004056 for (pch = h->h_addr_list; *pch != NULL; pch++) {
4057 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004058
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004059 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00004060
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004061 case AF_INET:
4062 {
4063 struct sockaddr_in sin;
4064 memset(&sin, 0, sizeof(sin));
4065 sin.sin_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004066#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004067 sin.sin_len = sizeof(sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004068#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004069 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
4070 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
Guido van Rossum67f7a382002-06-06 21:08:16 +00004071
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004072 if (pch == h->h_addr_list && alen >= sizeof(sin))
4073 memcpy((char *) addr, &sin, sizeof(sin));
4074 break;
4075 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004076
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004077#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004078 case AF_INET6:
4079 {
4080 struct sockaddr_in6 sin6;
4081 memset(&sin6, 0, sizeof(sin6));
4082 sin6.sin6_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004083#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004084 sin6.sin6_len = sizeof(sin6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004085#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004086 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
4087 tmp = makeipaddr((struct sockaddr *)&sin6,
4088 sizeof(sin6));
Guido van Rossum67f7a382002-06-06 21:08:16 +00004089
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004090 if (pch == h->h_addr_list && alen >= sizeof(sin6))
4091 memcpy((char *) addr, &sin6, sizeof(sin6));
4092 break;
4093 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004094#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00004095
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004096 default: /* can't happen */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004097 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004098 "unsupported address family");
4099 return NULL;
4100 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004101
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004102 if (tmp == NULL)
4103 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004104
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004105 status = PyList_Append(addr_list, tmp);
4106 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004107
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004108 if (status)
4109 goto err;
4110 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004111
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004112 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004113
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004114 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004115 Py_XDECREF(name_list);
4116 Py_XDECREF(addr_list);
4117 return rtn_tuple;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004118}
4119
4120
4121/* Python interface to gethostbyname_ex(name). */
4122
4123/*ARGSUSED*/
4124static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004125socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004126{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004127 char *name;
4128 struct hostent *h;
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00004129#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004130 struct sockaddr_storage addr;
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00004131#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004132 struct sockaddr_in addr;
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00004133#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004134 struct sockaddr *sa;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004135 PyObject *ret = NULL;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004136#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004137 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004138#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004139 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004140#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004141 char buf[16384];
4142 int buf_len = (sizeof buf) - 1;
4143 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004144#endif
4145#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004146 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004147#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004148#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004149
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004150 if (!PyArg_ParseTuple(args, "et:gethostbyname_ex", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004151 return NULL;
4152 if (setipaddr(name, (struct sockaddr *)&addr, sizeof(addr), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004153 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004154 Py_BEGIN_ALLOW_THREADS
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004155#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004156#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004157 result = gethostbyname_r(name, &hp_allocated, buf, buf_len,
4158 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004159#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004160 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004161#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004162 memset((void *) &data, '\0', sizeof(data));
4163 result = gethostbyname_r(name, &hp_allocated, &data);
4164 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004165#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004166#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00004167#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004168 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004169#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004170 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004171#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004172 Py_END_ALLOW_THREADS
4173 /* Some C libraries would require addr.__ss_family instead of
4174 addr.ss_family.
4175 Therefore, we cast the sockaddr_storage into sockaddr to
4176 access sa_family. */
4177 sa = (struct sockaddr*)&addr;
4178 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr),
4179 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00004180#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004181 PyThread_release_lock(netdb_lock);
Guido van Rossum955becc1999-03-22 20:14:53 +00004182#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004183finally:
4184 PyMem_Free(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004185 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004186}
4187
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004188PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004189"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
4190\n\
4191Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004192for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004193
4194
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004195/* Python interface to gethostbyaddr(IP). */
4196
4197/*ARGSUSED*/
4198static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004199socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004200{
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004201#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004202 struct sockaddr_storage addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004203#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004204 struct sockaddr_in addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004205#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004206 struct sockaddr *sa = (struct sockaddr *)&addr;
4207 char *ip_num;
4208 struct hostent *h;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004209 PyObject *ret = NULL;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004210#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004211 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004212#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004213 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004214#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004215 /* glibcs up to 2.10 assume that the buf argument to
4216 gethostbyaddr_r is 8-byte aligned, which at least llvm-gcc
4217 does not ensure. The attribute below instructs the compiler
4218 to maintain this alignment. */
4219 char buf[16384] Py_ALIGNED(8);
4220 int buf_len = (sizeof buf) - 1;
4221 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004222#endif
4223#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004224 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004225#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004226#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004227 char *ap;
4228 int al;
4229 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004230
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004231 if (!PyArg_ParseTuple(args, "et:gethostbyaddr", "idna", &ip_num))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004232 return NULL;
4233 af = AF_UNSPEC;
4234 if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004235 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004236 af = sa->sa_family;
4237 ap = NULL;
Brett Cannonb94767f2011-02-22 20:15:44 +00004238 /* al = 0; */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004239 switch (af) {
4240 case AF_INET:
4241 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
4242 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
4243 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004244#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004245 case AF_INET6:
4246 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
4247 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
4248 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004249#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004250 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004251 PyErr_SetString(PyExc_OSError, "unsupported address family");
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004252 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004253 }
4254 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004255#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004256#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004257 result = gethostbyaddr_r(ap, al, af,
4258 &hp_allocated, buf, buf_len,
4259 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004260#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004261 h = gethostbyaddr_r(ap, al, af,
4262 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004263#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004264 memset((void *) &data, '\0', sizeof(data));
4265 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
4266 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004267#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004268#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00004269#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004270 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004271#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004272 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004273#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004274 Py_END_ALLOW_THREADS
4275 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00004276#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004277 PyThread_release_lock(netdb_lock);
Guido van Rossum3baaa131999-03-22 21:44:51 +00004278#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004279finally:
4280 PyMem_Free(ip_num);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004281 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004282}
4283
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004284PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004285"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
4286\n\
4287Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004288for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004289
Guido van Rossum30a685f1991-06-27 15:51:29 +00004290
4291/* Python interface to getservbyname(name).
4292 This only returns the port number, since the other info is already
4293 known or not useful (like the list of aliases). */
4294
4295/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004296static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004297socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00004298{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004299 char *name, *proto=NULL;
4300 struct servent *sp;
4301 if (!PyArg_ParseTuple(args, "s|s:getservbyname", &name, &proto))
4302 return NULL;
4303 Py_BEGIN_ALLOW_THREADS
4304 sp = getservbyname(name, proto);
4305 Py_END_ALLOW_THREADS
4306 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004307 PyErr_SetString(PyExc_OSError, "service/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004308 return NULL;
4309 }
4310 return PyLong_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00004311}
4312
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004313PyDoc_STRVAR(getservbyname_doc,
Barry Warsaw11b91a02004-06-28 00:50:43 +00004314"getservbyname(servicename[, protocolname]) -> integer\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00004315\n\
4316Return a port number from a service name and protocol name.\n\
Barry Warsaw11b91a02004-06-28 00:50:43 +00004317The optional protocol name, if given, should be 'tcp' or 'udp',\n\
4318otherwise any protocol will match.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004319
Guido van Rossum30a685f1991-06-27 15:51:29 +00004320
Barry Warsaw11b91a02004-06-28 00:50:43 +00004321/* Python interface to getservbyport(port).
4322 This only returns the service name, since the other info is already
4323 known or not useful (like the list of aliases). */
4324
4325/*ARGSUSED*/
4326static PyObject *
4327socket_getservbyport(PyObject *self, PyObject *args)
4328{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004329 int port;
4330 char *proto=NULL;
4331 struct servent *sp;
4332 if (!PyArg_ParseTuple(args, "i|s:getservbyport", &port, &proto))
4333 return NULL;
4334 if (port < 0 || port > 0xffff) {
4335 PyErr_SetString(
4336 PyExc_OverflowError,
4337 "getservbyport: port must be 0-65535.");
4338 return NULL;
4339 }
4340 Py_BEGIN_ALLOW_THREADS
4341 sp = getservbyport(htons((short)port), proto);
4342 Py_END_ALLOW_THREADS
4343 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004344 PyErr_SetString(PyExc_OSError, "port/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004345 return NULL;
4346 }
4347 return PyUnicode_FromString(sp->s_name);
Barry Warsaw11b91a02004-06-28 00:50:43 +00004348}
4349
4350PyDoc_STRVAR(getservbyport_doc,
4351"getservbyport(port[, protocolname]) -> string\n\
4352\n\
4353Return the service name from a port number and protocol name.\n\
4354The optional protocol name, if given, should be 'tcp' or 'udp',\n\
4355otherwise any protocol will match.");
4356
Guido van Rossum3901d851996-12-19 16:35:04 +00004357/* Python interface to getprotobyname(name).
4358 This only returns the protocol number, since the other info is
4359 already known or not useful (like the list of aliases). */
4360
4361/*ARGSUSED*/
4362static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004363socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00004364{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004365 char *name;
4366 struct protoent *sp;
4367 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
4368 return NULL;
4369 Py_BEGIN_ALLOW_THREADS
4370 sp = getprotobyname(name);
4371 Py_END_ALLOW_THREADS
4372 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004373 PyErr_SetString(PyExc_OSError, "protocol not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004374 return NULL;
4375 }
4376 return PyLong_FromLong((long) sp->p_proto);
Guido van Rossum3901d851996-12-19 16:35:04 +00004377}
4378
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004379PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004380"getprotobyname(name) -> integer\n\
4381\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004382Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004383
Guido van Rossum3901d851996-12-19 16:35:04 +00004384
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004385#ifndef NO_DUP
4386/* dup() function for socket fds */
4387
4388static PyObject *
4389socket_dup(PyObject *self, PyObject *fdobj)
4390{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004391 SOCKET_T fd, newfd;
4392 PyObject *newfdobj;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004393
4394
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004395 fd = PyLong_AsSocket_t(fdobj);
4396 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
4397 return NULL;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004398
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004399 newfd = dup_socket(fd);
4400 if (newfd == INVALID_SOCKET)
4401 return set_error();
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004402
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004403 newfdobj = PyLong_FromSocket_t(newfd);
4404 if (newfdobj == NULL)
4405 SOCKETCLOSE(newfd);
4406 return newfdobj;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004407}
4408
4409PyDoc_STRVAR(dup_doc,
4410"dup(integer) -> integer\n\
4411\n\
4412Duplicate an integer socket file descriptor. This is like os.dup(), but for\n\
4413sockets; on some platforms os.dup() won't work for socket file descriptors.");
4414#endif
4415
4416
Dave Cole331708b2004-08-09 04:51:41 +00004417#ifdef HAVE_SOCKETPAIR
4418/* Create a pair of sockets using the socketpair() function.
Dave Cole07fda7e2004-08-23 05:16:23 +00004419 Arguments as for socket() except the default family is AF_UNIX if
Dave Colee8bbfe42004-08-26 00:51:16 +00004420 defined on the platform; otherwise, the default is AF_INET. */
Dave Cole331708b2004-08-09 04:51:41 +00004421
4422/*ARGSUSED*/
4423static PyObject *
4424socket_socketpair(PyObject *self, PyObject *args)
4425{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004426 PySocketSockObject *s0 = NULL, *s1 = NULL;
4427 SOCKET_T sv[2];
4428 int family, type = SOCK_STREAM, proto = 0;
4429 PyObject *res = NULL;
Dave Cole331708b2004-08-09 04:51:41 +00004430
4431#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004432 family = AF_UNIX;
Dave Cole331708b2004-08-09 04:51:41 +00004433#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004434 family = AF_INET;
Dave Cole331708b2004-08-09 04:51:41 +00004435#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004436 if (!PyArg_ParseTuple(args, "|iii:socketpair",
4437 &family, &type, &proto))
4438 return NULL;
4439 /* Create a pair of socket fds */
4440 if (socketpair(family, type, proto, sv) < 0)
4441 return set_error();
4442 s0 = new_sockobject(sv[0], family, type, proto);
4443 if (s0 == NULL)
4444 goto finally;
4445 s1 = new_sockobject(sv[1], family, type, proto);
4446 if (s1 == NULL)
4447 goto finally;
4448 res = PyTuple_Pack(2, s0, s1);
Dave Cole331708b2004-08-09 04:51:41 +00004449
4450finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004451 if (res == NULL) {
4452 if (s0 == NULL)
4453 SOCKETCLOSE(sv[0]);
4454 if (s1 == NULL)
4455 SOCKETCLOSE(sv[1]);
4456 }
4457 Py_XDECREF(s0);
4458 Py_XDECREF(s1);
4459 return res;
Dave Cole331708b2004-08-09 04:51:41 +00004460}
4461
4462PyDoc_STRVAR(socketpair_doc,
4463"socketpair([family[, type[, proto]]]) -> (socket object, socket object)\n\
4464\n\
4465Create a pair of socket objects from the sockets returned by the platform\n\
4466socketpair() function.\n\
Dave Cole07fda7e2004-08-23 05:16:23 +00004467The arguments are the same as for socket() except the default family is\n\
Dave Colee8bbfe42004-08-26 00:51:16 +00004468AF_UNIX if defined on the platform; otherwise, the default is AF_INET.");
Dave Cole331708b2004-08-09 04:51:41 +00004469
4470#endif /* HAVE_SOCKETPAIR */
4471
4472
Guido van Rossum006bf911996-06-12 04:04:55 +00004473static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004474socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00004475{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004476 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00004477
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004478 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
4479 return NULL;
4480 }
4481 if (x1 < 0) {
4482 PyErr_SetString(PyExc_OverflowError,
4483 "can't convert negative number to unsigned long");
4484 return NULL;
4485 }
4486 x2 = (unsigned int)ntohs((unsigned short)x1);
4487 return PyLong_FromLong(x2);
Guido van Rossum006bf911996-06-12 04:04:55 +00004488}
4489
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004490PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004491"ntohs(integer) -> integer\n\
4492\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004493Convert a 16-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004494
4495
Guido van Rossum006bf911996-06-12 04:04:55 +00004496static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004497socket_ntohl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00004498{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004499 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00004500
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004501 if (PyLong_Check(arg)) {
4502 x = PyLong_AsUnsignedLong(arg);
4503 if (x == (unsigned long) -1 && PyErr_Occurred())
4504 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004505#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004506 {
4507 unsigned long y;
4508 /* only want the trailing 32 bits */
4509 y = x & 0xFFFFFFFFUL;
4510 if (y ^ x)
4511 return PyErr_Format(PyExc_OverflowError,
4512 "long int larger than 32 bits");
4513 x = y;
4514 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004515#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004516 }
4517 else
4518 return PyErr_Format(PyExc_TypeError,
4519 "expected int/long, %s found",
4520 Py_TYPE(arg)->tp_name);
4521 if (x == (unsigned long) -1 && PyErr_Occurred())
4522 return NULL;
4523 return PyLong_FromUnsignedLong(ntohl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00004524}
4525
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004526PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004527"ntohl(integer) -> integer\n\
4528\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004529Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004530
4531
Guido van Rossum006bf911996-06-12 04:04:55 +00004532static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004533socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00004534{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004535 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00004536
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004537 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
4538 return NULL;
4539 }
4540 if (x1 < 0) {
4541 PyErr_SetString(PyExc_OverflowError,
4542 "can't convert negative number to unsigned long");
4543 return NULL;
4544 }
4545 x2 = (unsigned int)htons((unsigned short)x1);
4546 return PyLong_FromLong(x2);
Guido van Rossum006bf911996-06-12 04:04:55 +00004547}
4548
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004549PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004550"htons(integer) -> integer\n\
4551\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004552Convert a 16-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004553
4554
Guido van Rossum006bf911996-06-12 04:04:55 +00004555static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004556socket_htonl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00004557{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004558 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00004559
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004560 if (PyLong_Check(arg)) {
4561 x = PyLong_AsUnsignedLong(arg);
4562 if (x == (unsigned long) -1 && PyErr_Occurred())
4563 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004564#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004565 {
4566 unsigned long y;
4567 /* only want the trailing 32 bits */
4568 y = x & 0xFFFFFFFFUL;
4569 if (y ^ x)
4570 return PyErr_Format(PyExc_OverflowError,
4571 "long int larger than 32 bits");
4572 x = y;
4573 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004574#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004575 }
4576 else
4577 return PyErr_Format(PyExc_TypeError,
4578 "expected int/long, %s found",
4579 Py_TYPE(arg)->tp_name);
4580 return PyLong_FromUnsignedLong(htonl((unsigned long)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00004581}
4582
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004583PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004584"htonl(integer) -> integer\n\
4585\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004586Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004587
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004588/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004589
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004590PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004591"inet_aton(string) -> bytes giving packed 32-bit IP representation\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004592\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00004593Convert 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 +00004594binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004595
4596static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004597socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004598{
Guido van Rossuma2e48551999-09-09 15:42:59 +00004599#ifndef INADDR_NONE
4600#define INADDR_NONE (-1)
4601#endif
Neal Norwitz88f115b2003-02-13 02:15:42 +00004602#ifdef HAVE_INET_ATON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004603 struct in_addr buf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00004604#endif
4605
4606#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
Benjamin Petersonf91df042009-02-13 02:50:59 +00004607#if (SIZEOF_INT != 4)
4608#error "Not sure if in_addr_t exists and int is not 32-bits."
4609#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004610 /* Have to use inet_addr() instead */
4611 unsigned int packed_addr;
Tim Peters1df9fdd2003-02-13 03:13:40 +00004612#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004613 char *ip_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00004614
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004615 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))
4616 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00004617
Tim Peters1df9fdd2003-02-13 03:13:40 +00004618
4619#ifdef HAVE_INET_ATON
Thomas Wouters477c8d52006-05-27 19:21:47 +00004620
4621#ifdef USE_INET_ATON_WEAKLINK
4622 if (inet_aton != NULL) {
4623#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004624 if (inet_aton(ip_addr, &buf))
4625 return PyBytes_FromStringAndSize((char *)(&buf),
4626 sizeof(buf));
Guido van Rossumad05cdf2003-02-12 23:08:22 +00004627
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004628 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004629 "illegal IP address string passed to inet_aton");
4630 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00004631
Thomas Wouters477c8d52006-05-27 19:21:47 +00004632#ifdef USE_INET_ATON_WEAKLINK
4633 } else {
4634#endif
4635
4636#endif
4637
4638#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
4639
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004640 /* special-case this address as inet_addr might return INADDR_NONE
4641 * for this */
4642 if (strcmp(ip_addr, "255.255.255.255") == 0) {
4643 packed_addr = 0xFFFFFFFF;
4644 } else {
Thomas Wouters477c8d52006-05-27 19:21:47 +00004645
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004646 packed_addr = inet_addr(ip_addr);
Guido van Rossumc6a164b1999-08-20 19:11:27 +00004647
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004648 if (packed_addr == INADDR_NONE) { /* invalid address */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004649 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004650 "illegal IP address string passed to inet_aton");
4651 return NULL;
4652 }
4653 }
4654 return PyBytes_FromStringAndSize((char *) &packed_addr,
4655 sizeof(packed_addr));
Thomas Wouters477c8d52006-05-27 19:21:47 +00004656
4657#ifdef USE_INET_ATON_WEAKLINK
4658 }
4659#endif
4660
Guido van Rossumad05cdf2003-02-12 23:08:22 +00004661#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004662}
4663
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004664PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00004665"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004666\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004667Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004668
4669static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004670socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004671{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004672 char *packed_str;
4673 int addr_len;
4674 struct in_addr packed_addr;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004675
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004676 if (!PyArg_ParseTuple(args, "y#:inet_ntoa", &packed_str, &addr_len)) {
4677 return NULL;
4678 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00004679
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004680 if (addr_len != sizeof(packed_addr)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004681 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004682 "packed IP wrong length for inet_ntoa");
4683 return NULL;
4684 }
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004685
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004686 memcpy(&packed_addr, packed_str, addr_len);
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004687
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004688 return PyUnicode_FromString(inet_ntoa(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004689}
Guido van Rossum82a5c661998-07-07 20:45:43 +00004690
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004691#ifdef HAVE_INET_PTON
4692
4693PyDoc_STRVAR(inet_pton_doc,
4694"inet_pton(af, ip) -> packed IP address string\n\
4695\n\
4696Convert an IP address from string format to a packed string suitable\n\
4697for use with low-level network functions.");
4698
4699static PyObject *
4700socket_inet_pton(PyObject *self, PyObject *args)
4701{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004702 int af;
4703 char* ip;
4704 int retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004705#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004706 char packed[MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004707#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004708 char packed[sizeof(struct in_addr)];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004709#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004710 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
4711 return NULL;
4712 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004713
Martin v. Löwis04697e82004-06-02 12:35:29 +00004714#if !defined(ENABLE_IPV6) && defined(AF_INET6)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004715 if(af == AF_INET6) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004716 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004717 "can't use AF_INET6, IPv6 is disabled");
4718 return NULL;
4719 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00004720#endif
Martin v. Löwis10649092003-08-05 06:25:06 +00004721
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004722 retval = inet_pton(af, ip, packed);
4723 if (retval < 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004724 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004725 return NULL;
4726 } else if (retval == 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004727 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004728 "illegal IP address string passed to inet_pton");
4729 return NULL;
4730 } else if (af == AF_INET) {
4731 return PyBytes_FromStringAndSize(packed,
4732 sizeof(struct in_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004733#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004734 } else if (af == AF_INET6) {
4735 return PyBytes_FromStringAndSize(packed,
4736 sizeof(struct in6_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004737#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004738 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004739 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004740 return NULL;
4741 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004742}
Thomas Wouters477c8d52006-05-27 19:21:47 +00004743
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004744PyDoc_STRVAR(inet_ntop_doc,
4745"inet_ntop(af, packed_ip) -> string formatted IP address\n\
4746\n\
4747Convert a packed IP address of the given family to string format.");
4748
4749static PyObject *
4750socket_inet_ntop(PyObject *self, PyObject *args)
4751{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004752 int af;
4753 char* packed;
4754 int len;
4755 const char* retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004756#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004757 char ip[MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004758#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004759 char ip[INET_ADDRSTRLEN + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004760#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00004761
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004762 /* Guarantee NUL-termination for PyUnicode_FromString() below */
4763 memset((void *) &ip[0], '\0', sizeof(ip));
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004764
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004765 if (!PyArg_ParseTuple(args, "iy#:inet_ntop", &af, &packed, &len)) {
4766 return NULL;
4767 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004768
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004769 if (af == AF_INET) {
4770 if (len != sizeof(struct in_addr)) {
4771 PyErr_SetString(PyExc_ValueError,
4772 "invalid length of packed IP address string");
4773 return NULL;
4774 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004775#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004776 } else if (af == AF_INET6) {
4777 if (len != sizeof(struct in6_addr)) {
4778 PyErr_SetString(PyExc_ValueError,
4779 "invalid length of packed IP address string");
4780 return NULL;
4781 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004782#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004783 } else {
4784 PyErr_Format(PyExc_ValueError,
4785 "unknown address family %d", af);
4786 return NULL;
4787 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004788
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004789 retval = inet_ntop(af, packed, ip, sizeof(ip));
4790 if (!retval) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004791 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004792 return NULL;
4793 } else {
4794 return PyUnicode_FromString(retval);
4795 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004796
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004797 /* NOTREACHED */
4798 PyErr_SetString(PyExc_RuntimeError, "invalid handling of inet_ntop");
4799 return NULL;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004800}
4801
4802#endif /* HAVE_INET_PTON */
4803
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004804/* Python interface to getaddrinfo(host, port). */
4805
4806/*ARGSUSED*/
4807static PyObject *
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00004808socket_getaddrinfo(PyObject *self, PyObject *args, PyObject* kwargs)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004809{
Victor Stinner77af1722011-05-26 14:05:59 +02004810 static char* kwnames[] = {"host", "port", "family", "type", "proto",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00004811 "flags", 0};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004812 struct addrinfo hints, *res;
4813 struct addrinfo *res0 = NULL;
4814 PyObject *hobj = NULL;
4815 PyObject *pobj = (PyObject *)NULL;
4816 char pbuf[30];
4817 char *hptr, *pptr;
4818 int family, socktype, protocol, flags;
4819 int error;
4820 PyObject *all = (PyObject *)NULL;
4821 PyObject *idna = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004822
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004823 family = socktype = protocol = flags = 0;
4824 family = AF_UNSPEC;
Victor Stinner77af1722011-05-26 14:05:59 +02004825 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OO|iiii:getaddrinfo",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00004826 kwnames, &hobj, &pobj, &family, &socktype,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004827 &protocol, &flags)) {
4828 return NULL;
4829 }
4830 if (hobj == Py_None) {
4831 hptr = NULL;
4832 } else if (PyUnicode_Check(hobj)) {
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02004833 _Py_IDENTIFIER(encode);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02004834
4835 idna = _PyObject_CallMethodId(hobj, &PyId_encode, "s", "idna");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004836 if (!idna)
4837 return NULL;
4838 assert(PyBytes_Check(idna));
4839 hptr = PyBytes_AS_STRING(idna);
4840 } else if (PyBytes_Check(hobj)) {
4841 hptr = PyBytes_AsString(hobj);
4842 } else {
4843 PyErr_SetString(PyExc_TypeError,
4844 "getaddrinfo() argument 1 must be string or None");
4845 return NULL;
4846 }
4847 if (PyLong_CheckExact(pobj)) {
4848 long value = PyLong_AsLong(pobj);
4849 if (value == -1 && PyErr_Occurred())
4850 goto err;
4851 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", value);
4852 pptr = pbuf;
4853 } else if (PyUnicode_Check(pobj)) {
4854 pptr = _PyUnicode_AsString(pobj);
Alexander Belopolskye239d232010-12-08 23:31:48 +00004855 if (pptr == NULL)
4856 goto err;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004857 } else if (PyBytes_Check(pobj)) {
Alexander Belopolskye239d232010-12-08 23:31:48 +00004858 pptr = PyBytes_AS_STRING(pobj);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004859 } else if (pobj == Py_None) {
4860 pptr = (char *)NULL;
4861 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004862 PyErr_SetString(PyExc_OSError, "Int or String expected");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004863 goto err;
4864 }
4865 memset(&hints, 0, sizeof(hints));
4866 hints.ai_family = family;
4867 hints.ai_socktype = socktype;
4868 hints.ai_protocol = protocol;
4869 hints.ai_flags = flags;
4870 Py_BEGIN_ALLOW_THREADS
4871 ACQUIRE_GETADDRINFO_LOCK
4872 error = getaddrinfo(hptr, pptr, &hints, &res0);
4873 Py_END_ALLOW_THREADS
4874 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
4875 if (error) {
4876 set_gaierror(error);
4877 goto err;
4878 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004879
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004880 if ((all = PyList_New(0)) == NULL)
4881 goto err;
4882 for (res = res0; res; res = res->ai_next) {
4883 PyObject *single;
4884 PyObject *addr =
4885 makesockaddr(-1, res->ai_addr, res->ai_addrlen, protocol);
4886 if (addr == NULL)
4887 goto err;
4888 single = Py_BuildValue("iiisO", res->ai_family,
4889 res->ai_socktype, res->ai_protocol,
4890 res->ai_canonname ? res->ai_canonname : "",
4891 addr);
4892 Py_DECREF(addr);
4893 if (single == NULL)
4894 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004895
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004896 if (PyList_Append(all, single))
4897 goto err;
4898 Py_XDECREF(single);
4899 }
4900 Py_XDECREF(idna);
4901 if (res0)
4902 freeaddrinfo(res0);
4903 return all;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004904 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004905 Py_XDECREF(all);
4906 Py_XDECREF(idna);
4907 if (res0)
4908 freeaddrinfo(res0);
4909 return (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004910}
4911
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004912PyDoc_STRVAR(getaddrinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004913"getaddrinfo(host, port [, family, socktype, proto, flags])\n\
4914 -> list of (family, socktype, proto, canonname, sockaddr)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004915\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004916Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004917
4918/* Python interface to getnameinfo(sa, flags). */
4919
4920/*ARGSUSED*/
4921static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004922socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004923{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004924 PyObject *sa = (PyObject *)NULL;
4925 int flags;
4926 char *hostp;
4927 int port, flowinfo, scope_id;
4928 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
4929 struct addrinfo hints, *res = NULL;
4930 int error;
4931 PyObject *ret = (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004932
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004933 flags = flowinfo = scope_id = 0;
4934 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
4935 return NULL;
4936 if (!PyTuple_Check(sa)) {
4937 PyErr_SetString(PyExc_TypeError,
4938 "getnameinfo() argument 1 must be a tuple");
4939 return NULL;
4940 }
4941 if (!PyArg_ParseTuple(sa, "si|ii",
4942 &hostp, &port, &flowinfo, &scope_id))
4943 return NULL;
4944 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
4945 memset(&hints, 0, sizeof(hints));
4946 hints.ai_family = AF_UNSPEC;
4947 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Martin v. Löwis112c0f32010-08-25 07:38:15 +00004948 hints.ai_flags = AI_NUMERICHOST; /* don't do any name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004949 Py_BEGIN_ALLOW_THREADS
4950 ACQUIRE_GETADDRINFO_LOCK
4951 error = getaddrinfo(hostp, pbuf, &hints, &res);
4952 Py_END_ALLOW_THREADS
4953 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
4954 if (error) {
4955 set_gaierror(error);
4956 goto fail;
4957 }
4958 if (res->ai_next) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004959 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004960 "sockaddr resolved to multiple addresses");
4961 goto fail;
4962 }
4963 switch (res->ai_family) {
4964 case AF_INET:
4965 {
4966 if (PyTuple_GET_SIZE(sa) != 2) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004967 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004968 "IPv4 sockaddr must be 2 tuple");
4969 goto fail;
4970 }
4971 break;
4972 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004973#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004974 case AF_INET6:
4975 {
4976 struct sockaddr_in6 *sin6;
4977 sin6 = (struct sockaddr_in6 *)res->ai_addr;
4978 sin6->sin6_flowinfo = flowinfo;
4979 sin6->sin6_scope_id = scope_id;
4980 break;
4981 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004982#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004983 }
Antoine Pitrou19467d22010-08-17 19:33:30 +00004984 error = getnameinfo(res->ai_addr, (socklen_t) res->ai_addrlen,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004985 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
4986 if (error) {
4987 set_gaierror(error);
4988 goto fail;
4989 }
4990 ret = Py_BuildValue("ss", hbuf, pbuf);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004991
4992fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004993 if (res)
4994 freeaddrinfo(res);
4995 return ret;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004996}
4997
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004998PyDoc_STRVAR(getnameinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004999"getnameinfo(sockaddr, flags) --> (host, port)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005000\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005001Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005002
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005003
5004/* Python API to getting and setting the default timeout value. */
5005
5006static PyObject *
5007socket_getdefaulttimeout(PyObject *self)
5008{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005009 if (defaulttimeout < 0.0) {
5010 Py_INCREF(Py_None);
5011 return Py_None;
5012 }
5013 else
5014 return PyFloat_FromDouble(defaulttimeout);
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005015}
5016
5017PyDoc_STRVAR(getdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005018"getdefaulttimeout() -> timeout\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005019\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03005020Returns the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005021A value of None indicates that new socket objects have no timeout.\n\
5022When the socket module is first imported, the default is None.");
5023
5024static PyObject *
5025socket_setdefaulttimeout(PyObject *self, PyObject *arg)
5026{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005027 double timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005028
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005029 if (arg == Py_None)
5030 timeout = -1.0;
5031 else {
5032 timeout = PyFloat_AsDouble(arg);
5033 if (timeout < 0.0) {
5034 if (!PyErr_Occurred())
5035 PyErr_SetString(PyExc_ValueError,
5036 "Timeout value out of range");
5037 return NULL;
5038 }
5039 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005040
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005041 defaulttimeout = timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005042
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005043 Py_INCREF(Py_None);
5044 return Py_None;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005045}
5046
5047PyDoc_STRVAR(setdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005048"setdefaulttimeout(timeout)\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005049\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03005050Set the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005051A value of None indicates that new socket objects have no timeout.\n\
5052When the socket module is first imported, the default is None.");
5053
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005054#ifdef HAVE_IF_NAMEINDEX
5055/* Python API for getting interface indices and names */
5056
5057static PyObject *
5058socket_if_nameindex(PyObject *self, PyObject *arg)
5059{
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005060 PyObject *list;
Charles-François Natali60713592011-05-20 16:55:06 +02005061 int i;
5062 struct if_nameindex *ni;
Victor Stinner77af1722011-05-26 14:05:59 +02005063
Charles-François Natali60713592011-05-20 16:55:06 +02005064 ni = if_nameindex();
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005065 if (ni == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005066 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005067 return NULL;
5068 }
5069
5070 list = PyList_New(0);
5071 if (list == NULL) {
5072 if_freenameindex(ni);
5073 return NULL;
5074 }
5075
Charles-François Natali60713592011-05-20 16:55:06 +02005076 for (i = 0; ni[i].if_index != 0 && i < INT_MAX; i++) {
5077 PyObject *ni_tuple = Py_BuildValue("IO&",
5078 ni[i].if_index, PyUnicode_DecodeFSDefault, ni[i].if_name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005079
5080 if (ni_tuple == NULL || PyList_Append(list, ni_tuple) == -1) {
5081 Py_XDECREF(ni_tuple);
Charles-François Natali60713592011-05-20 16:55:06 +02005082 Py_DECREF(list);
5083 if_freenameindex(ni);
5084 return NULL;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005085 }
5086 Py_DECREF(ni_tuple);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005087 }
5088
5089 if_freenameindex(ni);
5090 return list;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005091}
5092
5093PyDoc_STRVAR(if_nameindex_doc,
5094"if_nameindex()\n\
5095\n\
5096Returns a list of network interface information (index, name) tuples.");
5097
Charles-François Natali60713592011-05-20 16:55:06 +02005098static PyObject *
5099socket_if_nametoindex(PyObject *self, PyObject *args)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005100{
Charles-François Natali60713592011-05-20 16:55:06 +02005101 PyObject *oname;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005102 unsigned long index;
5103
Charles-François Natali60713592011-05-20 16:55:06 +02005104 if (!PyArg_ParseTuple(args, "O&:if_nametoindex",
5105 PyUnicode_FSConverter, &oname))
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005106 return NULL;
5107
Charles-François Natali60713592011-05-20 16:55:06 +02005108 index = if_nametoindex(PyBytes_AS_STRING(oname));
5109 Py_DECREF(oname);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005110 if (index == 0) {
Charles-François Natali60713592011-05-20 16:55:06 +02005111 /* if_nametoindex() doesn't set errno */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005112 PyErr_SetString(PyExc_OSError, "no interface with this name");
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005113 return NULL;
5114 }
5115
5116 return PyLong_FromUnsignedLong(index);
5117}
5118
5119PyDoc_STRVAR(if_nametoindex_doc,
5120"if_nametoindex(if_name)\n\
5121\n\
5122Returns the interface index corresponding to the interface name if_name.");
5123
Charles-François Natali60713592011-05-20 16:55:06 +02005124static PyObject *
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005125socket_if_indextoname(PyObject *self, PyObject *arg)
5126{
Charles-François Natali60713592011-05-20 16:55:06 +02005127 unsigned long index;
5128 char name[IF_NAMESIZE + 1];
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005129
Charles-François Natali60713592011-05-20 16:55:06 +02005130 index = PyLong_AsUnsignedLong(arg);
5131 if (index == (unsigned long) -1)
5132 return NULL;
5133
5134 if (if_indextoname(index, name) == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005135 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005136 return NULL;
5137 }
5138
Charles-François Natali60713592011-05-20 16:55:06 +02005139 return PyUnicode_DecodeFSDefault(name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005140}
5141
5142PyDoc_STRVAR(if_indextoname_doc,
5143"if_indextoname(if_index)\n\
5144\n\
5145Returns the interface name corresponding to the interface index if_index.");
5146
5147#endif /* HAVE_IF_NAMEINDEX */
5148
5149
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005150#ifdef CMSG_LEN
5151/* Python interface to CMSG_LEN(length). */
5152
5153static PyObject *
5154socket_CMSG_LEN(PyObject *self, PyObject *args)
5155{
5156 Py_ssize_t length;
5157 size_t result;
5158
5159 if (!PyArg_ParseTuple(args, "n:CMSG_LEN", &length))
5160 return NULL;
5161 if (length < 0 || !get_CMSG_LEN(length, &result)) {
5162 PyErr_Format(PyExc_OverflowError, "CMSG_LEN() argument out of range");
5163 return NULL;
5164 }
5165 return PyLong_FromSize_t(result);
5166}
5167
5168PyDoc_STRVAR(CMSG_LEN_doc,
5169"CMSG_LEN(length) -> control message length\n\
5170\n\
5171Return the total length, without trailing padding, of an ancillary\n\
5172data item with associated data of the given length. This value can\n\
5173often be used as the buffer size for recvmsg() to receive a single\n\
5174item of ancillary data, but RFC 3542 requires portable applications to\n\
5175use CMSG_SPACE() and thus include space for padding, even when the\n\
5176item will be the last in the buffer. Raises OverflowError if length\n\
5177is outside the permissible range of values.");
5178
5179
5180#ifdef CMSG_SPACE
5181/* Python interface to CMSG_SPACE(length). */
5182
5183static PyObject *
5184socket_CMSG_SPACE(PyObject *self, PyObject *args)
5185{
5186 Py_ssize_t length;
5187 size_t result;
5188
5189 if (!PyArg_ParseTuple(args, "n:CMSG_SPACE", &length))
5190 return NULL;
5191 if (length < 0 || !get_CMSG_SPACE(length, &result)) {
5192 PyErr_SetString(PyExc_OverflowError,
5193 "CMSG_SPACE() argument out of range");
5194 return NULL;
5195 }
5196 return PyLong_FromSize_t(result);
5197}
5198
5199PyDoc_STRVAR(CMSG_SPACE_doc,
5200"CMSG_SPACE(length) -> buffer size\n\
5201\n\
5202Return the buffer size needed for recvmsg() to receive an ancillary\n\
5203data item with associated data of the given length, along with any\n\
5204trailing padding. The buffer space needed to receive multiple items\n\
5205is the sum of the CMSG_SPACE() values for their associated data\n\
5206lengths. Raises OverflowError if length is outside the permissible\n\
5207range of values.");
5208#endif /* CMSG_SPACE */
5209#endif /* CMSG_LEN */
5210
5211
Guido van Rossum30a685f1991-06-27 15:51:29 +00005212/* List of functions exported by this module. */
5213
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005214static PyMethodDef socket_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005215 {"gethostbyname", socket_gethostbyname,
5216 METH_VARARGS, gethostbyname_doc},
5217 {"gethostbyname_ex", socket_gethostbyname_ex,
5218 METH_VARARGS, ghbn_ex_doc},
5219 {"gethostbyaddr", socket_gethostbyaddr,
5220 METH_VARARGS, gethostbyaddr_doc},
5221 {"gethostname", socket_gethostname,
5222 METH_NOARGS, gethostname_doc},
Antoine Pitrou061cfb52011-02-28 22:25:22 +00005223#ifdef HAVE_SETHOSTNAME
5224 {"sethostname", socket_sethostname,
5225 METH_VARARGS, sethostname_doc},
5226#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005227 {"getservbyname", socket_getservbyname,
5228 METH_VARARGS, getservbyname_doc},
5229 {"getservbyport", socket_getservbyport,
5230 METH_VARARGS, getservbyport_doc},
5231 {"getprotobyname", socket_getprotobyname,
5232 METH_VARARGS, getprotobyname_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005233#ifndef NO_DUP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005234 {"dup", socket_dup,
5235 METH_O, dup_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005236#endif
Dave Cole331708b2004-08-09 04:51:41 +00005237#ifdef HAVE_SOCKETPAIR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005238 {"socketpair", socket_socketpair,
5239 METH_VARARGS, socketpair_doc},
Dave Cole331708b2004-08-09 04:51:41 +00005240#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005241 {"ntohs", socket_ntohs,
5242 METH_VARARGS, ntohs_doc},
5243 {"ntohl", socket_ntohl,
5244 METH_O, ntohl_doc},
5245 {"htons", socket_htons,
5246 METH_VARARGS, htons_doc},
5247 {"htonl", socket_htonl,
5248 METH_O, htonl_doc},
5249 {"inet_aton", socket_inet_aton,
5250 METH_VARARGS, inet_aton_doc},
5251 {"inet_ntoa", socket_inet_ntoa,
5252 METH_VARARGS, inet_ntoa_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005253#ifdef HAVE_INET_PTON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005254 {"inet_pton", socket_inet_pton,
5255 METH_VARARGS, inet_pton_doc},
5256 {"inet_ntop", socket_inet_ntop,
5257 METH_VARARGS, inet_ntop_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005258#endif
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005259 {"getaddrinfo", (PyCFunction)socket_getaddrinfo,
5260 METH_VARARGS | METH_KEYWORDS, getaddrinfo_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005261 {"getnameinfo", socket_getnameinfo,
5262 METH_VARARGS, getnameinfo_doc},
5263 {"getdefaulttimeout", (PyCFunction)socket_getdefaulttimeout,
5264 METH_NOARGS, getdefaulttimeout_doc},
5265 {"setdefaulttimeout", socket_setdefaulttimeout,
5266 METH_O, setdefaulttimeout_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005267#ifdef HAVE_IF_NAMEINDEX
5268 {"if_nameindex", socket_if_nameindex,
5269 METH_NOARGS, if_nameindex_doc},
5270 {"if_nametoindex", socket_if_nametoindex,
Charles-François Natali60713592011-05-20 16:55:06 +02005271 METH_VARARGS, if_nametoindex_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005272 {"if_indextoname", socket_if_indextoname,
5273 METH_O, if_indextoname_doc},
5274#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005275#ifdef CMSG_LEN
5276 {"CMSG_LEN", socket_CMSG_LEN,
5277 METH_VARARGS, CMSG_LEN_doc},
5278#ifdef CMSG_SPACE
5279 {"CMSG_SPACE", socket_CMSG_SPACE,
5280 METH_VARARGS, CMSG_SPACE_doc},
5281#endif
5282#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005283 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005284};
5285
Guido van Rossum30a685f1991-06-27 15:51:29 +00005286
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005287#ifdef MS_WINDOWS
5288#define OS_INIT_DEFINED
5289
5290/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00005291
5292static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005293os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00005294{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005295 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00005296}
5297
5298static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005299os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00005300{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005301 WSADATA WSAData;
5302 int ret;
5303 ret = WSAStartup(0x0101, &WSAData);
5304 switch (ret) {
5305 case 0: /* No error */
5306 Py_AtExit(os_cleanup);
5307 return 1; /* Success */
5308 case WSASYSNOTREADY:
5309 PyErr_SetString(PyExc_ImportError,
5310 "WSAStartup failed: network not ready");
5311 break;
5312 case WSAVERNOTSUPPORTED:
5313 case WSAEINVAL:
5314 PyErr_SetString(
5315 PyExc_ImportError,
5316 "WSAStartup failed: requested version not supported");
5317 break;
5318 default:
5319 PyErr_Format(PyExc_ImportError, "WSAStartup failed: error code %d", ret);
5320 break;
5321 }
5322 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00005323}
5324
Guido van Rossum8d665e61996-06-26 18:22:49 +00005325#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00005326
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005327
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005328#ifdef PYOS_OS2
5329#define OS_INIT_DEFINED
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005330
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005331/* Additional initialization for OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005332
5333static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005334os_init(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005335{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005336#ifndef PYCC_GCC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005337 int rc = sock_init();
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005338
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005339 if (rc == 0) {
5340 return 1; /* Success */
5341 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005342
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005343 PyErr_Format(PyExc_ImportError, "OS/2 TCP/IP Error# %d", sock_errno());
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005344
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005345 return 0; /* Failure */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00005346#else
Ezio Melotti13925002011-03-16 11:05:33 +02005347 /* No need to initialize sockets with GCC/EMX */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005348 return 1; /* Success */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00005349#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005350}
5351
5352#endif /* PYOS_OS2 */
5353
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005354
5355#ifndef OS_INIT_DEFINED
5356static int
5357os_init(void)
5358{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005359 return 1; /* Success */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005360}
5361#endif
5362
5363
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005364/* C API table - always add new things to the end for binary
5365 compatibility. */
5366static
5367PySocketModule_APIObject PySocketModuleAPI =
5368{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005369 &sock_type,
Antoine Pitrouc4df7842010-12-03 19:59:41 +00005370 NULL,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005371 NULL
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005372};
5373
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005374
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005375/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005376
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005377 This module is actually called "_socket", and there's a wrapper
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005378 "socket.py" which implements some additional functionality.
5379 The import of "_socket" may fail with an ImportError exception if
5380 os-specific initialization fails. On Windows, this does WINSOCK
Ezio Melotti13925002011-03-16 11:05:33 +02005381 initialization. When WINSOCK is initialized successfully, a call to
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005382 WSACleanup() is scheduled to be made at exit time.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005383*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005384
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005385PyDoc_STRVAR(socket_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005386"Implementation module for socket operations.\n\
5387\n\
5388See the socket module for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005389
Martin v. Löwis1a214512008-06-11 05:26:20 +00005390static struct PyModuleDef socketmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005391 PyModuleDef_HEAD_INIT,
5392 PySocket_MODULE_NAME,
5393 socket_doc,
5394 -1,
5395 socket_methods,
5396 NULL,
5397 NULL,
5398 NULL,
5399 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00005400};
5401
Mark Hammondfe51c6d2002-08-02 02:27:13 +00005402PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00005403PyInit__socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005404{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005405 PyObject *m, *has_ipv6;
Fred Drake4baedc12002-04-01 14:53:37 +00005406
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005407 if (!os_init())
5408 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005409
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005410 Py_TYPE(&sock_type) = &PyType_Type;
5411 m = PyModule_Create(&socketmodule);
5412 if (m == NULL)
5413 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005414
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005415 Py_INCREF(PyExc_OSError);
5416 PySocketModuleAPI.error = PyExc_OSError;
5417 Py_INCREF(PyExc_OSError);
5418 PyModule_AddObject(m, "error", PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005419 socket_herror = PyErr_NewException("socket.herror",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005420 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005421 if (socket_herror == NULL)
5422 return NULL;
5423 Py_INCREF(socket_herror);
5424 PyModule_AddObject(m, "herror", socket_herror);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005425 socket_gaierror = PyErr_NewException("socket.gaierror", PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005426 NULL);
5427 if (socket_gaierror == NULL)
5428 return NULL;
5429 Py_INCREF(socket_gaierror);
5430 PyModule_AddObject(m, "gaierror", socket_gaierror);
5431 socket_timeout = PyErr_NewException("socket.timeout",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005432 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005433 if (socket_timeout == NULL)
5434 return NULL;
Antoine Pitrouc4df7842010-12-03 19:59:41 +00005435 PySocketModuleAPI.timeout_error = socket_timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005436 Py_INCREF(socket_timeout);
5437 PyModule_AddObject(m, "timeout", socket_timeout);
5438 Py_INCREF((PyObject *)&sock_type);
5439 if (PyModule_AddObject(m, "SocketType",
5440 (PyObject *)&sock_type) != 0)
5441 return NULL;
5442 Py_INCREF((PyObject *)&sock_type);
5443 if (PyModule_AddObject(m, "socket",
5444 (PyObject *)&sock_type) != 0)
5445 return NULL;
Guido van Rossum09be4091999-08-09 14:40:40 +00005446
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005447#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005448 has_ipv6 = Py_True;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005449#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005450 has_ipv6 = Py_False;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005451#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005452 Py_INCREF(has_ipv6);
5453 PyModule_AddObject(m, "has_ipv6", has_ipv6);
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005454
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005455 /* Export C API */
5456 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
5457 PyCapsule_New(&PySocketModuleAPI, PySocket_CAPSULE_NAME, NULL)
5458 ) != 0)
5459 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005460
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005461 /* Address families (we only support AF_INET and AF_UNIX) */
Guido van Rossum09be4091999-08-09 14:40:40 +00005462#ifdef AF_UNSPEC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005463 PyModule_AddIntConstant(m, "AF_UNSPEC", AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00005464#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005465 PyModule_AddIntConstant(m, "AF_INET", AF_INET);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005466#ifdef AF_INET6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005467 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005468#endif /* AF_INET6 */
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00005469#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005470 PyModule_AddIntConstant(m, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00005471#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00005472#ifdef AF_AX25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005473 /* Amateur Radio AX.25 */
5474 PyModule_AddIntConstant(m, "AF_AX25", AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00005475#endif
5476#ifdef AF_IPX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005477 PyModule_AddIntConstant(m, "AF_IPX", AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00005478#endif
5479#ifdef AF_APPLETALK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005480 /* Appletalk DDP */
5481 PyModule_AddIntConstant(m, "AF_APPLETALK", AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00005482#endif
5483#ifdef AF_NETROM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005484 /* Amateur radio NetROM */
5485 PyModule_AddIntConstant(m, "AF_NETROM", AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00005486#endif
5487#ifdef AF_BRIDGE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005488 /* Multiprotocol bridge */
5489 PyModule_AddIntConstant(m, "AF_BRIDGE", AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00005490#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005491#ifdef AF_ATMPVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005492 /* ATM PVCs */
5493 PyModule_AddIntConstant(m, "AF_ATMPVC", AF_ATMPVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005494#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00005495#ifdef AF_AAL5
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005496 /* Reserved for Werner's ATM */
5497 PyModule_AddIntConstant(m, "AF_AAL5", AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00005498#endif
5499#ifdef AF_X25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005500 /* Reserved for X.25 project */
5501 PyModule_AddIntConstant(m, "AF_X25", AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00005502#endif
5503#ifdef AF_INET6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005504 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00005505#endif
5506#ifdef AF_ROSE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005507 /* Amateur Radio X.25 PLP */
5508 PyModule_AddIntConstant(m, "AF_ROSE", AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00005509#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005510#ifdef AF_DECnet
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005511 /* Reserved for DECnet project */
5512 PyModule_AddIntConstant(m, "AF_DECnet", AF_DECnet);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005513#endif
5514#ifdef AF_NETBEUI
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005515 /* Reserved for 802.2LLC project */
5516 PyModule_AddIntConstant(m, "AF_NETBEUI", AF_NETBEUI);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005517#endif
5518#ifdef AF_SECURITY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005519 /* Security callback pseudo AF */
5520 PyModule_AddIntConstant(m, "AF_SECURITY", AF_SECURITY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005521#endif
5522#ifdef AF_KEY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005523 /* PF_KEY key management API */
5524 PyModule_AddIntConstant(m, "AF_KEY", AF_KEY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005525#endif
5526#ifdef AF_NETLINK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005527 /* */
5528 PyModule_AddIntConstant(m, "AF_NETLINK", AF_NETLINK);
5529 PyModule_AddIntConstant(m, "NETLINK_ROUTE", NETLINK_ROUTE);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005530#ifdef NETLINK_SKIP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005531 PyModule_AddIntConstant(m, "NETLINK_SKIP", NETLINK_SKIP);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005532#endif
5533#ifdef NETLINK_W1
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005534 PyModule_AddIntConstant(m, "NETLINK_W1", NETLINK_W1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005535#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005536 PyModule_AddIntConstant(m, "NETLINK_USERSOCK", NETLINK_USERSOCK);
5537 PyModule_AddIntConstant(m, "NETLINK_FIREWALL", NETLINK_FIREWALL);
Guido van Rossum668a94a2006-02-21 01:07:27 +00005538#ifdef NETLINK_TCPDIAG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005539 PyModule_AddIntConstant(m, "NETLINK_TCPDIAG", NETLINK_TCPDIAG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00005540#endif
5541#ifdef NETLINK_NFLOG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005542 PyModule_AddIntConstant(m, "NETLINK_NFLOG", NETLINK_NFLOG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00005543#endif
Neal Norwitz65851662006-01-16 04:31:40 +00005544#ifdef NETLINK_XFRM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005545 PyModule_AddIntConstant(m, "NETLINK_XFRM", NETLINK_XFRM);
Neal Norwitz65851662006-01-16 04:31:40 +00005546#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005547#ifdef NETLINK_ARPD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005548 PyModule_AddIntConstant(m, "NETLINK_ARPD", NETLINK_ARPD);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005549#endif
5550#ifdef NETLINK_ROUTE6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005551 PyModule_AddIntConstant(m, "NETLINK_ROUTE6", NETLINK_ROUTE6);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005552#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005553 PyModule_AddIntConstant(m, "NETLINK_IP6_FW", NETLINK_IP6_FW);
Thomas Wouterscf297e42007-02-23 15:07:44 +00005554#ifdef NETLINK_DNRTMSG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005555 PyModule_AddIntConstant(m, "NETLINK_DNRTMSG", NETLINK_DNRTMSG);
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005556#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005557#ifdef NETLINK_TAPBASE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005558 PyModule_AddIntConstant(m, "NETLINK_TAPBASE", NETLINK_TAPBASE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005559#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005560#endif /* AF_NETLINK */
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005561#ifdef AF_ROUTE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005562 /* Alias to emulate 4.4BSD */
5563 PyModule_AddIntConstant(m, "AF_ROUTE", AF_ROUTE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005564#endif
5565#ifdef AF_ASH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005566 /* Ash */
5567 PyModule_AddIntConstant(m, "AF_ASH", AF_ASH);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005568#endif
5569#ifdef AF_ECONET
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005570 /* Acorn Econet */
5571 PyModule_AddIntConstant(m, "AF_ECONET", AF_ECONET);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005572#endif
5573#ifdef AF_ATMSVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005574 /* ATM SVCs */
5575 PyModule_AddIntConstant(m, "AF_ATMSVC", AF_ATMSVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005576#endif
5577#ifdef AF_SNA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005578 /* Linux SNA Project (nutters!) */
5579 PyModule_AddIntConstant(m, "AF_SNA", AF_SNA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005580#endif
5581#ifdef AF_IRDA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005582 /* IRDA sockets */
5583 PyModule_AddIntConstant(m, "AF_IRDA", AF_IRDA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005584#endif
5585#ifdef AF_PPPOX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005586 /* PPPoX sockets */
5587 PyModule_AddIntConstant(m, "AF_PPPOX", AF_PPPOX);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005588#endif
5589#ifdef AF_WANPIPE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005590 /* Wanpipe API Sockets */
5591 PyModule_AddIntConstant(m, "AF_WANPIPE", AF_WANPIPE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005592#endif
5593#ifdef AF_LLC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005594 /* Linux LLC */
5595 PyModule_AddIntConstant(m, "AF_LLC", AF_LLC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005596#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00005597
Hye-Shik Chang81268602004-02-02 06:05:24 +00005598#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005599 PyModule_AddIntConstant(m, "AF_BLUETOOTH", AF_BLUETOOTH);
5600 PyModule_AddIntConstant(m, "BTPROTO_L2CAP", BTPROTO_L2CAP);
5601 PyModule_AddIntConstant(m, "BTPROTO_HCI", BTPROTO_HCI);
5602 PyModule_AddIntConstant(m, "SOL_HCI", SOL_HCI);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00005603#if !defined(__NetBSD__) && !defined(__DragonFly__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005604 PyModule_AddIntConstant(m, "HCI_FILTER", HCI_FILTER);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00005605#endif
Hye-Shik Chang81268602004-02-02 06:05:24 +00005606#if !defined(__FreeBSD__)
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00005607#if !defined(__NetBSD__) && !defined(__DragonFly__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005608 PyModule_AddIntConstant(m, "HCI_TIME_STAMP", HCI_TIME_STAMP);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00005609#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005610 PyModule_AddIntConstant(m, "HCI_DATA_DIR", HCI_DATA_DIR);
5611 PyModule_AddIntConstant(m, "BTPROTO_SCO", BTPROTO_SCO);
Hye-Shik Chang81268602004-02-02 06:05:24 +00005612#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005613 PyModule_AddIntConstant(m, "BTPROTO_RFCOMM", BTPROTO_RFCOMM);
5614 PyModule_AddStringConstant(m, "BDADDR_ANY", "00:00:00:00:00:00");
5615 PyModule_AddStringConstant(m, "BDADDR_LOCAL", "00:00:00:FF:FF:FF");
Martin v. Löwis12af0482004-01-31 12:34:17 +00005616#endif
5617
Charles-François Natali47413c12011-10-06 19:47:44 +02005618#ifdef AF_CAN
5619 /* Controller Area Network */
5620 PyModule_AddIntConstant(m, "AF_CAN", AF_CAN);
5621#endif
5622#ifdef PF_CAN
5623 /* Controller Area Network */
5624 PyModule_AddIntConstant(m, "PF_CAN", PF_CAN);
5625#endif
5626
Charles-François Natali10b8cf42011-11-10 19:21:37 +01005627/* Reliable Datagram Sockets */
5628#ifdef AF_RDS
5629 PyModule_AddIntConstant(m, "AF_RDS", AF_RDS);
5630#endif
5631#ifdef PF_RDS
5632 PyModule_AddIntConstant(m, "PF_RDS", PF_RDS);
5633#endif
5634
Antoine Pitroub156a462010-10-27 20:13:57 +00005635#ifdef AF_PACKET
5636 PyModule_AddIntMacro(m, AF_PACKET);
5637#endif
5638#ifdef PF_PACKET
5639 PyModule_AddIntMacro(m, PF_PACKET);
5640#endif
5641#ifdef PACKET_HOST
5642 PyModule_AddIntMacro(m, PACKET_HOST);
5643#endif
5644#ifdef PACKET_BROADCAST
5645 PyModule_AddIntMacro(m, PACKET_BROADCAST);
5646#endif
5647#ifdef PACKET_MULTICAST
5648 PyModule_AddIntMacro(m, PACKET_MULTICAST);
5649#endif
5650#ifdef PACKET_OTHERHOST
5651 PyModule_AddIntMacro(m, PACKET_OTHERHOST);
5652#endif
5653#ifdef PACKET_OUTGOING
5654 PyModule_AddIntMacro(m, PACKET_OUTGOING);
5655#endif
5656#ifdef PACKET_LOOPBACK
5657 PyModule_AddIntMacro(m, PACKET_LOOPBACK);
5658#endif
5659#ifdef PACKET_FASTROUTE
5660 PyModule_AddIntMacro(m, PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00005661#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00005662
Christian Heimes043d6f62008-01-07 17:19:16 +00005663#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005664 PyModule_AddIntConstant(m, "AF_TIPC", AF_TIPC);
Christian Heimes043d6f62008-01-07 17:19:16 +00005665
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005666 /* for addresses */
5667 PyModule_AddIntConstant(m, "TIPC_ADDR_NAMESEQ", TIPC_ADDR_NAMESEQ);
5668 PyModule_AddIntConstant(m, "TIPC_ADDR_NAME", TIPC_ADDR_NAME);
5669 PyModule_AddIntConstant(m, "TIPC_ADDR_ID", TIPC_ADDR_ID);
Christian Heimes043d6f62008-01-07 17:19:16 +00005670
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005671 PyModule_AddIntConstant(m, "TIPC_ZONE_SCOPE", TIPC_ZONE_SCOPE);
5672 PyModule_AddIntConstant(m, "TIPC_CLUSTER_SCOPE", TIPC_CLUSTER_SCOPE);
5673 PyModule_AddIntConstant(m, "TIPC_NODE_SCOPE", TIPC_NODE_SCOPE);
Christian Heimes043d6f62008-01-07 17:19:16 +00005674
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005675 /* for setsockopt() */
5676 PyModule_AddIntConstant(m, "SOL_TIPC", SOL_TIPC);
5677 PyModule_AddIntConstant(m, "TIPC_IMPORTANCE", TIPC_IMPORTANCE);
5678 PyModule_AddIntConstant(m, "TIPC_SRC_DROPPABLE", TIPC_SRC_DROPPABLE);
5679 PyModule_AddIntConstant(m, "TIPC_DEST_DROPPABLE",
5680 TIPC_DEST_DROPPABLE);
5681 PyModule_AddIntConstant(m, "TIPC_CONN_TIMEOUT", TIPC_CONN_TIMEOUT);
Christian Heimes043d6f62008-01-07 17:19:16 +00005682
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005683 PyModule_AddIntConstant(m, "TIPC_LOW_IMPORTANCE",
5684 TIPC_LOW_IMPORTANCE);
5685 PyModule_AddIntConstant(m, "TIPC_MEDIUM_IMPORTANCE",
5686 TIPC_MEDIUM_IMPORTANCE);
5687 PyModule_AddIntConstant(m, "TIPC_HIGH_IMPORTANCE",
5688 TIPC_HIGH_IMPORTANCE);
5689 PyModule_AddIntConstant(m, "TIPC_CRITICAL_IMPORTANCE",
5690 TIPC_CRITICAL_IMPORTANCE);
Christian Heimes043d6f62008-01-07 17:19:16 +00005691
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005692 /* for subscriptions */
5693 PyModule_AddIntConstant(m, "TIPC_SUB_PORTS", TIPC_SUB_PORTS);
5694 PyModule_AddIntConstant(m, "TIPC_SUB_SERVICE", TIPC_SUB_SERVICE);
Christian Heimes25bb7832008-01-11 16:17:00 +00005695#ifdef TIPC_SUB_CANCEL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005696 /* doesn't seem to be available everywhere */
5697 PyModule_AddIntConstant(m, "TIPC_SUB_CANCEL", TIPC_SUB_CANCEL);
Christian Heimes25bb7832008-01-11 16:17:00 +00005698#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005699 PyModule_AddIntConstant(m, "TIPC_WAIT_FOREVER", TIPC_WAIT_FOREVER);
5700 PyModule_AddIntConstant(m, "TIPC_PUBLISHED", TIPC_PUBLISHED);
5701 PyModule_AddIntConstant(m, "TIPC_WITHDRAWN", TIPC_WITHDRAWN);
5702 PyModule_AddIntConstant(m, "TIPC_SUBSCR_TIMEOUT", TIPC_SUBSCR_TIMEOUT);
5703 PyModule_AddIntConstant(m, "TIPC_CFG_SRV", TIPC_CFG_SRV);
5704 PyModule_AddIntConstant(m, "TIPC_TOP_SRV", TIPC_TOP_SRV);
Christian Heimes043d6f62008-01-07 17:19:16 +00005705#endif
5706
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005707 /* Socket types */
5708 PyModule_AddIntConstant(m, "SOCK_STREAM", SOCK_STREAM);
5709 PyModule_AddIntConstant(m, "SOCK_DGRAM", SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00005710/* We have incomplete socket support. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005711 PyModule_AddIntConstant(m, "SOCK_RAW", SOCK_RAW);
5712 PyModule_AddIntConstant(m, "SOCK_SEQPACKET", SOCK_SEQPACKET);
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00005713#if defined(SOCK_RDM)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005714 PyModule_AddIntConstant(m, "SOCK_RDM", SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00005715#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +00005716#ifdef SOCK_CLOEXEC
5717 PyModule_AddIntConstant(m, "SOCK_CLOEXEC", SOCK_CLOEXEC);
5718#endif
5719#ifdef SOCK_NONBLOCK
5720 PyModule_AddIntConstant(m, "SOCK_NONBLOCK", SOCK_NONBLOCK);
5721#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005722
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005723#ifdef SO_DEBUG
5724 PyModule_AddIntConstant(m, "SO_DEBUG", SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005725#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005726#ifdef SO_ACCEPTCONN
5727 PyModule_AddIntConstant(m, "SO_ACCEPTCONN", SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005728#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005729#ifdef SO_REUSEADDR
5730 PyModule_AddIntConstant(m, "SO_REUSEADDR", SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005731#endif
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00005732#ifdef SO_EXCLUSIVEADDRUSE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005733 PyModule_AddIntConstant(m, "SO_EXCLUSIVEADDRUSE", SO_EXCLUSIVEADDRUSE);
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00005734#endif
5735
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005736#ifdef SO_KEEPALIVE
5737 PyModule_AddIntConstant(m, "SO_KEEPALIVE", SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005738#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005739#ifdef SO_DONTROUTE
5740 PyModule_AddIntConstant(m, "SO_DONTROUTE", SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005741#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005742#ifdef SO_BROADCAST
5743 PyModule_AddIntConstant(m, "SO_BROADCAST", SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005744#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005745#ifdef SO_USELOOPBACK
5746 PyModule_AddIntConstant(m, "SO_USELOOPBACK", SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005747#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005748#ifdef SO_LINGER
5749 PyModule_AddIntConstant(m, "SO_LINGER", SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005750#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005751#ifdef SO_OOBINLINE
5752 PyModule_AddIntConstant(m, "SO_OOBINLINE", SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005753#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005754#ifdef SO_REUSEPORT
5755 PyModule_AddIntConstant(m, "SO_REUSEPORT", SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005756#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005757#ifdef SO_SNDBUF
5758 PyModule_AddIntConstant(m, "SO_SNDBUF", SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005759#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005760#ifdef SO_RCVBUF
5761 PyModule_AddIntConstant(m, "SO_RCVBUF", SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005762#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005763#ifdef SO_SNDLOWAT
5764 PyModule_AddIntConstant(m, "SO_SNDLOWAT", SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005765#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005766#ifdef SO_RCVLOWAT
5767 PyModule_AddIntConstant(m, "SO_RCVLOWAT", SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005768#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005769#ifdef SO_SNDTIMEO
5770 PyModule_AddIntConstant(m, "SO_SNDTIMEO", SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005771#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005772#ifdef SO_RCVTIMEO
5773 PyModule_AddIntConstant(m, "SO_RCVTIMEO", SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005774#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005775#ifdef SO_ERROR
5776 PyModule_AddIntConstant(m, "SO_ERROR", SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005777#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005778#ifdef SO_TYPE
5779 PyModule_AddIntConstant(m, "SO_TYPE", SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005780#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005781#ifdef SO_SETFIB
5782 PyModule_AddIntConstant(m, "SO_SETFIB", SO_SETFIB);
Larry Hastingsf0f37952010-04-02 11:47:10 +00005783#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005784#ifdef SO_PASSCRED
5785 PyModule_AddIntConstant(m, "SO_PASSCRED", SO_PASSCRED);
5786#endif
5787#ifdef SO_PEERCRED
5788 PyModule_AddIntConstant(m, "SO_PEERCRED", SO_PEERCRED);
5789#endif
5790#ifdef LOCAL_PEERCRED
5791 PyModule_AddIntConstant(m, "LOCAL_PEERCRED", LOCAL_PEERCRED);
5792#endif
Victor Stinnercb98bed2011-10-25 13:45:48 +02005793#ifdef SO_BINDTODEVICE
5794 PyModule_AddIntMacro(m, SO_BINDTODEVICE);
5795#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005796
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005797 /* Maximum number of connections for "listen" */
5798#ifdef SOMAXCONN
5799 PyModule_AddIntConstant(m, "SOMAXCONN", SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005800#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005801 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005802#endif
5803
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005804 /* Ancilliary message types */
5805#ifdef SCM_RIGHTS
5806 PyModule_AddIntConstant(m, "SCM_RIGHTS", SCM_RIGHTS);
5807#endif
5808#ifdef SCM_CREDENTIALS
5809 PyModule_AddIntConstant(m, "SCM_CREDENTIALS", SCM_CREDENTIALS);
5810#endif
5811#ifdef SCM_CREDS
5812 PyModule_AddIntConstant(m, "SCM_CREDS", SCM_CREDS);
5813#endif
5814
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005815 /* Flags for send, recv */
5816#ifdef MSG_OOB
5817 PyModule_AddIntConstant(m, "MSG_OOB", MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005818#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005819#ifdef MSG_PEEK
5820 PyModule_AddIntConstant(m, "MSG_PEEK", MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005821#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005822#ifdef MSG_DONTROUTE
5823 PyModule_AddIntConstant(m, "MSG_DONTROUTE", MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005824#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005825#ifdef MSG_DONTWAIT
5826 PyModule_AddIntConstant(m, "MSG_DONTWAIT", MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00005827#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005828#ifdef MSG_EOR
5829 PyModule_AddIntConstant(m, "MSG_EOR", MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005830#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005831#ifdef MSG_TRUNC
5832 PyModule_AddIntConstant(m, "MSG_TRUNC", MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005833#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005834#ifdef MSG_CTRUNC
5835 PyModule_AddIntConstant(m, "MSG_CTRUNC", MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005836#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005837#ifdef MSG_WAITALL
5838 PyModule_AddIntConstant(m, "MSG_WAITALL", MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005839#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005840#ifdef MSG_BTAG
5841 PyModule_AddIntConstant(m, "MSG_BTAG", MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005842#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005843#ifdef MSG_ETAG
5844 PyModule_AddIntConstant(m, "MSG_ETAG", MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005845#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005846#ifdef MSG_NOSIGNAL
5847 PyModule_AddIntConstant(m, "MSG_NOSIGNAL", MSG_NOSIGNAL);
5848#endif
5849#ifdef MSG_NOTIFICATION
5850 PyModule_AddIntConstant(m, "MSG_NOTIFICATION", MSG_NOTIFICATION);
5851#endif
5852#ifdef MSG_CMSG_CLOEXEC
5853 PyModule_AddIntConstant(m, "MSG_CMSG_CLOEXEC", MSG_CMSG_CLOEXEC);
5854#endif
5855#ifdef MSG_ERRQUEUE
5856 PyModule_AddIntConstant(m, "MSG_ERRQUEUE", MSG_ERRQUEUE);
5857#endif
5858#ifdef MSG_CONFIRM
5859 PyModule_AddIntConstant(m, "MSG_CONFIRM", MSG_CONFIRM);
5860#endif
5861#ifdef MSG_MORE
5862 PyModule_AddIntConstant(m, "MSG_MORE", MSG_MORE);
5863#endif
5864#ifdef MSG_EOF
5865 PyModule_AddIntConstant(m, "MSG_EOF", MSG_EOF);
5866#endif
5867#ifdef MSG_BCAST
5868 PyModule_AddIntConstant(m, "MSG_BCAST", MSG_BCAST);
5869#endif
5870#ifdef MSG_MCAST
5871 PyModule_AddIntConstant(m, "MSG_MCAST", MSG_MCAST);
5872#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005873
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005874 /* Protocol level and numbers, usable for [gs]etsockopt */
5875#ifdef SOL_SOCKET
5876 PyModule_AddIntConstant(m, "SOL_SOCKET", SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005877#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005878#ifdef SOL_IP
5879 PyModule_AddIntConstant(m, "SOL_IP", SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00005880#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005881 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00005882#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005883#ifdef SOL_IPX
5884 PyModule_AddIntConstant(m, "SOL_IPX", SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00005885#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005886#ifdef SOL_AX25
5887 PyModule_AddIntConstant(m, "SOL_AX25", SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00005888#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005889#ifdef SOL_ATALK
5890 PyModule_AddIntConstant(m, "SOL_ATALK", SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00005891#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005892#ifdef SOL_NETROM
5893 PyModule_AddIntConstant(m, "SOL_NETROM", SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00005894#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005895#ifdef SOL_ROSE
5896 PyModule_AddIntConstant(m, "SOL_ROSE", SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00005897#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005898#ifdef SOL_TCP
5899 PyModule_AddIntConstant(m, "SOL_TCP", SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00005900#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005901 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00005902#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005903#ifdef SOL_UDP
5904 PyModule_AddIntConstant(m, "SOL_UDP", SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00005905#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005906 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00005907#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02005908#ifdef SOL_CAN_BASE
5909 PyModule_AddIntConstant(m, "SOL_CAN_BASE", SOL_CAN_BASE);
5910#endif
5911#ifdef SOL_CAN_RAW
5912 PyModule_AddIntConstant(m, "SOL_CAN_RAW", SOL_CAN_RAW);
5913 PyModule_AddIntConstant(m, "CAN_RAW", CAN_RAW);
5914#endif
5915#ifdef HAVE_LINUX_CAN_H
5916 PyModule_AddIntConstant(m, "CAN_EFF_FLAG", CAN_EFF_FLAG);
5917 PyModule_AddIntConstant(m, "CAN_RTR_FLAG", CAN_RTR_FLAG);
5918 PyModule_AddIntConstant(m, "CAN_ERR_FLAG", CAN_ERR_FLAG);
5919
5920 PyModule_AddIntConstant(m, "CAN_SFF_MASK", CAN_SFF_MASK);
5921 PyModule_AddIntConstant(m, "CAN_EFF_MASK", CAN_EFF_MASK);
5922 PyModule_AddIntConstant(m, "CAN_ERR_MASK", CAN_ERR_MASK);
5923#endif
5924#ifdef HAVE_LINUX_CAN_RAW_H
5925 PyModule_AddIntConstant(m, "CAN_RAW_FILTER", CAN_RAW_FILTER);
5926 PyModule_AddIntConstant(m, "CAN_RAW_ERR_FILTER", CAN_RAW_ERR_FILTER);
5927 PyModule_AddIntConstant(m, "CAN_RAW_LOOPBACK", CAN_RAW_LOOPBACK);
5928 PyModule_AddIntConstant(m, "CAN_RAW_RECV_OWN_MSGS", CAN_RAW_RECV_OWN_MSGS);
5929#endif
Charles-François Natali10b8cf42011-11-10 19:21:37 +01005930#ifdef SOL_RDS
5931 PyModule_AddIntConstant(m, "SOL_RDS", SOL_RDS);
5932#endif
5933#ifdef RDS_CANCEL_SENT_TO
5934 PyModule_AddIntConstant(m, "RDS_CANCEL_SENT_TO", RDS_CANCEL_SENT_TO);
5935#endif
5936#ifdef RDS_GET_MR
5937 PyModule_AddIntConstant(m, "RDS_GET_MR", RDS_GET_MR);
5938#endif
5939#ifdef RDS_FREE_MR
5940 PyModule_AddIntConstant(m, "RDS_FREE_MR", RDS_FREE_MR);
5941#endif
5942#ifdef RDS_RECVERR
5943 PyModule_AddIntConstant(m, "RDS_RECVERR", RDS_RECVERR);
5944#endif
5945#ifdef RDS_CONG_MONITOR
5946 PyModule_AddIntConstant(m, "RDS_CONG_MONITOR", RDS_CONG_MONITOR);
5947#endif
5948#ifdef RDS_GET_MR_FOR_DEST
5949 PyModule_AddIntConstant(m, "RDS_GET_MR_FOR_DEST", RDS_GET_MR_FOR_DEST);
5950#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005951#ifdef IPPROTO_IP
5952 PyModule_AddIntConstant(m, "IPPROTO_IP", IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00005953#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005954 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005955#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005956#ifdef IPPROTO_HOPOPTS
5957 PyModule_AddIntConstant(m, "IPPROTO_HOPOPTS", IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005958#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005959#ifdef IPPROTO_ICMP
5960 PyModule_AddIntConstant(m, "IPPROTO_ICMP", IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00005961#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005962 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005963#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005964#ifdef IPPROTO_IGMP
5965 PyModule_AddIntConstant(m, "IPPROTO_IGMP", IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005966#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005967#ifdef IPPROTO_GGP
5968 PyModule_AddIntConstant(m, "IPPROTO_GGP", IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005969#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005970#ifdef IPPROTO_IPV4
5971 PyModule_AddIntConstant(m, "IPPROTO_IPV4", IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005972#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005973#ifdef IPPROTO_IPV6
5974 PyModule_AddIntConstant(m, "IPPROTO_IPV6", IPPROTO_IPV6);
Martin v. Löwisa0f17342003-10-03 13:56:20 +00005975#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005976#ifdef IPPROTO_IPIP
5977 PyModule_AddIntConstant(m, "IPPROTO_IPIP", IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005978#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005979#ifdef IPPROTO_TCP
5980 PyModule_AddIntConstant(m, "IPPROTO_TCP", IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00005981#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005982 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005983#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005984#ifdef IPPROTO_EGP
5985 PyModule_AddIntConstant(m, "IPPROTO_EGP", IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005986#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005987#ifdef IPPROTO_PUP
5988 PyModule_AddIntConstant(m, "IPPROTO_PUP", IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005989#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005990#ifdef IPPROTO_UDP
5991 PyModule_AddIntConstant(m, "IPPROTO_UDP", IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00005992#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005993 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005994#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005995#ifdef IPPROTO_IDP
5996 PyModule_AddIntConstant(m, "IPPROTO_IDP", IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005997#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005998#ifdef IPPROTO_HELLO
5999 PyModule_AddIntConstant(m, "IPPROTO_HELLO", IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006000#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006001#ifdef IPPROTO_ND
6002 PyModule_AddIntConstant(m, "IPPROTO_ND", IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006003#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006004#ifdef IPPROTO_TP
6005 PyModule_AddIntConstant(m, "IPPROTO_TP", IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006006#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006007#ifdef IPPROTO_IPV6
6008 PyModule_AddIntConstant(m, "IPPROTO_IPV6", IPPROTO_IPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006009#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006010#ifdef IPPROTO_ROUTING
6011 PyModule_AddIntConstant(m, "IPPROTO_ROUTING", IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006012#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006013#ifdef IPPROTO_FRAGMENT
6014 PyModule_AddIntConstant(m, "IPPROTO_FRAGMENT", IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006015#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006016#ifdef IPPROTO_RSVP
6017 PyModule_AddIntConstant(m, "IPPROTO_RSVP", IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006018#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006019#ifdef IPPROTO_GRE
6020 PyModule_AddIntConstant(m, "IPPROTO_GRE", IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006021#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006022#ifdef IPPROTO_ESP
6023 PyModule_AddIntConstant(m, "IPPROTO_ESP", IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006024#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006025#ifdef IPPROTO_AH
6026 PyModule_AddIntConstant(m, "IPPROTO_AH", IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006027#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006028#ifdef IPPROTO_MOBILE
6029 PyModule_AddIntConstant(m, "IPPROTO_MOBILE", IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006030#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006031#ifdef IPPROTO_ICMPV6
6032 PyModule_AddIntConstant(m, "IPPROTO_ICMPV6", IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006033#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006034#ifdef IPPROTO_NONE
6035 PyModule_AddIntConstant(m, "IPPROTO_NONE", IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006036#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006037#ifdef IPPROTO_DSTOPTS
6038 PyModule_AddIntConstant(m, "IPPROTO_DSTOPTS", IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006039#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006040#ifdef IPPROTO_XTP
6041 PyModule_AddIntConstant(m, "IPPROTO_XTP", IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006042#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006043#ifdef IPPROTO_EON
6044 PyModule_AddIntConstant(m, "IPPROTO_EON", IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006045#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006046#ifdef IPPROTO_PIM
6047 PyModule_AddIntConstant(m, "IPPROTO_PIM", IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006048#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006049#ifdef IPPROTO_IPCOMP
6050 PyModule_AddIntConstant(m, "IPPROTO_IPCOMP", IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006051#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006052#ifdef IPPROTO_VRRP
6053 PyModule_AddIntConstant(m, "IPPROTO_VRRP", IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006054#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006055#ifdef IPPROTO_SCTP
6056 PyModule_AddIntConstant(m, "IPPROTO_SCTP", IPPROTO_SCTP);
6057#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006058#ifdef IPPROTO_BIP
6059 PyModule_AddIntConstant(m, "IPPROTO_BIP", IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006060#endif
6061/**/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006062#ifdef IPPROTO_RAW
6063 PyModule_AddIntConstant(m, "IPPROTO_RAW", IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00006064#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006065 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006066#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006067#ifdef IPPROTO_MAX
6068 PyModule_AddIntConstant(m, "IPPROTO_MAX", IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006069#endif
6070
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006071 /* Some port configuration */
6072#ifdef IPPORT_RESERVED
6073 PyModule_AddIntConstant(m, "IPPORT_RESERVED", IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006074#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006075 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006076#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006077#ifdef IPPORT_USERRESERVED
6078 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006079#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006080 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006081#endif
6082
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006083 /* Some reserved IP v.4 addresses */
6084#ifdef INADDR_ANY
6085 PyModule_AddIntConstant(m, "INADDR_ANY", INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006086#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006087 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006088#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006089#ifdef INADDR_BROADCAST
6090 PyModule_AddIntConstant(m, "INADDR_BROADCAST", INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006091#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006092 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006093#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006094#ifdef INADDR_LOOPBACK
6095 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006096#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006097 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006098#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006099#ifdef INADDR_UNSPEC_GROUP
6100 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006101#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006102 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006103#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006104#ifdef INADDR_ALLHOSTS_GROUP
6105 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
6106 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006107#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006108 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006109#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006110#ifdef INADDR_MAX_LOCAL_GROUP
6111 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP",
6112 INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006113#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006114 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006115#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006116#ifdef INADDR_NONE
6117 PyModule_AddIntConstant(m, "INADDR_NONE", INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006118#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006119 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006120#endif
6121
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006122 /* IPv4 [gs]etsockopt options */
6123#ifdef IP_OPTIONS
6124 PyModule_AddIntConstant(m, "IP_OPTIONS", IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006125#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006126#ifdef IP_HDRINCL
6127 PyModule_AddIntConstant(m, "IP_HDRINCL", IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006128#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006129#ifdef IP_TOS
6130 PyModule_AddIntConstant(m, "IP_TOS", IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006131#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006132#ifdef IP_TTL
6133 PyModule_AddIntConstant(m, "IP_TTL", IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006134#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006135#ifdef IP_RECVOPTS
6136 PyModule_AddIntConstant(m, "IP_RECVOPTS", IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006137#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006138#ifdef IP_RECVRETOPTS
6139 PyModule_AddIntConstant(m, "IP_RECVRETOPTS", IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006140#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006141#ifdef IP_RECVDSTADDR
6142 PyModule_AddIntConstant(m, "IP_RECVDSTADDR", IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006143#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006144#ifdef IP_RETOPTS
6145 PyModule_AddIntConstant(m, "IP_RETOPTS", IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006146#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006147#ifdef IP_MULTICAST_IF
6148 PyModule_AddIntConstant(m, "IP_MULTICAST_IF", IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006149#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006150#ifdef IP_MULTICAST_TTL
6151 PyModule_AddIntConstant(m, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006152#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006153#ifdef IP_MULTICAST_LOOP
6154 PyModule_AddIntConstant(m, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006155#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006156#ifdef IP_ADD_MEMBERSHIP
6157 PyModule_AddIntConstant(m, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006158#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006159#ifdef IP_DROP_MEMBERSHIP
6160 PyModule_AddIntConstant(m, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006161#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006162#ifdef IP_DEFAULT_MULTICAST_TTL
6163 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_TTL",
6164 IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00006165#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006166#ifdef IP_DEFAULT_MULTICAST_LOOP
6167 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_LOOP",
6168 IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006169#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006170#ifdef IP_MAX_MEMBERSHIPS
6171 PyModule_AddIntConstant(m, "IP_MAX_MEMBERSHIPS", IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00006172#endif
6173
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006174 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
6175#ifdef IPV6_JOIN_GROUP
6176 PyModule_AddIntConstant(m, "IPV6_JOIN_GROUP", IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006177#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006178#ifdef IPV6_LEAVE_GROUP
6179 PyModule_AddIntConstant(m, "IPV6_LEAVE_GROUP", IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006180#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006181#ifdef IPV6_MULTICAST_HOPS
6182 PyModule_AddIntConstant(m, "IPV6_MULTICAST_HOPS", IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006183#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006184#ifdef IPV6_MULTICAST_IF
6185 PyModule_AddIntConstant(m, "IPV6_MULTICAST_IF", IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006186#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006187#ifdef IPV6_MULTICAST_LOOP
6188 PyModule_AddIntConstant(m, "IPV6_MULTICAST_LOOP", IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006189#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006190#ifdef IPV6_UNICAST_HOPS
6191 PyModule_AddIntConstant(m, "IPV6_UNICAST_HOPS", IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006192#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006193 /* Additional IPV6 socket options, defined in RFC 3493 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00006194#ifdef IPV6_V6ONLY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006195 PyModule_AddIntConstant(m, "IPV6_V6ONLY", IPV6_V6ONLY);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006196#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006197 /* Advanced IPV6 socket options, from RFC 3542 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00006198#ifdef IPV6_CHECKSUM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006199 PyModule_AddIntConstant(m, "IPV6_CHECKSUM", IPV6_CHECKSUM);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006200#endif
6201#ifdef IPV6_DONTFRAG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006202 PyModule_AddIntConstant(m, "IPV6_DONTFRAG", IPV6_DONTFRAG);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006203#endif
6204#ifdef IPV6_DSTOPTS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006205 PyModule_AddIntConstant(m, "IPV6_DSTOPTS", IPV6_DSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006206#endif
6207#ifdef IPV6_HOPLIMIT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006208 PyModule_AddIntConstant(m, "IPV6_HOPLIMIT", IPV6_HOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006209#endif
6210#ifdef IPV6_HOPOPTS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006211 PyModule_AddIntConstant(m, "IPV6_HOPOPTS", IPV6_HOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006212#endif
6213#ifdef IPV6_NEXTHOP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006214 PyModule_AddIntConstant(m, "IPV6_NEXTHOP", IPV6_NEXTHOP);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006215#endif
6216#ifdef IPV6_PATHMTU
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006217 PyModule_AddIntConstant(m, "IPV6_PATHMTU", IPV6_PATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006218#endif
6219#ifdef IPV6_PKTINFO
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006220 PyModule_AddIntConstant(m, "IPV6_PKTINFO", IPV6_PKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006221#endif
6222#ifdef IPV6_RECVDSTOPTS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006223 PyModule_AddIntConstant(m, "IPV6_RECVDSTOPTS", IPV6_RECVDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006224#endif
6225#ifdef IPV6_RECVHOPLIMIT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006226 PyModule_AddIntConstant(m, "IPV6_RECVHOPLIMIT", IPV6_RECVHOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006227#endif
6228#ifdef IPV6_RECVHOPOPTS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006229 PyModule_AddIntConstant(m, "IPV6_RECVHOPOPTS", IPV6_RECVHOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006230#endif
6231#ifdef IPV6_RECVPKTINFO
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006232 PyModule_AddIntConstant(m, "IPV6_RECVPKTINFO", IPV6_RECVPKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006233#endif
6234#ifdef IPV6_RECVRTHDR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006235 PyModule_AddIntConstant(m, "IPV6_RECVRTHDR", IPV6_RECVRTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006236#endif
6237#ifdef IPV6_RECVTCLASS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006238 PyModule_AddIntConstant(m, "IPV6_RECVTCLASS", IPV6_RECVTCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006239#endif
6240#ifdef IPV6_RTHDR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006241 PyModule_AddIntConstant(m, "IPV6_RTHDR", IPV6_RTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006242#endif
6243#ifdef IPV6_RTHDRDSTOPTS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006244 PyModule_AddIntConstant(m, "IPV6_RTHDRDSTOPTS", IPV6_RTHDRDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006245#endif
6246#ifdef IPV6_RTHDR_TYPE_0
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006247 PyModule_AddIntConstant(m, "IPV6_RTHDR_TYPE_0", IPV6_RTHDR_TYPE_0);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006248#endif
6249#ifdef IPV6_RECVPATHMTU
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006250 PyModule_AddIntConstant(m, "IPV6_RECVPATHMTU", IPV6_RECVPATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006251#endif
6252#ifdef IPV6_TCLASS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006253 PyModule_AddIntConstant(m, "IPV6_TCLASS", IPV6_TCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006254#endif
6255#ifdef IPV6_USE_MIN_MTU
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006256 PyModule_AddIntConstant(m, "IPV6_USE_MIN_MTU", IPV6_USE_MIN_MTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006257#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006258
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006259 /* TCP options */
6260#ifdef TCP_NODELAY
6261 PyModule_AddIntConstant(m, "TCP_NODELAY", TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00006262#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006263#ifdef TCP_MAXSEG
6264 PyModule_AddIntConstant(m, "TCP_MAXSEG", TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00006265#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006266#ifdef TCP_CORK
6267 PyModule_AddIntConstant(m, "TCP_CORK", TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006268#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006269#ifdef TCP_KEEPIDLE
6270 PyModule_AddIntConstant(m, "TCP_KEEPIDLE", TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006271#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006272#ifdef TCP_KEEPINTVL
6273 PyModule_AddIntConstant(m, "TCP_KEEPINTVL", TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006274#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006275#ifdef TCP_KEEPCNT
6276 PyModule_AddIntConstant(m, "TCP_KEEPCNT", TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006277#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006278#ifdef TCP_SYNCNT
6279 PyModule_AddIntConstant(m, "TCP_SYNCNT", TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006280#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006281#ifdef TCP_LINGER2
6282 PyModule_AddIntConstant(m, "TCP_LINGER2", TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006283#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006284#ifdef TCP_DEFER_ACCEPT
6285 PyModule_AddIntConstant(m, "TCP_DEFER_ACCEPT", TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006286#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006287#ifdef TCP_WINDOW_CLAMP
6288 PyModule_AddIntConstant(m, "TCP_WINDOW_CLAMP", TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006289#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006290#ifdef TCP_INFO
6291 PyModule_AddIntConstant(m, "TCP_INFO", TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006292#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006293#ifdef TCP_QUICKACK
6294 PyModule_AddIntConstant(m, "TCP_QUICKACK", TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006295#endif
6296
Guido van Rossum09be4091999-08-09 14:40:40 +00006297
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006298 /* IPX options */
6299#ifdef IPX_TYPE
6300 PyModule_AddIntConstant(m, "IPX_TYPE", IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006301#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00006302
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006303/* Reliable Datagram Sockets */
6304#ifdef RDS_CMSG_RDMA_ARGS
6305 PyModule_AddIntConstant(m, "RDS_CMSG_RDMA_ARGS", RDS_CMSG_RDMA_ARGS);
6306#endif
6307#ifdef RDS_CMSG_RDMA_DEST
6308 PyModule_AddIntConstant(m, "RDS_CMSG_RDMA_DEST", RDS_CMSG_RDMA_DEST);
6309#endif
6310#ifdef RDS_CMSG_RDMA_MAP
6311 PyModule_AddIntConstant(m, "RDS_CMSG_RDMA_MAP", RDS_CMSG_RDMA_MAP);
6312#endif
6313#ifdef RDS_CMSG_RDMA_STATUS
6314 PyModule_AddIntConstant(m, "RDS_CMSG_RDMA_STATUS", RDS_CMSG_RDMA_STATUS);
6315#endif
6316#ifdef RDS_CMSG_RDMA_UPDATE
6317 PyModule_AddIntConstant(m, "RDS_CMSG_RDMA_UPDATE", RDS_CMSG_RDMA_UPDATE);
6318#endif
6319#ifdef RDS_RDMA_READWRITE
6320 PyModule_AddIntConstant(m, "RDS_RDMA_READWRITE", RDS_RDMA_READWRITE);
6321#endif
6322#ifdef RDS_RDMA_FENCE
6323 PyModule_AddIntConstant(m, "RDS_RDMA_FENCE", RDS_RDMA_FENCE);
6324#endif
6325#ifdef RDS_RDMA_INVALIDATE
6326 PyModule_AddIntConstant(m, "RDS_RDMA_INVALIDATE", RDS_RDMA_INVALIDATE);
6327#endif
6328#ifdef RDS_RDMA_USE_ONCE
6329 PyModule_AddIntConstant(m, "RDS_RDMA_USE_ONCE", RDS_RDMA_USE_ONCE);
6330#endif
6331#ifdef RDS_RDMA_DONTWAIT
6332 PyModule_AddIntConstant(m, "RDS_RDMA_DONTWAIT", RDS_RDMA_DONTWAIT);
6333#endif
6334#ifdef RDS_RDMA_NOTIFY_ME
6335 PyModule_AddIntConstant(m, "RDS_RDMA_NOTIFY_ME", RDS_RDMA_NOTIFY_ME);
6336#endif
6337#ifdef RDS_RDMA_SILENT
6338 PyModule_AddIntConstant(m, "RDS_RDMA_SILENT", RDS_RDMA_SILENT);
6339#endif
6340
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006341 /* get{addr,name}info parameters */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006342#ifdef EAI_ADDRFAMILY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006343 PyModule_AddIntConstant(m, "EAI_ADDRFAMILY", EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006344#endif
6345#ifdef EAI_AGAIN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006346 PyModule_AddIntConstant(m, "EAI_AGAIN", EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006347#endif
6348#ifdef EAI_BADFLAGS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006349 PyModule_AddIntConstant(m, "EAI_BADFLAGS", EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006350#endif
6351#ifdef EAI_FAIL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006352 PyModule_AddIntConstant(m, "EAI_FAIL", EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006353#endif
6354#ifdef EAI_FAMILY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006355 PyModule_AddIntConstant(m, "EAI_FAMILY", EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006356#endif
6357#ifdef EAI_MEMORY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006358 PyModule_AddIntConstant(m, "EAI_MEMORY", EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006359#endif
6360#ifdef EAI_NODATA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006361 PyModule_AddIntConstant(m, "EAI_NODATA", EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006362#endif
6363#ifdef EAI_NONAME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006364 PyModule_AddIntConstant(m, "EAI_NONAME", EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006365#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00006366#ifdef EAI_OVERFLOW
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006367 PyModule_AddIntConstant(m, "EAI_OVERFLOW", EAI_OVERFLOW);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006368#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006369#ifdef EAI_SERVICE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006370 PyModule_AddIntConstant(m, "EAI_SERVICE", EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006371#endif
6372#ifdef EAI_SOCKTYPE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006373 PyModule_AddIntConstant(m, "EAI_SOCKTYPE", EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006374#endif
6375#ifdef EAI_SYSTEM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006376 PyModule_AddIntConstant(m, "EAI_SYSTEM", EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006377#endif
6378#ifdef EAI_BADHINTS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006379 PyModule_AddIntConstant(m, "EAI_BADHINTS", EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006380#endif
6381#ifdef EAI_PROTOCOL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006382 PyModule_AddIntConstant(m, "EAI_PROTOCOL", EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006383#endif
6384#ifdef EAI_MAX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006385 PyModule_AddIntConstant(m, "EAI_MAX", EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006386#endif
6387#ifdef AI_PASSIVE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006388 PyModule_AddIntConstant(m, "AI_PASSIVE", AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006389#endif
6390#ifdef AI_CANONNAME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006391 PyModule_AddIntConstant(m, "AI_CANONNAME", AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006392#endif
6393#ifdef AI_NUMERICHOST
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006394 PyModule_AddIntConstant(m, "AI_NUMERICHOST", AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006395#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00006396#ifdef AI_NUMERICSERV
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006397 PyModule_AddIntConstant(m, "AI_NUMERICSERV", AI_NUMERICSERV);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006398#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006399#ifdef AI_MASK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006400 PyModule_AddIntConstant(m, "AI_MASK", AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006401#endif
6402#ifdef AI_ALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006403 PyModule_AddIntConstant(m, "AI_ALL", AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006404#endif
6405#ifdef AI_V4MAPPED_CFG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006406 PyModule_AddIntConstant(m, "AI_V4MAPPED_CFG", AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006407#endif
6408#ifdef AI_ADDRCONFIG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006409 PyModule_AddIntConstant(m, "AI_ADDRCONFIG", AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006410#endif
6411#ifdef AI_V4MAPPED
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006412 PyModule_AddIntConstant(m, "AI_V4MAPPED", AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006413#endif
6414#ifdef AI_DEFAULT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006415 PyModule_AddIntConstant(m, "AI_DEFAULT", AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006416#endif
6417#ifdef NI_MAXHOST
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006418 PyModule_AddIntConstant(m, "NI_MAXHOST", NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006419#endif
6420#ifdef NI_MAXSERV
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006421 PyModule_AddIntConstant(m, "NI_MAXSERV", NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006422#endif
6423#ifdef NI_NOFQDN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006424 PyModule_AddIntConstant(m, "NI_NOFQDN", NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006425#endif
6426#ifdef NI_NUMERICHOST
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006427 PyModule_AddIntConstant(m, "NI_NUMERICHOST", NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006428#endif
6429#ifdef NI_NAMEREQD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006430 PyModule_AddIntConstant(m, "NI_NAMEREQD", NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006431#endif
6432#ifdef NI_NUMERICSERV
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006433 PyModule_AddIntConstant(m, "NI_NUMERICSERV", NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006434#endif
6435#ifdef NI_DGRAM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006436 PyModule_AddIntConstant(m, "NI_DGRAM", NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006437#endif
6438
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006439 /* shutdown() parameters */
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006440#ifdef SHUT_RD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006441 PyModule_AddIntConstant(m, "SHUT_RD", SHUT_RD);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006442#elif defined(SD_RECEIVE)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006443 PyModule_AddIntConstant(m, "SHUT_RD", SD_RECEIVE);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006444#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006445 PyModule_AddIntConstant(m, "SHUT_RD", 0);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006446#endif
6447#ifdef SHUT_WR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006448 PyModule_AddIntConstant(m, "SHUT_WR", SHUT_WR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006449#elif defined(SD_SEND)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006450 PyModule_AddIntConstant(m, "SHUT_WR", SD_SEND);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006451#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006452 PyModule_AddIntConstant(m, "SHUT_WR", 1);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006453#endif
6454#ifdef SHUT_RDWR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006455 PyModule_AddIntConstant(m, "SHUT_RDWR", SHUT_RDWR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006456#elif defined(SD_BOTH)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006457 PyModule_AddIntConstant(m, "SHUT_RDWR", SD_BOTH);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006458#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006459 PyModule_AddIntConstant(m, "SHUT_RDWR", 2);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006460#endif
6461
Christian Heimesfaf2f632008-01-06 16:59:19 +00006462#ifdef SIO_RCVALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006463 {
6464 DWORD codes[] = {SIO_RCVALL, SIO_KEEPALIVE_VALS};
6465 const char *names[] = {"SIO_RCVALL", "SIO_KEEPALIVE_VALS"};
6466 int i;
Victor Stinner63941882011-09-29 00:42:28 +02006467 for(i = 0; i<Py_ARRAY_LENGTH(codes); ++i) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006468 PyObject *tmp;
6469 tmp = PyLong_FromUnsignedLong(codes[i]);
6470 if (tmp == NULL)
6471 return NULL;
6472 PyModule_AddObject(m, names[i], tmp);
6473 }
6474 }
6475 PyModule_AddIntConstant(m, "RCVALL_OFF", RCVALL_OFF);
6476 PyModule_AddIntConstant(m, "RCVALL_ON", RCVALL_ON);
6477 PyModule_AddIntConstant(m, "RCVALL_SOCKETLEVELONLY", RCVALL_SOCKETLEVELONLY);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00006478#ifdef RCVALL_IPLEVEL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006479 PyModule_AddIntConstant(m, "RCVALL_IPLEVEL", RCVALL_IPLEVEL);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00006480#endif
6481#ifdef RCVALL_MAX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006482 PyModule_AddIntConstant(m, "RCVALL_MAX", RCVALL_MAX);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00006483#endif
Christian Heimesfaf2f632008-01-06 16:59:19 +00006484#endif /* _MSTCPIP_ */
6485
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006486 /* Initialize gethostbyname lock */
Just van Rossum1040d2c2003-05-09 07:53:18 +00006487#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006488 netdb_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00006489#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006490 return m;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00006491}
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006492
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006493
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006494#ifndef HAVE_INET_PTON
Christian Heimes96e7b3d2007-11-20 06:51:17 +00006495#if !defined(NTDDI_VERSION) || (NTDDI_VERSION < NTDDI_LONGHORN)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006496
6497/* Simplistic emulation code for inet_pton that only works for IPv4 */
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006498/* These are not exposed because they do not set errno properly */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006499
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006500int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006501inet_pton(int af, const char *src, void *dst)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006502{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006503 if (af == AF_INET) {
Benjamin Petersonf91df042009-02-13 02:50:59 +00006504#if (SIZEOF_INT != 4)
6505#error "Not sure if in_addr_t exists and int is not 32-bits."
6506#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006507 unsigned int packed_addr;
6508 packed_addr = inet_addr(src);
6509 if (packed_addr == INADDR_NONE)
6510 return 0;
6511 memcpy(dst, &packed_addr, 4);
6512 return 1;
6513 }
6514 /* Should set errno to EAFNOSUPPORT */
6515 return -1;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006516}
6517
Martin v. Löwisc925b1532001-07-21 09:42:15 +00006518const char *
6519inet_ntop(int af, const void *src, char *dst, socklen_t size)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006520{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006521 if (af == AF_INET) {
6522 struct in_addr packed_addr;
6523 if (size < 16)
6524 /* Should set errno to ENOSPC. */
6525 return NULL;
6526 memcpy(&packed_addr, src, sizeof(packed_addr));
6527 return strncpy(dst, inet_ntoa(packed_addr), size);
6528 }
6529 /* Should set errno to EAFNOSUPPORT */
6530 return NULL;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006531}
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006532
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006533#endif
Christian Heimesb6150692007-11-15 23:37:07 +00006534#endif