blob: 04ef0dc1b8db2c60d3875d0b2ee75f5042eed848 [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
Charles-François Natali8b759652011-12-23 16:44:51 +0100439/* Convert "sock_addr_t *" to "struct sockaddr *". */
440#define SAS2SA(x) (&((x)->sa))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000441
Martin v. Löwise9416172003-05-03 10:12:45 +0000442/*
443 * Constants for getnameinfo()
444 */
445#if !defined(NI_MAXHOST)
446#define NI_MAXHOST 1025
447#endif
448#if !defined(NI_MAXSERV)
449#define NI_MAXSERV 32
450#endif
451
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000452#ifndef INVALID_SOCKET /* MS defines this */
453#define INVALID_SOCKET (-1)
454#endif
455
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000456/* XXX There's a problem here: *static* functions are not supposed to have
457 a Py prefix (or use CapitalizedWords). Later... */
458
Guido van Rossum30a685f1991-06-27 15:51:29 +0000459/* Global variable holding the exception type for errors detected
460 by this module (but not argument type or memory errors, etc.). */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000461static PyObject *socket_herror;
462static PyObject *socket_gaierror;
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000463static PyObject *socket_timeout;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000464
Tim Peters643a7fc2002-02-17 04:13:21 +0000465/* A forward reference to the socket type object.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000466 The sock_type variable contains pointers to various functions,
467 some of which call new_sockobject(), which uses sock_type, so
Tim Peters643a7fc2002-02-17 04:13:21 +0000468 there has to be a circular reference. */
Jeremy Hylton938ace62002-07-17 16:30:39 +0000469static PyTypeObject sock_type;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000470
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000471#if defined(HAVE_POLL_H)
472#include <poll.h>
473#elif defined(HAVE_SYS_POLL_H)
474#include <sys/poll.h>
475#endif
476
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000477/* Largest value to try to store in a socklen_t (used when handling
478 ancillary data). POSIX requires socklen_t to hold at least
479 (2**31)-1 and recommends against storing larger values, but
480 socklen_t was originally int in the BSD interface, so to be on the
481 safe side we use the smaller of (2**31)-1 and INT_MAX. */
482#if INT_MAX > 0x7fffffff
483#define SOCKLEN_T_LIMIT 0x7fffffff
484#else
485#define SOCKLEN_T_LIMIT INT_MAX
486#endif
487
Charles-François Nataliaa26b272011-08-28 17:51:43 +0200488#ifdef HAVE_POLL
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000489/* Instead of select(), we'll use poll() since poll() works on any fd. */
490#define IS_SELECTABLE(s) 1
491/* Can we call select() with this socket without a buffer overrun? */
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000492#else
Charles-François Nataliaa26b272011-08-28 17:51:43 +0200493/* If there's no timeout left, we don't have to call select, so it's a safe,
494 * little white lie. */
495#define IS_SELECTABLE(s) (_PyIsSelectable_fd((s)->sock_fd) || (s)->sock_timeout <= 0.0)
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000496#endif
Neal Norwitz082b2df2006-02-07 07:04:46 +0000497
498static PyObject*
499select_error(void)
500{
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200501 PyErr_SetString(PyExc_OSError, "unable to select on socket");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000502 return NULL;
Neal Norwitz082b2df2006-02-07 07:04:46 +0000503}
504
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000505#ifdef MS_WINDOWS
Antoine Pitrouc8f01962010-09-28 22:03:27 +0000506#ifndef WSAEAGAIN
507#define WSAEAGAIN WSAEWOULDBLOCK
508#endif
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000509#define CHECK_ERRNO(expected) \
510 (WSAGetLastError() == WSA ## expected)
511#else
512#define CHECK_ERRNO(expected) \
513 (errno == expected)
514#endif
515
Guido van Rossum30a685f1991-06-27 15:51:29 +0000516/* Convenience function to raise an error according to errno
517 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000518
Guido van Rossum73624e91994-10-10 17:59:00 +0000519static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000520set_error(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000521{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000522#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000523 int err_no = WSAGetLastError();
524 /* PyErr_SetExcFromWindowsErr() invokes FormatMessage() which
525 recognizes the error codes used by both GetLastError() and
526 WSAGetLastError */
527 if (err_no)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200528 return PyErr_SetExcFromWindowsErr(PyExc_OSError, err_no);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000529#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000530
Andrew MacIntyreba43e872002-03-03 03:03:52 +0000531#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000532 if (sock_errno() != NO_ERROR) {
533 APIRET rc;
534 ULONG msglen;
535 char outbuf[100];
536 int myerrorcode = sock_errno();
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000537
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000538 /* Retrieve socket-related error message from MPTN.MSG file */
539 rc = DosGetMessage(NULL, 0, outbuf, sizeof(outbuf),
540 myerrorcode - SOCBASEERR + 26,
541 "mptn.msg",
542 &msglen);
543 if (rc == NO_ERROR) {
544 PyObject *v;
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000545
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000546 /* OS/2 doesn't guarantee a terminator */
547 outbuf[msglen] = '\0';
548 if (strlen(outbuf) > 0) {
549 /* If non-empty msg, trim CRLF */
550 char *lastc = &outbuf[ strlen(outbuf)-1 ];
551 while (lastc > outbuf &&
552 isspace(Py_CHARMASK(*lastc))) {
553 /* Trim trailing whitespace (CRLF) */
554 *lastc-- = '\0';
555 }
556 }
557 v = Py_BuildValue("(is)", myerrorcode, outbuf);
558 if (v != NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200559 PyErr_SetObject(PyExc_OSError, v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000560 Py_DECREF(v);
561 }
562 return NULL;
563 }
564 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000565#endif
566
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200567 return PyErr_SetFromErrno(PyExc_OSError);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000568}
569
Guido van Rossum30a685f1991-06-27 15:51:29 +0000570
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000571static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000572set_herror(int h_error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000573{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000574 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000575
576#ifdef HAVE_HSTRERROR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000577 v = Py_BuildValue("(is)", h_error, (char *)hstrerror(h_error));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000578#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000579 v = Py_BuildValue("(is)", h_error, "host not found");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000580#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000581 if (v != NULL) {
582 PyErr_SetObject(socket_herror, v);
583 Py_DECREF(v);
584 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000585
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000586 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000587}
588
589
590static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000591set_gaierror(int error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000592{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000593 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000594
Martin v. Löwis272cb402002-03-01 08:31:07 +0000595#ifdef EAI_SYSTEM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000596 /* EAI_SYSTEM is not available on Windows XP. */
597 if (error == EAI_SYSTEM)
598 return set_error();
Martin v. Löwis272cb402002-03-01 08:31:07 +0000599#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000600
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000601#ifdef HAVE_GAI_STRERROR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000602 v = Py_BuildValue("(is)", error, gai_strerror(error));
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000603#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000604 v = Py_BuildValue("(is)", error, "getaddrinfo failed");
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000605#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000606 if (v != NULL) {
607 PyErr_SetObject(socket_gaierror, v);
608 Py_DECREF(v);
609 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000610
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000611 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000612}
613
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000614#ifdef __VMS
615/* Function to send in segments */
616static int
617sendsegmented(int sock_fd, char *buf, int len, int flags)
618{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000619 int n = 0;
620 int remaining = len;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000621
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000622 while (remaining > 0) {
623 unsigned int segment;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000624
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000625 segment = (remaining >= SEGMENT_SIZE ? SEGMENT_SIZE : remaining);
626 n = send(sock_fd, buf, segment, flags);
627 if (n < 0) {
628 return n;
629 }
630 remaining -= segment;
631 buf += segment;
632 } /* end while */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000633
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000634 return len;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000635}
636#endif
637
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000638/* Function to perform the setting of socket blocking mode
639 internally. block = (1 | 0). */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000640static int
641internal_setblocking(PySocketSockObject *s, int block)
642{
Guido van Rossum67f7a382002-06-06 21:08:16 +0000643#ifndef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000644 int delay_flag;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000645#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +0000646#ifdef SOCK_NONBLOCK
647 if (block)
648 s->sock_type &= (~SOCK_NONBLOCK);
649 else
650 s->sock_type |= SOCK_NONBLOCK;
651#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +0000652
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000653 Py_BEGIN_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000654#ifndef MS_WINDOWS
655#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000656 block = !block;
657 ioctl(s->sock_fd, FIONBIO, (caddr_t)&block, sizeof(block));
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000658#elif defined(__VMS)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000659 block = !block;
660 ioctl(s->sock_fd, FIONBIO, (unsigned int *)&block);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000661#else /* !PYOS_OS2 && !__VMS */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000662 delay_flag = fcntl(s->sock_fd, F_GETFL, 0);
663 if (block)
664 delay_flag &= (~O_NONBLOCK);
665 else
666 delay_flag |= O_NONBLOCK;
667 fcntl(s->sock_fd, F_SETFL, delay_flag);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000668#endif /* !PYOS_OS2 */
669#else /* MS_WINDOWS */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000670 block = !block;
671 ioctlsocket(s->sock_fd, FIONBIO, (u_long*)&block);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000672#endif /* MS_WINDOWS */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000673 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000674
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000675 /* Since these don't return anything */
676 return 1;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000677}
678
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000679/* Do a select()/poll() on the socket, if necessary (sock_timeout > 0).
Guido van Rossum11ba0942002-06-13 15:07:44 +0000680 The argument writing indicates the direction.
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000681 This does not raise an exception; we'll let our caller do that
682 after they've reacquired the interpreter lock.
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000683 Returns 1 on timeout, -1 on error, 0 otherwise. */
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000684static int
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000685internal_select_ex(PySocketSockObject *s, int writing, double interval)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000686{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000687 int n;
Guido van Rossum11ba0942002-06-13 15:07:44 +0000688
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000689 /* Nothing to do unless we're in timeout mode (not non-blocking) */
690 if (s->sock_timeout <= 0.0)
691 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000692
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000693 /* Guard against closed socket */
694 if (s->sock_fd < 0)
695 return 0;
Guido van Rossumad654902002-07-19 12:44:59 +0000696
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000697 /* Handling this condition here simplifies the select loops */
698 if (interval < 0.0)
699 return 1;
700
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000701 /* Prefer poll, if available, since you can poll() any fd
702 * which can't be done with select(). */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000703#ifdef HAVE_POLL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000704 {
705 struct pollfd pollfd;
706 int timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000707
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000708 pollfd.fd = s->sock_fd;
709 pollfd.events = writing ? POLLOUT : POLLIN;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000710
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000711 /* s->sock_timeout is in seconds, timeout in ms */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000712 timeout = (int)(interval * 1000 + 0.5);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000713 n = poll(&pollfd, 1, timeout);
714 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000715#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000716 {
717 /* Construct the arguments to select */
718 fd_set fds;
719 struct timeval tv;
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000720 tv.tv_sec = (int)interval;
721 tv.tv_usec = (int)((interval - tv.tv_sec) * 1e6);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000722 FD_ZERO(&fds);
723 FD_SET(s->sock_fd, &fds);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000724
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000725 /* See if the socket is ready */
726 if (writing)
Antoine Pitrou19467d22010-08-17 19:33:30 +0000727 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
728 NULL, &fds, NULL, &tv);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000729 else
Antoine Pitrou19467d22010-08-17 19:33:30 +0000730 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
731 &fds, NULL, NULL, &tv);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000732 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000733#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000734
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000735 if (n < 0)
736 return -1;
737 if (n == 0)
738 return 1;
739 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000740}
741
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000742static int
743internal_select(PySocketSockObject *s, int writing)
744{
745 return internal_select_ex(s, writing, s->sock_timeout);
746}
747
748/*
749 Two macros for automatic retry of select() in case of false positives
750 (for example, select() could indicate a socket is ready for reading
751 but the data then discarded by the OS because of a wrong checksum).
752 Here is an example of use:
753
754 BEGIN_SELECT_LOOP(s)
755 Py_BEGIN_ALLOW_THREADS
756 timeout = internal_select_ex(s, 0, interval);
757 if (!timeout)
758 outlen = recv(s->sock_fd, cbuf, len, flags);
759 Py_END_ALLOW_THREADS
760 if (timeout == 1) {
761 PyErr_SetString(socket_timeout, "timed out");
762 return -1;
763 }
764 END_SELECT_LOOP(s)
765*/
766
767#define BEGIN_SELECT_LOOP(s) \
768 { \
769 _PyTime_timeval now, deadline = {0, 0}; \
770 double interval = s->sock_timeout; \
771 int has_timeout = s->sock_timeout > 0.0; \
772 if (has_timeout) { \
773 _PyTime_gettimeofday(&now); \
774 deadline = now; \
775 _PyTime_ADD_SECONDS(deadline, s->sock_timeout); \
776 } \
777 while (1) { \
778 errno = 0; \
779
780#define END_SELECT_LOOP(s) \
781 if (!has_timeout || \
782 (!CHECK_ERRNO(EWOULDBLOCK) && !CHECK_ERRNO(EAGAIN))) \
783 break; \
784 _PyTime_gettimeofday(&now); \
785 interval = _PyTime_INTERVAL(now, deadline); \
786 } \
787 } \
788
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000789/* Initialize a new socket object. */
790
Tim Petersa12b4cf2002-07-18 22:38:44 +0000791static double defaulttimeout = -1.0; /* Default timeout for new sockets */
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000792
Martin v. Löwis1a214512008-06-11 05:26:20 +0000793static void
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000794init_sockobject(PySocketSockObject *s,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000795 SOCKET_T fd, int family, int type, int proto)
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000796{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000797 s->sock_fd = fd;
798 s->sock_family = family;
799 s->sock_type = type;
800 s->sock_proto = proto;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000801
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000802 s->errorhandler = &set_error;
Antoine Pitroub1c54962010-10-14 15:05:38 +0000803#ifdef SOCK_NONBLOCK
804 if (type & SOCK_NONBLOCK)
805 s->sock_timeout = 0.0;
806 else
807#endif
808 {
809 s->sock_timeout = defaulttimeout;
810 if (defaulttimeout >= 0.0)
811 internal_setblocking(s, 0);
812 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000813
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000814}
815
816
Guido van Rossum30a685f1991-06-27 15:51:29 +0000817/* Create a new socket object.
818 This just creates the object and initializes it.
819 If the creation fails, return NULL and set an exception (implicit
820 in NEWOBJ()). */
821
Guido van Rossum73624e91994-10-10 17:59:00 +0000822static PySocketSockObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000823new_sockobject(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000824{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000825 PySocketSockObject *s;
826 s = (PySocketSockObject *)
827 PyType_GenericNew(&sock_type, NULL, NULL);
828 if (s != NULL)
829 init_sockobject(s, fd, family, type, proto);
830 return s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000831}
832
Guido van Rossum30a685f1991-06-27 15:51:29 +0000833
Guido van Rossum48a680c2001-03-02 06:34:14 +0000834/* Lock to allow python interpreter to continue, but only allow one
Just van Rossum1040d2c2003-05-09 07:53:18 +0000835 thread to be in gethostbyname or getaddrinfo */
836#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
837PyThread_type_lock netdb_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000838#endif
839
840
Guido van Rossum30a685f1991-06-27 15:51:29 +0000841/* Convert a string specifying a host name or one of a few symbolic
842 names to a numeric IP address. This usually calls gethostbyname()
843 to do the work; the names "" and "<broadcast>" are special.
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000844 Return the length (IPv4 should be 4 bytes), or negative if
Guido van Rossum30a685f1991-06-27 15:51:29 +0000845 an error occurred; then an exception is raised. */
846
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000847static int
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000848setipaddr(char *name, struct sockaddr *addr_ret, size_t addr_ret_size, int af)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000849{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000850 struct addrinfo hints, *res;
851 int error;
852 int d1, d2, d3, d4;
853 char ch;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000854
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000855 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
856 if (name[0] == '\0') {
857 int siz;
858 memset(&hints, 0, sizeof(hints));
859 hints.ai_family = af;
860 hints.ai_socktype = SOCK_DGRAM; /*dummy*/
861 hints.ai_flags = AI_PASSIVE;
862 Py_BEGIN_ALLOW_THREADS
863 ACQUIRE_GETADDRINFO_LOCK
864 error = getaddrinfo(NULL, "0", &hints, &res);
865 Py_END_ALLOW_THREADS
866 /* We assume that those thread-unsafe getaddrinfo() versions
867 *are* safe regarding their return value, ie. that a
868 subsequent call to getaddrinfo() does not destroy the
869 outcome of the first call. */
870 RELEASE_GETADDRINFO_LOCK
871 if (error) {
872 set_gaierror(error);
873 return -1;
874 }
875 switch (res->ai_family) {
876 case AF_INET:
877 siz = 4;
878 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000879#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000880 case AF_INET6:
881 siz = 16;
882 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000883#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000884 default:
885 freeaddrinfo(res);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200886 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000887 "unsupported address family");
888 return -1;
889 }
890 if (res->ai_next) {
891 freeaddrinfo(res);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200892 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000893 "wildcard resolved to multiple address");
894 return -1;
895 }
896 if (res->ai_addrlen < addr_ret_size)
897 addr_ret_size = res->ai_addrlen;
898 memcpy(addr_ret, res->ai_addr, addr_ret_size);
899 freeaddrinfo(res);
900 return siz;
901 }
902 if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
903 struct sockaddr_in *sin;
904 if (af != AF_INET && af != AF_UNSPEC) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200905 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000906 "address family mismatched");
907 return -1;
908 }
909 sin = (struct sockaddr_in *)addr_ret;
910 memset((void *) sin, '\0', sizeof(*sin));
911 sin->sin_family = AF_INET;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000912#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000913 sin->sin_len = sizeof(*sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000914#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000915 sin->sin_addr.s_addr = INADDR_BROADCAST;
916 return sizeof(sin->sin_addr);
917 }
918 if (sscanf(name, "%d.%d.%d.%d%c", &d1, &d2, &d3, &d4, &ch) == 4 &&
919 0 <= d1 && d1 <= 255 && 0 <= d2 && d2 <= 255 &&
920 0 <= d3 && d3 <= 255 && 0 <= d4 && d4 <= 255) {
921 struct sockaddr_in *sin;
922 sin = (struct sockaddr_in *)addr_ret;
923 sin->sin_addr.s_addr = htonl(
924 ((long) d1 << 24) | ((long) d2 << 16) |
925 ((long) d3 << 8) | ((long) d4 << 0));
926 sin->sin_family = AF_INET;
Anthony Baxter0e85f9d2003-05-02 15:40:46 +0000927#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000928 sin->sin_len = sizeof(*sin);
Anthony Baxter0e85f9d2003-05-02 15:40:46 +0000929#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000930 return 4;
931 }
932 memset(&hints, 0, sizeof(hints));
933 hints.ai_family = af;
934 Py_BEGIN_ALLOW_THREADS
935 ACQUIRE_GETADDRINFO_LOCK
936 error = getaddrinfo(name, NULL, &hints, &res);
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000937#if defined(__digital__) && defined(__unix__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000938 if (error == EAI_NONAME && af == AF_UNSPEC) {
939 /* On Tru64 V5.1, numeric-to-addr conversion fails
940 if no address family is given. Assume IPv4 for now.*/
941 hints.ai_family = AF_INET;
942 error = getaddrinfo(name, NULL, &hints, &res);
943 }
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000944#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000945 Py_END_ALLOW_THREADS
946 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
947 if (error) {
948 set_gaierror(error);
949 return -1;
950 }
951 if (res->ai_addrlen < addr_ret_size)
952 addr_ret_size = res->ai_addrlen;
953 memcpy((char *) addr_ret, res->ai_addr, addr_ret_size);
954 freeaddrinfo(res);
955 switch (addr_ret->sa_family) {
956 case AF_INET:
957 return 4;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000958#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000959 case AF_INET6:
960 return 16;
Guido van Rossum955becc1999-03-22 20:14:53 +0000961#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000962 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200963 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000964 return -1;
965 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000966}
967
Guido van Rossum30a685f1991-06-27 15:51:29 +0000968
Guido van Rossum30a685f1991-06-27 15:51:29 +0000969/* Create a string object representing an IP address.
970 This is always a string of the form 'dd.dd.dd.dd' (with variable
971 size numbers). */
972
Guido van Rossum73624e91994-10-10 17:59:00 +0000973static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000974makeipaddr(struct sockaddr *addr, int addrlen)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000975{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000976 char buf[NI_MAXHOST];
977 int error;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000978
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000979 error = getnameinfo(addr, addrlen, buf, sizeof(buf), NULL, 0,
980 NI_NUMERICHOST);
981 if (error) {
982 set_gaierror(error);
983 return NULL;
984 }
985 return PyUnicode_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000986}
987
988
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000989#ifdef USE_BLUETOOTH
990/* Convert a string representation of a Bluetooth address into a numeric
991 address. Returns the length (6), or raises an exception and returns -1 if
992 an error occurred. */
993
994static int
995setbdaddr(char *name, bdaddr_t *bdaddr)
996{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000997 unsigned int b0, b1, b2, b3, b4, b5;
998 char ch;
999 int n;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001000
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001001 n = sscanf(name, "%X:%X:%X:%X:%X:%X%c",
1002 &b5, &b4, &b3, &b2, &b1, &b0, &ch);
1003 if (n == 6 && (b0 | b1 | b2 | b3 | b4 | b5) < 256) {
1004 bdaddr->b[0] = b0;
1005 bdaddr->b[1] = b1;
1006 bdaddr->b[2] = b2;
1007 bdaddr->b[3] = b3;
1008 bdaddr->b[4] = b4;
1009 bdaddr->b[5] = b5;
1010 return 6;
1011 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001012 PyErr_SetString(PyExc_OSError, "bad bluetooth address");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001013 return -1;
1014 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001015}
1016
1017/* Create a string representation of the Bluetooth address. This is always a
1018 string of the form 'XX:XX:XX:XX:XX:XX' where XX is a two digit hexadecimal
1019 value (zero padded if necessary). */
1020
1021static PyObject *
1022makebdaddr(bdaddr_t *bdaddr)
1023{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001024 char buf[(6 * 2) + 5 + 1];
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001025
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001026 sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X",
1027 bdaddr->b[5], bdaddr->b[4], bdaddr->b[3],
1028 bdaddr->b[2], bdaddr->b[1], bdaddr->b[0]);
1029 return PyUnicode_FromString(buf);
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001030}
1031#endif
1032
1033
Guido van Rossum30a685f1991-06-27 15:51:29 +00001034/* Create an object representing the given socket address,
1035 suitable for passing it back to bind(), connect() etc.
1036 The family field of the sockaddr structure is inspected
1037 to determine what kind of address it really is. */
1038
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001039/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001040static PyObject *
Antoine Pitrou19467d22010-08-17 19:33:30 +00001041makesockaddr(SOCKET_T sockfd, struct sockaddr *addr, size_t addrlen, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001042{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001043 if (addrlen == 0) {
1044 /* No address -- may be recvfrom() from known socket */
1045 Py_INCREF(Py_None);
1046 return Py_None;
1047 }
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001048
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001049 switch (addr->sa_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001050
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001051 case AF_INET:
1052 {
1053 struct sockaddr_in *a;
1054 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
1055 PyObject *ret = NULL;
1056 if (addrobj) {
1057 a = (struct sockaddr_in *)addr;
1058 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
1059 Py_DECREF(addrobj);
1060 }
1061 return ret;
1062 }
Guido van Rossum30a685f1991-06-27 15:51:29 +00001063
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001064#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001065 case AF_UNIX:
1066 {
1067 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001068#ifdef linux
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001069 if (a->sun_path[0] == 0) { /* Linux abstract namespace */
1070 addrlen -= offsetof(struct sockaddr_un, sun_path);
1071 return PyBytes_FromStringAndSize(a->sun_path, addrlen);
1072 }
1073 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001074#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001075 {
1076 /* regular NULL-terminated string */
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001077 return PyUnicode_DecodeFSDefault(a->sun_path);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001078 }
1079 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001080#endif /* AF_UNIX */
1081
Martin v. Löwis11017b12006-01-14 18:12:57 +00001082#if defined(AF_NETLINK)
1083 case AF_NETLINK:
1084 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001085 struct sockaddr_nl *a = (struct sockaddr_nl *) addr;
1086 return Py_BuildValue("II", a->nl_pid, a->nl_groups);
Martin v. Löwis11017b12006-01-14 18:12:57 +00001087 }
1088#endif /* AF_NETLINK */
1089
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001090#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001091 case AF_INET6:
1092 {
1093 struct sockaddr_in6 *a;
1094 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
1095 PyObject *ret = NULL;
1096 if (addrobj) {
1097 a = (struct sockaddr_in6 *)addr;
1098 ret = Py_BuildValue("Oiii",
1099 addrobj,
1100 ntohs(a->sin6_port),
1101 a->sin6_flowinfo,
1102 a->sin6_scope_id);
1103 Py_DECREF(addrobj);
1104 }
1105 return ret;
1106 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001107#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001108
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001109#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001110 case AF_BLUETOOTH:
1111 switch (proto) {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001112
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001113 case BTPROTO_L2CAP:
1114 {
1115 struct sockaddr_l2 *a = (struct sockaddr_l2 *) addr;
1116 PyObject *addrobj = makebdaddr(&_BT_L2_MEMB(a, bdaddr));
1117 PyObject *ret = NULL;
1118 if (addrobj) {
1119 ret = Py_BuildValue("Oi",
1120 addrobj,
1121 _BT_L2_MEMB(a, psm));
1122 Py_DECREF(addrobj);
1123 }
1124 return ret;
1125 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001126
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001127 case BTPROTO_RFCOMM:
1128 {
1129 struct sockaddr_rc *a = (struct sockaddr_rc *) addr;
1130 PyObject *addrobj = makebdaddr(&_BT_RC_MEMB(a, bdaddr));
1131 PyObject *ret = NULL;
1132 if (addrobj) {
1133 ret = Py_BuildValue("Oi",
1134 addrobj,
1135 _BT_RC_MEMB(a, channel));
1136 Py_DECREF(addrobj);
1137 }
1138 return ret;
1139 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001140
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001141 case BTPROTO_HCI:
1142 {
1143 struct sockaddr_hci *a = (struct sockaddr_hci *) addr;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001144#if defined(__NetBSD__) || defined(__DragonFly__)
1145 return makebdaddr(&_BT_HCI_MEMB(a, bdaddr));
1146#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001147 PyObject *ret = NULL;
1148 ret = Py_BuildValue("i", _BT_HCI_MEMB(a, dev));
1149 return ret;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001150#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001151 }
Thomas Wouterscf297e42007-02-23 15:07:44 +00001152
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001153#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001154 case BTPROTO_SCO:
1155 {
1156 struct sockaddr_sco *a = (struct sockaddr_sco *) addr;
1157 return makebdaddr(&_BT_SCO_MEMB(a, bdaddr));
1158 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001159#endif
1160
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001161 default:
1162 PyErr_SetString(PyExc_ValueError,
1163 "Unknown Bluetooth protocol");
1164 return NULL;
1165 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001166#endif
1167
Antoine Pitroub156a462010-10-27 20:13:57 +00001168#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFNAME)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001169 case AF_PACKET:
1170 {
1171 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
1172 char *ifname = "";
1173 struct ifreq ifr;
1174 /* need to look up interface name give index */
1175 if (a->sll_ifindex) {
1176 ifr.ifr_ifindex = a->sll_ifindex;
1177 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1178 ifname = ifr.ifr_name;
1179 }
1180 return Py_BuildValue("shbhy#",
1181 ifname,
1182 ntohs(a->sll_protocol),
1183 a->sll_pkttype,
1184 a->sll_hatype,
1185 a->sll_addr,
1186 a->sll_halen);
1187 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001188#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001189
Christian Heimes043d6f62008-01-07 17:19:16 +00001190#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001191 case AF_TIPC:
1192 {
1193 struct sockaddr_tipc *a = (struct sockaddr_tipc *) addr;
1194 if (a->addrtype == TIPC_ADDR_NAMESEQ) {
1195 return Py_BuildValue("IIIII",
1196 a->addrtype,
1197 a->addr.nameseq.type,
1198 a->addr.nameseq.lower,
1199 a->addr.nameseq.upper,
1200 a->scope);
1201 } else if (a->addrtype == TIPC_ADDR_NAME) {
1202 return Py_BuildValue("IIIII",
1203 a->addrtype,
1204 a->addr.name.name.type,
1205 a->addr.name.name.instance,
1206 a->addr.name.name.instance,
1207 a->scope);
1208 } else if (a->addrtype == TIPC_ADDR_ID) {
1209 return Py_BuildValue("IIIII",
1210 a->addrtype,
1211 a->addr.id.node,
1212 a->addr.id.ref,
1213 0,
1214 a->scope);
1215 } else {
1216 PyErr_SetString(PyExc_ValueError,
1217 "Invalid address type");
1218 return NULL;
1219 }
1220 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001221#endif
1222
Charles-François Natali30589c92011-10-07 22:47:08 +02001223#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02001224 case AF_CAN:
1225 {
1226 struct sockaddr_can *a = (struct sockaddr_can *)addr;
1227 char *ifname = "";
1228 struct ifreq ifr;
1229 /* need to look up interface name given index */
1230 if (a->can_ifindex) {
1231 ifr.ifr_ifindex = a->can_ifindex;
1232 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1233 ifname = ifr.ifr_name;
1234 }
1235
1236 return Py_BuildValue("O&h", PyUnicode_DecodeFSDefault,
1237 ifname,
1238 a->can_family);
1239 }
1240#endif
1241
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001242 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001243
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001244 default:
1245 /* If we don't know the address family, don't raise an
1246 exception -- return it as an (int, bytes) tuple. */
1247 return Py_BuildValue("iy#",
1248 addr->sa_family,
1249 addr->sa_data,
1250 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001251
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001252 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001253}
1254
Guido van Rossum30a685f1991-06-27 15:51:29 +00001255
1256/* Parse a socket address argument according to the socket object's
1257 address family. Return 1 if the address was in the proper format,
1258 0 of not. The address is returned through addr_ret, its length
1259 through len_ret. */
1260
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001261static int
Guido van Rossum48a680c2001-03-02 06:34:14 +00001262getsockaddrarg(PySocketSockObject *s, PyObject *args,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001263 struct sockaddr *addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001264{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001265 switch (s->sock_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001266
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001267#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001268 case AF_UNIX:
1269 {
1270 struct sockaddr_un* addr;
1271 char *path;
1272 int len;
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001273 int retval = 0;
1274
1275 /* PEP 383. Not using PyUnicode_FSConverter since we need to
1276 allow embedded nulls on Linux. */
1277 if (PyUnicode_Check(args)) {
1278 if ((args = PyUnicode_EncodeFSDefault(args)) == NULL)
1279 return 0;
1280 }
1281 else
1282 Py_INCREF(args);
1283 if (!PyArg_Parse(args, "y#", &path, &len))
1284 goto unix_out;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001285
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001286 addr = (struct sockaddr_un*)addr_ret;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001287#ifdef linux
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001288 if (len > 0 && path[0] == 0) {
1289 /* Linux abstract namespace extension */
1290 if (len > sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001291 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001292 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001293 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001294 }
1295 }
1296 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001297#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001298 {
1299 /* regular NULL-terminated string */
1300 if (len >= sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001301 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001302 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001303 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001304 }
1305 addr->sun_path[len] = 0;
1306 }
1307 addr->sun_family = s->sock_family;
1308 memcpy(addr->sun_path, path, len);
Andrew MacIntyredaedf212004-04-11 12:03:57 +00001309#if defined(PYOS_OS2)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001310 *len_ret = sizeof(*addr);
Andrew MacIntyredaedf212004-04-11 12:03:57 +00001311#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001312 *len_ret = len + offsetof(struct sockaddr_un, sun_path);
Andrew MacIntyredaedf212004-04-11 12:03:57 +00001313#endif
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001314 retval = 1;
1315 unix_out:
1316 Py_DECREF(args);
1317 return retval;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001318 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001319#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001320
Martin v. Löwis11017b12006-01-14 18:12:57 +00001321#if defined(AF_NETLINK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001322 case AF_NETLINK:
1323 {
1324 struct sockaddr_nl* addr;
1325 int pid, groups;
1326 addr = (struct sockaddr_nl *)addr_ret;
1327 if (!PyTuple_Check(args)) {
1328 PyErr_Format(
1329 PyExc_TypeError,
1330 "getsockaddrarg: "
1331 "AF_NETLINK address must be tuple, not %.500s",
1332 Py_TYPE(args)->tp_name);
1333 return 0;
1334 }
1335 if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &pid, &groups))
1336 return 0;
1337 addr->nl_family = AF_NETLINK;
1338 addr->nl_pid = pid;
1339 addr->nl_groups = groups;
1340 *len_ret = sizeof(*addr);
1341 return 1;
1342 }
Martin v. Löwis11017b12006-01-14 18:12:57 +00001343#endif
1344
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001345#ifdef AF_RDS
1346 case AF_RDS:
1347 /* RDS sockets use sockaddr_in: fall-through */
1348#endif
1349
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001350 case AF_INET:
1351 {
1352 struct sockaddr_in* addr;
1353 char *host;
1354 int port, result;
1355 if (!PyTuple_Check(args)) {
1356 PyErr_Format(
1357 PyExc_TypeError,
1358 "getsockaddrarg: "
1359 "AF_INET address must be tuple, not %.500s",
1360 Py_TYPE(args)->tp_name);
1361 return 0;
1362 }
1363 if (!PyArg_ParseTuple(args, "eti:getsockaddrarg",
1364 "idna", &host, &port))
1365 return 0;
1366 addr=(struct sockaddr_in*)addr_ret;
1367 result = setipaddr(host, (struct sockaddr *)addr,
1368 sizeof(*addr), AF_INET);
1369 PyMem_Free(host);
1370 if (result < 0)
1371 return 0;
1372 if (port < 0 || port > 0xffff) {
1373 PyErr_SetString(
1374 PyExc_OverflowError,
1375 "getsockaddrarg: port must be 0-65535.");
1376 return 0;
1377 }
1378 addr->sin_family = AF_INET;
1379 addr->sin_port = htons((short)port);
1380 *len_ret = sizeof *addr;
1381 return 1;
1382 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001383
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001384#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001385 case AF_INET6:
1386 {
1387 struct sockaddr_in6* addr;
1388 char *host;
1389 int port, flowinfo, scope_id, result;
1390 flowinfo = scope_id = 0;
1391 if (!PyTuple_Check(args)) {
1392 PyErr_Format(
1393 PyExc_TypeError,
1394 "getsockaddrarg: "
1395 "AF_INET6 address must be tuple, not %.500s",
1396 Py_TYPE(args)->tp_name);
1397 return 0;
1398 }
1399 if (!PyArg_ParseTuple(args, "eti|ii",
1400 "idna", &host, &port, &flowinfo,
1401 &scope_id)) {
1402 return 0;
1403 }
1404 addr = (struct sockaddr_in6*)addr_ret;
1405 result = setipaddr(host, (struct sockaddr *)addr,
1406 sizeof(*addr), AF_INET6);
1407 PyMem_Free(host);
1408 if (result < 0)
1409 return 0;
1410 if (port < 0 || port > 0xffff) {
1411 PyErr_SetString(
1412 PyExc_OverflowError,
1413 "getsockaddrarg: port must be 0-65535.");
1414 return 0;
1415 }
1416 addr->sin6_family = s->sock_family;
1417 addr->sin6_port = htons((short)port);
1418 addr->sin6_flowinfo = flowinfo;
1419 addr->sin6_scope_id = scope_id;
1420 *len_ret = sizeof *addr;
1421 return 1;
1422 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001423#endif
1424
Hye-Shik Chang81268602004-02-02 06:05:24 +00001425#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001426 case AF_BLUETOOTH:
1427 {
1428 switch (s->sock_proto) {
1429 case BTPROTO_L2CAP:
1430 {
1431 struct sockaddr_l2 *addr;
1432 char *straddr;
Martin v. Löwis12af0482004-01-31 12:34:17 +00001433
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001434 addr = (struct sockaddr_l2 *)addr_ret;
1435 memset(addr, 0, sizeof(struct sockaddr_l2));
1436 _BT_L2_MEMB(addr, family) = AF_BLUETOOTH;
1437 if (!PyArg_ParseTuple(args, "si", &straddr,
1438 &_BT_L2_MEMB(addr, psm))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001439 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001440 "wrong format");
1441 return 0;
1442 }
1443 if (setbdaddr(straddr, &_BT_L2_MEMB(addr, bdaddr)) < 0)
1444 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001445
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001446 *len_ret = sizeof *addr;
1447 return 1;
1448 }
1449 case BTPROTO_RFCOMM:
1450 {
1451 struct sockaddr_rc *addr;
1452 char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001453
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001454 addr = (struct sockaddr_rc *)addr_ret;
1455 _BT_RC_MEMB(addr, family) = AF_BLUETOOTH;
1456 if (!PyArg_ParseTuple(args, "si", &straddr,
1457 &_BT_RC_MEMB(addr, channel))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001458 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001459 "wrong format");
1460 return 0;
1461 }
1462 if (setbdaddr(straddr, &_BT_RC_MEMB(addr, bdaddr)) < 0)
1463 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001464
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001465 *len_ret = sizeof *addr;
1466 return 1;
1467 }
1468 case BTPROTO_HCI:
1469 {
1470 struct sockaddr_hci *addr = (struct sockaddr_hci *)addr_ret;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001471#if defined(__NetBSD__) || defined(__DragonFly__)
Alexander Belopolskye239d232010-12-08 23:31:48 +00001472 char *straddr = PyBytes_AS_STRING(args);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001473
Alexander Belopolskye239d232010-12-08 23:31:48 +00001474 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001475 if (straddr == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001476 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001477 "wrong format");
1478 return 0;
1479 }
1480 if (setbdaddr(straddr, &_BT_HCI_MEMB(addr, bdaddr)) < 0)
1481 return 0;
1482#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001483 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
1484 if (!PyArg_ParseTuple(args, "i", &_BT_HCI_MEMB(addr, dev))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001485 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001486 "wrong format");
1487 return 0;
1488 }
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001489#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001490 *len_ret = sizeof *addr;
1491 return 1;
1492 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001493#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001494 case BTPROTO_SCO:
1495 {
1496 struct sockaddr_sco *addr;
1497 char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001498
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001499 addr = (struct sockaddr_sco *)addr_ret;
1500 _BT_SCO_MEMB(addr, family) = AF_BLUETOOTH;
1501 if (!PyBytes_Check(args)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001502 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001503 "wrong format");
1504 return 0;
1505 }
1506 straddr = PyBytes_AS_STRING(args);
1507 if (setbdaddr(straddr, &_BT_SCO_MEMB(addr, bdaddr)) < 0)
1508 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001509
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001510 *len_ret = sizeof *addr;
1511 return 1;
1512 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001513#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001514 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001515 PyErr_SetString(PyExc_OSError, "getsockaddrarg: unknown Bluetooth protocol");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001516 return 0;
1517 }
1518 }
Martin v. Löwis12af0482004-01-31 12:34:17 +00001519#endif
1520
Antoine Pitroub156a462010-10-27 20:13:57 +00001521#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFINDEX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001522 case AF_PACKET:
1523 {
1524 struct sockaddr_ll* addr;
1525 struct ifreq ifr;
1526 char *interfaceName;
1527 int protoNumber;
1528 int hatype = 0;
1529 int pkttype = 0;
1530 char *haddr = NULL;
1531 unsigned int halen = 0;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001532
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001533 if (!PyTuple_Check(args)) {
1534 PyErr_Format(
1535 PyExc_TypeError,
1536 "getsockaddrarg: "
1537 "AF_PACKET address must be tuple, not %.500s",
1538 Py_TYPE(args)->tp_name);
1539 return 0;
1540 }
1541 if (!PyArg_ParseTuple(args, "si|iiy#", &interfaceName,
1542 &protoNumber, &pkttype, &hatype,
1543 &haddr, &halen))
1544 return 0;
1545 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
1546 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
1547 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1548 s->errorhandler();
1549 return 0;
1550 }
1551 if (halen > 8) {
1552 PyErr_SetString(PyExc_ValueError,
1553 "Hardware address must be 8 bytes or less");
1554 return 0;
1555 }
1556 if (protoNumber < 0 || protoNumber > 0xffff) {
1557 PyErr_SetString(
1558 PyExc_OverflowError,
1559 "getsockaddrarg: protoNumber must be 0-65535.");
1560 return 0;
1561 }
1562 addr = (struct sockaddr_ll*)addr_ret;
1563 addr->sll_family = AF_PACKET;
1564 addr->sll_protocol = htons((short)protoNumber);
1565 addr->sll_ifindex = ifr.ifr_ifindex;
1566 addr->sll_pkttype = pkttype;
1567 addr->sll_hatype = hatype;
1568 if (halen != 0) {
1569 memcpy(&addr->sll_addr, haddr, halen);
1570 }
1571 addr->sll_halen = halen;
1572 *len_ret = sizeof *addr;
1573 return 1;
1574 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00001575#endif
1576
Christian Heimes043d6f62008-01-07 17:19:16 +00001577#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001578 case AF_TIPC:
1579 {
1580 unsigned int atype, v1, v2, v3;
1581 unsigned int scope = TIPC_CLUSTER_SCOPE;
1582 struct sockaddr_tipc *addr;
Christian Heimes043d6f62008-01-07 17:19:16 +00001583
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001584 if (!PyTuple_Check(args)) {
1585 PyErr_Format(
1586 PyExc_TypeError,
1587 "getsockaddrarg: "
1588 "AF_TIPC address must be tuple, not %.500s",
1589 Py_TYPE(args)->tp_name);
1590 return 0;
1591 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001592
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001593 if (!PyArg_ParseTuple(args,
1594 "IIII|I;Invalid TIPC address format",
1595 &atype, &v1, &v2, &v3, &scope))
1596 return 0;
Christian Heimes043d6f62008-01-07 17:19:16 +00001597
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001598 addr = (struct sockaddr_tipc *) addr_ret;
1599 memset(addr, 0, sizeof(struct sockaddr_tipc));
Christian Heimes043d6f62008-01-07 17:19:16 +00001600
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001601 addr->family = AF_TIPC;
1602 addr->scope = scope;
1603 addr->addrtype = atype;
Christian Heimes043d6f62008-01-07 17:19:16 +00001604
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001605 if (atype == TIPC_ADDR_NAMESEQ) {
1606 addr->addr.nameseq.type = v1;
1607 addr->addr.nameseq.lower = v2;
1608 addr->addr.nameseq.upper = v3;
1609 } else if (atype == TIPC_ADDR_NAME) {
1610 addr->addr.name.name.type = v1;
1611 addr->addr.name.name.instance = v2;
1612 } else if (atype == TIPC_ADDR_ID) {
1613 addr->addr.id.node = v1;
1614 addr->addr.id.ref = v2;
1615 } else {
1616 /* Shouldn't happen */
1617 PyErr_SetString(PyExc_TypeError, "Invalid address type");
1618 return 0;
1619 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001620
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001621 *len_ret = sizeof(*addr);
Christian Heimes043d6f62008-01-07 17:19:16 +00001622
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001623 return 1;
1624 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001625#endif
1626
Charles-François Natali30589c92011-10-07 22:47:08 +02001627#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02001628 case AF_CAN:
1629 switch (s->sock_proto) {
1630 case CAN_RAW:
1631 {
1632 struct sockaddr_can *addr;
1633 PyObject *interfaceName;
1634 struct ifreq ifr;
1635 addr = (struct sockaddr_can *)addr_ret;
1636 Py_ssize_t len;
1637
1638 if (!PyArg_ParseTuple(args, "O&", PyUnicode_FSConverter,
1639 &interfaceName))
1640 return 0;
1641
1642 len = PyBytes_GET_SIZE(interfaceName);
1643
1644 if (len == 0) {
1645 ifr.ifr_ifindex = 0;
1646 } else if (len < sizeof(ifr.ifr_name)) {
1647 strcpy(ifr.ifr_name, PyBytes_AS_STRING(interfaceName));
1648 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1649 s->errorhandler();
1650 Py_DECREF(interfaceName);
1651 return 0;
1652 }
1653 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001654 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02001655 "AF_CAN interface name too long");
1656 Py_DECREF(interfaceName);
1657 return 0;
1658 }
1659
1660 addr->can_family = AF_CAN;
1661 addr->can_ifindex = ifr.ifr_ifindex;
1662
1663 *len_ret = sizeof(*addr);
1664 Py_DECREF(interfaceName);
1665 return 1;
1666 }
1667 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001668 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02001669 "getsockaddrarg: unsupported CAN protocol");
1670 return 0;
1671 }
1672#endif
1673
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001674 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001675
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001676 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001677 PyErr_SetString(PyExc_OSError, "getsockaddrarg: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001678 return 0;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001679
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001680 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001681}
1682
Guido van Rossum30a685f1991-06-27 15:51:29 +00001683
Guido van Rossum48a680c2001-03-02 06:34:14 +00001684/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +00001685 Return 1 if the family is known, 0 otherwise. The length is returned
1686 through len_ret. */
1687
1688static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +00001689getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +00001690{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001691 switch (s->sock_family) {
Guido van Rossum710e1df1992-06-12 10:39:36 +00001692
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001693#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001694 case AF_UNIX:
1695 {
1696 *len_ret = sizeof (struct sockaddr_un);
1697 return 1;
1698 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001699#endif /* AF_UNIX */
Martin v. Löwis11017b12006-01-14 18:12:57 +00001700#if defined(AF_NETLINK)
1701 case AF_NETLINK:
1702 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001703 *len_ret = sizeof (struct sockaddr_nl);
1704 return 1;
Martin v. Löwis11017b12006-01-14 18:12:57 +00001705 }
1706#endif
Guido van Rossum710e1df1992-06-12 10:39:36 +00001707
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001708#ifdef AF_RDS
1709 case AF_RDS:
1710 /* RDS sockets use sockaddr_in: fall-through */
1711#endif
1712
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001713 case AF_INET:
1714 {
1715 *len_ret = sizeof (struct sockaddr_in);
1716 return 1;
1717 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00001718
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001719#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001720 case AF_INET6:
1721 {
1722 *len_ret = sizeof (struct sockaddr_in6);
1723 return 1;
1724 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001725#endif
1726
Hye-Shik Chang81268602004-02-02 06:05:24 +00001727#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001728 case AF_BLUETOOTH:
1729 {
1730 switch(s->sock_proto)
1731 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001732
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001733 case BTPROTO_L2CAP:
1734 *len_ret = sizeof (struct sockaddr_l2);
1735 return 1;
1736 case BTPROTO_RFCOMM:
1737 *len_ret = sizeof (struct sockaddr_rc);
1738 return 1;
1739 case BTPROTO_HCI:
1740 *len_ret = sizeof (struct sockaddr_hci);
1741 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00001742#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001743 case BTPROTO_SCO:
1744 *len_ret = sizeof (struct sockaddr_sco);
1745 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00001746#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001747 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001748 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001749 "unknown BT protocol");
1750 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001751
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001752 }
1753 }
Martin v. Löwis12af0482004-01-31 12:34:17 +00001754#endif
1755
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00001756#ifdef HAVE_NETPACKET_PACKET_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001757 case AF_PACKET:
1758 {
1759 *len_ret = sizeof (struct sockaddr_ll);
1760 return 1;
1761 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001762#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001763
Christian Heimes043d6f62008-01-07 17:19:16 +00001764#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001765 case AF_TIPC:
1766 {
1767 *len_ret = sizeof (struct sockaddr_tipc);
1768 return 1;
1769 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001770#endif
1771
Charles-François Natali30589c92011-10-07 22:47:08 +02001772#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02001773 case AF_CAN:
1774 {
1775 *len_ret = sizeof (struct sockaddr_can);
1776 return 1;
1777 }
1778#endif
1779
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001780 /* More cases here... */
Guido van Rossum710e1df1992-06-12 10:39:36 +00001781
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001782 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001783 PyErr_SetString(PyExc_OSError, "getsockaddrlen: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001784 return 0;
Guido van Rossum710e1df1992-06-12 10:39:36 +00001785
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001786 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00001787}
1788
1789
Nick Coghlan96fe56a2011-08-22 11:55:57 +10001790/* Support functions for the sendmsg() and recvmsg[_into]() methods.
1791 Currently, these methods are only compiled if the RFC 2292/3542
1792 CMSG_LEN() macro is available. Older systems seem to have used
1793 sizeof(struct cmsghdr) + (length) where CMSG_LEN() is used now, so
1794 it may be possible to define CMSG_LEN() that way if it's not
1795 provided. Some architectures might need extra padding after the
1796 cmsghdr, however, and CMSG_LEN() would have to take account of
1797 this. */
1798#ifdef CMSG_LEN
1799/* If length is in range, set *result to CMSG_LEN(length) and return
1800 true; otherwise, return false. */
1801static int
1802get_CMSG_LEN(size_t length, size_t *result)
1803{
1804 size_t tmp;
1805
1806 if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0)))
1807 return 0;
1808 tmp = CMSG_LEN(length);
1809 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
1810 return 0;
1811 *result = tmp;
1812 return 1;
1813}
1814
1815#ifdef CMSG_SPACE
1816/* If length is in range, set *result to CMSG_SPACE(length) and return
1817 true; otherwise, return false. */
1818static int
1819get_CMSG_SPACE(size_t length, size_t *result)
1820{
1821 size_t tmp;
1822
1823 /* Use CMSG_SPACE(1) here in order to take account of the padding
1824 necessary before *and* after the data. */
1825 if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1)))
1826 return 0;
1827 tmp = CMSG_SPACE(length);
1828 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
1829 return 0;
1830 *result = tmp;
1831 return 1;
1832}
1833#endif
1834
1835/* Return true iff msg->msg_controllen is valid, cmsgh is a valid
1836 pointer in msg->msg_control with at least "space" bytes after it,
1837 and its cmsg_len member inside the buffer. */
1838static int
1839cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space)
1840{
1841 size_t cmsg_offset;
1842 static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) +
1843 sizeof(cmsgh->cmsg_len));
1844
Charles-François Natali466517d2011-08-28 18:23:43 +02001845 /* Note that POSIX allows msg_controllen to be of signed type. */
1846 if (cmsgh == NULL || msg->msg_control == NULL || msg->msg_controllen < 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10001847 return 0;
1848 if (space < cmsg_len_end)
1849 space = cmsg_len_end;
1850 cmsg_offset = (char *)cmsgh - (char *)msg->msg_control;
1851 return (cmsg_offset <= (size_t)-1 - space &&
1852 cmsg_offset + space <= msg->msg_controllen);
1853}
1854
1855/* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set
1856 *space to number of bytes following it in the buffer and return
1857 true; otherwise, return false. Assumes cmsgh, msg->msg_control and
1858 msg->msg_controllen are valid. */
1859static int
1860get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space)
1861{
1862 size_t data_offset;
1863 char *data_ptr;
1864
1865 if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL)
1866 return 0;
1867 data_offset = data_ptr - (char *)msg->msg_control;
1868 if (data_offset > msg->msg_controllen)
1869 return 0;
1870 *space = msg->msg_controllen - data_offset;
1871 return 1;
1872}
1873
1874/* If cmsgh is invalid or not contained in the buffer pointed to by
1875 msg->msg_control, return -1. If cmsgh is valid and its associated
1876 data is entirely contained in the buffer, set *data_len to the
1877 length of the associated data and return 0. If only part of the
1878 associated data is contained in the buffer but cmsgh is otherwise
1879 valid, set *data_len to the length contained in the buffer and
1880 return 1. */
1881static int
1882get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len)
1883{
1884 size_t space, cmsg_data_len;
1885
1886 if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) ||
1887 cmsgh->cmsg_len < CMSG_LEN(0))
1888 return -1;
1889 cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0);
1890 if (!get_cmsg_data_space(msg, cmsgh, &space))
1891 return -1;
1892 if (space >= cmsg_data_len) {
1893 *data_len = cmsg_data_len;
1894 return 0;
1895 }
1896 *data_len = space;
1897 return 1;
1898}
1899#endif /* CMSG_LEN */
1900
1901
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001902/* s._accept() -> (fd, address) */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001903
Guido van Rossum73624e91994-10-10 17:59:00 +00001904static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001905sock_accept(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001906{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001907 sock_addr_t addrbuf;
1908 SOCKET_T newfd = INVALID_SOCKET;
1909 socklen_t addrlen;
1910 PyObject *sock = NULL;
1911 PyObject *addr = NULL;
1912 PyObject *res = NULL;
1913 int timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001914 if (!getsockaddrlen(s, &addrlen))
1915 return NULL;
1916 memset(&addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001917
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001918 if (!IS_SELECTABLE(s))
1919 return select_error();
Neal Norwitz082b2df2006-02-07 07:04:46 +00001920
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00001921 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001922 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00001923 timeout = internal_select_ex(s, 0, interval);
Antoine Pitroub1c54962010-10-14 15:05:38 +00001924 if (!timeout) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001925 newfd = accept(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
Antoine Pitroub1c54962010-10-14 15:05:38 +00001926 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001927 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001928
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001929 if (timeout == 1) {
1930 PyErr_SetString(socket_timeout, "timed out");
1931 return NULL;
1932 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00001933 END_SELECT_LOOP(s)
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001934
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001935 if (newfd == INVALID_SOCKET)
1936 return s->errorhandler();
Barry Warsaw752300b1997-01-03 17:18:10 +00001937
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001938 sock = PyLong_FromSocket_t(newfd);
1939 if (sock == NULL) {
1940 SOCKETCLOSE(newfd);
1941 goto finally;
1942 }
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001943
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001944 addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
1945 addrlen, s->sock_proto);
1946 if (addr == NULL)
1947 goto finally;
Barry Warsaw752300b1997-01-03 17:18:10 +00001948
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001949 res = PyTuple_Pack(2, sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00001950
Guido van Rossum67f7a382002-06-06 21:08:16 +00001951finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001952 Py_XDECREF(sock);
1953 Py_XDECREF(addr);
1954 return res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001955}
1956
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001957PyDoc_STRVAR(accept_doc,
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001958"_accept() -> (integer, address info)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00001959\n\
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001960Wait for an incoming connection. Return a new socket file descriptor\n\
1961representing the connection, and the address of the client.\n\
1962For IP sockets, the address info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001963
Guido van Rossum11ba0942002-06-13 15:07:44 +00001964/* s.setblocking(flag) method. Argument:
1965 False -- non-blocking mode; same as settimeout(0)
1966 True -- blocking mode; same as settimeout(None)
1967*/
Guido van Rossume4485b01994-09-07 14:32:49 +00001968
Guido van Rossum73624e91994-10-10 17:59:00 +00001969static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001970sock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00001971{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001972 int block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001973
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001974 block = PyLong_AsLong(arg);
1975 if (block == -1 && PyErr_Occurred())
1976 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001977
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001978 s->sock_timeout = block ? -1.0 : 0.0;
1979 internal_setblocking(s, block);
Guido van Rossume4485b01994-09-07 14:32:49 +00001980
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001981 Py_INCREF(Py_None);
1982 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +00001983}
Guido van Rossume4485b01994-09-07 14:32:49 +00001984
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001985PyDoc_STRVAR(setblocking_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001986"setblocking(flag)\n\
1987\n\
1988Set the socket to blocking (flag is true) or non-blocking (false).\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00001989setblocking(True) is equivalent to settimeout(None);\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001990setblocking(False) is equivalent to settimeout(0.0).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001991
Guido van Rossum11ba0942002-06-13 15:07:44 +00001992/* s.settimeout(timeout) method. Argument:
1993 None -- no timeout, blocking mode; same as setblocking(True)
1994 0.0 -- non-blocking mode; same as setblocking(False)
1995 > 0 -- timeout mode; operations time out after timeout seconds
1996 < 0 -- illegal; raises an exception
1997*/
Guido van Rossum67f7a382002-06-06 21:08:16 +00001998static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001999sock_settimeout(PySocketSockObject *s, PyObject *arg)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002000{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002001 double timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002002
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002003 if (arg == Py_None)
2004 timeout = -1.0;
2005 else {
2006 timeout = PyFloat_AsDouble(arg);
2007 if (timeout < 0.0) {
2008 if (!PyErr_Occurred())
2009 PyErr_SetString(PyExc_ValueError,
2010 "Timeout value out of range");
2011 return NULL;
2012 }
2013 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002014
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002015 s->sock_timeout = timeout;
2016 internal_setblocking(s, timeout < 0.0);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002017
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002018 Py_INCREF(Py_None);
2019 return Py_None;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002020}
2021
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002022PyDoc_STRVAR(settimeout_doc,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002023"settimeout(timeout)\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002024\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002025Set a timeout on socket operations. 'timeout' can be a float,\n\
2026giving in seconds, or None. Setting a timeout of None disables\n\
2027the timeout feature and is equivalent to setblocking(1).\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002028Setting a timeout of zero is the same as setblocking(0).");
Guido van Rossum67f7a382002-06-06 21:08:16 +00002029
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002030/* s.gettimeout() method.
2031 Returns the timeout associated with a socket. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00002032static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002033sock_gettimeout(PySocketSockObject *s)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002034{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002035 if (s->sock_timeout < 0.0) {
2036 Py_INCREF(Py_None);
2037 return Py_None;
2038 }
2039 else
2040 return PyFloat_FromDouble(s->sock_timeout);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002041}
2042
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002043PyDoc_STRVAR(gettimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002044"gettimeout() -> timeout\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002045\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03002046Returns the timeout in seconds (float) associated with socket \n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002047operations. A timeout of None indicates that timeouts on socket \n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002048operations are disabled.");
Guido van Rossume4485b01994-09-07 14:32:49 +00002049
Guido van Rossumaee08791992-09-08 09:05:33 +00002050/* s.setsockopt() method.
2051 With an integer third argument, sets an integer option.
2052 With a string third argument, sets an option from a buffer;
2053 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002054
Guido van Rossum73624e91994-10-10 17:59:00 +00002055static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002056sock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002057{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002058 int level;
2059 int optname;
2060 int res;
2061 char *buf;
2062 int buflen;
2063 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002064
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002065 if (PyArg_ParseTuple(args, "iii:setsockopt",
2066 &level, &optname, &flag)) {
2067 buf = (char *) &flag;
2068 buflen = sizeof flag;
2069 }
2070 else {
2071 PyErr_Clear();
2072 if (!PyArg_ParseTuple(args, "iiy#:setsockopt",
2073 &level, &optname, &buf, &buflen))
2074 return NULL;
2075 }
2076 res = setsockopt(s->sock_fd, level, optname, (void *)buf, buflen);
2077 if (res < 0)
2078 return s->errorhandler();
2079 Py_INCREF(Py_None);
2080 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002081}
2082
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002083PyDoc_STRVAR(setsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002084"setsockopt(level, option, value)\n\
2085\n\
2086Set a socket option. See the Unix manual for level and option.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002087The value argument can either be an integer or a string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002088
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002089
Guido van Rossumaee08791992-09-08 09:05:33 +00002090/* s.getsockopt() method.
2091 With two arguments, retrieves an integer option.
2092 With a third integer argument, retrieves a string buffer of that size;
2093 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002094
Guido van Rossum73624e91994-10-10 17:59:00 +00002095static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002096sock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002097{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002098 int level;
2099 int optname;
2100 int res;
2101 PyObject *buf;
2102 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002103
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002104 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
2105 &level, &optname, &buflen))
2106 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002107
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002108 if (buflen == 0) {
2109 int flag = 0;
2110 socklen_t flagsize = sizeof flag;
2111 res = getsockopt(s->sock_fd, level, optname,
2112 (void *)&flag, &flagsize);
2113 if (res < 0)
2114 return s->errorhandler();
2115 return PyLong_FromLong(flag);
2116 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002117#ifdef __VMS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002118 /* socklen_t is unsigned so no negative test is needed,
2119 test buflen == 0 is previously done */
2120 if (buflen > 1024) {
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002121#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002122 if (buflen <= 0 || buflen > 1024) {
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002123#endif
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002124 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002125 "getsockopt buflen out of range");
2126 return NULL;
2127 }
2128 buf = PyBytes_FromStringAndSize((char *)NULL, buflen);
2129 if (buf == NULL)
2130 return NULL;
2131 res = getsockopt(s->sock_fd, level, optname,
2132 (void *)PyBytes_AS_STRING(buf), &buflen);
2133 if (res < 0) {
2134 Py_DECREF(buf);
2135 return s->errorhandler();
2136 }
2137 _PyBytes_Resize(&buf, buflen);
2138 return buf;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002139}
2140
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002141PyDoc_STRVAR(getsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002142"getsockopt(level, option[, buffersize]) -> value\n\
2143\n\
2144Get a socket option. See the Unix manual for level and option.\n\
2145If a nonzero buffersize argument is given, the return value is a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002146string of that length; otherwise it is an integer.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002147
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002148
Fred Drake728819a2000-07-01 03:40:12 +00002149/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002150
Guido van Rossum73624e91994-10-10 17:59:00 +00002151static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002152sock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002153{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002154 sock_addr_t addrbuf;
2155 int addrlen;
2156 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002157
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002158 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2159 return NULL;
2160 Py_BEGIN_ALLOW_THREADS
2161 res = bind(s->sock_fd, SAS2SA(&addrbuf), addrlen);
2162 Py_END_ALLOW_THREADS
2163 if (res < 0)
2164 return s->errorhandler();
2165 Py_INCREF(Py_None);
2166 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002167}
2168
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002169PyDoc_STRVAR(bind_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002170"bind(address)\n\
2171\n\
2172Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00002173pair (host, port); the host must refer to the local host. For raw packet\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002174sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002175
Guido van Rossum30a685f1991-06-27 15:51:29 +00002176
2177/* s.close() method.
2178 Set the file descriptor to -1 so operations tried subsequently
2179 will surely fail. */
2180
Guido van Rossum73624e91994-10-10 17:59:00 +00002181static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002182sock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002183{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002184 SOCKET_T fd;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002185
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002186 if ((fd = s->sock_fd) != -1) {
2187 s->sock_fd = -1;
2188 Py_BEGIN_ALLOW_THREADS
2189 (void) SOCKETCLOSE(fd);
2190 Py_END_ALLOW_THREADS
2191 }
2192 Py_INCREF(Py_None);
2193 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002194}
2195
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002196PyDoc_STRVAR(close_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002197"close()\n\
2198\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002199Close the socket. It cannot be used after this call.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002200
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002201static PyObject *
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002202sock_detach(PySocketSockObject *s)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002203{
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002204 SOCKET_T fd = s->sock_fd;
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002205 s->sock_fd = -1;
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002206 return PyLong_FromSocket_t(fd);
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002207}
2208
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002209PyDoc_STRVAR(detach_doc,
2210"detach()\n\
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002211\n\
2212Close the socket object without closing the underlying file descriptor.\
2213The object cannot be used after this call, but the file descriptor\
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002214can be reused for other purposes. The file descriptor is returned.");
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002215
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002216static int
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002217internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002218 int *timeoutp)
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002219{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002220 int res, timeout;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002221
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002222 timeout = 0;
2223 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002224
2225#ifdef MS_WINDOWS
2226
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002227 if (s->sock_timeout > 0.0) {
2228 if (res < 0 && WSAGetLastError() == WSAEWOULDBLOCK &&
2229 IS_SELECTABLE(s)) {
2230 /* This is a mess. Best solution: trust select */
2231 fd_set fds;
2232 fd_set fds_exc;
2233 struct timeval tv;
2234 tv.tv_sec = (int)s->sock_timeout;
2235 tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6);
2236 FD_ZERO(&fds);
2237 FD_SET(s->sock_fd, &fds);
2238 FD_ZERO(&fds_exc);
2239 FD_SET(s->sock_fd, &fds_exc);
Antoine Pitrou19467d22010-08-17 19:33:30 +00002240 res = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
2241 NULL, &fds, &fds_exc, &tv);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002242 if (res == 0) {
2243 res = WSAEWOULDBLOCK;
2244 timeout = 1;
2245 } else if (res > 0) {
2246 if (FD_ISSET(s->sock_fd, &fds))
2247 /* The socket is in the writable set - this
2248 means connected */
2249 res = 0;
2250 else {
2251 /* As per MS docs, we need to call getsockopt()
2252 to get the underlying error */
2253 int res_size = sizeof res;
2254 /* It must be in the exception set */
2255 assert(FD_ISSET(s->sock_fd, &fds_exc));
2256 if (0 == getsockopt(s->sock_fd, SOL_SOCKET, SO_ERROR,
2257 (char *)&res, &res_size))
2258 /* getsockopt also clears WSAGetLastError,
2259 so reset it back. */
2260 WSASetLastError(res);
2261 else
2262 res = WSAGetLastError();
2263 }
2264 }
2265 /* else if (res < 0) an error occurred */
2266 }
2267 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002268
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002269 if (res < 0)
2270 res = WSAGetLastError();
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002271
2272#else
2273
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002274 if (s->sock_timeout > 0.0) {
2275 if (res < 0 && errno == EINPROGRESS && IS_SELECTABLE(s)) {
2276 timeout = internal_select(s, 1);
2277 if (timeout == 0) {
2278 /* Bug #1019808: in case of an EINPROGRESS,
2279 use getsockopt(SO_ERROR) to get the real
2280 error. */
2281 socklen_t res_size = sizeof res;
2282 (void)getsockopt(s->sock_fd, SOL_SOCKET,
2283 SO_ERROR, &res, &res_size);
2284 if (res == EISCONN)
2285 res = 0;
2286 errno = res;
2287 }
2288 else if (timeout == -1) {
2289 res = errno; /* had error */
2290 }
2291 else
2292 res = EWOULDBLOCK; /* timed out */
2293 }
2294 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002295
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002296 if (res < 0)
2297 res = errno;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002298
2299#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002300 *timeoutp = timeout;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002301
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002302 return res;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002303}
Guido van Rossum30a685f1991-06-27 15:51:29 +00002304
Fred Drake728819a2000-07-01 03:40:12 +00002305/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002306
Guido van Rossum73624e91994-10-10 17:59:00 +00002307static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002308sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002309{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002310 sock_addr_t addrbuf;
2311 int addrlen;
2312 int res;
2313 int timeout;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002314
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002315 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2316 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002317
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002318 Py_BEGIN_ALLOW_THREADS
2319 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, &timeout);
2320 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002321
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002322 if (timeout == 1) {
2323 PyErr_SetString(socket_timeout, "timed out");
2324 return NULL;
2325 }
2326 if (res != 0)
2327 return s->errorhandler();
2328 Py_INCREF(Py_None);
2329 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002330}
2331
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002332PyDoc_STRVAR(connect_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002333"connect(address)\n\
2334\n\
2335Connect the socket to a remote address. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002336is a pair (host, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002337
Guido van Rossum30a685f1991-06-27 15:51:29 +00002338
Fred Drake728819a2000-07-01 03:40:12 +00002339/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002340
2341static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002342sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002343{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002344 sock_addr_t addrbuf;
2345 int addrlen;
2346 int res;
2347 int timeout;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002348
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002349 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2350 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002351
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002352 Py_BEGIN_ALLOW_THREADS
2353 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, &timeout);
2354 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002355
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002356 /* Signals are not errors (though they may raise exceptions). Adapted
2357 from PyErr_SetFromErrnoWithFilenameObject(). */
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002358#ifdef EINTR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002359 if (res == EINTR && PyErr_CheckSignals())
2360 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002361#endif
2362
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002363 return PyLong_FromLong((long) res);
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002364}
2365
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002366PyDoc_STRVAR(connect_ex_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002367"connect_ex(address) -> errno\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002368\n\
2369This is like connect(address), but returns an error code (the errno value)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002370instead of raising an exception when an error occurs.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002371
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002372
Guido van Rossumed233a51992-06-23 09:07:03 +00002373/* s.fileno() method */
2374
Guido van Rossum73624e91994-10-10 17:59:00 +00002375static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002376sock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00002377{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002378 return PyLong_FromSocket_t(s->sock_fd);
Guido van Rossumed233a51992-06-23 09:07:03 +00002379}
2380
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002381PyDoc_STRVAR(fileno_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002382"fileno() -> integer\n\
2383\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002384Return the integer file descriptor of the socket.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002385
Guido van Rossumed233a51992-06-23 09:07:03 +00002386
Guido van Rossumc89705d1992-11-26 08:54:07 +00002387/* s.getsockname() method */
2388
Guido van Rossum73624e91994-10-10 17:59:00 +00002389static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002390sock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002391{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002392 sock_addr_t addrbuf;
2393 int res;
2394 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002395
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002396 if (!getsockaddrlen(s, &addrlen))
2397 return NULL;
2398 memset(&addrbuf, 0, addrlen);
2399 Py_BEGIN_ALLOW_THREADS
2400 res = getsockname(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2401 Py_END_ALLOW_THREADS
2402 if (res < 0)
2403 return s->errorhandler();
2404 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2405 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002406}
2407
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002408PyDoc_STRVAR(getsockname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002409"getsockname() -> address info\n\
2410\n\
2411Return the address of the local endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002412info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002413
Guido van Rossumc89705d1992-11-26 08:54:07 +00002414
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002415#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002416/* s.getpeername() method */
2417
Guido van Rossum73624e91994-10-10 17:59:00 +00002418static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002419sock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002420{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002421 sock_addr_t addrbuf;
2422 int res;
2423 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002424
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002425 if (!getsockaddrlen(s, &addrlen))
2426 return NULL;
2427 memset(&addrbuf, 0, addrlen);
2428 Py_BEGIN_ALLOW_THREADS
2429 res = getpeername(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2430 Py_END_ALLOW_THREADS
2431 if (res < 0)
2432 return s->errorhandler();
2433 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2434 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002435}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002436
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002437PyDoc_STRVAR(getpeername_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002438"getpeername() -> address info\n\
2439\n\
2440Return the address of the remote endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002441info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002442
Guido van Rossumb6775db1994-08-01 11:34:53 +00002443#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002444
2445
Guido van Rossum30a685f1991-06-27 15:51:29 +00002446/* s.listen(n) method */
2447
Guido van Rossum73624e91994-10-10 17:59:00 +00002448static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002449sock_listen(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002450{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002451 int backlog;
2452 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002453
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002454 backlog = PyLong_AsLong(arg);
2455 if (backlog == -1 && PyErr_Occurred())
2456 return NULL;
2457 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou1be815a2011-05-10 19:16:29 +02002458 /* To avoid problems on systems that don't allow a negative backlog
2459 * (which doesn't make sense anyway) we force a minimum value of 0. */
2460 if (backlog < 0)
2461 backlog = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002462 res = listen(s->sock_fd, backlog);
2463 Py_END_ALLOW_THREADS
2464 if (res < 0)
2465 return s->errorhandler();
2466 Py_INCREF(Py_None);
2467 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002468}
2469
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002470PyDoc_STRVAR(listen_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002471"listen(backlog)\n\
2472\n\
2473Enable a server to accept connections. The backlog argument must be at\n\
Antoine Pitrou1be815a2011-05-10 19:16:29 +02002474least 0 (if it is lower, it is set to 0); it specifies the number of\n\
2475unaccepted connections that the system will allow before refusing new\n\
2476connections.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002477
2478
Thomas Wouters477c8d52006-05-27 19:21:47 +00002479/*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002480 * This is the guts of the recv() and recv_into() methods, which reads into a
Thomas Wouters902d6eb2007-01-09 23:18:33 +00002481 * char buffer. If you have any inc/dec ref to do to the objects that contain
Thomas Wouters477c8d52006-05-27 19:21:47 +00002482 * the buffer, do it in the caller. This function returns the number of bytes
Ezio Melotti13925002011-03-16 11:05:33 +02002483 * successfully read. If there was an error, it returns -1. Note that it is
Thomas Wouters477c8d52006-05-27 19:21:47 +00002484 * also possible that we return a number of bytes smaller than the request
2485 * bytes.
2486 */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002487
Antoine Pitrou19467d22010-08-17 19:33:30 +00002488static Py_ssize_t
2489sock_recv_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002490{
Antoine Pitrou19467d22010-08-17 19:33:30 +00002491 Py_ssize_t outlen = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002492 int timeout;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002493#ifdef __VMS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002494 int remaining;
2495 char *read_buf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002496#endif
2497
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002498 if (!IS_SELECTABLE(s)) {
2499 select_error();
2500 return -1;
2501 }
2502 if (len == 0) {
2503 /* If 0 bytes were requested, do nothing. */
2504 return 0;
2505 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002506
2507#ifndef __VMS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002508 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002509 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002510 timeout = internal_select_ex(s, 0, interval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002511 if (!timeout)
2512 outlen = recv(s->sock_fd, cbuf, len, flags);
2513 Py_END_ALLOW_THREADS
Thomas Wouters477c8d52006-05-27 19:21:47 +00002514
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002515 if (timeout == 1) {
2516 PyErr_SetString(socket_timeout, "timed out");
2517 return -1;
2518 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002519 END_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002520 if (outlen < 0) {
2521 /* Note: the call to errorhandler() ALWAYS indirectly returned
2522 NULL, so ignore its return value */
2523 s->errorhandler();
2524 return -1;
2525 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002526#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002527 read_buf = cbuf;
2528 remaining = len;
2529 while (remaining != 0) {
2530 unsigned int segment;
2531 int nread = -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002532
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002533 segment = remaining /SEGMENT_SIZE;
2534 if (segment != 0) {
2535 segment = SEGMENT_SIZE;
2536 }
2537 else {
2538 segment = remaining;
2539 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002540
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002541 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002542 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002543 timeout = internal_select_ex(s, 0, interval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002544 if (!timeout)
2545 nread = recv(s->sock_fd, read_buf, segment, flags);
2546 Py_END_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002547 if (timeout == 1) {
2548 PyErr_SetString(socket_timeout, "timed out");
2549 return -1;
2550 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002551 END_SELECT_LOOP(s)
2552
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002553 if (nread < 0) {
2554 s->errorhandler();
2555 return -1;
2556 }
2557 if (nread != remaining) {
2558 read_buf += nread;
2559 break;
2560 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002561
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002562 remaining -= segment;
2563 read_buf += segment;
2564 }
2565 outlen = read_buf - cbuf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002566#endif /* !__VMS */
2567
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002568 return outlen;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002569}
2570
Guido van Rossum48a680c2001-03-02 06:34:14 +00002571
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002572/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002573
Guido van Rossum73624e91994-10-10 17:59:00 +00002574static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002575sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002576{
Antoine Pitrou19467d22010-08-17 19:33:30 +00002577 Py_ssize_t recvlen, outlen;
2578 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002579 PyObject *buf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002580
Antoine Pitrou19467d22010-08-17 19:33:30 +00002581 if (!PyArg_ParseTuple(args, "n|i:recv", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002582 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002583
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002584 if (recvlen < 0) {
2585 PyErr_SetString(PyExc_ValueError,
2586 "negative buffersize in recv");
2587 return NULL;
2588 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002589
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002590 /* Allocate a new string. */
2591 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
2592 if (buf == NULL)
2593 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002594
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002595 /* Call the guts */
2596 outlen = sock_recv_guts(s, PyBytes_AS_STRING(buf), recvlen, flags);
2597 if (outlen < 0) {
2598 /* An error occurred, release the string and return an
2599 error. */
2600 Py_DECREF(buf);
2601 return NULL;
2602 }
2603 if (outlen != recvlen) {
2604 /* We did not read as many bytes as we anticipated, resize the
2605 string if possible and be successful. */
2606 _PyBytes_Resize(&buf, outlen);
2607 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002608
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002609 return buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002610}
2611
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002612PyDoc_STRVAR(recv_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002613"recv(buffersize[, flags]) -> data\n\
2614\n\
2615Receive up to buffersize bytes from the socket. For the optional flags\n\
2616argument, see the Unix manual. When no data is available, block until\n\
2617at least one byte is available or until the remote end is closed. When\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002618the remote end is closed and all data is read, return the empty string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002619
Guido van Rossum30a685f1991-06-27 15:51:29 +00002620
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002621/* s.recv_into(buffer, [nbytes [,flags]]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002622
Thomas Wouters477c8d52006-05-27 19:21:47 +00002623static PyObject*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002624sock_recv_into(PySocketSockObject *s, PyObject *args, PyObject *kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002625{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002626 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00002627
Antoine Pitrou19467d22010-08-17 19:33:30 +00002628 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002629 Py_buffer pbuf;
2630 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002631 Py_ssize_t buflen, readlen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002632
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002633 /* Get the buffer's memory */
Antoine Pitrou19467d22010-08-17 19:33:30 +00002634 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recv_into", kwlist,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002635 &pbuf, &recvlen, &flags))
2636 return NULL;
2637 buf = pbuf.buf;
2638 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002639
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002640 if (recvlen < 0) {
2641 PyBuffer_Release(&pbuf);
2642 PyErr_SetString(PyExc_ValueError,
2643 "negative buffersize in recv_into");
2644 return NULL;
2645 }
2646 if (recvlen == 0) {
2647 /* If nbytes was not specified, use the buffer's length */
2648 recvlen = buflen;
2649 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002650
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002651 /* Check if the buffer is large enough */
2652 if (buflen < recvlen) {
2653 PyBuffer_Release(&pbuf);
2654 PyErr_SetString(PyExc_ValueError,
2655 "buffer too small for requested bytes");
2656 return NULL;
2657 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002658
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002659 /* Call the guts */
2660 readlen = sock_recv_guts(s, buf, recvlen, flags);
2661 if (readlen < 0) {
2662 /* Return an error. */
2663 PyBuffer_Release(&pbuf);
2664 return NULL;
2665 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002666
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002667 PyBuffer_Release(&pbuf);
2668 /* Return the number of bytes read. Note that we do not do anything
2669 special here in the case that readlen < recvlen. */
2670 return PyLong_FromSsize_t(readlen);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002671}
2672
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002673PyDoc_STRVAR(recv_into_doc,
2674"recv_into(buffer, [nbytes[, flags]]) -> nbytes_read\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00002675\n\
2676A version of recv() that stores its data into a buffer rather than creating \n\
2677a new string. Receive up to buffersize bytes from the socket. If buffersize \n\
2678is not specified (or 0), receive up to the size available in the given buffer.\n\
2679\n\
2680See recv() for documentation about the flags.");
2681
2682
2683/*
Christian Heimes99170a52007-12-19 02:07:34 +00002684 * This is the guts of the recvfrom() and recvfrom_into() methods, which reads
2685 * into a char buffer. If you have any inc/def ref to do to the objects that
2686 * contain the buffer, do it in the caller. This function returns the number
Ezio Melotti13925002011-03-16 11:05:33 +02002687 * of bytes successfully read. If there was an error, it returns -1. Note
Christian Heimes99170a52007-12-19 02:07:34 +00002688 * that it is also possible that we return a number of bytes smaller than the
2689 * request bytes.
Thomas Wouters477c8d52006-05-27 19:21:47 +00002690 *
2691 * 'addr' is a return value for the address object. Note that you must decref
2692 * it yourself.
2693 */
Antoine Pitrou19467d22010-08-17 19:33:30 +00002694static Py_ssize_t
2695sock_recvfrom_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002696 PyObject** addr)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002697{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002698 sock_addr_t addrbuf;
2699 int timeout;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002700 Py_ssize_t n = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002701 socklen_t addrlen;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002702
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002703 *addr = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002704
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002705 if (!getsockaddrlen(s, &addrlen))
2706 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002707
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002708 if (!IS_SELECTABLE(s)) {
2709 select_error();
2710 return -1;
2711 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00002712
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002713 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002714 Py_BEGIN_ALLOW_THREADS
2715 memset(&addrbuf, 0, addrlen);
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002716 timeout = internal_select_ex(s, 0, interval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002717 if (!timeout) {
Guido van Rossum8d665e61996-06-26 18:22:49 +00002718#ifndef MS_WINDOWS
Andrew MacIntyreba43e872002-03-03 03:03:52 +00002719#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002720 n = recvfrom(s->sock_fd, cbuf, len, flags,
2721 SAS2SA(&addrbuf), &addrlen);
Guido van Rossum32c575d1997-12-02 20:37:32 +00002722#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002723 n = recvfrom(s->sock_fd, cbuf, len, flags,
2724 (void *) &addrbuf, &addrlen);
Guido van Rossum32c575d1997-12-02 20:37:32 +00002725#endif
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002726#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002727 n = recvfrom(s->sock_fd, cbuf, len, flags,
2728 SAS2SA(&addrbuf), &addrlen);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002729#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002730 }
2731 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002732
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002733 if (timeout == 1) {
2734 PyErr_SetString(socket_timeout, "timed out");
2735 return -1;
2736 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002737 END_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002738 if (n < 0) {
2739 s->errorhandler();
2740 return -1;
2741 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002742
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002743 if (!(*addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
2744 addrlen, s->sock_proto)))
2745 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002746
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002747 return n;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002748}
2749
2750/* s.recvfrom(nbytes [,flags]) method */
2751
2752static PyObject *
2753sock_recvfrom(PySocketSockObject *s, PyObject *args)
2754{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002755 PyObject *buf = NULL;
2756 PyObject *addr = NULL;
2757 PyObject *ret = NULL;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002758 int flags = 0;
2759 Py_ssize_t recvlen, outlen;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002760
Antoine Pitrou19467d22010-08-17 19:33:30 +00002761 if (!PyArg_ParseTuple(args, "n|i:recvfrom", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002762 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002763
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002764 if (recvlen < 0) {
2765 PyErr_SetString(PyExc_ValueError,
2766 "negative buffersize in recvfrom");
2767 return NULL;
2768 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00002769
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002770 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
2771 if (buf == NULL)
2772 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002773
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002774 outlen = sock_recvfrom_guts(s, PyBytes_AS_STRING(buf),
2775 recvlen, flags, &addr);
2776 if (outlen < 0) {
2777 goto finally;
2778 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002779
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002780 if (outlen != recvlen) {
2781 /* We did not read as many bytes as we anticipated, resize the
Ezio Melotti13925002011-03-16 11:05:33 +02002782 string if possible and be successful. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002783 if (_PyBytes_Resize(&buf, outlen) < 0)
Ezio Melotti13925002011-03-16 11:05:33 +02002784 /* Oopsy, not so successful after all. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002785 goto finally;
2786 }
Barry Warsaw752300b1997-01-03 17:18:10 +00002787
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002788 ret = PyTuple_Pack(2, buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002789
2790finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002791 Py_XDECREF(buf);
2792 Py_XDECREF(addr);
2793 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002794}
2795
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002796PyDoc_STRVAR(recvfrom_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002797"recvfrom(buffersize[, flags]) -> (data, address info)\n\
2798\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002799Like recv(buffersize, flags) but also return the sender's address info.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002800
Thomas Wouters477c8d52006-05-27 19:21:47 +00002801
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002802/* s.recvfrom_into(buffer[, nbytes [,flags]]) method */
Thomas Wouters477c8d52006-05-27 19:21:47 +00002803
2804static PyObject *
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002805sock_recvfrom_into(PySocketSockObject *s, PyObject *args, PyObject* kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002806{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002807 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00002808
Antoine Pitrou19467d22010-08-17 19:33:30 +00002809 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002810 Py_buffer pbuf;
2811 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002812 Py_ssize_t readlen, buflen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002813
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002814 PyObject *addr = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002815
Antoine Pitrou19467d22010-08-17 19:33:30 +00002816 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recvfrom_into",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002817 kwlist, &pbuf,
2818 &recvlen, &flags))
2819 return NULL;
2820 buf = pbuf.buf;
2821 buflen = pbuf.len;
2822 assert(buf != 0 && buflen > 0);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002823
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002824 if (recvlen < 0) {
2825 PyBuffer_Release(&pbuf);
2826 PyErr_SetString(PyExc_ValueError,
2827 "negative buffersize in recvfrom_into");
2828 return NULL;
2829 }
2830 if (recvlen == 0) {
2831 /* If nbytes was not specified, use the buffer's length */
2832 recvlen = buflen;
2833 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002834
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002835 readlen = sock_recvfrom_guts(s, buf, recvlen, flags, &addr);
2836 if (readlen < 0) {
2837 PyBuffer_Release(&pbuf);
2838 /* Return an error */
2839 Py_XDECREF(addr);
2840 return NULL;
2841 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002842
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002843 PyBuffer_Release(&pbuf);
2844 /* Return the number of bytes read and the address. Note that we do
2845 not do anything special here in the case that readlen < recvlen. */
Antoine Pitrou19467d22010-08-17 19:33:30 +00002846 return Py_BuildValue("nN", readlen, addr);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002847}
2848
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002849PyDoc_STRVAR(recvfrom_into_doc,
2850"recvfrom_into(buffer[, nbytes[, flags]]) -> (nbytes, address info)\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00002851\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002852Like recv_into(buffer[, nbytes[, flags]]) but also return the sender's address info.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00002853
2854
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002855/* The sendmsg() and recvmsg[_into]() methods require a working
2856 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
2857#ifdef CMSG_LEN
2858/*
2859 * Call recvmsg() with the supplied iovec structures, flags, and
2860 * ancillary data buffer size (controllen). Returns the tuple return
2861 * value for recvmsg() or recvmsg_into(), with the first item provided
2862 * by the supplied makeval() function. makeval() will be called with
2863 * the length read and makeval_data as arguments, and must return a
2864 * new reference (which will be decrefed if there is a subsequent
2865 * error). On error, closes any file descriptors received via
2866 * SCM_RIGHTS.
2867 */
2868static PyObject *
2869sock_recvmsg_guts(PySocketSockObject *s, struct iovec *iov, int iovlen,
2870 int flags, Py_ssize_t controllen,
2871 PyObject *(*makeval)(ssize_t, void *), void *makeval_data)
2872{
2873 ssize_t bytes_received = -1;
2874 int timeout;
2875 sock_addr_t addrbuf;
2876 socklen_t addrbuflen;
Charles-François Natalie9e95ae2011-08-24 21:40:53 +02002877 struct msghdr msg = {0};
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002878 PyObject *cmsg_list = NULL, *retval = NULL;
2879 void *controlbuf = NULL;
2880 struct cmsghdr *cmsgh;
2881 size_t cmsgdatalen = 0;
2882 int cmsg_status;
2883
2884 /* XXX: POSIX says that msg_name and msg_namelen "shall be
2885 ignored" when the socket is connected (Linux fills them in
2886 anyway for AF_UNIX sockets at least). Normally msg_namelen
2887 seems to be set to 0 if there's no address, but try to
2888 initialize msg_name to something that won't be mistaken for a
2889 real address if that doesn't happen. */
2890 if (!getsockaddrlen(s, &addrbuflen))
2891 return NULL;
2892 memset(&addrbuf, 0, addrbuflen);
2893 SAS2SA(&addrbuf)->sa_family = AF_UNSPEC;
2894
2895 if (controllen < 0 || controllen > SOCKLEN_T_LIMIT) {
2896 PyErr_SetString(PyExc_ValueError,
2897 "invalid ancillary data buffer length");
2898 return NULL;
2899 }
2900 if (controllen > 0 && (controlbuf = PyMem_Malloc(controllen)) == NULL)
2901 return PyErr_NoMemory();
2902
2903 /* Make the system call. */
2904 if (!IS_SELECTABLE(s)) {
2905 select_error();
2906 goto finally;
2907 }
2908
2909 BEGIN_SELECT_LOOP(s)
2910 Py_BEGIN_ALLOW_THREADS;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002911 msg.msg_name = SAS2SA(&addrbuf);
2912 msg.msg_namelen = addrbuflen;
2913 msg.msg_iov = iov;
2914 msg.msg_iovlen = iovlen;
2915 msg.msg_control = controlbuf;
2916 msg.msg_controllen = controllen;
2917 timeout = internal_select_ex(s, 0, interval);
2918 if (!timeout)
2919 bytes_received = recvmsg(s->sock_fd, &msg, flags);
2920 Py_END_ALLOW_THREADS;
2921 if (timeout == 1) {
2922 PyErr_SetString(socket_timeout, "timed out");
2923 goto finally;
2924 }
2925 END_SELECT_LOOP(s)
2926
2927 if (bytes_received < 0) {
2928 s->errorhandler();
2929 goto finally;
2930 }
2931
2932 /* Make list of (level, type, data) tuples from control messages. */
2933 if ((cmsg_list = PyList_New(0)) == NULL)
2934 goto err_closefds;
2935 /* Check for empty ancillary data as old CMSG_FIRSTHDR()
2936 implementations didn't do so. */
2937 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
2938 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
2939 PyObject *bytes, *tuple;
2940 int tmp;
2941
2942 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
2943 if (cmsg_status != 0) {
2944 if (PyErr_WarnEx(PyExc_RuntimeWarning,
2945 "received malformed or improperly-truncated "
2946 "ancillary data", 1) == -1)
2947 goto err_closefds;
2948 }
2949 if (cmsg_status < 0)
2950 break;
2951 if (cmsgdatalen > PY_SSIZE_T_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002952 PyErr_SetString(PyExc_OSError, "control message too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002953 goto err_closefds;
2954 }
2955
2956 bytes = PyBytes_FromStringAndSize((char *)CMSG_DATA(cmsgh),
2957 cmsgdatalen);
2958 tuple = Py_BuildValue("iiN", (int)cmsgh->cmsg_level,
2959 (int)cmsgh->cmsg_type, bytes);
2960 if (tuple == NULL)
2961 goto err_closefds;
2962 tmp = PyList_Append(cmsg_list, tuple);
2963 Py_DECREF(tuple);
2964 if (tmp != 0)
2965 goto err_closefds;
2966
2967 if (cmsg_status != 0)
2968 break;
2969 }
2970
2971 retval = Py_BuildValue("NOiN",
2972 (*makeval)(bytes_received, makeval_data),
2973 cmsg_list,
2974 (int)msg.msg_flags,
2975 makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
2976 ((msg.msg_namelen > addrbuflen) ?
2977 addrbuflen : msg.msg_namelen),
2978 s->sock_proto));
2979 if (retval == NULL)
2980 goto err_closefds;
2981
2982finally:
2983 Py_XDECREF(cmsg_list);
2984 PyMem_Free(controlbuf);
2985 return retval;
2986
2987err_closefds:
2988#ifdef SCM_RIGHTS
2989 /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */
2990 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
2991 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
2992 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
2993 if (cmsg_status < 0)
2994 break;
2995 if (cmsgh->cmsg_level == SOL_SOCKET &&
2996 cmsgh->cmsg_type == SCM_RIGHTS) {
2997 size_t numfds;
2998 int *fdp;
2999
3000 numfds = cmsgdatalen / sizeof(int);
3001 fdp = (int *)CMSG_DATA(cmsgh);
3002 while (numfds-- > 0)
3003 close(*fdp++);
3004 }
3005 if (cmsg_status != 0)
3006 break;
3007 }
3008#endif /* SCM_RIGHTS */
3009 goto finally;
3010}
3011
3012
3013static PyObject *
3014makeval_recvmsg(ssize_t received, void *data)
3015{
3016 PyObject **buf = data;
3017
3018 if (received < PyBytes_GET_SIZE(*buf))
3019 _PyBytes_Resize(buf, received);
3020 Py_XINCREF(*buf);
3021 return *buf;
3022}
3023
3024/* s.recvmsg(bufsize[, ancbufsize[, flags]]) method */
3025
3026static PyObject *
3027sock_recvmsg(PySocketSockObject *s, PyObject *args)
3028{
3029 Py_ssize_t bufsize, ancbufsize = 0;
3030 int flags = 0;
3031 struct iovec iov;
3032 PyObject *buf = NULL, *retval = NULL;
3033
3034 if (!PyArg_ParseTuple(args, "n|ni:recvmsg", &bufsize, &ancbufsize, &flags))
3035 return NULL;
3036
3037 if (bufsize < 0) {
3038 PyErr_SetString(PyExc_ValueError, "negative buffer size in recvmsg()");
3039 return NULL;
3040 }
3041 if ((buf = PyBytes_FromStringAndSize(NULL, bufsize)) == NULL)
3042 return NULL;
3043 iov.iov_base = PyBytes_AS_STRING(buf);
3044 iov.iov_len = bufsize;
3045
3046 /* Note that we're passing a pointer to *our pointer* to the bytes
3047 object here (&buf); makeval_recvmsg() may incref the object, or
3048 deallocate it and set our pointer to NULL. */
3049 retval = sock_recvmsg_guts(s, &iov, 1, flags, ancbufsize,
3050 &makeval_recvmsg, &buf);
3051 Py_XDECREF(buf);
3052 return retval;
3053}
3054
3055PyDoc_STRVAR(recvmsg_doc,
3056"recvmsg(bufsize[, ancbufsize[, flags]]) -> (data, ancdata, msg_flags, address)\n\
3057\n\
3058Receive normal data (up to bufsize bytes) and ancillary data from the\n\
3059socket. The ancbufsize argument sets the size in bytes of the\n\
3060internal buffer used to receive the ancillary data; it defaults to 0,\n\
3061meaning that no ancillary data will be received. Appropriate buffer\n\
3062sizes for ancillary data can be calculated using CMSG_SPACE() or\n\
3063CMSG_LEN(), and items which do not fit into the buffer might be\n\
3064truncated or discarded. The flags argument defaults to 0 and has the\n\
3065same meaning as for recv().\n\
3066\n\
3067The return value is a 4-tuple: (data, ancdata, msg_flags, address).\n\
3068The data item is a bytes object holding the non-ancillary data\n\
3069received. The ancdata item is a list of zero or more tuples\n\
3070(cmsg_level, cmsg_type, cmsg_data) representing the ancillary data\n\
3071(control messages) received: cmsg_level and cmsg_type are integers\n\
3072specifying the protocol level and protocol-specific type respectively,\n\
3073and cmsg_data is a bytes object holding the associated data. The\n\
3074msg_flags item is the bitwise OR of various flags indicating\n\
3075conditions on the received message; see your system documentation for\n\
3076details. If the receiving socket is unconnected, address is the\n\
3077address of the sending socket, if available; otherwise, its value is\n\
3078unspecified.\n\
3079\n\
3080If recvmsg() raises an exception after the system call returns, it\n\
3081will first attempt to close any file descriptors received via the\n\
3082SCM_RIGHTS mechanism.");
3083
3084
3085static PyObject *
3086makeval_recvmsg_into(ssize_t received, void *data)
3087{
3088 return PyLong_FromSsize_t(received);
3089}
3090
3091/* s.recvmsg_into(buffers[, ancbufsize[, flags]]) method */
3092
3093static PyObject *
3094sock_recvmsg_into(PySocketSockObject *s, PyObject *args)
3095{
3096 Py_ssize_t ancbufsize = 0;
3097 int flags = 0;
3098 struct iovec *iovs = NULL;
3099 Py_ssize_t i, nitems, nbufs = 0;
3100 Py_buffer *bufs = NULL;
3101 PyObject *buffers_arg, *fast, *retval = NULL;
3102
3103 if (!PyArg_ParseTuple(args, "O|ni:recvmsg_into",
3104 &buffers_arg, &ancbufsize, &flags))
3105 return NULL;
3106
3107 if ((fast = PySequence_Fast(buffers_arg,
3108 "recvmsg_into() argument 1 must be an "
3109 "iterable")) == NULL)
3110 return NULL;
3111 nitems = PySequence_Fast_GET_SIZE(fast);
3112 if (nitems > INT_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003113 PyErr_SetString(PyExc_OSError, "recvmsg_into() argument 1 is too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003114 goto finally;
3115 }
3116
3117 /* Fill in an iovec for each item, and save the Py_buffer
3118 structs to release afterwards. */
3119 if (nitems > 0 && ((iovs = PyMem_New(struct iovec, nitems)) == NULL ||
3120 (bufs = PyMem_New(Py_buffer, nitems)) == NULL)) {
3121 PyErr_NoMemory();
3122 goto finally;
3123 }
3124 for (; nbufs < nitems; nbufs++) {
3125 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(fast, nbufs),
3126 "w*;recvmsg_into() argument 1 must be an iterable "
3127 "of single-segment read-write buffers",
3128 &bufs[nbufs]))
3129 goto finally;
3130 iovs[nbufs].iov_base = bufs[nbufs].buf;
3131 iovs[nbufs].iov_len = bufs[nbufs].len;
3132 }
3133
3134 retval = sock_recvmsg_guts(s, iovs, nitems, flags, ancbufsize,
3135 &makeval_recvmsg_into, NULL);
3136finally:
3137 for (i = 0; i < nbufs; i++)
3138 PyBuffer_Release(&bufs[i]);
3139 PyMem_Free(bufs);
3140 PyMem_Free(iovs);
3141 Py_DECREF(fast);
3142 return retval;
3143}
3144
3145PyDoc_STRVAR(recvmsg_into_doc,
3146"recvmsg_into(buffers[, ancbufsize[, flags]]) -> (nbytes, ancdata, msg_flags, address)\n\
3147\n\
3148Receive normal data and ancillary data from the socket, scattering the\n\
3149non-ancillary data into a series of buffers. The buffers argument\n\
3150must be an iterable of objects that export writable buffers\n\
3151(e.g. bytearray objects); these will be filled with successive chunks\n\
3152of the non-ancillary data until it has all been written or there are\n\
3153no more buffers. The ancbufsize argument sets the size in bytes of\n\
3154the internal buffer used to receive the ancillary data; it defaults to\n\
31550, meaning that no ancillary data will be received. Appropriate\n\
3156buffer sizes for ancillary data can be calculated using CMSG_SPACE()\n\
3157or CMSG_LEN(), and items which do not fit into the buffer might be\n\
3158truncated or discarded. The flags argument defaults to 0 and has the\n\
3159same meaning as for recv().\n\
3160\n\
3161The return value is a 4-tuple: (nbytes, ancdata, msg_flags, address).\n\
3162The nbytes item is the total number of bytes of non-ancillary data\n\
3163written into the buffers. The ancdata item is a list of zero or more\n\
3164tuples (cmsg_level, cmsg_type, cmsg_data) representing the ancillary\n\
3165data (control messages) received: cmsg_level and cmsg_type are\n\
3166integers specifying the protocol level and protocol-specific type\n\
3167respectively, and cmsg_data is a bytes object holding the associated\n\
3168data. The msg_flags item is the bitwise OR of various flags\n\
3169indicating conditions on the received message; see your system\n\
3170documentation for details. If the receiving socket is unconnected,\n\
3171address is the address of the sending socket, if available; otherwise,\n\
3172its value is unspecified.\n\
3173\n\
3174If recvmsg_into() raises an exception after the system call returns,\n\
3175it will first attempt to close any file descriptors received via the\n\
3176SCM_RIGHTS mechanism.");
3177#endif /* CMSG_LEN */
3178
3179
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003180/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003181
Guido van Rossum73624e91994-10-10 17:59:00 +00003182static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003183sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003184{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003185 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003186 Py_ssize_t len, n = -1;
3187 int flags = 0, timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003188 Py_buffer pbuf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003189
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003190 if (!PyArg_ParseTuple(args, "y*|i:send", &pbuf, &flags))
3191 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003192
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003193 if (!IS_SELECTABLE(s)) {
3194 PyBuffer_Release(&pbuf);
3195 return select_error();
3196 }
3197 buf = pbuf.buf;
3198 len = pbuf.len;
Neal Norwitz082b2df2006-02-07 07:04:46 +00003199
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003200 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003201 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003202 timeout = internal_select_ex(s, 1, interval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003203 if (!timeout)
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003204#ifdef __VMS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003205 n = sendsegmented(s->sock_fd, buf, len, flags);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003206#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003207 n = send(s->sock_fd, buf, len, flags);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003208#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003209 Py_END_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003210 if (timeout == 1) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003211 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003212 PyErr_SetString(socket_timeout, "timed out");
3213 return NULL;
3214 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003215 END_SELECT_LOOP(s)
3216
3217 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003218 if (n < 0)
3219 return s->errorhandler();
Antoine Pitrou19467d22010-08-17 19:33:30 +00003220 return PyLong_FromSsize_t(n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00003221}
3222
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003223PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003224"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003225\n\
3226Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003227argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003228sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003229
3230
3231/* s.sendall(data [,flags]) method */
3232
3233static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003234sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003235{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003236 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003237 Py_ssize_t len, n = -1;
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003238 int flags = 0, timeout, saved_errno;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003239 Py_buffer pbuf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003240
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003241 if (!PyArg_ParseTuple(args, "y*|i:sendall", &pbuf, &flags))
3242 return NULL;
3243 buf = pbuf.buf;
3244 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003245
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003246 if (!IS_SELECTABLE(s)) {
3247 PyBuffer_Release(&pbuf);
3248 return select_error();
3249 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003250
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003251 do {
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003252 Py_BEGIN_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003253 timeout = internal_select(s, 1);
3254 n = -1;
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003255 if (!timeout) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003256#ifdef __VMS
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003257 n = sendsegmented(s->sock_fd, buf, len, flags);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003258#else
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003259 n = send(s->sock_fd, buf, len, flags);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003260#endif
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003261 }
3262 Py_END_ALLOW_THREADS
3263 if (timeout == 1) {
3264 PyBuffer_Release(&pbuf);
3265 PyErr_SetString(socket_timeout, "timed out");
3266 return NULL;
3267 }
3268 /* PyErr_CheckSignals() might change errno */
3269 saved_errno = errno;
3270 /* We must run our signal handlers before looping again.
3271 send() can return a successful partial write when it is
3272 interrupted, so we can't restrict ourselves to EINTR. */
3273 if (PyErr_CheckSignals()) {
3274 PyBuffer_Release(&pbuf);
3275 return NULL;
3276 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003277 if (n < 0) {
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003278 /* If interrupted, try again */
3279 if (saved_errno == EINTR)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003280 continue;
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003281 else
3282 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003283 }
3284 buf += n;
3285 len -= n;
3286 } while (len > 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003287 PyBuffer_Release(&pbuf);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003288
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003289 if (n < 0)
3290 return s->errorhandler();
Guido van Rossum67f7a382002-06-06 21:08:16 +00003291
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003292 Py_INCREF(Py_None);
3293 return Py_None;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003294}
3295
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003296PyDoc_STRVAR(sendall_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003297"sendall(data[, flags])\n\
3298\n\
3299Send a data string to the socket. For the optional flags\n\
3300argument, see the Unix manual. This calls send() repeatedly\n\
3301until all data is sent. If an error occurs, it's impossible\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003302to tell how much data has been sent.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003303
Guido van Rossum30a685f1991-06-27 15:51:29 +00003304
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003305/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003306
Guido van Rossum73624e91994-10-10 17:59:00 +00003307static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003308sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003309{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003310 Py_buffer pbuf;
3311 PyObject *addro;
3312 char *buf;
Antoine Pitrou5e981412011-03-17 22:38:37 +01003313 Py_ssize_t len, arglen;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003314 sock_addr_t addrbuf;
3315 int addrlen, n = -1, flags, timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003316
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003317 flags = 0;
Antoine Pitrou5e981412011-03-17 22:38:37 +01003318 arglen = PyTuple_Size(args);
3319 switch (arglen) {
3320 case 2:
3321 PyArg_ParseTuple(args, "y*O:sendto", &pbuf, &addro);
3322 break;
3323 case 3:
3324 PyArg_ParseTuple(args, "y*iO:sendto",
3325 &pbuf, &flags, &addro);
3326 break;
3327 default:
3328 PyErr_Format(PyExc_TypeError,
3329 "sendto() takes 2 or 3 arguments (%d given)",
3330 arglen);
Victor Stinner77af1722011-05-26 14:05:59 +02003331 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003332 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01003333 if (PyErr_Occurred())
3334 return NULL;
3335
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003336 buf = pbuf.buf;
3337 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003338
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003339 if (!IS_SELECTABLE(s)) {
3340 PyBuffer_Release(&pbuf);
3341 return select_error();
3342 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003343
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003344 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen)) {
3345 PyBuffer_Release(&pbuf);
3346 return NULL;
3347 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003348
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003349 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003350 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003351 timeout = internal_select_ex(s, 1, interval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003352 if (!timeout)
3353 n = sendto(s->sock_fd, buf, len, flags, SAS2SA(&addrbuf), addrlen);
3354 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00003355
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003356 if (timeout == 1) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003357 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003358 PyErr_SetString(socket_timeout, "timed out");
3359 return NULL;
3360 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003361 END_SELECT_LOOP(s)
3362 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003363 if (n < 0)
3364 return s->errorhandler();
Antoine Pitrou19467d22010-08-17 19:33:30 +00003365 return PyLong_FromSsize_t(n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003366}
3367
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003368PyDoc_STRVAR(sendto_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003369"sendto(data[, flags], address) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003370\n\
3371Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003372For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003373
Guido van Rossum30a685f1991-06-27 15:51:29 +00003374
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003375/* The sendmsg() and recvmsg[_into]() methods require a working
3376 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
3377#ifdef CMSG_LEN
3378/* s.sendmsg(buffers[, ancdata[, flags[, address]]]) method */
3379
3380static PyObject *
3381sock_sendmsg(PySocketSockObject *s, PyObject *args)
3382{
3383 Py_ssize_t i, ndataparts, ndatabufs = 0, ncmsgs, ncmsgbufs = 0;
3384 Py_buffer *databufs = NULL;
3385 struct iovec *iovs = NULL;
3386 sock_addr_t addrbuf;
Charles-François Natalie9e95ae2011-08-24 21:40:53 +02003387 struct msghdr msg = {0};
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003388 struct cmsginfo {
3389 int level;
3390 int type;
3391 Py_buffer data;
3392 } *cmsgs = NULL;
3393 void *controlbuf = NULL;
3394 size_t controllen, controllen_last;
3395 ssize_t bytes_sent = -1;
3396 int addrlen, timeout, flags = 0;
3397 PyObject *data_arg, *cmsg_arg = NULL, *addr_arg = NULL, *data_fast = NULL,
3398 *cmsg_fast = NULL, *retval = NULL;
3399
3400 if (!PyArg_ParseTuple(args, "O|OiO:sendmsg",
3401 &data_arg, &cmsg_arg, &flags, &addr_arg))
3402 return NULL;
3403
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003404 /* Parse destination address. */
3405 if (addr_arg != NULL && addr_arg != Py_None) {
3406 if (!getsockaddrarg(s, addr_arg, SAS2SA(&addrbuf), &addrlen))
3407 goto finally;
3408 msg.msg_name = &addrbuf;
3409 msg.msg_namelen = addrlen;
3410 }
3411
3412 /* Fill in an iovec for each message part, and save the Py_buffer
3413 structs to release afterwards. */
3414 if ((data_fast = PySequence_Fast(data_arg,
3415 "sendmsg() argument 1 must be an "
3416 "iterable")) == NULL)
3417 goto finally;
3418 ndataparts = PySequence_Fast_GET_SIZE(data_fast);
3419 if (ndataparts > INT_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003420 PyErr_SetString(PyExc_OSError, "sendmsg() argument 1 is too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003421 goto finally;
3422 }
3423 msg.msg_iovlen = ndataparts;
3424 if (ndataparts > 0 &&
3425 ((msg.msg_iov = iovs = PyMem_New(struct iovec, ndataparts)) == NULL ||
3426 (databufs = PyMem_New(Py_buffer, ndataparts)) == NULL)) {
3427 PyErr_NoMemory();
3428 goto finally;
3429 }
3430 for (; ndatabufs < ndataparts; ndatabufs++) {
3431 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(data_fast, ndatabufs),
3432 "y*;sendmsg() argument 1 must be an iterable of "
3433 "buffer-compatible objects",
3434 &databufs[ndatabufs]))
3435 goto finally;
3436 iovs[ndatabufs].iov_base = databufs[ndatabufs].buf;
3437 iovs[ndatabufs].iov_len = databufs[ndatabufs].len;
3438 }
3439
3440 if (cmsg_arg == NULL)
3441 ncmsgs = 0;
3442 else {
3443 if ((cmsg_fast = PySequence_Fast(cmsg_arg,
3444 "sendmsg() argument 2 must be an "
3445 "iterable")) == NULL)
3446 goto finally;
3447 ncmsgs = PySequence_Fast_GET_SIZE(cmsg_fast);
3448 }
3449
3450#ifndef CMSG_SPACE
3451 if (ncmsgs > 1) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003452 PyErr_SetString(PyExc_OSError,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003453 "sending multiple control messages is not supported "
3454 "on this system");
3455 goto finally;
3456 }
3457#endif
3458 /* Save level, type and Py_buffer for each control message,
3459 and calculate total size. */
3460 if (ncmsgs > 0 && (cmsgs = PyMem_New(struct cmsginfo, ncmsgs)) == NULL) {
3461 PyErr_NoMemory();
3462 goto finally;
3463 }
3464 controllen = controllen_last = 0;
3465 while (ncmsgbufs < ncmsgs) {
3466 size_t bufsize, space;
3467
3468 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(cmsg_fast, ncmsgbufs),
3469 "(iiy*):[sendmsg() ancillary data items]",
3470 &cmsgs[ncmsgbufs].level,
3471 &cmsgs[ncmsgbufs].type,
3472 &cmsgs[ncmsgbufs].data))
3473 goto finally;
3474 bufsize = cmsgs[ncmsgbufs++].data.len;
3475
3476#ifdef CMSG_SPACE
3477 if (!get_CMSG_SPACE(bufsize, &space)) {
3478#else
3479 if (!get_CMSG_LEN(bufsize, &space)) {
3480#endif
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003481 PyErr_SetString(PyExc_OSError, "ancillary data item too large");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003482 goto finally;
3483 }
3484 controllen += space;
3485 if (controllen > SOCKLEN_T_LIMIT || controllen < controllen_last) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003486 PyErr_SetString(PyExc_OSError, "too much ancillary data");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003487 goto finally;
3488 }
3489 controllen_last = controllen;
3490 }
3491
3492 /* Construct ancillary data block from control message info. */
3493 if (ncmsgbufs > 0) {
3494 struct cmsghdr *cmsgh = NULL;
3495
3496 if ((msg.msg_control = controlbuf =
3497 PyMem_Malloc(controllen)) == NULL) {
3498 PyErr_NoMemory();
3499 goto finally;
3500 }
3501 msg.msg_controllen = controllen;
3502
3503 /* Need to zero out the buffer as a workaround for glibc's
3504 CMSG_NXTHDR() implementation. After getting the pointer to
3505 the next header, it checks its (uninitialized) cmsg_len
3506 member to see if the "message" fits in the buffer, and
3507 returns NULL if it doesn't. Zero-filling the buffer
3508 ensures that that doesn't happen. */
3509 memset(controlbuf, 0, controllen);
3510
3511 for (i = 0; i < ncmsgbufs; i++) {
3512 size_t msg_len, data_len = cmsgs[i].data.len;
3513 int enough_space = 0;
3514
3515 cmsgh = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsgh);
3516 if (cmsgh == NULL) {
3517 PyErr_Format(PyExc_RuntimeError,
3518 "unexpected NULL result from %s()",
3519 (i == 0) ? "CMSG_FIRSTHDR" : "CMSG_NXTHDR");
3520 goto finally;
3521 }
3522 if (!get_CMSG_LEN(data_len, &msg_len)) {
3523 PyErr_SetString(PyExc_RuntimeError,
3524 "item size out of range for CMSG_LEN()");
3525 goto finally;
3526 }
3527 if (cmsg_min_space(&msg, cmsgh, msg_len)) {
3528 size_t space;
3529
3530 cmsgh->cmsg_len = msg_len;
3531 if (get_cmsg_data_space(&msg, cmsgh, &space))
3532 enough_space = (space >= data_len);
3533 }
3534 if (!enough_space) {
3535 PyErr_SetString(PyExc_RuntimeError,
3536 "ancillary data does not fit in calculated "
3537 "space");
3538 goto finally;
3539 }
3540 cmsgh->cmsg_level = cmsgs[i].level;
3541 cmsgh->cmsg_type = cmsgs[i].type;
3542 memcpy(CMSG_DATA(cmsgh), cmsgs[i].data.buf, data_len);
3543 }
3544 }
3545
3546 /* Make the system call. */
3547 if (!IS_SELECTABLE(s)) {
3548 select_error();
3549 goto finally;
3550 }
3551
3552 BEGIN_SELECT_LOOP(s)
3553 Py_BEGIN_ALLOW_THREADS;
3554 timeout = internal_select_ex(s, 1, interval);
3555 if (!timeout)
3556 bytes_sent = sendmsg(s->sock_fd, &msg, flags);
3557 Py_END_ALLOW_THREADS;
3558 if (timeout == 1) {
3559 PyErr_SetString(socket_timeout, "timed out");
3560 goto finally;
3561 }
3562 END_SELECT_LOOP(s)
3563
3564 if (bytes_sent < 0) {
3565 s->errorhandler();
3566 goto finally;
3567 }
3568 retval = PyLong_FromSsize_t(bytes_sent);
3569
3570finally:
3571 PyMem_Free(controlbuf);
3572 for (i = 0; i < ncmsgbufs; i++)
3573 PyBuffer_Release(&cmsgs[i].data);
3574 PyMem_Free(cmsgs);
3575 Py_XDECREF(cmsg_fast);
3576 for (i = 0; i < ndatabufs; i++)
3577 PyBuffer_Release(&databufs[i]);
3578 PyMem_Free(databufs);
3579 PyMem_Free(iovs);
3580 Py_XDECREF(data_fast);
3581 return retval;
3582}
3583
3584PyDoc_STRVAR(sendmsg_doc,
3585"sendmsg(buffers[, ancdata[, flags[, address]]]) -> count\n\
3586\n\
3587Send normal and ancillary data to the socket, gathering the\n\
3588non-ancillary data from a series of buffers and concatenating it into\n\
3589a single message. The buffers argument specifies the non-ancillary\n\
3590data as an iterable of buffer-compatible objects (e.g. bytes objects).\n\
3591The ancdata argument specifies the ancillary data (control messages)\n\
3592as an iterable of zero or more tuples (cmsg_level, cmsg_type,\n\
3593cmsg_data), where cmsg_level and cmsg_type are integers specifying the\n\
3594protocol level and protocol-specific type respectively, and cmsg_data\n\
3595is a buffer-compatible object holding the associated data. The flags\n\
3596argument defaults to 0 and has the same meaning as for send(). If\n\
3597address is supplied and not None, it sets a destination address for\n\
3598the message. The return value is the number of bytes of non-ancillary\n\
3599data sent.");
3600#endif /* CMSG_LEN */
3601
3602
Guido van Rossum30a685f1991-06-27 15:51:29 +00003603/* s.shutdown(how) method */
3604
Guido van Rossum73624e91994-10-10 17:59:00 +00003605static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003606sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003607{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003608 int how;
3609 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003610
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003611 how = PyLong_AsLong(arg);
3612 if (how == -1 && PyErr_Occurred())
3613 return NULL;
3614 Py_BEGIN_ALLOW_THREADS
3615 res = shutdown(s->sock_fd, how);
3616 Py_END_ALLOW_THREADS
3617 if (res < 0)
3618 return s->errorhandler();
3619 Py_INCREF(Py_None);
3620 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003621}
3622
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003623PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003624"shutdown(flag)\n\
3625\n\
Martin v. Löwis94681fc2003-11-27 19:40:22 +00003626Shut down the reading side of the socket (flag == SHUT_RD), the writing side\n\
3627of the socket (flag == SHUT_WR), or both ends (flag == SHUT_RDWR).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003628
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00003629#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Christian Heimesfaf2f632008-01-06 16:59:19 +00003630static PyObject*
3631sock_ioctl(PySocketSockObject *s, PyObject *arg)
3632{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003633 unsigned long cmd = SIO_RCVALL;
3634 PyObject *argO;
3635 DWORD recv;
Christian Heimesfaf2f632008-01-06 16:59:19 +00003636
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003637 if (!PyArg_ParseTuple(arg, "kO:ioctl", &cmd, &argO))
3638 return NULL;
Christian Heimesfaf2f632008-01-06 16:59:19 +00003639
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003640 switch (cmd) {
3641 case SIO_RCVALL: {
3642 unsigned int option = RCVALL_ON;
3643 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
3644 return NULL;
3645 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
3646 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
3647 return set_error();
3648 }
3649 return PyLong_FromUnsignedLong(recv); }
3650 case SIO_KEEPALIVE_VALS: {
3651 struct tcp_keepalive ka;
3652 if (!PyArg_ParseTuple(arg, "k(kkk):ioctl", &cmd,
3653 &ka.onoff, &ka.keepalivetime, &ka.keepaliveinterval))
3654 return NULL;
3655 if (WSAIoctl(s->sock_fd, cmd, &ka, sizeof(ka),
3656 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
3657 return set_error();
3658 }
3659 return PyLong_FromUnsignedLong(recv); }
3660 default:
3661 PyErr_Format(PyExc_ValueError, "invalid ioctl command %d", cmd);
3662 return NULL;
3663 }
Christian Heimesfaf2f632008-01-06 16:59:19 +00003664}
3665PyDoc_STRVAR(sock_ioctl_doc,
3666"ioctl(cmd, option) -> long\n\
3667\n\
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00003668Control the socket with WSAIoctl syscall. Currently supported 'cmd' values are\n\
3669SIO_RCVALL: 'option' must be one of the socket.RCVALL_* constants.\n\
3670SIO_KEEPALIVE_VALS: 'option' is a tuple of (onoff, timeout, interval).");
Christian Heimesfaf2f632008-01-06 16:59:19 +00003671
3672#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00003673
3674/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003675
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003676static PyMethodDef sock_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003677 {"_accept", (PyCFunction)sock_accept, METH_NOARGS,
3678 accept_doc},
3679 {"bind", (PyCFunction)sock_bind, METH_O,
3680 bind_doc},
3681 {"close", (PyCFunction)sock_close, METH_NOARGS,
3682 close_doc},
3683 {"connect", (PyCFunction)sock_connect, METH_O,
3684 connect_doc},
3685 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
3686 connect_ex_doc},
Antoine Pitrou6e451df2010-08-09 20:39:54 +00003687 {"detach", (PyCFunction)sock_detach, METH_NOARGS,
3688 detach_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003689 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
3690 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00003691#ifdef HAVE_GETPEERNAME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003692 {"getpeername", (PyCFunction)sock_getpeername,
3693 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00003694#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003695 {"getsockname", (PyCFunction)sock_getsockname,
3696 METH_NOARGS, getsockname_doc},
3697 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
3698 getsockopt_doc},
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00003699#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003700 {"ioctl", (PyCFunction)sock_ioctl, METH_VARARGS,
3701 sock_ioctl_doc},
Christian Heimesfaf2f632008-01-06 16:59:19 +00003702#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003703 {"listen", (PyCFunction)sock_listen, METH_O,
3704 listen_doc},
3705 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
3706 recv_doc},
3707 {"recv_into", (PyCFunction)sock_recv_into, METH_VARARGS | METH_KEYWORDS,
3708 recv_into_doc},
3709 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
3710 recvfrom_doc},
3711 {"recvfrom_into", (PyCFunction)sock_recvfrom_into, METH_VARARGS | METH_KEYWORDS,
3712 recvfrom_into_doc},
3713 {"send", (PyCFunction)sock_send, METH_VARARGS,
3714 send_doc},
3715 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
3716 sendall_doc},
3717 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
3718 sendto_doc},
3719 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
3720 setblocking_doc},
3721 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
3722 settimeout_doc},
3723 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
3724 gettimeout_doc},
3725 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
3726 setsockopt_doc},
3727 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
3728 shutdown_doc},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003729#ifdef CMSG_LEN
3730 {"recvmsg", (PyCFunction)sock_recvmsg, METH_VARARGS,
3731 recvmsg_doc},
3732 {"recvmsg_into", (PyCFunction)sock_recvmsg_into, METH_VARARGS,
3733 recvmsg_into_doc,},
3734 {"sendmsg", (PyCFunction)sock_sendmsg, METH_VARARGS,
3735 sendmsg_doc},
3736#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003737 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003738};
3739
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003740/* SockObject members */
3741static PyMemberDef sock_memberlist[] = {
3742 {"family", T_INT, offsetof(PySocketSockObject, sock_family), READONLY, "the socket family"},
3743 {"type", T_INT, offsetof(PySocketSockObject, sock_type), READONLY, "the socket type"},
3744 {"proto", T_INT, offsetof(PySocketSockObject, sock_proto), READONLY, "the socket protocol"},
3745 {"timeout", T_DOUBLE, offsetof(PySocketSockObject, sock_timeout), READONLY, "the socket timeout"},
3746 {0},
3747};
Guido van Rossum30a685f1991-06-27 15:51:29 +00003748
Guido van Rossum73624e91994-10-10 17:59:00 +00003749/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00003750 First close the file description. */
3751
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003752static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003753sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003754{
Antoine Pitroue033e062010-10-29 10:38:18 +00003755 if (s->sock_fd != -1) {
3756 PyObject *exc, *val, *tb;
3757 Py_ssize_t old_refcount = Py_REFCNT(s);
3758 ++Py_REFCNT(s);
3759 PyErr_Fetch(&exc, &val, &tb);
3760 if (PyErr_WarnFormat(PyExc_ResourceWarning, 1,
3761 "unclosed %R", s))
3762 /* Spurious errors can appear at shutdown */
3763 if (PyErr_ExceptionMatches(PyExc_Warning))
3764 PyErr_WriteUnraisable((PyObject *) s);
3765 PyErr_Restore(exc, val, tb);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003766 (void) SOCKETCLOSE(s->sock_fd);
Antoine Pitroue033e062010-10-29 10:38:18 +00003767 Py_REFCNT(s) = old_refcount;
3768 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003769 Py_TYPE(s)->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003770}
3771
Guido van Rossum30a685f1991-06-27 15:51:29 +00003772
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003773static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003774sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003775{
Fred Drakea04eaad2000-06-30 02:46:07 +00003776#if SIZEOF_SOCKET_T > SIZEOF_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003777 if (s->sock_fd > LONG_MAX) {
3778 /* this can occur on Win64, and actually there is a special
3779 ugly printf formatter for decimal pointer length integer
3780 printing, only bother if necessary*/
3781 PyErr_SetString(PyExc_OverflowError,
3782 "no printf formatter to display "
3783 "the socket descriptor in decimal");
3784 return NULL;
3785 }
Fred Drakea04eaad2000-06-30 02:46:07 +00003786#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003787 return PyUnicode_FromFormat(
3788 "<socket object, fd=%ld, family=%d, type=%d, proto=%d>",
3789 (long)s->sock_fd, s->sock_family,
3790 s->sock_type,
3791 s->sock_proto);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003792}
3793
3794
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003795/* Create a new, uninitialized socket object. */
3796
3797static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003798sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003799{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003800 PyObject *new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003801
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003802 new = type->tp_alloc(type, 0);
3803 if (new != NULL) {
3804 ((PySocketSockObject *)new)->sock_fd = -1;
3805 ((PySocketSockObject *)new)->sock_timeout = -1.0;
3806 ((PySocketSockObject *)new)->errorhandler = &set_error;
3807 }
3808 return new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003809}
3810
3811
3812/* Initialize a new socket object. */
3813
3814/*ARGSUSED*/
3815static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00003816sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003817{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003818 PySocketSockObject *s = (PySocketSockObject *)self;
3819 PyObject *fdobj = NULL;
3820 SOCKET_T fd = INVALID_SOCKET;
3821 int family = AF_INET, type = SOCK_STREAM, proto = 0;
3822 static char *keywords[] = {"family", "type", "proto", "fileno", 0};
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003823
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003824 if (!PyArg_ParseTupleAndKeywords(args, kwds,
3825 "|iiiO:socket", keywords,
3826 &family, &type, &proto, &fdobj))
3827 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003828
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003829 if (fdobj != NULL && fdobj != Py_None) {
3830 fd = PyLong_AsSocket_t(fdobj);
3831 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
3832 return -1;
3833 if (fd == INVALID_SOCKET) {
3834 PyErr_SetString(PyExc_ValueError,
3835 "can't use invalid socket value");
3836 return -1;
3837 }
3838 }
3839 else {
3840 Py_BEGIN_ALLOW_THREADS
3841 fd = socket(family, type, proto);
3842 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00003843
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003844 if (fd == INVALID_SOCKET) {
3845 set_error();
3846 return -1;
3847 }
3848 }
3849 init_sockobject(s, fd, family, type, proto);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003850
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003851 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003852
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003853}
3854
3855
Guido van Rossumb6775db1994-08-01 11:34:53 +00003856/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003857
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003858static PyTypeObject sock_type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003859 PyVarObject_HEAD_INIT(0, 0) /* Must fill in type value later */
3860 "_socket.socket", /* tp_name */
3861 sizeof(PySocketSockObject), /* tp_basicsize */
3862 0, /* tp_itemsize */
3863 (destructor)sock_dealloc, /* tp_dealloc */
3864 0, /* tp_print */
3865 0, /* tp_getattr */
3866 0, /* tp_setattr */
3867 0, /* tp_reserved */
3868 (reprfunc)sock_repr, /* tp_repr */
3869 0, /* tp_as_number */
3870 0, /* tp_as_sequence */
3871 0, /* tp_as_mapping */
3872 0, /* tp_hash */
3873 0, /* tp_call */
3874 0, /* tp_str */
3875 PyObject_GenericGetAttr, /* tp_getattro */
3876 0, /* tp_setattro */
3877 0, /* tp_as_buffer */
3878 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
3879 sock_doc, /* tp_doc */
3880 0, /* tp_traverse */
3881 0, /* tp_clear */
3882 0, /* tp_richcompare */
3883 0, /* tp_weaklistoffset */
3884 0, /* tp_iter */
3885 0, /* tp_iternext */
3886 sock_methods, /* tp_methods */
3887 sock_memberlist, /* tp_members */
3888 0, /* tp_getset */
3889 0, /* tp_base */
3890 0, /* tp_dict */
3891 0, /* tp_descr_get */
3892 0, /* tp_descr_set */
3893 0, /* tp_dictoffset */
3894 sock_initobj, /* tp_init */
3895 PyType_GenericAlloc, /* tp_alloc */
3896 sock_new, /* tp_new */
3897 PyObject_Del, /* tp_free */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003898};
3899
Guido van Rossum30a685f1991-06-27 15:51:29 +00003900
Guido van Rossum81194471991-07-27 21:42:02 +00003901/* Python interface to gethostname(). */
3902
3903/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00003904static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00003905socket_gethostname(PyObject *self, PyObject *unused)
Guido van Rossum81194471991-07-27 21:42:02 +00003906{
Martin v. Löwis72f48422010-10-29 18:20:08 +00003907#ifdef MS_WINDOWS
3908 /* Don't use winsock's gethostname, as this returns the ANSI
3909 version of the hostname, whereas we need a Unicode string.
3910 Otherwise, gethostname apparently also returns the DNS name. */
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00003911 wchar_t buf[MAX_COMPUTERNAME_LENGTH + 1];
Victor Stinner63941882011-09-29 00:42:28 +02003912 DWORD size = Py_ARRAY_LENGTH(buf);
Victor Stinner74168972011-11-17 01:11:36 +01003913 wchar_t *name;
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00003914 PyObject *result;
Victor Stinner74168972011-11-17 01:11:36 +01003915
3916 if (GetComputerNameExW(ComputerNamePhysicalDnsHostname, buf, &size))
Victor Stinner9d3b93b2011-11-22 02:27:30 +01003917 return PyUnicode_FromWideChar(buf, size);
Victor Stinner74168972011-11-17 01:11:36 +01003918
3919 if (GetLastError() != ERROR_MORE_DATA)
3920 return PyErr_SetFromWindowsErr(0);
3921
3922 if (size == 0)
3923 return PyUnicode_New(0, 0);
3924
3925 /* MSDN says ERROR_MORE_DATA may occur because DNS allows longer
3926 names */
3927 name = PyMem_Malloc(size * sizeof(wchar_t));
3928 if (!name)
3929 return NULL;
3930 if (!GetComputerNameExW(ComputerNamePhysicalDnsHostname,
3931 name,
3932 &size))
3933 {
3934 PyMem_Free(name);
3935 return PyErr_SetFromWindowsErr(0);
Martin v. Löwis72f48422010-10-29 18:20:08 +00003936 }
Victor Stinner74168972011-11-17 01:11:36 +01003937
3938 result = PyUnicode_FromWideChar(name, size);
3939 PyMem_Free(name);
3940 return result;
Martin v. Löwis72f48422010-10-29 18:20:08 +00003941#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003942 char buf[1024];
3943 int res;
3944 Py_BEGIN_ALLOW_THREADS
3945 res = gethostname(buf, (int) sizeof buf - 1);
3946 Py_END_ALLOW_THREADS
3947 if (res < 0)
3948 return set_error();
3949 buf[sizeof buf - 1] = '\0';
3950 return PyUnicode_FromString(buf);
Martin v. Löwis72f48422010-10-29 18:20:08 +00003951#endif
Guido van Rossum81194471991-07-27 21:42:02 +00003952}
Guido van Rossumff4949e1992-08-05 19:58:53 +00003953
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003954PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003955"gethostname() -> string\n\
3956\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003957Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003958
Antoine Pitrou061cfb52011-02-28 22:25:22 +00003959#ifdef HAVE_SETHOSTNAME
3960PyDoc_STRVAR(sethostname_doc,
3961"sethostname(name)\n\n\
3962Sets the hostname to name.");
3963
3964static PyObject *
3965socket_sethostname(PyObject *self, PyObject *args)
3966{
3967 PyObject *hnobj;
3968 Py_buffer buf;
3969 int res, flag = 0;
3970
3971 if (!PyArg_ParseTuple(args, "S:sethostname", &hnobj)) {
3972 PyErr_Clear();
3973 if (!PyArg_ParseTuple(args, "O&:sethostname",
3974 PyUnicode_FSConverter, &hnobj))
3975 return NULL;
3976 flag = 1;
3977 }
3978 res = PyObject_GetBuffer(hnobj, &buf, PyBUF_SIMPLE);
3979 if (!res) {
3980 res = sethostname(buf.buf, buf.len);
3981 PyBuffer_Release(&buf);
3982 }
3983 if (flag)
3984 Py_DECREF(hnobj);
3985 if (res)
3986 return set_error();
3987 Py_RETURN_NONE;
3988}
3989#endif
Guido van Rossumff4949e1992-08-05 19:58:53 +00003990
Guido van Rossum30a685f1991-06-27 15:51:29 +00003991/* Python interface to gethostbyname(name). */
3992
3993/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00003994static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003995socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003996{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003997 char *name;
3998 sock_addr_t addrbuf;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00003999 PyObject *ret = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004000
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004001 if (!PyArg_ParseTuple(args, "et:gethostbyname", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004002 return NULL;
4003 if (setipaddr(name, SAS2SA(&addrbuf), sizeof(addrbuf), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004004 goto finally;
4005 ret = makeipaddr(SAS2SA(&addrbuf), sizeof(struct sockaddr_in));
4006finally:
4007 PyMem_Free(name);
4008 return ret;
Guido van Rossum30a685f1991-06-27 15:51:29 +00004009}
4010
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004011PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004012"gethostbyname(host) -> address\n\
4013\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004014Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004015
4016
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004017/* Convenience function common to gethostbyname_ex and gethostbyaddr */
4018
4019static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004020gethost_common(struct hostent *h, struct sockaddr *addr, int alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004021{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004022 char **pch;
4023 PyObject *rtn_tuple = (PyObject *)NULL;
4024 PyObject *name_list = (PyObject *)NULL;
4025 PyObject *addr_list = (PyObject *)NULL;
4026 PyObject *tmp;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004027
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004028 if (h == NULL) {
4029 /* Let's get real error message to return */
4030 set_herror(h_errno);
4031 return NULL;
4032 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004033
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004034 if (h->h_addrtype != af) {
4035 /* Let's get real error message to return */
Victor Stinner1f33f2b2011-12-17 04:45:09 +01004036 errno = EAFNOSUPPORT;
4037 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004038 return NULL;
4039 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004040
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004041 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00004042
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004043 case AF_INET:
4044 if (alen < sizeof(struct sockaddr_in))
4045 return NULL;
4046 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004047
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004048#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004049 case AF_INET6:
4050 if (alen < sizeof(struct sockaddr_in6))
4051 return NULL;
4052 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004053#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00004054
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004055 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004056
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004057 if ((name_list = PyList_New(0)) == NULL)
4058 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004059
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004060 if ((addr_list = PyList_New(0)) == NULL)
4061 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004062
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004063 /* SF #1511317: h_aliases can be NULL */
4064 if (h->h_aliases) {
4065 for (pch = h->h_aliases; *pch != NULL; pch++) {
4066 int status;
4067 tmp = PyUnicode_FromString(*pch);
4068 if (tmp == NULL)
4069 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004070
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004071 status = PyList_Append(name_list, tmp);
4072 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004073
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004074 if (status)
4075 goto err;
4076 }
4077 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004078
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004079 for (pch = h->h_addr_list; *pch != NULL; pch++) {
4080 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004081
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004082 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00004083
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004084 case AF_INET:
4085 {
4086 struct sockaddr_in sin;
4087 memset(&sin, 0, sizeof(sin));
4088 sin.sin_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004089#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004090 sin.sin_len = sizeof(sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004091#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004092 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
4093 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
Guido van Rossum67f7a382002-06-06 21:08:16 +00004094
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004095 if (pch == h->h_addr_list && alen >= sizeof(sin))
4096 memcpy((char *) addr, &sin, sizeof(sin));
4097 break;
4098 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004099
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004100#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004101 case AF_INET6:
4102 {
4103 struct sockaddr_in6 sin6;
4104 memset(&sin6, 0, sizeof(sin6));
4105 sin6.sin6_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004106#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004107 sin6.sin6_len = sizeof(sin6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004108#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004109 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
4110 tmp = makeipaddr((struct sockaddr *)&sin6,
4111 sizeof(sin6));
Guido van Rossum67f7a382002-06-06 21:08:16 +00004112
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004113 if (pch == h->h_addr_list && alen >= sizeof(sin6))
4114 memcpy((char *) addr, &sin6, sizeof(sin6));
4115 break;
4116 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004117#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00004118
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004119 default: /* can't happen */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004120 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004121 "unsupported address family");
4122 return NULL;
4123 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004124
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004125 if (tmp == NULL)
4126 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004127
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004128 status = PyList_Append(addr_list, tmp);
4129 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004130
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004131 if (status)
4132 goto err;
4133 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004134
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004135 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004136
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004137 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004138 Py_XDECREF(name_list);
4139 Py_XDECREF(addr_list);
4140 return rtn_tuple;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004141}
4142
4143
4144/* Python interface to gethostbyname_ex(name). */
4145
4146/*ARGSUSED*/
4147static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004148socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004149{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004150 char *name;
4151 struct hostent *h;
Charles-François Natali8b759652011-12-23 16:44:51 +01004152 sock_addr_t addr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004153 struct sockaddr *sa;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004154 PyObject *ret = NULL;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004155#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004156 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004157#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004158 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004159#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004160 char buf[16384];
4161 int buf_len = (sizeof buf) - 1;
4162 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004163#endif
4164#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004165 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004166#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004167#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004168
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004169 if (!PyArg_ParseTuple(args, "et:gethostbyname_ex", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004170 return NULL;
Charles-François Natali8b759652011-12-23 16:44:51 +01004171 if (setipaddr(name, SAS2SA(&addr), sizeof(addr), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004172 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004173 Py_BEGIN_ALLOW_THREADS
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004174#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004175#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004176 result = gethostbyname_r(name, &hp_allocated, buf, buf_len,
4177 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004178#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004179 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004180#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004181 memset((void *) &data, '\0', sizeof(data));
4182 result = gethostbyname_r(name, &hp_allocated, &data);
4183 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004184#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004185#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00004186#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004187 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004188#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004189 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004190#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004191 Py_END_ALLOW_THREADS
4192 /* Some C libraries would require addr.__ss_family instead of
4193 addr.ss_family.
4194 Therefore, we cast the sockaddr_storage into sockaddr to
4195 access sa_family. */
Charles-François Natali8b759652011-12-23 16:44:51 +01004196 sa = SAS2SA(&addr);
4197 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004198 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00004199#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004200 PyThread_release_lock(netdb_lock);
Guido van Rossum955becc1999-03-22 20:14:53 +00004201#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004202finally:
4203 PyMem_Free(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004204 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004205}
4206
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004207PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004208"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
4209\n\
4210Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004211for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004212
4213
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004214/* Python interface to gethostbyaddr(IP). */
4215
4216/*ARGSUSED*/
4217static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004218socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004219{
Charles-François Natali8b759652011-12-23 16:44:51 +01004220 sock_addr_t addr;
4221 struct sockaddr *sa = SAS2SA(&addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004222 char *ip_num;
4223 struct hostent *h;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004224 PyObject *ret = NULL;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004225#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004226 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004227#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004228 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004229#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004230 /* glibcs up to 2.10 assume that the buf argument to
4231 gethostbyaddr_r is 8-byte aligned, which at least llvm-gcc
4232 does not ensure. The attribute below instructs the compiler
4233 to maintain this alignment. */
4234 char buf[16384] Py_ALIGNED(8);
4235 int buf_len = (sizeof buf) - 1;
4236 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004237#endif
4238#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004239 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004240#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004241#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004242 char *ap;
4243 int al;
4244 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004245
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004246 if (!PyArg_ParseTuple(args, "et:gethostbyaddr", "idna", &ip_num))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004247 return NULL;
4248 af = AF_UNSPEC;
4249 if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004250 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004251 af = sa->sa_family;
4252 ap = NULL;
Brett Cannonb94767f2011-02-22 20:15:44 +00004253 /* al = 0; */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004254 switch (af) {
4255 case AF_INET:
4256 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
4257 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
4258 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004259#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004260 case AF_INET6:
4261 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
4262 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
4263 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004264#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004265 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004266 PyErr_SetString(PyExc_OSError, "unsupported address family");
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004267 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004268 }
4269 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004270#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004271#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004272 result = gethostbyaddr_r(ap, al, af,
4273 &hp_allocated, buf, buf_len,
4274 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004275#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004276 h = gethostbyaddr_r(ap, al, af,
4277 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004278#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004279 memset((void *) &data, '\0', sizeof(data));
4280 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
4281 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004282#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004283#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00004284#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004285 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004286#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004287 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004288#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004289 Py_END_ALLOW_THREADS
Charles-François Natali8b759652011-12-23 16:44:51 +01004290 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00004291#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004292 PyThread_release_lock(netdb_lock);
Guido van Rossum3baaa131999-03-22 21:44:51 +00004293#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004294finally:
4295 PyMem_Free(ip_num);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004296 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004297}
4298
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004299PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004300"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
4301\n\
4302Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004303for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004304
Guido van Rossum30a685f1991-06-27 15:51:29 +00004305
4306/* Python interface to getservbyname(name).
4307 This only returns the port number, since the other info is already
4308 known or not useful (like the list of aliases). */
4309
4310/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004311static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004312socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00004313{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004314 char *name, *proto=NULL;
4315 struct servent *sp;
4316 if (!PyArg_ParseTuple(args, "s|s:getservbyname", &name, &proto))
4317 return NULL;
4318 Py_BEGIN_ALLOW_THREADS
4319 sp = getservbyname(name, proto);
4320 Py_END_ALLOW_THREADS
4321 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004322 PyErr_SetString(PyExc_OSError, "service/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004323 return NULL;
4324 }
4325 return PyLong_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00004326}
4327
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004328PyDoc_STRVAR(getservbyname_doc,
Barry Warsaw11b91a02004-06-28 00:50:43 +00004329"getservbyname(servicename[, protocolname]) -> integer\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00004330\n\
4331Return a port number from a service name and protocol name.\n\
Barry Warsaw11b91a02004-06-28 00:50:43 +00004332The optional protocol name, if given, should be 'tcp' or 'udp',\n\
4333otherwise any protocol will match.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004334
Guido van Rossum30a685f1991-06-27 15:51:29 +00004335
Barry Warsaw11b91a02004-06-28 00:50:43 +00004336/* Python interface to getservbyport(port).
4337 This only returns the service name, since the other info is already
4338 known or not useful (like the list of aliases). */
4339
4340/*ARGSUSED*/
4341static PyObject *
4342socket_getservbyport(PyObject *self, PyObject *args)
4343{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004344 int port;
4345 char *proto=NULL;
4346 struct servent *sp;
4347 if (!PyArg_ParseTuple(args, "i|s:getservbyport", &port, &proto))
4348 return NULL;
4349 if (port < 0 || port > 0xffff) {
4350 PyErr_SetString(
4351 PyExc_OverflowError,
4352 "getservbyport: port must be 0-65535.");
4353 return NULL;
4354 }
4355 Py_BEGIN_ALLOW_THREADS
4356 sp = getservbyport(htons((short)port), proto);
4357 Py_END_ALLOW_THREADS
4358 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004359 PyErr_SetString(PyExc_OSError, "port/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004360 return NULL;
4361 }
4362 return PyUnicode_FromString(sp->s_name);
Barry Warsaw11b91a02004-06-28 00:50:43 +00004363}
4364
4365PyDoc_STRVAR(getservbyport_doc,
4366"getservbyport(port[, protocolname]) -> string\n\
4367\n\
4368Return the service name from a port number and protocol name.\n\
4369The optional protocol name, if given, should be 'tcp' or 'udp',\n\
4370otherwise any protocol will match.");
4371
Guido van Rossum3901d851996-12-19 16:35:04 +00004372/* Python interface to getprotobyname(name).
4373 This only returns the protocol number, since the other info is
4374 already known or not useful (like the list of aliases). */
4375
4376/*ARGSUSED*/
4377static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004378socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00004379{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004380 char *name;
4381 struct protoent *sp;
4382 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
4383 return NULL;
4384 Py_BEGIN_ALLOW_THREADS
4385 sp = getprotobyname(name);
4386 Py_END_ALLOW_THREADS
4387 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004388 PyErr_SetString(PyExc_OSError, "protocol not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004389 return NULL;
4390 }
4391 return PyLong_FromLong((long) sp->p_proto);
Guido van Rossum3901d851996-12-19 16:35:04 +00004392}
4393
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004394PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004395"getprotobyname(name) -> integer\n\
4396\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004397Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004398
Guido van Rossum3901d851996-12-19 16:35:04 +00004399
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004400#ifndef NO_DUP
4401/* dup() function for socket fds */
4402
4403static PyObject *
4404socket_dup(PyObject *self, PyObject *fdobj)
4405{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004406 SOCKET_T fd, newfd;
4407 PyObject *newfdobj;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004408
4409
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004410 fd = PyLong_AsSocket_t(fdobj);
4411 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
4412 return NULL;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004413
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004414 newfd = dup_socket(fd);
4415 if (newfd == INVALID_SOCKET)
4416 return set_error();
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004417
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004418 newfdobj = PyLong_FromSocket_t(newfd);
4419 if (newfdobj == NULL)
4420 SOCKETCLOSE(newfd);
4421 return newfdobj;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004422}
4423
4424PyDoc_STRVAR(dup_doc,
4425"dup(integer) -> integer\n\
4426\n\
4427Duplicate an integer socket file descriptor. This is like os.dup(), but for\n\
4428sockets; on some platforms os.dup() won't work for socket file descriptors.");
4429#endif
4430
4431
Dave Cole331708b2004-08-09 04:51:41 +00004432#ifdef HAVE_SOCKETPAIR
4433/* Create a pair of sockets using the socketpair() function.
Dave Cole07fda7e2004-08-23 05:16:23 +00004434 Arguments as for socket() except the default family is AF_UNIX if
Dave Colee8bbfe42004-08-26 00:51:16 +00004435 defined on the platform; otherwise, the default is AF_INET. */
Dave Cole331708b2004-08-09 04:51:41 +00004436
4437/*ARGSUSED*/
4438static PyObject *
4439socket_socketpair(PyObject *self, PyObject *args)
4440{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004441 PySocketSockObject *s0 = NULL, *s1 = NULL;
4442 SOCKET_T sv[2];
4443 int family, type = SOCK_STREAM, proto = 0;
4444 PyObject *res = NULL;
Dave Cole331708b2004-08-09 04:51:41 +00004445
4446#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004447 family = AF_UNIX;
Dave Cole331708b2004-08-09 04:51:41 +00004448#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004449 family = AF_INET;
Dave Cole331708b2004-08-09 04:51:41 +00004450#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004451 if (!PyArg_ParseTuple(args, "|iii:socketpair",
4452 &family, &type, &proto))
4453 return NULL;
4454 /* Create a pair of socket fds */
4455 if (socketpair(family, type, proto, sv) < 0)
4456 return set_error();
4457 s0 = new_sockobject(sv[0], family, type, proto);
4458 if (s0 == NULL)
4459 goto finally;
4460 s1 = new_sockobject(sv[1], family, type, proto);
4461 if (s1 == NULL)
4462 goto finally;
4463 res = PyTuple_Pack(2, s0, s1);
Dave Cole331708b2004-08-09 04:51:41 +00004464
4465finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004466 if (res == NULL) {
4467 if (s0 == NULL)
4468 SOCKETCLOSE(sv[0]);
4469 if (s1 == NULL)
4470 SOCKETCLOSE(sv[1]);
4471 }
4472 Py_XDECREF(s0);
4473 Py_XDECREF(s1);
4474 return res;
Dave Cole331708b2004-08-09 04:51:41 +00004475}
4476
4477PyDoc_STRVAR(socketpair_doc,
4478"socketpair([family[, type[, proto]]]) -> (socket object, socket object)\n\
4479\n\
4480Create a pair of socket objects from the sockets returned by the platform\n\
4481socketpair() function.\n\
Dave Cole07fda7e2004-08-23 05:16:23 +00004482The arguments are the same as for socket() except the default family is\n\
Dave Colee8bbfe42004-08-26 00:51:16 +00004483AF_UNIX if defined on the platform; otherwise, the default is AF_INET.");
Dave Cole331708b2004-08-09 04:51:41 +00004484
4485#endif /* HAVE_SOCKETPAIR */
4486
4487
Guido van Rossum006bf911996-06-12 04:04:55 +00004488static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004489socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00004490{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004491 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00004492
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004493 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
4494 return NULL;
4495 }
4496 if (x1 < 0) {
4497 PyErr_SetString(PyExc_OverflowError,
4498 "can't convert negative number to unsigned long");
4499 return NULL;
4500 }
4501 x2 = (unsigned int)ntohs((unsigned short)x1);
4502 return PyLong_FromLong(x2);
Guido van Rossum006bf911996-06-12 04:04:55 +00004503}
4504
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004505PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004506"ntohs(integer) -> integer\n\
4507\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004508Convert a 16-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004509
4510
Guido van Rossum006bf911996-06-12 04:04:55 +00004511static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004512socket_ntohl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00004513{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004514 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00004515
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004516 if (PyLong_Check(arg)) {
4517 x = PyLong_AsUnsignedLong(arg);
4518 if (x == (unsigned long) -1 && PyErr_Occurred())
4519 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004520#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004521 {
4522 unsigned long y;
4523 /* only want the trailing 32 bits */
4524 y = x & 0xFFFFFFFFUL;
4525 if (y ^ x)
4526 return PyErr_Format(PyExc_OverflowError,
4527 "long int larger than 32 bits");
4528 x = y;
4529 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004530#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004531 }
4532 else
4533 return PyErr_Format(PyExc_TypeError,
4534 "expected int/long, %s found",
4535 Py_TYPE(arg)->tp_name);
4536 if (x == (unsigned long) -1 && PyErr_Occurred())
4537 return NULL;
4538 return PyLong_FromUnsignedLong(ntohl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00004539}
4540
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004541PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004542"ntohl(integer) -> integer\n\
4543\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004544Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004545
4546
Guido van Rossum006bf911996-06-12 04:04:55 +00004547static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004548socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00004549{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004550 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00004551
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004552 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
4553 return NULL;
4554 }
4555 if (x1 < 0) {
4556 PyErr_SetString(PyExc_OverflowError,
4557 "can't convert negative number to unsigned long");
4558 return NULL;
4559 }
4560 x2 = (unsigned int)htons((unsigned short)x1);
4561 return PyLong_FromLong(x2);
Guido van Rossum006bf911996-06-12 04:04:55 +00004562}
4563
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004564PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004565"htons(integer) -> integer\n\
4566\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004567Convert a 16-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004568
4569
Guido van Rossum006bf911996-06-12 04:04:55 +00004570static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004571socket_htonl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00004572{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004573 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00004574
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004575 if (PyLong_Check(arg)) {
4576 x = PyLong_AsUnsignedLong(arg);
4577 if (x == (unsigned long) -1 && PyErr_Occurred())
4578 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004579#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004580 {
4581 unsigned long y;
4582 /* only want the trailing 32 bits */
4583 y = x & 0xFFFFFFFFUL;
4584 if (y ^ x)
4585 return PyErr_Format(PyExc_OverflowError,
4586 "long int larger than 32 bits");
4587 x = y;
4588 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004589#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004590 }
4591 else
4592 return PyErr_Format(PyExc_TypeError,
4593 "expected int/long, %s found",
4594 Py_TYPE(arg)->tp_name);
4595 return PyLong_FromUnsignedLong(htonl((unsigned long)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00004596}
4597
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004598PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004599"htonl(integer) -> integer\n\
4600\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004601Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004602
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004603/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004604
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004605PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004606"inet_aton(string) -> bytes giving packed 32-bit IP representation\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004607\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00004608Convert 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 +00004609binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004610
4611static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004612socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004613{
Guido van Rossuma2e48551999-09-09 15:42:59 +00004614#ifndef INADDR_NONE
4615#define INADDR_NONE (-1)
4616#endif
Neal Norwitz88f115b2003-02-13 02:15:42 +00004617#ifdef HAVE_INET_ATON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004618 struct in_addr buf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00004619#endif
4620
4621#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
Benjamin Petersonf91df042009-02-13 02:50:59 +00004622#if (SIZEOF_INT != 4)
4623#error "Not sure if in_addr_t exists and int is not 32-bits."
4624#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004625 /* Have to use inet_addr() instead */
4626 unsigned int packed_addr;
Tim Peters1df9fdd2003-02-13 03:13:40 +00004627#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004628 char *ip_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00004629
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004630 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))
4631 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00004632
Tim Peters1df9fdd2003-02-13 03:13:40 +00004633
4634#ifdef HAVE_INET_ATON
Thomas Wouters477c8d52006-05-27 19:21:47 +00004635
4636#ifdef USE_INET_ATON_WEAKLINK
4637 if (inet_aton != NULL) {
4638#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004639 if (inet_aton(ip_addr, &buf))
4640 return PyBytes_FromStringAndSize((char *)(&buf),
4641 sizeof(buf));
Guido van Rossumad05cdf2003-02-12 23:08:22 +00004642
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004643 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004644 "illegal IP address string passed to inet_aton");
4645 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00004646
Thomas Wouters477c8d52006-05-27 19:21:47 +00004647#ifdef USE_INET_ATON_WEAKLINK
4648 } else {
4649#endif
4650
4651#endif
4652
4653#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
4654
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004655 /* special-case this address as inet_addr might return INADDR_NONE
4656 * for this */
4657 if (strcmp(ip_addr, "255.255.255.255") == 0) {
4658 packed_addr = 0xFFFFFFFF;
4659 } else {
Thomas Wouters477c8d52006-05-27 19:21:47 +00004660
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004661 packed_addr = inet_addr(ip_addr);
Guido van Rossumc6a164b1999-08-20 19:11:27 +00004662
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004663 if (packed_addr == INADDR_NONE) { /* invalid address */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004664 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004665 "illegal IP address string passed to inet_aton");
4666 return NULL;
4667 }
4668 }
4669 return PyBytes_FromStringAndSize((char *) &packed_addr,
4670 sizeof(packed_addr));
Thomas Wouters477c8d52006-05-27 19:21:47 +00004671
4672#ifdef USE_INET_ATON_WEAKLINK
4673 }
4674#endif
4675
Guido van Rossumad05cdf2003-02-12 23:08:22 +00004676#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004677}
4678
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004679PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00004680"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004681\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004682Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004683
4684static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004685socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004686{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004687 char *packed_str;
4688 int addr_len;
4689 struct in_addr packed_addr;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004690
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004691 if (!PyArg_ParseTuple(args, "y#:inet_ntoa", &packed_str, &addr_len)) {
4692 return NULL;
4693 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00004694
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004695 if (addr_len != sizeof(packed_addr)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004696 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004697 "packed IP wrong length for inet_ntoa");
4698 return NULL;
4699 }
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004700
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004701 memcpy(&packed_addr, packed_str, addr_len);
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004702
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004703 return PyUnicode_FromString(inet_ntoa(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004704}
Guido van Rossum82a5c661998-07-07 20:45:43 +00004705
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004706#ifdef HAVE_INET_PTON
4707
4708PyDoc_STRVAR(inet_pton_doc,
4709"inet_pton(af, ip) -> packed IP address string\n\
4710\n\
4711Convert an IP address from string format to a packed string suitable\n\
4712for use with low-level network functions.");
4713
4714static PyObject *
4715socket_inet_pton(PyObject *self, PyObject *args)
4716{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004717 int af;
4718 char* ip;
4719 int retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004720#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004721 char packed[MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004722#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004723 char packed[sizeof(struct in_addr)];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004724#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004725 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
4726 return NULL;
4727 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004728
Martin v. Löwis04697e82004-06-02 12:35:29 +00004729#if !defined(ENABLE_IPV6) && defined(AF_INET6)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004730 if(af == AF_INET6) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004731 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004732 "can't use AF_INET6, IPv6 is disabled");
4733 return NULL;
4734 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00004735#endif
Martin v. Löwis10649092003-08-05 06:25:06 +00004736
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004737 retval = inet_pton(af, ip, packed);
4738 if (retval < 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004739 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004740 return NULL;
4741 } else if (retval == 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004742 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004743 "illegal IP address string passed to inet_pton");
4744 return NULL;
4745 } else if (af == AF_INET) {
4746 return PyBytes_FromStringAndSize(packed,
4747 sizeof(struct in_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004748#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004749 } else if (af == AF_INET6) {
4750 return PyBytes_FromStringAndSize(packed,
4751 sizeof(struct in6_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004752#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004753 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004754 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004755 return NULL;
4756 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004757}
Thomas Wouters477c8d52006-05-27 19:21:47 +00004758
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004759PyDoc_STRVAR(inet_ntop_doc,
4760"inet_ntop(af, packed_ip) -> string formatted IP address\n\
4761\n\
4762Convert a packed IP address of the given family to string format.");
4763
4764static PyObject *
4765socket_inet_ntop(PyObject *self, PyObject *args)
4766{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004767 int af;
4768 char* packed;
4769 int len;
4770 const char* retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004771#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004772 char ip[MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004773#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004774 char ip[INET_ADDRSTRLEN + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004775#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00004776
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004777 /* Guarantee NUL-termination for PyUnicode_FromString() below */
4778 memset((void *) &ip[0], '\0', sizeof(ip));
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004779
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004780 if (!PyArg_ParseTuple(args, "iy#:inet_ntop", &af, &packed, &len)) {
4781 return NULL;
4782 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004783
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004784 if (af == AF_INET) {
4785 if (len != sizeof(struct in_addr)) {
4786 PyErr_SetString(PyExc_ValueError,
4787 "invalid length of packed IP address string");
4788 return NULL;
4789 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004790#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004791 } else if (af == AF_INET6) {
4792 if (len != sizeof(struct in6_addr)) {
4793 PyErr_SetString(PyExc_ValueError,
4794 "invalid length of packed IP address string");
4795 return NULL;
4796 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004797#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004798 } else {
4799 PyErr_Format(PyExc_ValueError,
4800 "unknown address family %d", af);
4801 return NULL;
4802 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004803
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004804 retval = inet_ntop(af, packed, ip, sizeof(ip));
4805 if (!retval) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004806 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004807 return NULL;
4808 } else {
4809 return PyUnicode_FromString(retval);
4810 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004811
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004812 /* NOTREACHED */
4813 PyErr_SetString(PyExc_RuntimeError, "invalid handling of inet_ntop");
4814 return NULL;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004815}
4816
4817#endif /* HAVE_INET_PTON */
4818
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004819/* Python interface to getaddrinfo(host, port). */
4820
4821/*ARGSUSED*/
4822static PyObject *
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00004823socket_getaddrinfo(PyObject *self, PyObject *args, PyObject* kwargs)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004824{
Victor Stinner77af1722011-05-26 14:05:59 +02004825 static char* kwnames[] = {"host", "port", "family", "type", "proto",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00004826 "flags", 0};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004827 struct addrinfo hints, *res;
4828 struct addrinfo *res0 = NULL;
4829 PyObject *hobj = NULL;
4830 PyObject *pobj = (PyObject *)NULL;
4831 char pbuf[30];
4832 char *hptr, *pptr;
4833 int family, socktype, protocol, flags;
4834 int error;
4835 PyObject *all = (PyObject *)NULL;
4836 PyObject *idna = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004837
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004838 family = socktype = protocol = flags = 0;
4839 family = AF_UNSPEC;
Victor Stinner77af1722011-05-26 14:05:59 +02004840 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OO|iiii:getaddrinfo",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00004841 kwnames, &hobj, &pobj, &family, &socktype,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004842 &protocol, &flags)) {
4843 return NULL;
4844 }
4845 if (hobj == Py_None) {
4846 hptr = NULL;
4847 } else if (PyUnicode_Check(hobj)) {
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02004848 _Py_IDENTIFIER(encode);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02004849
4850 idna = _PyObject_CallMethodId(hobj, &PyId_encode, "s", "idna");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004851 if (!idna)
4852 return NULL;
4853 assert(PyBytes_Check(idna));
4854 hptr = PyBytes_AS_STRING(idna);
4855 } else if (PyBytes_Check(hobj)) {
4856 hptr = PyBytes_AsString(hobj);
4857 } else {
4858 PyErr_SetString(PyExc_TypeError,
4859 "getaddrinfo() argument 1 must be string or None");
4860 return NULL;
4861 }
4862 if (PyLong_CheckExact(pobj)) {
4863 long value = PyLong_AsLong(pobj);
4864 if (value == -1 && PyErr_Occurred())
4865 goto err;
4866 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", value);
4867 pptr = pbuf;
4868 } else if (PyUnicode_Check(pobj)) {
4869 pptr = _PyUnicode_AsString(pobj);
Alexander Belopolskye239d232010-12-08 23:31:48 +00004870 if (pptr == NULL)
4871 goto err;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004872 } else if (PyBytes_Check(pobj)) {
Alexander Belopolskye239d232010-12-08 23:31:48 +00004873 pptr = PyBytes_AS_STRING(pobj);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004874 } else if (pobj == Py_None) {
4875 pptr = (char *)NULL;
4876 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004877 PyErr_SetString(PyExc_OSError, "Int or String expected");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004878 goto err;
4879 }
4880 memset(&hints, 0, sizeof(hints));
4881 hints.ai_family = family;
4882 hints.ai_socktype = socktype;
4883 hints.ai_protocol = protocol;
4884 hints.ai_flags = flags;
4885 Py_BEGIN_ALLOW_THREADS
4886 ACQUIRE_GETADDRINFO_LOCK
4887 error = getaddrinfo(hptr, pptr, &hints, &res0);
4888 Py_END_ALLOW_THREADS
4889 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
4890 if (error) {
4891 set_gaierror(error);
4892 goto err;
4893 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004894
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004895 if ((all = PyList_New(0)) == NULL)
4896 goto err;
4897 for (res = res0; res; res = res->ai_next) {
4898 PyObject *single;
4899 PyObject *addr =
4900 makesockaddr(-1, res->ai_addr, res->ai_addrlen, protocol);
4901 if (addr == NULL)
4902 goto err;
4903 single = Py_BuildValue("iiisO", res->ai_family,
4904 res->ai_socktype, res->ai_protocol,
4905 res->ai_canonname ? res->ai_canonname : "",
4906 addr);
4907 Py_DECREF(addr);
4908 if (single == NULL)
4909 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004910
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004911 if (PyList_Append(all, single))
4912 goto err;
4913 Py_XDECREF(single);
4914 }
4915 Py_XDECREF(idna);
4916 if (res0)
4917 freeaddrinfo(res0);
4918 return all;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004919 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004920 Py_XDECREF(all);
4921 Py_XDECREF(idna);
4922 if (res0)
4923 freeaddrinfo(res0);
4924 return (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004925}
4926
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004927PyDoc_STRVAR(getaddrinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004928"getaddrinfo(host, port [, family, socktype, proto, flags])\n\
4929 -> list of (family, socktype, proto, canonname, sockaddr)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004930\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004931Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004932
4933/* Python interface to getnameinfo(sa, flags). */
4934
4935/*ARGSUSED*/
4936static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004937socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004938{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004939 PyObject *sa = (PyObject *)NULL;
4940 int flags;
4941 char *hostp;
4942 int port, flowinfo, scope_id;
4943 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
4944 struct addrinfo hints, *res = NULL;
4945 int error;
4946 PyObject *ret = (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004947
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004948 flags = flowinfo = scope_id = 0;
4949 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
4950 return NULL;
4951 if (!PyTuple_Check(sa)) {
4952 PyErr_SetString(PyExc_TypeError,
4953 "getnameinfo() argument 1 must be a tuple");
4954 return NULL;
4955 }
4956 if (!PyArg_ParseTuple(sa, "si|ii",
4957 &hostp, &port, &flowinfo, &scope_id))
4958 return NULL;
4959 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
4960 memset(&hints, 0, sizeof(hints));
4961 hints.ai_family = AF_UNSPEC;
4962 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Martin v. Löwis112c0f32010-08-25 07:38:15 +00004963 hints.ai_flags = AI_NUMERICHOST; /* don't do any name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004964 Py_BEGIN_ALLOW_THREADS
4965 ACQUIRE_GETADDRINFO_LOCK
4966 error = getaddrinfo(hostp, pbuf, &hints, &res);
4967 Py_END_ALLOW_THREADS
4968 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
4969 if (error) {
4970 set_gaierror(error);
4971 goto fail;
4972 }
4973 if (res->ai_next) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004974 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004975 "sockaddr resolved to multiple addresses");
4976 goto fail;
4977 }
4978 switch (res->ai_family) {
4979 case AF_INET:
4980 {
4981 if (PyTuple_GET_SIZE(sa) != 2) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004982 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004983 "IPv4 sockaddr must be 2 tuple");
4984 goto fail;
4985 }
4986 break;
4987 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004988#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004989 case AF_INET6:
4990 {
4991 struct sockaddr_in6 *sin6;
4992 sin6 = (struct sockaddr_in6 *)res->ai_addr;
4993 sin6->sin6_flowinfo = flowinfo;
4994 sin6->sin6_scope_id = scope_id;
4995 break;
4996 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004997#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004998 }
Antoine Pitrou19467d22010-08-17 19:33:30 +00004999 error = getnameinfo(res->ai_addr, (socklen_t) res->ai_addrlen,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005000 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
5001 if (error) {
5002 set_gaierror(error);
5003 goto fail;
5004 }
5005 ret = Py_BuildValue("ss", hbuf, pbuf);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005006
5007fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005008 if (res)
5009 freeaddrinfo(res);
5010 return ret;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005011}
5012
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005013PyDoc_STRVAR(getnameinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005014"getnameinfo(sockaddr, flags) --> (host, port)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005015\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005016Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005017
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005018
5019/* Python API to getting and setting the default timeout value. */
5020
5021static PyObject *
5022socket_getdefaulttimeout(PyObject *self)
5023{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005024 if (defaulttimeout < 0.0) {
5025 Py_INCREF(Py_None);
5026 return Py_None;
5027 }
5028 else
5029 return PyFloat_FromDouble(defaulttimeout);
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005030}
5031
5032PyDoc_STRVAR(getdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005033"getdefaulttimeout() -> timeout\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005034\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03005035Returns the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005036A value of None indicates that new socket objects have no timeout.\n\
5037When the socket module is first imported, the default is None.");
5038
5039static PyObject *
5040socket_setdefaulttimeout(PyObject *self, PyObject *arg)
5041{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005042 double timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005043
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005044 if (arg == Py_None)
5045 timeout = -1.0;
5046 else {
5047 timeout = PyFloat_AsDouble(arg);
5048 if (timeout < 0.0) {
5049 if (!PyErr_Occurred())
5050 PyErr_SetString(PyExc_ValueError,
5051 "Timeout value out of range");
5052 return NULL;
5053 }
5054 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005055
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005056 defaulttimeout = timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005057
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005058 Py_INCREF(Py_None);
5059 return Py_None;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005060}
5061
5062PyDoc_STRVAR(setdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005063"setdefaulttimeout(timeout)\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005064\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03005065Set the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005066A value of None indicates that new socket objects have no timeout.\n\
5067When the socket module is first imported, the default is None.");
5068
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005069#ifdef HAVE_IF_NAMEINDEX
5070/* Python API for getting interface indices and names */
5071
5072static PyObject *
5073socket_if_nameindex(PyObject *self, PyObject *arg)
5074{
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005075 PyObject *list;
Charles-François Natali60713592011-05-20 16:55:06 +02005076 int i;
5077 struct if_nameindex *ni;
Victor Stinner77af1722011-05-26 14:05:59 +02005078
Charles-François Natali60713592011-05-20 16:55:06 +02005079 ni = if_nameindex();
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005080 if (ni == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005081 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005082 return NULL;
5083 }
5084
5085 list = PyList_New(0);
5086 if (list == NULL) {
5087 if_freenameindex(ni);
5088 return NULL;
5089 }
5090
Charles-François Natali60713592011-05-20 16:55:06 +02005091 for (i = 0; ni[i].if_index != 0 && i < INT_MAX; i++) {
5092 PyObject *ni_tuple = Py_BuildValue("IO&",
5093 ni[i].if_index, PyUnicode_DecodeFSDefault, ni[i].if_name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005094
5095 if (ni_tuple == NULL || PyList_Append(list, ni_tuple) == -1) {
5096 Py_XDECREF(ni_tuple);
Charles-François Natali60713592011-05-20 16:55:06 +02005097 Py_DECREF(list);
5098 if_freenameindex(ni);
5099 return NULL;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005100 }
5101 Py_DECREF(ni_tuple);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005102 }
5103
5104 if_freenameindex(ni);
5105 return list;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005106}
5107
5108PyDoc_STRVAR(if_nameindex_doc,
5109"if_nameindex()\n\
5110\n\
5111Returns a list of network interface information (index, name) tuples.");
5112
Charles-François Natali60713592011-05-20 16:55:06 +02005113static PyObject *
5114socket_if_nametoindex(PyObject *self, PyObject *args)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005115{
Charles-François Natali60713592011-05-20 16:55:06 +02005116 PyObject *oname;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005117 unsigned long index;
5118
Charles-François Natali60713592011-05-20 16:55:06 +02005119 if (!PyArg_ParseTuple(args, "O&:if_nametoindex",
5120 PyUnicode_FSConverter, &oname))
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005121 return NULL;
5122
Charles-François Natali60713592011-05-20 16:55:06 +02005123 index = if_nametoindex(PyBytes_AS_STRING(oname));
5124 Py_DECREF(oname);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005125 if (index == 0) {
Charles-François Natali60713592011-05-20 16:55:06 +02005126 /* if_nametoindex() doesn't set errno */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005127 PyErr_SetString(PyExc_OSError, "no interface with this name");
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005128 return NULL;
5129 }
5130
5131 return PyLong_FromUnsignedLong(index);
5132}
5133
5134PyDoc_STRVAR(if_nametoindex_doc,
5135"if_nametoindex(if_name)\n\
5136\n\
5137Returns the interface index corresponding to the interface name if_name.");
5138
Charles-François Natali60713592011-05-20 16:55:06 +02005139static PyObject *
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005140socket_if_indextoname(PyObject *self, PyObject *arg)
5141{
Charles-François Natali60713592011-05-20 16:55:06 +02005142 unsigned long index;
5143 char name[IF_NAMESIZE + 1];
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005144
Charles-François Natali60713592011-05-20 16:55:06 +02005145 index = PyLong_AsUnsignedLong(arg);
5146 if (index == (unsigned long) -1)
5147 return NULL;
5148
5149 if (if_indextoname(index, name) == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005150 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005151 return NULL;
5152 }
5153
Charles-François Natali60713592011-05-20 16:55:06 +02005154 return PyUnicode_DecodeFSDefault(name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005155}
5156
5157PyDoc_STRVAR(if_indextoname_doc,
5158"if_indextoname(if_index)\n\
5159\n\
5160Returns the interface name corresponding to the interface index if_index.");
5161
5162#endif /* HAVE_IF_NAMEINDEX */
5163
5164
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005165#ifdef CMSG_LEN
5166/* Python interface to CMSG_LEN(length). */
5167
5168static PyObject *
5169socket_CMSG_LEN(PyObject *self, PyObject *args)
5170{
5171 Py_ssize_t length;
5172 size_t result;
5173
5174 if (!PyArg_ParseTuple(args, "n:CMSG_LEN", &length))
5175 return NULL;
5176 if (length < 0 || !get_CMSG_LEN(length, &result)) {
5177 PyErr_Format(PyExc_OverflowError, "CMSG_LEN() argument out of range");
5178 return NULL;
5179 }
5180 return PyLong_FromSize_t(result);
5181}
5182
5183PyDoc_STRVAR(CMSG_LEN_doc,
5184"CMSG_LEN(length) -> control message length\n\
5185\n\
5186Return the total length, without trailing padding, of an ancillary\n\
5187data item with associated data of the given length. This value can\n\
5188often be used as the buffer size for recvmsg() to receive a single\n\
5189item of ancillary data, but RFC 3542 requires portable applications to\n\
5190use CMSG_SPACE() and thus include space for padding, even when the\n\
5191item will be the last in the buffer. Raises OverflowError if length\n\
5192is outside the permissible range of values.");
5193
5194
5195#ifdef CMSG_SPACE
5196/* Python interface to CMSG_SPACE(length). */
5197
5198static PyObject *
5199socket_CMSG_SPACE(PyObject *self, PyObject *args)
5200{
5201 Py_ssize_t length;
5202 size_t result;
5203
5204 if (!PyArg_ParseTuple(args, "n:CMSG_SPACE", &length))
5205 return NULL;
5206 if (length < 0 || !get_CMSG_SPACE(length, &result)) {
5207 PyErr_SetString(PyExc_OverflowError,
5208 "CMSG_SPACE() argument out of range");
5209 return NULL;
5210 }
5211 return PyLong_FromSize_t(result);
5212}
5213
5214PyDoc_STRVAR(CMSG_SPACE_doc,
5215"CMSG_SPACE(length) -> buffer size\n\
5216\n\
5217Return the buffer size needed for recvmsg() to receive an ancillary\n\
5218data item with associated data of the given length, along with any\n\
5219trailing padding. The buffer space needed to receive multiple items\n\
5220is the sum of the CMSG_SPACE() values for their associated data\n\
5221lengths. Raises OverflowError if length is outside the permissible\n\
5222range of values.");
5223#endif /* CMSG_SPACE */
5224#endif /* CMSG_LEN */
5225
5226
Guido van Rossum30a685f1991-06-27 15:51:29 +00005227/* List of functions exported by this module. */
5228
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005229static PyMethodDef socket_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005230 {"gethostbyname", socket_gethostbyname,
5231 METH_VARARGS, gethostbyname_doc},
5232 {"gethostbyname_ex", socket_gethostbyname_ex,
5233 METH_VARARGS, ghbn_ex_doc},
5234 {"gethostbyaddr", socket_gethostbyaddr,
5235 METH_VARARGS, gethostbyaddr_doc},
5236 {"gethostname", socket_gethostname,
5237 METH_NOARGS, gethostname_doc},
Antoine Pitrou061cfb52011-02-28 22:25:22 +00005238#ifdef HAVE_SETHOSTNAME
5239 {"sethostname", socket_sethostname,
5240 METH_VARARGS, sethostname_doc},
5241#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005242 {"getservbyname", socket_getservbyname,
5243 METH_VARARGS, getservbyname_doc},
5244 {"getservbyport", socket_getservbyport,
5245 METH_VARARGS, getservbyport_doc},
5246 {"getprotobyname", socket_getprotobyname,
5247 METH_VARARGS, getprotobyname_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005248#ifndef NO_DUP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005249 {"dup", socket_dup,
5250 METH_O, dup_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005251#endif
Dave Cole331708b2004-08-09 04:51:41 +00005252#ifdef HAVE_SOCKETPAIR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005253 {"socketpair", socket_socketpair,
5254 METH_VARARGS, socketpair_doc},
Dave Cole331708b2004-08-09 04:51:41 +00005255#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005256 {"ntohs", socket_ntohs,
5257 METH_VARARGS, ntohs_doc},
5258 {"ntohl", socket_ntohl,
5259 METH_O, ntohl_doc},
5260 {"htons", socket_htons,
5261 METH_VARARGS, htons_doc},
5262 {"htonl", socket_htonl,
5263 METH_O, htonl_doc},
5264 {"inet_aton", socket_inet_aton,
5265 METH_VARARGS, inet_aton_doc},
5266 {"inet_ntoa", socket_inet_ntoa,
5267 METH_VARARGS, inet_ntoa_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005268#ifdef HAVE_INET_PTON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005269 {"inet_pton", socket_inet_pton,
5270 METH_VARARGS, inet_pton_doc},
5271 {"inet_ntop", socket_inet_ntop,
5272 METH_VARARGS, inet_ntop_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005273#endif
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005274 {"getaddrinfo", (PyCFunction)socket_getaddrinfo,
5275 METH_VARARGS | METH_KEYWORDS, getaddrinfo_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005276 {"getnameinfo", socket_getnameinfo,
5277 METH_VARARGS, getnameinfo_doc},
5278 {"getdefaulttimeout", (PyCFunction)socket_getdefaulttimeout,
5279 METH_NOARGS, getdefaulttimeout_doc},
5280 {"setdefaulttimeout", socket_setdefaulttimeout,
5281 METH_O, setdefaulttimeout_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005282#ifdef HAVE_IF_NAMEINDEX
5283 {"if_nameindex", socket_if_nameindex,
5284 METH_NOARGS, if_nameindex_doc},
5285 {"if_nametoindex", socket_if_nametoindex,
Charles-François Natali60713592011-05-20 16:55:06 +02005286 METH_VARARGS, if_nametoindex_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005287 {"if_indextoname", socket_if_indextoname,
5288 METH_O, if_indextoname_doc},
5289#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005290#ifdef CMSG_LEN
5291 {"CMSG_LEN", socket_CMSG_LEN,
5292 METH_VARARGS, CMSG_LEN_doc},
5293#ifdef CMSG_SPACE
5294 {"CMSG_SPACE", socket_CMSG_SPACE,
5295 METH_VARARGS, CMSG_SPACE_doc},
5296#endif
5297#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005298 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005299};
5300
Guido van Rossum30a685f1991-06-27 15:51:29 +00005301
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005302#ifdef MS_WINDOWS
5303#define OS_INIT_DEFINED
5304
5305/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00005306
5307static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005308os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00005309{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005310 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00005311}
5312
5313static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005314os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00005315{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005316 WSADATA WSAData;
5317 int ret;
5318 ret = WSAStartup(0x0101, &WSAData);
5319 switch (ret) {
5320 case 0: /* No error */
5321 Py_AtExit(os_cleanup);
5322 return 1; /* Success */
5323 case WSASYSNOTREADY:
5324 PyErr_SetString(PyExc_ImportError,
5325 "WSAStartup failed: network not ready");
5326 break;
5327 case WSAVERNOTSUPPORTED:
5328 case WSAEINVAL:
5329 PyErr_SetString(
5330 PyExc_ImportError,
5331 "WSAStartup failed: requested version not supported");
5332 break;
5333 default:
5334 PyErr_Format(PyExc_ImportError, "WSAStartup failed: error code %d", ret);
5335 break;
5336 }
5337 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00005338}
5339
Guido van Rossum8d665e61996-06-26 18:22:49 +00005340#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00005341
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005342
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005343#ifdef PYOS_OS2
5344#define OS_INIT_DEFINED
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005345
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005346/* Additional initialization for OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005347
5348static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005349os_init(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005350{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005351#ifndef PYCC_GCC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005352 int rc = sock_init();
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005353
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005354 if (rc == 0) {
5355 return 1; /* Success */
5356 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005357
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005358 PyErr_Format(PyExc_ImportError, "OS/2 TCP/IP Error# %d", sock_errno());
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005359
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005360 return 0; /* Failure */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00005361#else
Ezio Melotti13925002011-03-16 11:05:33 +02005362 /* No need to initialize sockets with GCC/EMX */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005363 return 1; /* Success */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00005364#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005365}
5366
5367#endif /* PYOS_OS2 */
5368
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005369
5370#ifndef OS_INIT_DEFINED
5371static int
5372os_init(void)
5373{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005374 return 1; /* Success */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005375}
5376#endif
5377
5378
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005379/* C API table - always add new things to the end for binary
5380 compatibility. */
5381static
5382PySocketModule_APIObject PySocketModuleAPI =
5383{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005384 &sock_type,
Antoine Pitrouc4df7842010-12-03 19:59:41 +00005385 NULL,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005386 NULL
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005387};
5388
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005389
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005390/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005391
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005392 This module is actually called "_socket", and there's a wrapper
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005393 "socket.py" which implements some additional functionality.
5394 The import of "_socket" may fail with an ImportError exception if
5395 os-specific initialization fails. On Windows, this does WINSOCK
Ezio Melotti13925002011-03-16 11:05:33 +02005396 initialization. When WINSOCK is initialized successfully, a call to
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005397 WSACleanup() is scheduled to be made at exit time.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005398*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005399
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005400PyDoc_STRVAR(socket_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005401"Implementation module for socket operations.\n\
5402\n\
5403See the socket module for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005404
Martin v. Löwis1a214512008-06-11 05:26:20 +00005405static struct PyModuleDef socketmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005406 PyModuleDef_HEAD_INIT,
5407 PySocket_MODULE_NAME,
5408 socket_doc,
5409 -1,
5410 socket_methods,
5411 NULL,
5412 NULL,
5413 NULL,
5414 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00005415};
5416
Mark Hammondfe51c6d2002-08-02 02:27:13 +00005417PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00005418PyInit__socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005419{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005420 PyObject *m, *has_ipv6;
Fred Drake4baedc12002-04-01 14:53:37 +00005421
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005422 if (!os_init())
5423 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005424
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005425 Py_TYPE(&sock_type) = &PyType_Type;
5426 m = PyModule_Create(&socketmodule);
5427 if (m == NULL)
5428 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005429
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005430 Py_INCREF(PyExc_OSError);
5431 PySocketModuleAPI.error = PyExc_OSError;
5432 Py_INCREF(PyExc_OSError);
5433 PyModule_AddObject(m, "error", PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005434 socket_herror = PyErr_NewException("socket.herror",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005435 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005436 if (socket_herror == NULL)
5437 return NULL;
5438 Py_INCREF(socket_herror);
5439 PyModule_AddObject(m, "herror", socket_herror);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005440 socket_gaierror = PyErr_NewException("socket.gaierror", PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005441 NULL);
5442 if (socket_gaierror == NULL)
5443 return NULL;
5444 Py_INCREF(socket_gaierror);
5445 PyModule_AddObject(m, "gaierror", socket_gaierror);
5446 socket_timeout = PyErr_NewException("socket.timeout",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005447 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005448 if (socket_timeout == NULL)
5449 return NULL;
Antoine Pitrouc4df7842010-12-03 19:59:41 +00005450 PySocketModuleAPI.timeout_error = socket_timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005451 Py_INCREF(socket_timeout);
5452 PyModule_AddObject(m, "timeout", socket_timeout);
5453 Py_INCREF((PyObject *)&sock_type);
5454 if (PyModule_AddObject(m, "SocketType",
5455 (PyObject *)&sock_type) != 0)
5456 return NULL;
5457 Py_INCREF((PyObject *)&sock_type);
5458 if (PyModule_AddObject(m, "socket",
5459 (PyObject *)&sock_type) != 0)
5460 return NULL;
Guido van Rossum09be4091999-08-09 14:40:40 +00005461
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005462#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005463 has_ipv6 = Py_True;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005464#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005465 has_ipv6 = Py_False;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005466#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005467 Py_INCREF(has_ipv6);
5468 PyModule_AddObject(m, "has_ipv6", has_ipv6);
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005469
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005470 /* Export C API */
5471 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
5472 PyCapsule_New(&PySocketModuleAPI, PySocket_CAPSULE_NAME, NULL)
5473 ) != 0)
5474 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005475
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005476 /* Address families (we only support AF_INET and AF_UNIX) */
Guido van Rossum09be4091999-08-09 14:40:40 +00005477#ifdef AF_UNSPEC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005478 PyModule_AddIntConstant(m, "AF_UNSPEC", AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00005479#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005480 PyModule_AddIntConstant(m, "AF_INET", AF_INET);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005481#ifdef AF_INET6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005482 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005483#endif /* AF_INET6 */
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00005484#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005485 PyModule_AddIntConstant(m, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00005486#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00005487#ifdef AF_AX25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005488 /* Amateur Radio AX.25 */
5489 PyModule_AddIntConstant(m, "AF_AX25", AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00005490#endif
5491#ifdef AF_IPX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005492 PyModule_AddIntConstant(m, "AF_IPX", AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00005493#endif
5494#ifdef AF_APPLETALK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005495 /* Appletalk DDP */
5496 PyModule_AddIntConstant(m, "AF_APPLETALK", AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00005497#endif
5498#ifdef AF_NETROM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005499 /* Amateur radio NetROM */
5500 PyModule_AddIntConstant(m, "AF_NETROM", AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00005501#endif
5502#ifdef AF_BRIDGE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005503 /* Multiprotocol bridge */
5504 PyModule_AddIntConstant(m, "AF_BRIDGE", AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00005505#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005506#ifdef AF_ATMPVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005507 /* ATM PVCs */
5508 PyModule_AddIntConstant(m, "AF_ATMPVC", AF_ATMPVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005509#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00005510#ifdef AF_AAL5
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005511 /* Reserved for Werner's ATM */
5512 PyModule_AddIntConstant(m, "AF_AAL5", AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00005513#endif
5514#ifdef AF_X25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005515 /* Reserved for X.25 project */
5516 PyModule_AddIntConstant(m, "AF_X25", AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00005517#endif
5518#ifdef AF_INET6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005519 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00005520#endif
5521#ifdef AF_ROSE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005522 /* Amateur Radio X.25 PLP */
5523 PyModule_AddIntConstant(m, "AF_ROSE", AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00005524#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005525#ifdef AF_DECnet
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005526 /* Reserved for DECnet project */
5527 PyModule_AddIntConstant(m, "AF_DECnet", AF_DECnet);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005528#endif
5529#ifdef AF_NETBEUI
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005530 /* Reserved for 802.2LLC project */
5531 PyModule_AddIntConstant(m, "AF_NETBEUI", AF_NETBEUI);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005532#endif
5533#ifdef AF_SECURITY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005534 /* Security callback pseudo AF */
5535 PyModule_AddIntConstant(m, "AF_SECURITY", AF_SECURITY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005536#endif
5537#ifdef AF_KEY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005538 /* PF_KEY key management API */
5539 PyModule_AddIntConstant(m, "AF_KEY", AF_KEY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005540#endif
5541#ifdef AF_NETLINK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005542 /* */
5543 PyModule_AddIntConstant(m, "AF_NETLINK", AF_NETLINK);
5544 PyModule_AddIntConstant(m, "NETLINK_ROUTE", NETLINK_ROUTE);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005545#ifdef NETLINK_SKIP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005546 PyModule_AddIntConstant(m, "NETLINK_SKIP", NETLINK_SKIP);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005547#endif
5548#ifdef NETLINK_W1
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005549 PyModule_AddIntConstant(m, "NETLINK_W1", NETLINK_W1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005550#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005551 PyModule_AddIntConstant(m, "NETLINK_USERSOCK", NETLINK_USERSOCK);
5552 PyModule_AddIntConstant(m, "NETLINK_FIREWALL", NETLINK_FIREWALL);
Guido van Rossum668a94a2006-02-21 01:07:27 +00005553#ifdef NETLINK_TCPDIAG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005554 PyModule_AddIntConstant(m, "NETLINK_TCPDIAG", NETLINK_TCPDIAG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00005555#endif
5556#ifdef NETLINK_NFLOG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005557 PyModule_AddIntConstant(m, "NETLINK_NFLOG", NETLINK_NFLOG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00005558#endif
Neal Norwitz65851662006-01-16 04:31:40 +00005559#ifdef NETLINK_XFRM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005560 PyModule_AddIntConstant(m, "NETLINK_XFRM", NETLINK_XFRM);
Neal Norwitz65851662006-01-16 04:31:40 +00005561#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005562#ifdef NETLINK_ARPD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005563 PyModule_AddIntConstant(m, "NETLINK_ARPD", NETLINK_ARPD);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005564#endif
5565#ifdef NETLINK_ROUTE6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005566 PyModule_AddIntConstant(m, "NETLINK_ROUTE6", NETLINK_ROUTE6);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005567#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005568 PyModule_AddIntConstant(m, "NETLINK_IP6_FW", NETLINK_IP6_FW);
Thomas Wouterscf297e42007-02-23 15:07:44 +00005569#ifdef NETLINK_DNRTMSG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005570 PyModule_AddIntConstant(m, "NETLINK_DNRTMSG", NETLINK_DNRTMSG);
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005571#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005572#ifdef NETLINK_TAPBASE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005573 PyModule_AddIntConstant(m, "NETLINK_TAPBASE", NETLINK_TAPBASE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005574#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005575#endif /* AF_NETLINK */
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005576#ifdef AF_ROUTE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005577 /* Alias to emulate 4.4BSD */
5578 PyModule_AddIntConstant(m, "AF_ROUTE", AF_ROUTE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005579#endif
5580#ifdef AF_ASH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005581 /* Ash */
5582 PyModule_AddIntConstant(m, "AF_ASH", AF_ASH);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005583#endif
5584#ifdef AF_ECONET
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005585 /* Acorn Econet */
5586 PyModule_AddIntConstant(m, "AF_ECONET", AF_ECONET);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005587#endif
5588#ifdef AF_ATMSVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005589 /* ATM SVCs */
5590 PyModule_AddIntConstant(m, "AF_ATMSVC", AF_ATMSVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005591#endif
5592#ifdef AF_SNA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005593 /* Linux SNA Project (nutters!) */
5594 PyModule_AddIntConstant(m, "AF_SNA", AF_SNA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005595#endif
5596#ifdef AF_IRDA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005597 /* IRDA sockets */
5598 PyModule_AddIntConstant(m, "AF_IRDA", AF_IRDA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005599#endif
5600#ifdef AF_PPPOX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005601 /* PPPoX sockets */
5602 PyModule_AddIntConstant(m, "AF_PPPOX", AF_PPPOX);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005603#endif
5604#ifdef AF_WANPIPE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005605 /* Wanpipe API Sockets */
5606 PyModule_AddIntConstant(m, "AF_WANPIPE", AF_WANPIPE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005607#endif
5608#ifdef AF_LLC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005609 /* Linux LLC */
5610 PyModule_AddIntConstant(m, "AF_LLC", AF_LLC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005611#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00005612
Hye-Shik Chang81268602004-02-02 06:05:24 +00005613#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005614 PyModule_AddIntConstant(m, "AF_BLUETOOTH", AF_BLUETOOTH);
5615 PyModule_AddIntConstant(m, "BTPROTO_L2CAP", BTPROTO_L2CAP);
5616 PyModule_AddIntConstant(m, "BTPROTO_HCI", BTPROTO_HCI);
5617 PyModule_AddIntConstant(m, "SOL_HCI", SOL_HCI);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00005618#if !defined(__NetBSD__) && !defined(__DragonFly__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005619 PyModule_AddIntConstant(m, "HCI_FILTER", HCI_FILTER);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00005620#endif
Hye-Shik Chang81268602004-02-02 06:05:24 +00005621#if !defined(__FreeBSD__)
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00005622#if !defined(__NetBSD__) && !defined(__DragonFly__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005623 PyModule_AddIntConstant(m, "HCI_TIME_STAMP", HCI_TIME_STAMP);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00005624#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005625 PyModule_AddIntConstant(m, "HCI_DATA_DIR", HCI_DATA_DIR);
5626 PyModule_AddIntConstant(m, "BTPROTO_SCO", BTPROTO_SCO);
Hye-Shik Chang81268602004-02-02 06:05:24 +00005627#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005628 PyModule_AddIntConstant(m, "BTPROTO_RFCOMM", BTPROTO_RFCOMM);
5629 PyModule_AddStringConstant(m, "BDADDR_ANY", "00:00:00:00:00:00");
5630 PyModule_AddStringConstant(m, "BDADDR_LOCAL", "00:00:00:FF:FF:FF");
Martin v. Löwis12af0482004-01-31 12:34:17 +00005631#endif
5632
Charles-François Natali47413c12011-10-06 19:47:44 +02005633#ifdef AF_CAN
5634 /* Controller Area Network */
5635 PyModule_AddIntConstant(m, "AF_CAN", AF_CAN);
5636#endif
5637#ifdef PF_CAN
5638 /* Controller Area Network */
5639 PyModule_AddIntConstant(m, "PF_CAN", PF_CAN);
5640#endif
5641
Charles-François Natali10b8cf42011-11-10 19:21:37 +01005642/* Reliable Datagram Sockets */
5643#ifdef AF_RDS
5644 PyModule_AddIntConstant(m, "AF_RDS", AF_RDS);
5645#endif
5646#ifdef PF_RDS
5647 PyModule_AddIntConstant(m, "PF_RDS", PF_RDS);
5648#endif
5649
Antoine Pitroub156a462010-10-27 20:13:57 +00005650#ifdef AF_PACKET
5651 PyModule_AddIntMacro(m, AF_PACKET);
5652#endif
5653#ifdef PF_PACKET
5654 PyModule_AddIntMacro(m, PF_PACKET);
5655#endif
5656#ifdef PACKET_HOST
5657 PyModule_AddIntMacro(m, PACKET_HOST);
5658#endif
5659#ifdef PACKET_BROADCAST
5660 PyModule_AddIntMacro(m, PACKET_BROADCAST);
5661#endif
5662#ifdef PACKET_MULTICAST
5663 PyModule_AddIntMacro(m, PACKET_MULTICAST);
5664#endif
5665#ifdef PACKET_OTHERHOST
5666 PyModule_AddIntMacro(m, PACKET_OTHERHOST);
5667#endif
5668#ifdef PACKET_OUTGOING
5669 PyModule_AddIntMacro(m, PACKET_OUTGOING);
5670#endif
5671#ifdef PACKET_LOOPBACK
5672 PyModule_AddIntMacro(m, PACKET_LOOPBACK);
5673#endif
5674#ifdef PACKET_FASTROUTE
5675 PyModule_AddIntMacro(m, PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00005676#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00005677
Christian Heimes043d6f62008-01-07 17:19:16 +00005678#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005679 PyModule_AddIntConstant(m, "AF_TIPC", AF_TIPC);
Christian Heimes043d6f62008-01-07 17:19:16 +00005680
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005681 /* for addresses */
5682 PyModule_AddIntConstant(m, "TIPC_ADDR_NAMESEQ", TIPC_ADDR_NAMESEQ);
5683 PyModule_AddIntConstant(m, "TIPC_ADDR_NAME", TIPC_ADDR_NAME);
5684 PyModule_AddIntConstant(m, "TIPC_ADDR_ID", TIPC_ADDR_ID);
Christian Heimes043d6f62008-01-07 17:19:16 +00005685
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005686 PyModule_AddIntConstant(m, "TIPC_ZONE_SCOPE", TIPC_ZONE_SCOPE);
5687 PyModule_AddIntConstant(m, "TIPC_CLUSTER_SCOPE", TIPC_CLUSTER_SCOPE);
5688 PyModule_AddIntConstant(m, "TIPC_NODE_SCOPE", TIPC_NODE_SCOPE);
Christian Heimes043d6f62008-01-07 17:19:16 +00005689
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005690 /* for setsockopt() */
5691 PyModule_AddIntConstant(m, "SOL_TIPC", SOL_TIPC);
5692 PyModule_AddIntConstant(m, "TIPC_IMPORTANCE", TIPC_IMPORTANCE);
5693 PyModule_AddIntConstant(m, "TIPC_SRC_DROPPABLE", TIPC_SRC_DROPPABLE);
5694 PyModule_AddIntConstant(m, "TIPC_DEST_DROPPABLE",
5695 TIPC_DEST_DROPPABLE);
5696 PyModule_AddIntConstant(m, "TIPC_CONN_TIMEOUT", TIPC_CONN_TIMEOUT);
Christian Heimes043d6f62008-01-07 17:19:16 +00005697
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005698 PyModule_AddIntConstant(m, "TIPC_LOW_IMPORTANCE",
5699 TIPC_LOW_IMPORTANCE);
5700 PyModule_AddIntConstant(m, "TIPC_MEDIUM_IMPORTANCE",
5701 TIPC_MEDIUM_IMPORTANCE);
5702 PyModule_AddIntConstant(m, "TIPC_HIGH_IMPORTANCE",
5703 TIPC_HIGH_IMPORTANCE);
5704 PyModule_AddIntConstant(m, "TIPC_CRITICAL_IMPORTANCE",
5705 TIPC_CRITICAL_IMPORTANCE);
Christian Heimes043d6f62008-01-07 17:19:16 +00005706
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005707 /* for subscriptions */
5708 PyModule_AddIntConstant(m, "TIPC_SUB_PORTS", TIPC_SUB_PORTS);
5709 PyModule_AddIntConstant(m, "TIPC_SUB_SERVICE", TIPC_SUB_SERVICE);
Christian Heimes25bb7832008-01-11 16:17:00 +00005710#ifdef TIPC_SUB_CANCEL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005711 /* doesn't seem to be available everywhere */
5712 PyModule_AddIntConstant(m, "TIPC_SUB_CANCEL", TIPC_SUB_CANCEL);
Christian Heimes25bb7832008-01-11 16:17:00 +00005713#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005714 PyModule_AddIntConstant(m, "TIPC_WAIT_FOREVER", TIPC_WAIT_FOREVER);
5715 PyModule_AddIntConstant(m, "TIPC_PUBLISHED", TIPC_PUBLISHED);
5716 PyModule_AddIntConstant(m, "TIPC_WITHDRAWN", TIPC_WITHDRAWN);
5717 PyModule_AddIntConstant(m, "TIPC_SUBSCR_TIMEOUT", TIPC_SUBSCR_TIMEOUT);
5718 PyModule_AddIntConstant(m, "TIPC_CFG_SRV", TIPC_CFG_SRV);
5719 PyModule_AddIntConstant(m, "TIPC_TOP_SRV", TIPC_TOP_SRV);
Christian Heimes043d6f62008-01-07 17:19:16 +00005720#endif
5721
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005722 /* Socket types */
5723 PyModule_AddIntConstant(m, "SOCK_STREAM", SOCK_STREAM);
5724 PyModule_AddIntConstant(m, "SOCK_DGRAM", SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00005725/* We have incomplete socket support. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005726 PyModule_AddIntConstant(m, "SOCK_RAW", SOCK_RAW);
5727 PyModule_AddIntConstant(m, "SOCK_SEQPACKET", SOCK_SEQPACKET);
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00005728#if defined(SOCK_RDM)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005729 PyModule_AddIntConstant(m, "SOCK_RDM", SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00005730#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +00005731#ifdef SOCK_CLOEXEC
5732 PyModule_AddIntConstant(m, "SOCK_CLOEXEC", SOCK_CLOEXEC);
5733#endif
5734#ifdef SOCK_NONBLOCK
5735 PyModule_AddIntConstant(m, "SOCK_NONBLOCK", SOCK_NONBLOCK);
5736#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005737
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005738#ifdef SO_DEBUG
5739 PyModule_AddIntConstant(m, "SO_DEBUG", SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005740#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005741#ifdef SO_ACCEPTCONN
5742 PyModule_AddIntConstant(m, "SO_ACCEPTCONN", SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005743#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005744#ifdef SO_REUSEADDR
5745 PyModule_AddIntConstant(m, "SO_REUSEADDR", SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005746#endif
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00005747#ifdef SO_EXCLUSIVEADDRUSE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005748 PyModule_AddIntConstant(m, "SO_EXCLUSIVEADDRUSE", SO_EXCLUSIVEADDRUSE);
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00005749#endif
5750
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005751#ifdef SO_KEEPALIVE
5752 PyModule_AddIntConstant(m, "SO_KEEPALIVE", SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005753#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005754#ifdef SO_DONTROUTE
5755 PyModule_AddIntConstant(m, "SO_DONTROUTE", SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005756#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005757#ifdef SO_BROADCAST
5758 PyModule_AddIntConstant(m, "SO_BROADCAST", SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005759#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005760#ifdef SO_USELOOPBACK
5761 PyModule_AddIntConstant(m, "SO_USELOOPBACK", SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005762#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005763#ifdef SO_LINGER
5764 PyModule_AddIntConstant(m, "SO_LINGER", SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005765#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005766#ifdef SO_OOBINLINE
5767 PyModule_AddIntConstant(m, "SO_OOBINLINE", SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005768#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005769#ifdef SO_REUSEPORT
5770 PyModule_AddIntConstant(m, "SO_REUSEPORT", SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005771#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005772#ifdef SO_SNDBUF
5773 PyModule_AddIntConstant(m, "SO_SNDBUF", SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005774#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005775#ifdef SO_RCVBUF
5776 PyModule_AddIntConstant(m, "SO_RCVBUF", SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005777#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005778#ifdef SO_SNDLOWAT
5779 PyModule_AddIntConstant(m, "SO_SNDLOWAT", SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005780#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005781#ifdef SO_RCVLOWAT
5782 PyModule_AddIntConstant(m, "SO_RCVLOWAT", SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005783#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005784#ifdef SO_SNDTIMEO
5785 PyModule_AddIntConstant(m, "SO_SNDTIMEO", SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005786#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005787#ifdef SO_RCVTIMEO
5788 PyModule_AddIntConstant(m, "SO_RCVTIMEO", SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005789#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005790#ifdef SO_ERROR
5791 PyModule_AddIntConstant(m, "SO_ERROR", SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005792#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005793#ifdef SO_TYPE
5794 PyModule_AddIntConstant(m, "SO_TYPE", SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005795#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005796#ifdef SO_SETFIB
5797 PyModule_AddIntConstant(m, "SO_SETFIB", SO_SETFIB);
Larry Hastingsf0f37952010-04-02 11:47:10 +00005798#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005799#ifdef SO_PASSCRED
5800 PyModule_AddIntConstant(m, "SO_PASSCRED", SO_PASSCRED);
5801#endif
5802#ifdef SO_PEERCRED
5803 PyModule_AddIntConstant(m, "SO_PEERCRED", SO_PEERCRED);
5804#endif
5805#ifdef LOCAL_PEERCRED
5806 PyModule_AddIntConstant(m, "LOCAL_PEERCRED", LOCAL_PEERCRED);
5807#endif
Victor Stinnercb98bed2011-10-25 13:45:48 +02005808#ifdef SO_BINDTODEVICE
5809 PyModule_AddIntMacro(m, SO_BINDTODEVICE);
5810#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005811
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005812 /* Maximum number of connections for "listen" */
5813#ifdef SOMAXCONN
5814 PyModule_AddIntConstant(m, "SOMAXCONN", SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005815#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005816 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005817#endif
5818
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005819 /* Ancilliary message types */
5820#ifdef SCM_RIGHTS
5821 PyModule_AddIntConstant(m, "SCM_RIGHTS", SCM_RIGHTS);
5822#endif
5823#ifdef SCM_CREDENTIALS
5824 PyModule_AddIntConstant(m, "SCM_CREDENTIALS", SCM_CREDENTIALS);
5825#endif
5826#ifdef SCM_CREDS
5827 PyModule_AddIntConstant(m, "SCM_CREDS", SCM_CREDS);
5828#endif
5829
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005830 /* Flags for send, recv */
5831#ifdef MSG_OOB
5832 PyModule_AddIntConstant(m, "MSG_OOB", MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005833#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005834#ifdef MSG_PEEK
5835 PyModule_AddIntConstant(m, "MSG_PEEK", MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005836#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005837#ifdef MSG_DONTROUTE
5838 PyModule_AddIntConstant(m, "MSG_DONTROUTE", MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005839#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005840#ifdef MSG_DONTWAIT
5841 PyModule_AddIntConstant(m, "MSG_DONTWAIT", MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00005842#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005843#ifdef MSG_EOR
5844 PyModule_AddIntConstant(m, "MSG_EOR", MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005845#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005846#ifdef MSG_TRUNC
5847 PyModule_AddIntConstant(m, "MSG_TRUNC", MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005848#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005849#ifdef MSG_CTRUNC
5850 PyModule_AddIntConstant(m, "MSG_CTRUNC", MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005851#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005852#ifdef MSG_WAITALL
5853 PyModule_AddIntConstant(m, "MSG_WAITALL", MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005854#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005855#ifdef MSG_BTAG
5856 PyModule_AddIntConstant(m, "MSG_BTAG", MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005857#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005858#ifdef MSG_ETAG
5859 PyModule_AddIntConstant(m, "MSG_ETAG", MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005860#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005861#ifdef MSG_NOSIGNAL
5862 PyModule_AddIntConstant(m, "MSG_NOSIGNAL", MSG_NOSIGNAL);
5863#endif
5864#ifdef MSG_NOTIFICATION
5865 PyModule_AddIntConstant(m, "MSG_NOTIFICATION", MSG_NOTIFICATION);
5866#endif
5867#ifdef MSG_CMSG_CLOEXEC
5868 PyModule_AddIntConstant(m, "MSG_CMSG_CLOEXEC", MSG_CMSG_CLOEXEC);
5869#endif
5870#ifdef MSG_ERRQUEUE
5871 PyModule_AddIntConstant(m, "MSG_ERRQUEUE", MSG_ERRQUEUE);
5872#endif
5873#ifdef MSG_CONFIRM
5874 PyModule_AddIntConstant(m, "MSG_CONFIRM", MSG_CONFIRM);
5875#endif
5876#ifdef MSG_MORE
5877 PyModule_AddIntConstant(m, "MSG_MORE", MSG_MORE);
5878#endif
5879#ifdef MSG_EOF
5880 PyModule_AddIntConstant(m, "MSG_EOF", MSG_EOF);
5881#endif
5882#ifdef MSG_BCAST
5883 PyModule_AddIntConstant(m, "MSG_BCAST", MSG_BCAST);
5884#endif
5885#ifdef MSG_MCAST
5886 PyModule_AddIntConstant(m, "MSG_MCAST", MSG_MCAST);
5887#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005888
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005889 /* Protocol level and numbers, usable for [gs]etsockopt */
5890#ifdef SOL_SOCKET
5891 PyModule_AddIntConstant(m, "SOL_SOCKET", SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005892#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005893#ifdef SOL_IP
5894 PyModule_AddIntConstant(m, "SOL_IP", SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00005895#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005896 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00005897#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005898#ifdef SOL_IPX
5899 PyModule_AddIntConstant(m, "SOL_IPX", SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00005900#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005901#ifdef SOL_AX25
5902 PyModule_AddIntConstant(m, "SOL_AX25", SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00005903#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005904#ifdef SOL_ATALK
5905 PyModule_AddIntConstant(m, "SOL_ATALK", SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00005906#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005907#ifdef SOL_NETROM
5908 PyModule_AddIntConstant(m, "SOL_NETROM", SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00005909#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005910#ifdef SOL_ROSE
5911 PyModule_AddIntConstant(m, "SOL_ROSE", SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00005912#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005913#ifdef SOL_TCP
5914 PyModule_AddIntConstant(m, "SOL_TCP", SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00005915#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005916 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00005917#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005918#ifdef SOL_UDP
5919 PyModule_AddIntConstant(m, "SOL_UDP", SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00005920#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005921 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00005922#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02005923#ifdef SOL_CAN_BASE
5924 PyModule_AddIntConstant(m, "SOL_CAN_BASE", SOL_CAN_BASE);
5925#endif
5926#ifdef SOL_CAN_RAW
5927 PyModule_AddIntConstant(m, "SOL_CAN_RAW", SOL_CAN_RAW);
5928 PyModule_AddIntConstant(m, "CAN_RAW", CAN_RAW);
5929#endif
5930#ifdef HAVE_LINUX_CAN_H
5931 PyModule_AddIntConstant(m, "CAN_EFF_FLAG", CAN_EFF_FLAG);
5932 PyModule_AddIntConstant(m, "CAN_RTR_FLAG", CAN_RTR_FLAG);
5933 PyModule_AddIntConstant(m, "CAN_ERR_FLAG", CAN_ERR_FLAG);
5934
5935 PyModule_AddIntConstant(m, "CAN_SFF_MASK", CAN_SFF_MASK);
5936 PyModule_AddIntConstant(m, "CAN_EFF_MASK", CAN_EFF_MASK);
5937 PyModule_AddIntConstant(m, "CAN_ERR_MASK", CAN_ERR_MASK);
5938#endif
5939#ifdef HAVE_LINUX_CAN_RAW_H
5940 PyModule_AddIntConstant(m, "CAN_RAW_FILTER", CAN_RAW_FILTER);
5941 PyModule_AddIntConstant(m, "CAN_RAW_ERR_FILTER", CAN_RAW_ERR_FILTER);
5942 PyModule_AddIntConstant(m, "CAN_RAW_LOOPBACK", CAN_RAW_LOOPBACK);
5943 PyModule_AddIntConstant(m, "CAN_RAW_RECV_OWN_MSGS", CAN_RAW_RECV_OWN_MSGS);
5944#endif
Charles-François Natali10b8cf42011-11-10 19:21:37 +01005945#ifdef SOL_RDS
5946 PyModule_AddIntConstant(m, "SOL_RDS", SOL_RDS);
5947#endif
5948#ifdef RDS_CANCEL_SENT_TO
5949 PyModule_AddIntConstant(m, "RDS_CANCEL_SENT_TO", RDS_CANCEL_SENT_TO);
5950#endif
5951#ifdef RDS_GET_MR
5952 PyModule_AddIntConstant(m, "RDS_GET_MR", RDS_GET_MR);
5953#endif
5954#ifdef RDS_FREE_MR
5955 PyModule_AddIntConstant(m, "RDS_FREE_MR", RDS_FREE_MR);
5956#endif
5957#ifdef RDS_RECVERR
5958 PyModule_AddIntConstant(m, "RDS_RECVERR", RDS_RECVERR);
5959#endif
5960#ifdef RDS_CONG_MONITOR
5961 PyModule_AddIntConstant(m, "RDS_CONG_MONITOR", RDS_CONG_MONITOR);
5962#endif
5963#ifdef RDS_GET_MR_FOR_DEST
5964 PyModule_AddIntConstant(m, "RDS_GET_MR_FOR_DEST", RDS_GET_MR_FOR_DEST);
5965#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005966#ifdef IPPROTO_IP
5967 PyModule_AddIntConstant(m, "IPPROTO_IP", IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00005968#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005969 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005970#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005971#ifdef IPPROTO_HOPOPTS
5972 PyModule_AddIntConstant(m, "IPPROTO_HOPOPTS", IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005973#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005974#ifdef IPPROTO_ICMP
5975 PyModule_AddIntConstant(m, "IPPROTO_ICMP", IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00005976#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005977 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005978#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005979#ifdef IPPROTO_IGMP
5980 PyModule_AddIntConstant(m, "IPPROTO_IGMP", IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005981#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005982#ifdef IPPROTO_GGP
5983 PyModule_AddIntConstant(m, "IPPROTO_GGP", IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005984#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005985#ifdef IPPROTO_IPV4
5986 PyModule_AddIntConstant(m, "IPPROTO_IPV4", IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005987#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005988#ifdef IPPROTO_IPV6
5989 PyModule_AddIntConstant(m, "IPPROTO_IPV6", IPPROTO_IPV6);
Martin v. Löwisa0f17342003-10-03 13:56:20 +00005990#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005991#ifdef IPPROTO_IPIP
5992 PyModule_AddIntConstant(m, "IPPROTO_IPIP", IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005993#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005994#ifdef IPPROTO_TCP
5995 PyModule_AddIntConstant(m, "IPPROTO_TCP", IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00005996#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005997 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005998#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005999#ifdef IPPROTO_EGP
6000 PyModule_AddIntConstant(m, "IPPROTO_EGP", IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006001#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006002#ifdef IPPROTO_PUP
6003 PyModule_AddIntConstant(m, "IPPROTO_PUP", IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006004#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006005#ifdef IPPROTO_UDP
6006 PyModule_AddIntConstant(m, "IPPROTO_UDP", IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00006007#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006008 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006009#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006010#ifdef IPPROTO_IDP
6011 PyModule_AddIntConstant(m, "IPPROTO_IDP", IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006012#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006013#ifdef IPPROTO_HELLO
6014 PyModule_AddIntConstant(m, "IPPROTO_HELLO", IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006015#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006016#ifdef IPPROTO_ND
6017 PyModule_AddIntConstant(m, "IPPROTO_ND", IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006018#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006019#ifdef IPPROTO_TP
6020 PyModule_AddIntConstant(m, "IPPROTO_TP", IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006021#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006022#ifdef IPPROTO_IPV6
6023 PyModule_AddIntConstant(m, "IPPROTO_IPV6", IPPROTO_IPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006024#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006025#ifdef IPPROTO_ROUTING
6026 PyModule_AddIntConstant(m, "IPPROTO_ROUTING", IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006027#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006028#ifdef IPPROTO_FRAGMENT
6029 PyModule_AddIntConstant(m, "IPPROTO_FRAGMENT", IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006030#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006031#ifdef IPPROTO_RSVP
6032 PyModule_AddIntConstant(m, "IPPROTO_RSVP", IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006033#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006034#ifdef IPPROTO_GRE
6035 PyModule_AddIntConstant(m, "IPPROTO_GRE", IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006036#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006037#ifdef IPPROTO_ESP
6038 PyModule_AddIntConstant(m, "IPPROTO_ESP", IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006039#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006040#ifdef IPPROTO_AH
6041 PyModule_AddIntConstant(m, "IPPROTO_AH", IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006042#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006043#ifdef IPPROTO_MOBILE
6044 PyModule_AddIntConstant(m, "IPPROTO_MOBILE", IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006045#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006046#ifdef IPPROTO_ICMPV6
6047 PyModule_AddIntConstant(m, "IPPROTO_ICMPV6", IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006048#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006049#ifdef IPPROTO_NONE
6050 PyModule_AddIntConstant(m, "IPPROTO_NONE", IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006051#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006052#ifdef IPPROTO_DSTOPTS
6053 PyModule_AddIntConstant(m, "IPPROTO_DSTOPTS", IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006054#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006055#ifdef IPPROTO_XTP
6056 PyModule_AddIntConstant(m, "IPPROTO_XTP", IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006057#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006058#ifdef IPPROTO_EON
6059 PyModule_AddIntConstant(m, "IPPROTO_EON", IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006060#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006061#ifdef IPPROTO_PIM
6062 PyModule_AddIntConstant(m, "IPPROTO_PIM", IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006063#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006064#ifdef IPPROTO_IPCOMP
6065 PyModule_AddIntConstant(m, "IPPROTO_IPCOMP", IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006066#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006067#ifdef IPPROTO_VRRP
6068 PyModule_AddIntConstant(m, "IPPROTO_VRRP", IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006069#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006070#ifdef IPPROTO_SCTP
6071 PyModule_AddIntConstant(m, "IPPROTO_SCTP", IPPROTO_SCTP);
6072#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006073#ifdef IPPROTO_BIP
6074 PyModule_AddIntConstant(m, "IPPROTO_BIP", IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006075#endif
6076/**/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006077#ifdef IPPROTO_RAW
6078 PyModule_AddIntConstant(m, "IPPROTO_RAW", IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00006079#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006080 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006081#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006082#ifdef IPPROTO_MAX
6083 PyModule_AddIntConstant(m, "IPPROTO_MAX", IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006084#endif
6085
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006086 /* Some port configuration */
6087#ifdef IPPORT_RESERVED
6088 PyModule_AddIntConstant(m, "IPPORT_RESERVED", IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006089#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006090 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006091#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006092#ifdef IPPORT_USERRESERVED
6093 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006094#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006095 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006096#endif
6097
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006098 /* Some reserved IP v.4 addresses */
6099#ifdef INADDR_ANY
6100 PyModule_AddIntConstant(m, "INADDR_ANY", INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006101#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006102 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006103#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006104#ifdef INADDR_BROADCAST
6105 PyModule_AddIntConstant(m, "INADDR_BROADCAST", INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006106#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006107 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006108#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006109#ifdef INADDR_LOOPBACK
6110 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006111#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006112 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006113#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006114#ifdef INADDR_UNSPEC_GROUP
6115 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006116#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006117 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006118#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006119#ifdef INADDR_ALLHOSTS_GROUP
6120 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
6121 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006122#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006123 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006124#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006125#ifdef INADDR_MAX_LOCAL_GROUP
6126 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP",
6127 INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006128#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006129 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006130#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006131#ifdef INADDR_NONE
6132 PyModule_AddIntConstant(m, "INADDR_NONE", INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006133#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006134 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006135#endif
6136
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006137 /* IPv4 [gs]etsockopt options */
6138#ifdef IP_OPTIONS
6139 PyModule_AddIntConstant(m, "IP_OPTIONS", IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006140#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006141#ifdef IP_HDRINCL
6142 PyModule_AddIntConstant(m, "IP_HDRINCL", IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006143#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006144#ifdef IP_TOS
6145 PyModule_AddIntConstant(m, "IP_TOS", IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006146#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006147#ifdef IP_TTL
6148 PyModule_AddIntConstant(m, "IP_TTL", IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006149#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006150#ifdef IP_RECVOPTS
6151 PyModule_AddIntConstant(m, "IP_RECVOPTS", IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006152#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006153#ifdef IP_RECVRETOPTS
6154 PyModule_AddIntConstant(m, "IP_RECVRETOPTS", IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006155#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006156#ifdef IP_RECVDSTADDR
6157 PyModule_AddIntConstant(m, "IP_RECVDSTADDR", IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006158#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006159#ifdef IP_RETOPTS
6160 PyModule_AddIntConstant(m, "IP_RETOPTS", IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006161#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006162#ifdef IP_MULTICAST_IF
6163 PyModule_AddIntConstant(m, "IP_MULTICAST_IF", IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006164#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006165#ifdef IP_MULTICAST_TTL
6166 PyModule_AddIntConstant(m, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006167#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006168#ifdef IP_MULTICAST_LOOP
6169 PyModule_AddIntConstant(m, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006170#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006171#ifdef IP_ADD_MEMBERSHIP
6172 PyModule_AddIntConstant(m, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006173#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006174#ifdef IP_DROP_MEMBERSHIP
6175 PyModule_AddIntConstant(m, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006176#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006177#ifdef IP_DEFAULT_MULTICAST_TTL
6178 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_TTL",
6179 IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00006180#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006181#ifdef IP_DEFAULT_MULTICAST_LOOP
6182 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_LOOP",
6183 IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006184#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006185#ifdef IP_MAX_MEMBERSHIPS
6186 PyModule_AddIntConstant(m, "IP_MAX_MEMBERSHIPS", IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00006187#endif
Charles-François Natali564a42c2011-12-17 14:59:56 +01006188#ifdef IP_TRANSPARENT
6189 PyModule_AddIntConstant(m, "IP_TRANSPARENT", IP_TRANSPARENT);
6190#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006191
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006192 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
6193#ifdef IPV6_JOIN_GROUP
6194 PyModule_AddIntConstant(m, "IPV6_JOIN_GROUP", IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006195#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006196#ifdef IPV6_LEAVE_GROUP
6197 PyModule_AddIntConstant(m, "IPV6_LEAVE_GROUP", IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006198#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006199#ifdef IPV6_MULTICAST_HOPS
6200 PyModule_AddIntConstant(m, "IPV6_MULTICAST_HOPS", IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006201#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006202#ifdef IPV6_MULTICAST_IF
6203 PyModule_AddIntConstant(m, "IPV6_MULTICAST_IF", IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006204#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006205#ifdef IPV6_MULTICAST_LOOP
6206 PyModule_AddIntConstant(m, "IPV6_MULTICAST_LOOP", IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006207#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006208#ifdef IPV6_UNICAST_HOPS
6209 PyModule_AddIntConstant(m, "IPV6_UNICAST_HOPS", IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006210#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006211 /* Additional IPV6 socket options, defined in RFC 3493 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00006212#ifdef IPV6_V6ONLY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006213 PyModule_AddIntConstant(m, "IPV6_V6ONLY", IPV6_V6ONLY);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006214#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006215 /* Advanced IPV6 socket options, from RFC 3542 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00006216#ifdef IPV6_CHECKSUM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006217 PyModule_AddIntConstant(m, "IPV6_CHECKSUM", IPV6_CHECKSUM);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006218#endif
6219#ifdef IPV6_DONTFRAG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006220 PyModule_AddIntConstant(m, "IPV6_DONTFRAG", IPV6_DONTFRAG);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006221#endif
6222#ifdef IPV6_DSTOPTS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006223 PyModule_AddIntConstant(m, "IPV6_DSTOPTS", IPV6_DSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006224#endif
6225#ifdef IPV6_HOPLIMIT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006226 PyModule_AddIntConstant(m, "IPV6_HOPLIMIT", IPV6_HOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006227#endif
6228#ifdef IPV6_HOPOPTS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006229 PyModule_AddIntConstant(m, "IPV6_HOPOPTS", IPV6_HOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006230#endif
6231#ifdef IPV6_NEXTHOP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006232 PyModule_AddIntConstant(m, "IPV6_NEXTHOP", IPV6_NEXTHOP);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006233#endif
6234#ifdef IPV6_PATHMTU
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006235 PyModule_AddIntConstant(m, "IPV6_PATHMTU", IPV6_PATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006236#endif
6237#ifdef IPV6_PKTINFO
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006238 PyModule_AddIntConstant(m, "IPV6_PKTINFO", IPV6_PKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006239#endif
6240#ifdef IPV6_RECVDSTOPTS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006241 PyModule_AddIntConstant(m, "IPV6_RECVDSTOPTS", IPV6_RECVDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006242#endif
6243#ifdef IPV6_RECVHOPLIMIT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006244 PyModule_AddIntConstant(m, "IPV6_RECVHOPLIMIT", IPV6_RECVHOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006245#endif
6246#ifdef IPV6_RECVHOPOPTS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006247 PyModule_AddIntConstant(m, "IPV6_RECVHOPOPTS", IPV6_RECVHOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006248#endif
6249#ifdef IPV6_RECVPKTINFO
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006250 PyModule_AddIntConstant(m, "IPV6_RECVPKTINFO", IPV6_RECVPKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006251#endif
6252#ifdef IPV6_RECVRTHDR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006253 PyModule_AddIntConstant(m, "IPV6_RECVRTHDR", IPV6_RECVRTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006254#endif
6255#ifdef IPV6_RECVTCLASS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006256 PyModule_AddIntConstant(m, "IPV6_RECVTCLASS", IPV6_RECVTCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006257#endif
6258#ifdef IPV6_RTHDR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006259 PyModule_AddIntConstant(m, "IPV6_RTHDR", IPV6_RTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006260#endif
6261#ifdef IPV6_RTHDRDSTOPTS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006262 PyModule_AddIntConstant(m, "IPV6_RTHDRDSTOPTS", IPV6_RTHDRDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006263#endif
6264#ifdef IPV6_RTHDR_TYPE_0
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006265 PyModule_AddIntConstant(m, "IPV6_RTHDR_TYPE_0", IPV6_RTHDR_TYPE_0);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006266#endif
6267#ifdef IPV6_RECVPATHMTU
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006268 PyModule_AddIntConstant(m, "IPV6_RECVPATHMTU", IPV6_RECVPATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006269#endif
6270#ifdef IPV6_TCLASS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006271 PyModule_AddIntConstant(m, "IPV6_TCLASS", IPV6_TCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006272#endif
6273#ifdef IPV6_USE_MIN_MTU
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006274 PyModule_AddIntConstant(m, "IPV6_USE_MIN_MTU", IPV6_USE_MIN_MTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006275#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006276
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006277 /* TCP options */
6278#ifdef TCP_NODELAY
6279 PyModule_AddIntConstant(m, "TCP_NODELAY", TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00006280#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006281#ifdef TCP_MAXSEG
6282 PyModule_AddIntConstant(m, "TCP_MAXSEG", TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00006283#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006284#ifdef TCP_CORK
6285 PyModule_AddIntConstant(m, "TCP_CORK", TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006286#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006287#ifdef TCP_KEEPIDLE
6288 PyModule_AddIntConstant(m, "TCP_KEEPIDLE", TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006289#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006290#ifdef TCP_KEEPINTVL
6291 PyModule_AddIntConstant(m, "TCP_KEEPINTVL", TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006292#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006293#ifdef TCP_KEEPCNT
6294 PyModule_AddIntConstant(m, "TCP_KEEPCNT", TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006295#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006296#ifdef TCP_SYNCNT
6297 PyModule_AddIntConstant(m, "TCP_SYNCNT", TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006298#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006299#ifdef TCP_LINGER2
6300 PyModule_AddIntConstant(m, "TCP_LINGER2", TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006301#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006302#ifdef TCP_DEFER_ACCEPT
6303 PyModule_AddIntConstant(m, "TCP_DEFER_ACCEPT", TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006304#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006305#ifdef TCP_WINDOW_CLAMP
6306 PyModule_AddIntConstant(m, "TCP_WINDOW_CLAMP", TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006307#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006308#ifdef TCP_INFO
6309 PyModule_AddIntConstant(m, "TCP_INFO", TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006310#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006311#ifdef TCP_QUICKACK
6312 PyModule_AddIntConstant(m, "TCP_QUICKACK", TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006313#endif
6314
Guido van Rossum09be4091999-08-09 14:40:40 +00006315
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006316 /* IPX options */
6317#ifdef IPX_TYPE
6318 PyModule_AddIntConstant(m, "IPX_TYPE", IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006319#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00006320
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006321/* Reliable Datagram Sockets */
6322#ifdef RDS_CMSG_RDMA_ARGS
6323 PyModule_AddIntConstant(m, "RDS_CMSG_RDMA_ARGS", RDS_CMSG_RDMA_ARGS);
6324#endif
6325#ifdef RDS_CMSG_RDMA_DEST
6326 PyModule_AddIntConstant(m, "RDS_CMSG_RDMA_DEST", RDS_CMSG_RDMA_DEST);
6327#endif
6328#ifdef RDS_CMSG_RDMA_MAP
6329 PyModule_AddIntConstant(m, "RDS_CMSG_RDMA_MAP", RDS_CMSG_RDMA_MAP);
6330#endif
6331#ifdef RDS_CMSG_RDMA_STATUS
6332 PyModule_AddIntConstant(m, "RDS_CMSG_RDMA_STATUS", RDS_CMSG_RDMA_STATUS);
6333#endif
6334#ifdef RDS_CMSG_RDMA_UPDATE
6335 PyModule_AddIntConstant(m, "RDS_CMSG_RDMA_UPDATE", RDS_CMSG_RDMA_UPDATE);
6336#endif
6337#ifdef RDS_RDMA_READWRITE
6338 PyModule_AddIntConstant(m, "RDS_RDMA_READWRITE", RDS_RDMA_READWRITE);
6339#endif
6340#ifdef RDS_RDMA_FENCE
6341 PyModule_AddIntConstant(m, "RDS_RDMA_FENCE", RDS_RDMA_FENCE);
6342#endif
6343#ifdef RDS_RDMA_INVALIDATE
6344 PyModule_AddIntConstant(m, "RDS_RDMA_INVALIDATE", RDS_RDMA_INVALIDATE);
6345#endif
6346#ifdef RDS_RDMA_USE_ONCE
6347 PyModule_AddIntConstant(m, "RDS_RDMA_USE_ONCE", RDS_RDMA_USE_ONCE);
6348#endif
6349#ifdef RDS_RDMA_DONTWAIT
6350 PyModule_AddIntConstant(m, "RDS_RDMA_DONTWAIT", RDS_RDMA_DONTWAIT);
6351#endif
6352#ifdef RDS_RDMA_NOTIFY_ME
6353 PyModule_AddIntConstant(m, "RDS_RDMA_NOTIFY_ME", RDS_RDMA_NOTIFY_ME);
6354#endif
6355#ifdef RDS_RDMA_SILENT
6356 PyModule_AddIntConstant(m, "RDS_RDMA_SILENT", RDS_RDMA_SILENT);
6357#endif
6358
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006359 /* get{addr,name}info parameters */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006360#ifdef EAI_ADDRFAMILY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006361 PyModule_AddIntConstant(m, "EAI_ADDRFAMILY", EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006362#endif
6363#ifdef EAI_AGAIN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006364 PyModule_AddIntConstant(m, "EAI_AGAIN", EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006365#endif
6366#ifdef EAI_BADFLAGS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006367 PyModule_AddIntConstant(m, "EAI_BADFLAGS", EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006368#endif
6369#ifdef EAI_FAIL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006370 PyModule_AddIntConstant(m, "EAI_FAIL", EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006371#endif
6372#ifdef EAI_FAMILY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006373 PyModule_AddIntConstant(m, "EAI_FAMILY", EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006374#endif
6375#ifdef EAI_MEMORY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006376 PyModule_AddIntConstant(m, "EAI_MEMORY", EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006377#endif
6378#ifdef EAI_NODATA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006379 PyModule_AddIntConstant(m, "EAI_NODATA", EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006380#endif
6381#ifdef EAI_NONAME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006382 PyModule_AddIntConstant(m, "EAI_NONAME", EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006383#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00006384#ifdef EAI_OVERFLOW
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006385 PyModule_AddIntConstant(m, "EAI_OVERFLOW", EAI_OVERFLOW);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006386#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006387#ifdef EAI_SERVICE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006388 PyModule_AddIntConstant(m, "EAI_SERVICE", EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006389#endif
6390#ifdef EAI_SOCKTYPE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006391 PyModule_AddIntConstant(m, "EAI_SOCKTYPE", EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006392#endif
6393#ifdef EAI_SYSTEM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006394 PyModule_AddIntConstant(m, "EAI_SYSTEM", EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006395#endif
6396#ifdef EAI_BADHINTS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006397 PyModule_AddIntConstant(m, "EAI_BADHINTS", EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006398#endif
6399#ifdef EAI_PROTOCOL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006400 PyModule_AddIntConstant(m, "EAI_PROTOCOL", EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006401#endif
6402#ifdef EAI_MAX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006403 PyModule_AddIntConstant(m, "EAI_MAX", EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006404#endif
6405#ifdef AI_PASSIVE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006406 PyModule_AddIntConstant(m, "AI_PASSIVE", AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006407#endif
6408#ifdef AI_CANONNAME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006409 PyModule_AddIntConstant(m, "AI_CANONNAME", AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006410#endif
6411#ifdef AI_NUMERICHOST
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006412 PyModule_AddIntConstant(m, "AI_NUMERICHOST", AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006413#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00006414#ifdef AI_NUMERICSERV
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006415 PyModule_AddIntConstant(m, "AI_NUMERICSERV", AI_NUMERICSERV);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006416#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006417#ifdef AI_MASK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006418 PyModule_AddIntConstant(m, "AI_MASK", AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006419#endif
6420#ifdef AI_ALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006421 PyModule_AddIntConstant(m, "AI_ALL", AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006422#endif
6423#ifdef AI_V4MAPPED_CFG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006424 PyModule_AddIntConstant(m, "AI_V4MAPPED_CFG", AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006425#endif
6426#ifdef AI_ADDRCONFIG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006427 PyModule_AddIntConstant(m, "AI_ADDRCONFIG", AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006428#endif
6429#ifdef AI_V4MAPPED
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006430 PyModule_AddIntConstant(m, "AI_V4MAPPED", AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006431#endif
6432#ifdef AI_DEFAULT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006433 PyModule_AddIntConstant(m, "AI_DEFAULT", AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006434#endif
6435#ifdef NI_MAXHOST
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006436 PyModule_AddIntConstant(m, "NI_MAXHOST", NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006437#endif
6438#ifdef NI_MAXSERV
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006439 PyModule_AddIntConstant(m, "NI_MAXSERV", NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006440#endif
6441#ifdef NI_NOFQDN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006442 PyModule_AddIntConstant(m, "NI_NOFQDN", NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006443#endif
6444#ifdef NI_NUMERICHOST
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006445 PyModule_AddIntConstant(m, "NI_NUMERICHOST", NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006446#endif
6447#ifdef NI_NAMEREQD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006448 PyModule_AddIntConstant(m, "NI_NAMEREQD", NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006449#endif
6450#ifdef NI_NUMERICSERV
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006451 PyModule_AddIntConstant(m, "NI_NUMERICSERV", NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006452#endif
6453#ifdef NI_DGRAM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006454 PyModule_AddIntConstant(m, "NI_DGRAM", NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006455#endif
6456
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006457 /* shutdown() parameters */
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006458#ifdef SHUT_RD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006459 PyModule_AddIntConstant(m, "SHUT_RD", SHUT_RD);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006460#elif defined(SD_RECEIVE)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006461 PyModule_AddIntConstant(m, "SHUT_RD", SD_RECEIVE);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006462#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006463 PyModule_AddIntConstant(m, "SHUT_RD", 0);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006464#endif
6465#ifdef SHUT_WR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006466 PyModule_AddIntConstant(m, "SHUT_WR", SHUT_WR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006467#elif defined(SD_SEND)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006468 PyModule_AddIntConstant(m, "SHUT_WR", SD_SEND);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006469#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006470 PyModule_AddIntConstant(m, "SHUT_WR", 1);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006471#endif
6472#ifdef SHUT_RDWR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006473 PyModule_AddIntConstant(m, "SHUT_RDWR", SHUT_RDWR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006474#elif defined(SD_BOTH)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006475 PyModule_AddIntConstant(m, "SHUT_RDWR", SD_BOTH);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006476#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006477 PyModule_AddIntConstant(m, "SHUT_RDWR", 2);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006478#endif
6479
Christian Heimesfaf2f632008-01-06 16:59:19 +00006480#ifdef SIO_RCVALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006481 {
6482 DWORD codes[] = {SIO_RCVALL, SIO_KEEPALIVE_VALS};
6483 const char *names[] = {"SIO_RCVALL", "SIO_KEEPALIVE_VALS"};
6484 int i;
Victor Stinner63941882011-09-29 00:42:28 +02006485 for(i = 0; i<Py_ARRAY_LENGTH(codes); ++i) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006486 PyObject *tmp;
6487 tmp = PyLong_FromUnsignedLong(codes[i]);
6488 if (tmp == NULL)
6489 return NULL;
6490 PyModule_AddObject(m, names[i], tmp);
6491 }
6492 }
6493 PyModule_AddIntConstant(m, "RCVALL_OFF", RCVALL_OFF);
6494 PyModule_AddIntConstant(m, "RCVALL_ON", RCVALL_ON);
6495 PyModule_AddIntConstant(m, "RCVALL_SOCKETLEVELONLY", RCVALL_SOCKETLEVELONLY);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00006496#ifdef RCVALL_IPLEVEL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006497 PyModule_AddIntConstant(m, "RCVALL_IPLEVEL", RCVALL_IPLEVEL);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00006498#endif
6499#ifdef RCVALL_MAX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006500 PyModule_AddIntConstant(m, "RCVALL_MAX", RCVALL_MAX);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00006501#endif
Christian Heimesfaf2f632008-01-06 16:59:19 +00006502#endif /* _MSTCPIP_ */
6503
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006504 /* Initialize gethostbyname lock */
Just van Rossum1040d2c2003-05-09 07:53:18 +00006505#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006506 netdb_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00006507#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006508 return m;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00006509}
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006510
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006511
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006512#ifndef HAVE_INET_PTON
Christian Heimes96e7b3d2007-11-20 06:51:17 +00006513#if !defined(NTDDI_VERSION) || (NTDDI_VERSION < NTDDI_LONGHORN)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006514
6515/* Simplistic emulation code for inet_pton that only works for IPv4 */
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006516/* These are not exposed because they do not set errno properly */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006517
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006518int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006519inet_pton(int af, const char *src, void *dst)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006520{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006521 if (af == AF_INET) {
Benjamin Petersonf91df042009-02-13 02:50:59 +00006522#if (SIZEOF_INT != 4)
6523#error "Not sure if in_addr_t exists and int is not 32-bits."
6524#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006525 unsigned int packed_addr;
6526 packed_addr = inet_addr(src);
6527 if (packed_addr == INADDR_NONE)
6528 return 0;
6529 memcpy(dst, &packed_addr, 4);
6530 return 1;
6531 }
6532 /* Should set errno to EAFNOSUPPORT */
6533 return -1;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006534}
6535
Martin v. Löwisc925b1532001-07-21 09:42:15 +00006536const char *
6537inet_ntop(int af, const void *src, char *dst, socklen_t size)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006538{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006539 if (af == AF_INET) {
6540 struct in_addr packed_addr;
6541 if (size < 16)
6542 /* Should set errno to ENOSPC. */
6543 return NULL;
6544 memcpy(&packed_addr, src, sizeof(packed_addr));
6545 return strncpy(dst, inet_ntoa(packed_addr), size);
6546 }
6547 /* Should set errno to EAFNOSUPPORT */
6548 return NULL;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006549}
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006550
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006551#endif
Christian Heimesb6150692007-11-15 23:37:07 +00006552#endif