blob: c828d49e39e52c39b92e42b4d17166e89a88effb [file] [log] [blame]
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001/* Socket module */
2
3/*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005This module provides an interface to Berkeley socket IPC.
6
7Limitations:
8
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00009- Only AF_INET, AF_INET6 and AF_UNIX address families are supported in a
Christian Heimes043d6f62008-01-07 17:19:16 +000010 portable manner, though AF_PACKET, AF_NETLINK and AF_TIPC are supported
11 under Linux.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000012- No read/write operations (use sendall/recv or makefile instead).
13- Additional restrictions apply on some non-Unix platforms (compensated
14 for by socket.py).
Guido van Rossum6574b3e1991-06-25 21:36:08 +000015
Guido van Rossum27e177d1995-03-16 15:43:47 +000016Module interface:
Guido van Rossum6574b3e1991-06-25 21:36:08 +000017
Guido van Rossum27e177d1995-03-16 15:43:47 +000018- socket.error: exception raised for socket specific errors
Martin v. Löwis2d8d4272001-07-21 18:05:31 +000019- socket.gaierror: exception raised for getaddrinfo/getnameinfo errors,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000020 a subclass of socket.error
Martin v. Löwis2d8d4272001-07-21 18:05:31 +000021- socket.herror: exception raised for gethostby* errors,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000022 a subclass of socket.error
Guido van Rossum30a685f1991-06-27 15:51:29 +000023- socket.gethostbyname(hostname) --> host IP address (string: 'dd.dd.dd.dd')
Guido van Rossum3bbc62e1995-01-02 19:30:30 +000024- socket.gethostbyaddr(IP address) --> (hostname, [alias, ...], [IP addr, ...])
Guido van Rossum27e177d1995-03-16 15:43:47 +000025- socket.gethostname() --> host name (string: 'spam' or 'spam.domain.com')
Guido van Rossum25405c71996-12-19 16:42:52 +000026- socket.getprotobyname(protocolname) --> protocol number
Barry Warsaw11b91a02004-06-28 00:50:43 +000027- socket.getservbyname(servicename[, protocolname]) --> port number
28- socket.getservbyport(portnumber[, protocolname]) --> service name
Guido van Rossum7d0a8262007-05-21 23:13:11 +000029- socket.socket([family[, type [, proto, fileno]]]) --> new socket object
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000030 (fileno specifies a pre-existing socket file descriptor)
Dave Cole331708b2004-08-09 04:51:41 +000031- socket.socketpair([family[, type [, proto]]]) --> (socket, socket)
Guido van Rossum006bf911996-06-12 04:04:55 +000032- socket.ntohs(16 bit value) --> new int object
33- socket.ntohl(32 bit value) --> new int object
34- socket.htons(16 bit value) --> new int object
35- socket.htonl(32 bit value) --> new int object
Martin v. Löwis2d8d4272001-07-21 18:05:31 +000036- socket.getaddrinfo(host, port [, family, socktype, proto, flags])
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000037 --> List of (family, socktype, proto, canonname, sockaddr)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +000038- socket.getnameinfo(sockaddr, flags) --> (host, port)
Guido van Rossum27e177d1995-03-16 15:43:47 +000039- socket.AF_INET, socket.SOCK_STREAM, etc.: constants from <socket.h>
Guido van Rossum47dfa4a2003-04-25 05:48:32 +000040- socket.has_ipv6: boolean value indicating if IPv6 is supported
Guido van Rossum5c9eb211999-08-20 18:21:51 +000041- socket.inet_aton(IP address) -> 32-bit packed IP representation
42- socket.inet_ntoa(packed IP) -> IP address string
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +000043- socket.getdefaulttimeout() -> None | float
44- socket.setdefaulttimeout(None | float)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -070045- socket.if_nameindex() -> list of tuples (if_index, if_name)
46- socket.if_nametoindex(name) -> corresponding interface index
47- socket.if_indextoname(index) -> corresponding interface name
Guido van Rossum6574b3e1991-06-25 21:36:08 +000048- an Internet socket address is a pair (hostname, port)
49 where hostname can be anything recognized by gethostbyname()
50 (including the dd.dd.dd.dd notation) and port is in host byte order
51- where a hostname is returned, the dd.dd.dd.dd notation is used
Guido van Rossum27e177d1995-03-16 15:43:47 +000052- a UNIX domain socket address is a string specifying the pathname
Jeremy Hylton22308652001-02-02 03:23:09 +000053- an AF_PACKET socket address is a tuple containing a string
54 specifying the ethernet interface and an integer specifying
55 the Ethernet protocol number to be received. For example:
Jeremy Hyltondbfb6622001-02-02 19:55:17 +000056 ("eth0",0x1234). Optional 3rd,4th,5th elements in the tuple
Andrew M. Kuchlingb8e17172004-07-10 23:39:35 +000057 specify packet-type and ha-type/addr.
Christian Heimes043d6f62008-01-07 17:19:16 +000058- an AF_TIPC socket address is expressed as
59 (addr_type, v1, v2, v3 [, scope]); where addr_type can be one of:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000060 TIPC_ADDR_NAMESEQ, TIPC_ADDR_NAME, and TIPC_ADDR_ID;
Christian Heimes043d6f62008-01-07 17:19:16 +000061 and scope can be one of:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000062 TIPC_ZONE_SCOPE, TIPC_CLUSTER_SCOPE, and TIPC_NODE_SCOPE.
Christian Heimes043d6f62008-01-07 17:19:16 +000063 The meaning of v1, v2 and v3 depends on the value of addr_type:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000064 if addr_type is TIPC_ADDR_NAME:
65 v1 is the server type
66 v2 is the port identifier
67 v3 is ignored
68 if addr_type is TIPC_ADDR_NAMESEQ:
69 v1 is the server type
70 v2 is the lower port number
71 v3 is the upper port number
72 if addr_type is TIPC_ADDR_ID:
73 v1 is the node
74 v2 is the ref
75 v3 is ignored
Christian Heimes043d6f62008-01-07 17:19:16 +000076
Guido van Rossum6574b3e1991-06-25 21:36:08 +000077
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000078Local naming conventions:
Guido van Rossum6574b3e1991-06-25 21:36:08 +000079
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000080- names starting with sock_ are socket object methods
81- names starting with socket_ are module-level functions
82- names starting with PySocket are exported through socketmodule.h
Guido van Rossum30a685f1991-06-27 15:51:29 +000083
Guido van Rossum6574b3e1991-06-25 21:36:08 +000084*/
85
Thomas Wouters477c8d52006-05-27 19:21:47 +000086#ifdef __APPLE__
87 /*
88 * inet_aton is not available on OSX 10.3, yet we want to use a binary
89 * that was build on 10.4 or later to work on that release, weak linking
90 * comes to the rescue.
91 */
92# pragma weak inet_aton
93#endif
94
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000095#include "Python.h"
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000096#include "structmember.h"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000097
Guido van Rossum47dfa4a2003-04-25 05:48:32 +000098#undef MAX
99#define MAX(x, y) ((x) < (y) ? (y) : (x))
100
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000101/* Socket object documentation */
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000102PyDoc_STRVAR(sock_doc,
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000103"socket([family[, type[, proto]]]) -> socket object\n\
104\n\
105Open a socket of the given type. The family argument specifies the\n\
106address family; it defaults to AF_INET. The type argument specifies\n\
107whether this is a stream (SOCK_STREAM, this is the default)\n\
108or datagram (SOCK_DGRAM) socket. The protocol argument defaults to 0,\n\
109specifying the default protocol. Keyword arguments are accepted.\n\
110\n\
111A socket object represents one endpoint of a network connection.\n\
112\n\
113Methods of socket objects (keyword arguments not allowed):\n\
114\n\
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000115_accept() -- accept connection, returning new socket fd and client address\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000116bind(addr) -- bind the socket to a local address\n\
117close() -- close the socket\n\
118connect(addr) -- connect the socket to a remote address\n\
119connect_ex(addr) -- connect, return an error code instead of an exception\n\
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000120_dup() -- return a new socket fd duplicated from fileno()\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000121fileno() -- return underlying file descriptor\n\
122getpeername() -- return remote address [*]\n\
123getsockname() -- return local address\n\
124getsockopt(level, optname[, buflen]) -- get socket options\n\
125gettimeout() -- return timeout or None\n\
126listen(n) -- start listening for incoming connections\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000127recv(buflen[, flags]) -- receive data\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000128recv_into(buffer[, nbytes[, flags]]) -- receive data (into a buffer)\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +0000129recvfrom(buflen[, flags]) -- receive data and sender\'s address\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000130recvfrom_into(buffer[, nbytes, [, flags])\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +0000131 -- receive data and sender\'s address (into a buffer)\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000132sendall(data[, flags]) -- send all data\n\
133send(data[, flags]) -- send data, may not send all of it\n\
134sendto(data[, flags], addr) -- send data to a given address\n\
135setblocking(0 | 1) -- set or clear the blocking I/O flag\n\
136setsockopt(level, optname, value) -- set socket options\n\
137settimeout(None | float) -- set or clear the timeout\n\
138shutdown(how) -- shut down traffic in one or both directions\n\
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700139if_nameindex() -- return all network interface indices and names\n\
Gregory P. Smithb6471db2011-05-22 22:47:55 -0700140if_nametoindex(name) -- return the corresponding interface index\n\
141if_indextoname(index) -- return the corresponding interface name\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000142\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000143 [*] not available on all platforms!");
Guido van Rossum3baaa131999-03-22 21:44:51 +0000144
Walter Dörwaldf0dfc7a2003-10-20 14:01:56 +0000145/* XXX This is a terrible mess of platform-dependent preprocessor hacks.
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000146 I hope some day someone can clean this up please... */
147
Guido van Rossum9376b741999-09-15 22:01:40 +0000148/* Hacks for gethostbyname_r(). On some non-Linux platforms, the configure
149 script doesn't get this right, so we hardcode some platform checks below.
150 On the other hand, not all Linux versions agree, so there the settings
151 computed by the configure script are needed! */
152
153#ifndef linux
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000154# undef HAVE_GETHOSTBYNAME_R_3_ARG
155# undef HAVE_GETHOSTBYNAME_R_5_ARG
156# undef HAVE_GETHOSTBYNAME_R_6_ARG
Guido van Rossum9376b741999-09-15 22:01:40 +0000157#endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000158
Victor Stinner710d27e2011-08-23 10:57:32 +0200159#if defined(__OpenBSD__)
160# include <sys/uio.h>
161#endif
162
Guido van Rossum7a122991999-04-13 04:07:32 +0000163#ifndef WITH_THREAD
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000164# undef HAVE_GETHOSTBYNAME_R
Guido van Rossum7a122991999-04-13 04:07:32 +0000165#endif
166
Guido van Rossume7de2061999-03-24 17:24:33 +0000167#ifdef HAVE_GETHOSTBYNAME_R
Jesus Cea736e7fc2011-03-14 17:36:54 +0100168# if defined(_AIX)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000169# define HAVE_GETHOSTBYNAME_R_3_ARG
170# elif defined(__sun) || defined(__sgi)
171# define HAVE_GETHOSTBYNAME_R_5_ARG
172# elif defined(linux)
Guido van Rossum9376b741999-09-15 22:01:40 +0000173/* Rely on the configure script */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000174# else
175# undef HAVE_GETHOSTBYNAME_R
176# endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000177#endif
178
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000179#if !defined(HAVE_GETHOSTBYNAME_R) && defined(WITH_THREAD) && \
180 !defined(MS_WINDOWS)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000181# define USE_GETHOSTBYNAME_LOCK
Guido van Rossum3baaa131999-03-22 21:44:51 +0000182#endif
183
Hye-Shik Chang9ceebd52005-09-24 14:58:47 +0000184/* To use __FreeBSD_version */
185#ifdef HAVE_SYS_PARAM_H
186#include <sys/param.h>
187#endif
Just van Rossum1040d2c2003-05-09 07:53:18 +0000188/* On systems on which getaddrinfo() is believed to not be thread-safe,
Just van Rossum09aecd72003-05-09 08:03:44 +0000189 (this includes the getaddrinfo emulation) protect access with a lock. */
Hye-Shik Chang9ceebd52005-09-24 14:58:47 +0000190#if defined(WITH_THREAD) && (defined(__APPLE__) || \
191 (defined(__FreeBSD__) && __FreeBSD_version+0 < 503000) || \
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000192 defined(__OpenBSD__) || defined(__NetBSD__) || \
193 defined(__VMS) || !defined(HAVE_GETADDRINFO))
Just van Rossum1040d2c2003-05-09 07:53:18 +0000194#define USE_GETADDRINFO_LOCK
195#endif
196
197#ifdef USE_GETADDRINFO_LOCK
198#define ACQUIRE_GETADDRINFO_LOCK PyThread_acquire_lock(netdb_lock, 1);
199#define RELEASE_GETADDRINFO_LOCK PyThread_release_lock(netdb_lock);
200#else
201#define ACQUIRE_GETADDRINFO_LOCK
202#define RELEASE_GETADDRINFO_LOCK
203#endif
204
205#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000206# include "pythread.h"
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000207#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000208
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000209#if defined(PYCC_VACPP)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000210# include <types.h>
211# include <io.h>
212# include <sys/ioctl.h>
213# include <utils.h>
214# include <ctype.h>
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000215#endif
216
Martin v. Löwis9e437302002-12-06 12:57:26 +0000217#if defined(__VMS)
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000218# include <ioctl.h>
219#endif
220
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000221#if defined(PYOS_OS2)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000222# define INCL_DOS
223# define INCL_DOSERRORS
224# define INCL_NOPMAPI
225# include <os2.h>
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000226#endif
227
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000228#if defined(__sgi) && _COMPILER_VERSION>700 && !_SGIAPI
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000229/* make sure that the reentrant (gethostbyaddr_r etc)
230 functions are declared correctly if compiling with
231 MIPSPro 7.x in ANSI C mode (default) */
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000232
Thomas Wouters477c8d52006-05-27 19:21:47 +0000233/* XXX Using _SGIAPI is the wrong thing,
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000234 but I don't know what the right thing is. */
Trent Mick8ea5bdf2004-09-13 17:48:41 +0000235#undef _SGIAPI /* to avoid warning */
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000236#define _SGIAPI 1
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000237
Trent Mick8ea5bdf2004-09-13 17:48:41 +0000238#undef _XOPEN_SOURCE
239#include <sys/socket.h>
240#include <sys/types.h>
241#include <netinet/in.h>
242#ifdef _SS_ALIGNSIZE
243#define HAVE_GETADDRINFO 1
244#define HAVE_GETNAMEINFO 1
245#endif
246
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000247#define HAVE_INET_PTON
248#include <netdb.h>
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000249#endif
250
Thomas Wouters477c8d52006-05-27 19:21:47 +0000251/* Irix 6.5 fails to define this variable at all. This is needed
252 for both GCC and SGI's compiler. I'd say that the SGI headers
Georg Brandldbd83392006-02-20 09:42:33 +0000253 are just busted. Same thing for Solaris. */
254#if (defined(__sgi) || defined(sun)) && !defined(INET_ADDRSTRLEN)
Anthony Baxterbab23cf2003-10-04 08:00:49 +0000255#define INET_ADDRSTRLEN 16
256#endif
257
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000258/* Generic includes */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000259#ifdef HAVE_SYS_TYPES_H
Guido van Rossumb6775db1994-08-01 11:34:53 +0000260#include <sys/types.h>
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000261#endif
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000262
Gregory P. Smith3b1f2c32011-05-15 12:18:23 -0700263#ifdef HAVE_SYS_SOCKET_H
264#include <sys/socket.h>
265#endif
266
267#ifdef HAVE_NET_IF_H
268#include <net/if.h>
269#endif
270
Marc-André Lemburg976ade62002-02-16 18:47:07 +0000271/* Generic socket object definitions and includes */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000272#define PySocket_BUILDING_SOCKET
Marc-André Lemburgbb8b78b2002-02-16 18:44:52 +0000273#include "socketmodule.h"
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000274
275/* Addressing includes */
276
Guido van Rossum6f489d91996-06-28 20:15:15 +0000277#ifndef MS_WINDOWS
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000278
279/* Non-MS WINDOWS includes */
280# include <netdb.h>
Nick Coghlan4ecf6cf2011-08-22 15:45:19 +1000281# include <unistd.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000282
Guido van Rossum9376b741999-09-15 22:01:40 +0000283/* Headers needed for inet_ntoa() and inet_addr() */
Skip Montanaroeb33e5a2007-08-17 12:57:41 +0000284# if defined(PYOS_OS2) && defined(PYCC_VACPP)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000285# include <netdb.h>
Tim Peters603c6832001-11-05 02:45:59 +0000286typedef size_t socklen_t;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000287# else
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000288# include <arpa/inet.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000289# endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000290
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000291# include <fcntl.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000292
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000293#else
Guido van Rossum48a680c2001-03-02 06:34:14 +0000294
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000295/* MS_WINDOWS includes */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000296# ifdef HAVE_FCNTL_H
297# include <fcntl.h>
298# endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000299
Jeremy Hylton22308652001-02-02 03:23:09 +0000300#endif
301
Skip Montanaro7befb992004-02-10 16:50:21 +0000302#include <stddef.h>
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000303
304#ifndef offsetof
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000305# define offsetof(type, member) ((size_t)(&((type *)0)->member))
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000306#endif
307
Neal Norwitz39d22e52002-11-02 19:55:21 +0000308#ifndef O_NONBLOCK
309# define O_NONBLOCK O_NDELAY
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000310#endif
311
Trent Micka708d6e2004-09-07 17:48:26 +0000312/* include Python's addrinfo.h unless it causes trouble */
313#if defined(__sgi) && _COMPILER_VERSION>700 && defined(_SS_ALIGNSIZE)
314 /* Do not include addinfo.h on some newer IRIX versions.
315 * _SS_ALIGNSIZE is defined in sys/socket.h by 6.5.21,
316 * for example, but not by 6.5.10.
317 */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000318#elif defined(_MSC_VER) && _MSC_VER>1201
Trent Micka708d6e2004-09-07 17:48:26 +0000319 /* Do not include addrinfo.h for MSVC7 or greater. 'addrinfo' and
320 * EAI_* constants are defined in (the already included) ws2tcpip.h.
321 */
322#else
323# include "addrinfo.h"
324#endif
Jason Tishlerc246cb72004-08-09 13:25:59 +0000325
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000326#ifndef HAVE_INET_PTON
Christian Heimes96e7b3d2007-11-20 06:51:17 +0000327#if !defined(NTDDI_VERSION) || (NTDDI_VERSION < NTDDI_LONGHORN)
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000328int inet_pton(int af, const char *src, void *dst);
Martin v. Löwisc925b1532001-07-21 09:42:15 +0000329const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000330#endif
Christian Heimesb6150692007-11-15 23:37:07 +0000331#endif
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000332
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000333#ifdef __APPLE__
334/* On OS X, getaddrinfo returns no error indication of lookup
335 failure, so we must use the emulation instead of the libinfo
336 implementation. Unfortunately, performing an autoconf test
337 for this bug would require DNS access for the machine performing
338 the configuration, which is not acceptable. Therefore, we
339 determine the bug just by checking for __APPLE__. If this bug
340 gets ever fixed, perhaps checking for sys/version.h would be
341 appropriate, which is 10/0 on the system with the bug. */
Jack Jansen84262fb2002-07-02 14:40:42 +0000342#ifndef HAVE_GETNAMEINFO
343/* This bug seems to be fixed in Jaguar. Ths easiest way I could
344 Find to check for Jaguar is that it has getnameinfo(), which
345 older releases don't have */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000346#undef HAVE_GETADDRINFO
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000347#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +0000348
349#ifdef HAVE_INET_ATON
350#define USE_INET_ATON_WEAKLINK
351#endif
352
Jack Jansen84262fb2002-07-02 14:40:42 +0000353#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000354
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000355/* I know this is a bad practice, but it is the easiest... */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000356#if !defined(HAVE_GETADDRINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000357/* avoid clashes with the C library definition of the symbol. */
358#define getaddrinfo fake_getaddrinfo
359#define gai_strerror fake_gai_strerror
360#define freeaddrinfo fake_freeaddrinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000361#include "getaddrinfo.c"
362#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000363#if !defined(HAVE_GETNAMEINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000364#define getnameinfo fake_getnameinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000365#include "getnameinfo.c"
366#endif
367
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000368#ifdef MS_WINDOWS
369/* On Windows a socket is really a handle not an fd */
370static SOCKET
371dup_socket(SOCKET handle)
372{
Daniel Stutzbach6c765282010-09-03 12:38:33 +0000373 WSAPROTOCOL_INFO info;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000374
Daniel Stutzbach6c765282010-09-03 12:38:33 +0000375 if (WSADuplicateSocket(handle, GetCurrentProcessId(), &info))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000376 return INVALID_SOCKET;
Daniel Stutzbach6c765282010-09-03 12:38:33 +0000377
378 return WSASocket(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
379 FROM_PROTOCOL_INFO, &info, 0, 0);
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000380}
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000381#define SOCKETCLOSE closesocket
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000382#else
383/* On Unix we can use dup to duplicate the file descriptor of a socket*/
384#define dup_socket(fd) dup(fd)
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000385#endif
386
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000387#ifdef MS_WIN32
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000388#define EAFNOSUPPORT WSAEAFNOSUPPORT
389#define snprintf _snprintf
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000390#endif
Fred Drakea04eaad2000-06-30 02:46:07 +0000391
Andrew MacIntyreba43e872002-03-03 03:03:52 +0000392#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000393#define SOCKETCLOSE soclose
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000394#define NO_DUP /* Sockets are Not Actual File Handles under OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000395#endif
396
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000397#ifndef SOCKETCLOSE
398#define SOCKETCLOSE close
399#endif
400
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000401#if (defined(HAVE_BLUETOOTH_H) || defined(HAVE_BLUETOOTH_BLUETOOTH_H)) && !defined(__NetBSD__) && !defined(__DragonFly__)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000402#define USE_BLUETOOTH 1
403#if defined(__FreeBSD__)
404#define BTPROTO_L2CAP BLUETOOTH_PROTO_L2CAP
405#define BTPROTO_RFCOMM BLUETOOTH_PROTO_RFCOMM
Thomas Wouterscf297e42007-02-23 15:07:44 +0000406#define BTPROTO_HCI BLUETOOTH_PROTO_HCI
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000407#define SOL_HCI SOL_HCI_RAW
408#define HCI_FILTER SO_HCI_RAW_FILTER
Hye-Shik Chang81268602004-02-02 06:05:24 +0000409#define sockaddr_l2 sockaddr_l2cap
410#define sockaddr_rc sockaddr_rfcomm
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000411#define hci_dev hci_node
Hye-Shik Chang81268602004-02-02 06:05:24 +0000412#define _BT_L2_MEMB(sa, memb) ((sa)->l2cap_##memb)
413#define _BT_RC_MEMB(sa, memb) ((sa)->rfcomm_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000414#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000415#elif defined(__NetBSD__) || defined(__DragonFly__)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000416#define sockaddr_l2 sockaddr_bt
417#define sockaddr_rc sockaddr_bt
Thomas Wouterscf297e42007-02-23 15:07:44 +0000418#define sockaddr_hci sockaddr_bt
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000419#define sockaddr_sco sockaddr_bt
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000420#define SOL_HCI BTPROTO_HCI
421#define HCI_DATA_DIR SO_HCI_DIRECTION
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000422#define _BT_L2_MEMB(sa, memb) ((sa)->bt_##memb)
423#define _BT_RC_MEMB(sa, memb) ((sa)->bt_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000424#define _BT_HCI_MEMB(sa, memb) ((sa)->bt_##memb)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000425#define _BT_SCO_MEMB(sa, memb) ((sa)->bt_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000426#else
Hye-Shik Chang81268602004-02-02 06:05:24 +0000427#define _BT_L2_MEMB(sa, memb) ((sa)->l2_##memb)
428#define _BT_RC_MEMB(sa, memb) ((sa)->rc_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000429#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000430#define _BT_SCO_MEMB(sa, memb) ((sa)->sco_##memb)
431#endif
432#endif
433
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000434#ifdef __VMS
435/* TCP/IP Services for VMS uses a maximum send/recv buffer length */
436#define SEGMENT_SIZE (32 * 1024 -1)
437#endif
438
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000439#define SAS2SA(x) ((struct sockaddr *)(x))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000440
Martin v. Löwise9416172003-05-03 10:12:45 +0000441/*
442 * Constants for getnameinfo()
443 */
444#if !defined(NI_MAXHOST)
445#define NI_MAXHOST 1025
446#endif
447#if !defined(NI_MAXSERV)
448#define NI_MAXSERV 32
449#endif
450
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000451#ifndef INVALID_SOCKET /* MS defines this */
452#define INVALID_SOCKET (-1)
453#endif
454
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000455/* XXX There's a problem here: *static* functions are not supposed to have
456 a Py prefix (or use CapitalizedWords). Later... */
457
Guido van Rossum30a685f1991-06-27 15:51:29 +0000458/* Global variable holding the exception type for errors detected
459 by this module (but not argument type or memory errors, etc.). */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000460static PyObject *socket_herror;
461static PyObject *socket_gaierror;
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000462static PyObject *socket_timeout;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000463
Tim Peters643a7fc2002-02-17 04:13:21 +0000464/* A forward reference to the socket type object.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000465 The sock_type variable contains pointers to various functions,
466 some of which call new_sockobject(), which uses sock_type, so
Tim Peters643a7fc2002-02-17 04:13:21 +0000467 there has to be a circular reference. */
Jeremy Hylton938ace62002-07-17 16:30:39 +0000468static PyTypeObject sock_type;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000469
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000470#if defined(HAVE_POLL_H)
471#include <poll.h>
472#elif defined(HAVE_SYS_POLL_H)
473#include <sys/poll.h>
474#endif
475
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000476/* Largest value to try to store in a socklen_t (used when handling
477 ancillary data). POSIX requires socklen_t to hold at least
478 (2**31)-1 and recommends against storing larger values, but
479 socklen_t was originally int in the BSD interface, so to be on the
480 safe side we use the smaller of (2**31)-1 and INT_MAX. */
481#if INT_MAX > 0x7fffffff
482#define SOCKLEN_T_LIMIT 0x7fffffff
483#else
484#define SOCKLEN_T_LIMIT INT_MAX
485#endif
486
Charles-François Nataliaa26b272011-08-28 17:51:43 +0200487#ifdef HAVE_POLL
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000488/* Instead of select(), we'll use poll() since poll() works on any fd. */
489#define IS_SELECTABLE(s) 1
490/* Can we call select() with this socket without a buffer overrun? */
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000491#else
Charles-François Nataliaa26b272011-08-28 17:51:43 +0200492/* If there's no timeout left, we don't have to call select, so it's a safe,
493 * little white lie. */
494#define IS_SELECTABLE(s) (_PyIsSelectable_fd((s)->sock_fd) || (s)->sock_timeout <= 0.0)
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000495#endif
Neal Norwitz082b2df2006-02-07 07:04:46 +0000496
497static PyObject*
498select_error(void)
499{
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200500 PyErr_SetString(PyExc_OSError, "unable to select on socket");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000501 return NULL;
Neal Norwitz082b2df2006-02-07 07:04:46 +0000502}
503
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000504#ifdef MS_WINDOWS
Antoine Pitrouc8f01962010-09-28 22:03:27 +0000505#ifndef WSAEAGAIN
506#define WSAEAGAIN WSAEWOULDBLOCK
507#endif
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000508#define CHECK_ERRNO(expected) \
509 (WSAGetLastError() == WSA ## expected)
510#else
511#define CHECK_ERRNO(expected) \
512 (errno == expected)
513#endif
514
Guido van Rossum30a685f1991-06-27 15:51:29 +0000515/* Convenience function to raise an error according to errno
516 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000517
Guido van Rossum73624e91994-10-10 17:59:00 +0000518static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000519set_error(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000520{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000521#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000522 int err_no = WSAGetLastError();
523 /* PyErr_SetExcFromWindowsErr() invokes FormatMessage() which
524 recognizes the error codes used by both GetLastError() and
525 WSAGetLastError */
526 if (err_no)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200527 return PyErr_SetExcFromWindowsErr(PyExc_OSError, err_no);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000528#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000529
Andrew MacIntyreba43e872002-03-03 03:03:52 +0000530#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000531 if (sock_errno() != NO_ERROR) {
532 APIRET rc;
533 ULONG msglen;
534 char outbuf[100];
535 int myerrorcode = sock_errno();
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000536
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000537 /* Retrieve socket-related error message from MPTN.MSG file */
538 rc = DosGetMessage(NULL, 0, outbuf, sizeof(outbuf),
539 myerrorcode - SOCBASEERR + 26,
540 "mptn.msg",
541 &msglen);
542 if (rc == NO_ERROR) {
543 PyObject *v;
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000544
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000545 /* OS/2 doesn't guarantee a terminator */
546 outbuf[msglen] = '\0';
547 if (strlen(outbuf) > 0) {
548 /* If non-empty msg, trim CRLF */
549 char *lastc = &outbuf[ strlen(outbuf)-1 ];
550 while (lastc > outbuf &&
551 isspace(Py_CHARMASK(*lastc))) {
552 /* Trim trailing whitespace (CRLF) */
553 *lastc-- = '\0';
554 }
555 }
556 v = Py_BuildValue("(is)", myerrorcode, outbuf);
557 if (v != NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200558 PyErr_SetObject(PyExc_OSError, v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000559 Py_DECREF(v);
560 }
561 return NULL;
562 }
563 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000564#endif
565
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200566 return PyErr_SetFromErrno(PyExc_OSError);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000567}
568
Guido van Rossum30a685f1991-06-27 15:51:29 +0000569
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000570static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000571set_herror(int h_error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000572{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000573 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000574
575#ifdef HAVE_HSTRERROR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000576 v = Py_BuildValue("(is)", h_error, (char *)hstrerror(h_error));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000577#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000578 v = Py_BuildValue("(is)", h_error, "host not found");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000579#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000580 if (v != NULL) {
581 PyErr_SetObject(socket_herror, v);
582 Py_DECREF(v);
583 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000584
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000585 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000586}
587
588
589static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000590set_gaierror(int error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000591{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000592 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000593
Martin v. Löwis272cb402002-03-01 08:31:07 +0000594#ifdef EAI_SYSTEM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000595 /* EAI_SYSTEM is not available on Windows XP. */
596 if (error == EAI_SYSTEM)
597 return set_error();
Martin v. Löwis272cb402002-03-01 08:31:07 +0000598#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000599
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000600#ifdef HAVE_GAI_STRERROR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000601 v = Py_BuildValue("(is)", error, gai_strerror(error));
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000602#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000603 v = Py_BuildValue("(is)", error, "getaddrinfo failed");
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000604#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000605 if (v != NULL) {
606 PyErr_SetObject(socket_gaierror, v);
607 Py_DECREF(v);
608 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000609
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000610 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000611}
612
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000613#ifdef __VMS
614/* Function to send in segments */
615static int
616sendsegmented(int sock_fd, char *buf, int len, int flags)
617{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000618 int n = 0;
619 int remaining = len;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000620
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000621 while (remaining > 0) {
622 unsigned int segment;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000623
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000624 segment = (remaining >= SEGMENT_SIZE ? SEGMENT_SIZE : remaining);
625 n = send(sock_fd, buf, segment, flags);
626 if (n < 0) {
627 return n;
628 }
629 remaining -= segment;
630 buf += segment;
631 } /* end while */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000632
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000633 return len;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000634}
635#endif
636
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000637/* Function to perform the setting of socket blocking mode
638 internally. block = (1 | 0). */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000639static int
640internal_setblocking(PySocketSockObject *s, int block)
641{
Guido van Rossum67f7a382002-06-06 21:08:16 +0000642#ifndef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000643 int delay_flag;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000644#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +0000645#ifdef SOCK_NONBLOCK
646 if (block)
647 s->sock_type &= (~SOCK_NONBLOCK);
648 else
649 s->sock_type |= SOCK_NONBLOCK;
650#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +0000651
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000652 Py_BEGIN_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000653#ifndef MS_WINDOWS
654#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000655 block = !block;
656 ioctl(s->sock_fd, FIONBIO, (caddr_t)&block, sizeof(block));
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000657#elif defined(__VMS)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000658 block = !block;
659 ioctl(s->sock_fd, FIONBIO, (unsigned int *)&block);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000660#else /* !PYOS_OS2 && !__VMS */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000661 delay_flag = fcntl(s->sock_fd, F_GETFL, 0);
662 if (block)
663 delay_flag &= (~O_NONBLOCK);
664 else
665 delay_flag |= O_NONBLOCK;
666 fcntl(s->sock_fd, F_SETFL, delay_flag);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000667#endif /* !PYOS_OS2 */
668#else /* MS_WINDOWS */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000669 block = !block;
670 ioctlsocket(s->sock_fd, FIONBIO, (u_long*)&block);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000671#endif /* MS_WINDOWS */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000672 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000673
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000674 /* Since these don't return anything */
675 return 1;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000676}
677
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000678/* Do a select()/poll() on the socket, if necessary (sock_timeout > 0).
Guido van Rossum11ba0942002-06-13 15:07:44 +0000679 The argument writing indicates the direction.
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000680 This does not raise an exception; we'll let our caller do that
681 after they've reacquired the interpreter lock.
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000682 Returns 1 on timeout, -1 on error, 0 otherwise. */
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000683static int
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000684internal_select_ex(PySocketSockObject *s, int writing, double interval)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000685{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000686 int n;
Guido van Rossum11ba0942002-06-13 15:07:44 +0000687
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000688 /* Nothing to do unless we're in timeout mode (not non-blocking) */
689 if (s->sock_timeout <= 0.0)
690 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000691
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000692 /* Guard against closed socket */
693 if (s->sock_fd < 0)
694 return 0;
Guido van Rossumad654902002-07-19 12:44:59 +0000695
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000696 /* Handling this condition here simplifies the select loops */
697 if (interval < 0.0)
698 return 1;
699
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000700 /* Prefer poll, if available, since you can poll() any fd
701 * which can't be done with select(). */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000702#ifdef HAVE_POLL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000703 {
704 struct pollfd pollfd;
705 int timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000706
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000707 pollfd.fd = s->sock_fd;
708 pollfd.events = writing ? POLLOUT : POLLIN;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000709
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000710 /* s->sock_timeout is in seconds, timeout in ms */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000711 timeout = (int)(interval * 1000 + 0.5);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000712 n = poll(&pollfd, 1, timeout);
713 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000714#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000715 {
716 /* Construct the arguments to select */
717 fd_set fds;
718 struct timeval tv;
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000719 tv.tv_sec = (int)interval;
720 tv.tv_usec = (int)((interval - tv.tv_sec) * 1e6);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000721 FD_ZERO(&fds);
722 FD_SET(s->sock_fd, &fds);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000723
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000724 /* See if the socket is ready */
725 if (writing)
Antoine Pitrou19467d22010-08-17 19:33:30 +0000726 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
727 NULL, &fds, NULL, &tv);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000728 else
Antoine Pitrou19467d22010-08-17 19:33:30 +0000729 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
730 &fds, NULL, NULL, &tv);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000731 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000732#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000733
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000734 if (n < 0)
735 return -1;
736 if (n == 0)
737 return 1;
738 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000739}
740
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000741static int
742internal_select(PySocketSockObject *s, int writing)
743{
744 return internal_select_ex(s, writing, s->sock_timeout);
745}
746
747/*
748 Two macros for automatic retry of select() in case of false positives
749 (for example, select() could indicate a socket is ready for reading
750 but the data then discarded by the OS because of a wrong checksum).
751 Here is an example of use:
752
753 BEGIN_SELECT_LOOP(s)
754 Py_BEGIN_ALLOW_THREADS
755 timeout = internal_select_ex(s, 0, interval);
756 if (!timeout)
757 outlen = recv(s->sock_fd, cbuf, len, flags);
758 Py_END_ALLOW_THREADS
759 if (timeout == 1) {
760 PyErr_SetString(socket_timeout, "timed out");
761 return -1;
762 }
763 END_SELECT_LOOP(s)
764*/
765
766#define BEGIN_SELECT_LOOP(s) \
767 { \
768 _PyTime_timeval now, deadline = {0, 0}; \
769 double interval = s->sock_timeout; \
770 int has_timeout = s->sock_timeout > 0.0; \
771 if (has_timeout) { \
772 _PyTime_gettimeofday(&now); \
773 deadline = now; \
774 _PyTime_ADD_SECONDS(deadline, s->sock_timeout); \
775 } \
776 while (1) { \
777 errno = 0; \
778
779#define END_SELECT_LOOP(s) \
780 if (!has_timeout || \
781 (!CHECK_ERRNO(EWOULDBLOCK) && !CHECK_ERRNO(EAGAIN))) \
782 break; \
783 _PyTime_gettimeofday(&now); \
784 interval = _PyTime_INTERVAL(now, deadline); \
785 } \
786 } \
787
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000788/* Initialize a new socket object. */
789
Tim Petersa12b4cf2002-07-18 22:38:44 +0000790static double defaulttimeout = -1.0; /* Default timeout for new sockets */
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000791
Martin v. Löwis1a214512008-06-11 05:26:20 +0000792static void
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000793init_sockobject(PySocketSockObject *s,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000794 SOCKET_T fd, int family, int type, int proto)
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000795{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000796 s->sock_fd = fd;
797 s->sock_family = family;
798 s->sock_type = type;
799 s->sock_proto = proto;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000800
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000801 s->errorhandler = &set_error;
Antoine Pitroub1c54962010-10-14 15:05:38 +0000802#ifdef SOCK_NONBLOCK
803 if (type & SOCK_NONBLOCK)
804 s->sock_timeout = 0.0;
805 else
806#endif
807 {
808 s->sock_timeout = defaulttimeout;
809 if (defaulttimeout >= 0.0)
810 internal_setblocking(s, 0);
811 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000812
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000813}
814
815
Guido van Rossum30a685f1991-06-27 15:51:29 +0000816/* Create a new socket object.
817 This just creates the object and initializes it.
818 If the creation fails, return NULL and set an exception (implicit
819 in NEWOBJ()). */
820
Guido van Rossum73624e91994-10-10 17:59:00 +0000821static PySocketSockObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000822new_sockobject(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000823{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000824 PySocketSockObject *s;
825 s = (PySocketSockObject *)
826 PyType_GenericNew(&sock_type, NULL, NULL);
827 if (s != NULL)
828 init_sockobject(s, fd, family, type, proto);
829 return s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000830}
831
Guido van Rossum30a685f1991-06-27 15:51:29 +0000832
Guido van Rossum48a680c2001-03-02 06:34:14 +0000833/* Lock to allow python interpreter to continue, but only allow one
Just van Rossum1040d2c2003-05-09 07:53:18 +0000834 thread to be in gethostbyname or getaddrinfo */
835#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
836PyThread_type_lock netdb_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000837#endif
838
839
Guido van Rossum30a685f1991-06-27 15:51:29 +0000840/* Convert a string specifying a host name or one of a few symbolic
841 names to a numeric IP address. This usually calls gethostbyname()
842 to do the work; the names "" and "<broadcast>" are special.
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000843 Return the length (IPv4 should be 4 bytes), or negative if
Guido van Rossum30a685f1991-06-27 15:51:29 +0000844 an error occurred; then an exception is raised. */
845
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000846static int
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000847setipaddr(char *name, struct sockaddr *addr_ret, size_t addr_ret_size, int af)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000848{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000849 struct addrinfo hints, *res;
850 int error;
851 int d1, d2, d3, d4;
852 char ch;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000853
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000854 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
855 if (name[0] == '\0') {
856 int siz;
857 memset(&hints, 0, sizeof(hints));
858 hints.ai_family = af;
859 hints.ai_socktype = SOCK_DGRAM; /*dummy*/
860 hints.ai_flags = AI_PASSIVE;
861 Py_BEGIN_ALLOW_THREADS
862 ACQUIRE_GETADDRINFO_LOCK
863 error = getaddrinfo(NULL, "0", &hints, &res);
864 Py_END_ALLOW_THREADS
865 /* We assume that those thread-unsafe getaddrinfo() versions
866 *are* safe regarding their return value, ie. that a
867 subsequent call to getaddrinfo() does not destroy the
868 outcome of the first call. */
869 RELEASE_GETADDRINFO_LOCK
870 if (error) {
871 set_gaierror(error);
872 return -1;
873 }
874 switch (res->ai_family) {
875 case AF_INET:
876 siz = 4;
877 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000878#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000879 case AF_INET6:
880 siz = 16;
881 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000882#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000883 default:
884 freeaddrinfo(res);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200885 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000886 "unsupported address family");
887 return -1;
888 }
889 if (res->ai_next) {
890 freeaddrinfo(res);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200891 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000892 "wildcard resolved to multiple address");
893 return -1;
894 }
895 if (res->ai_addrlen < addr_ret_size)
896 addr_ret_size = res->ai_addrlen;
897 memcpy(addr_ret, res->ai_addr, addr_ret_size);
898 freeaddrinfo(res);
899 return siz;
900 }
901 if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
902 struct sockaddr_in *sin;
903 if (af != AF_INET && af != AF_UNSPEC) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200904 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000905 "address family mismatched");
906 return -1;
907 }
908 sin = (struct sockaddr_in *)addr_ret;
909 memset((void *) sin, '\0', sizeof(*sin));
910 sin->sin_family = AF_INET;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000911#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000912 sin->sin_len = sizeof(*sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000913#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000914 sin->sin_addr.s_addr = INADDR_BROADCAST;
915 return sizeof(sin->sin_addr);
916 }
917 if (sscanf(name, "%d.%d.%d.%d%c", &d1, &d2, &d3, &d4, &ch) == 4 &&
918 0 <= d1 && d1 <= 255 && 0 <= d2 && d2 <= 255 &&
919 0 <= d3 && d3 <= 255 && 0 <= d4 && d4 <= 255) {
920 struct sockaddr_in *sin;
921 sin = (struct sockaddr_in *)addr_ret;
922 sin->sin_addr.s_addr = htonl(
923 ((long) d1 << 24) | ((long) d2 << 16) |
924 ((long) d3 << 8) | ((long) d4 << 0));
925 sin->sin_family = AF_INET;
Anthony Baxter0e85f9d2003-05-02 15:40:46 +0000926#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000927 sin->sin_len = sizeof(*sin);
Anthony Baxter0e85f9d2003-05-02 15:40:46 +0000928#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000929 return 4;
930 }
931 memset(&hints, 0, sizeof(hints));
932 hints.ai_family = af;
933 Py_BEGIN_ALLOW_THREADS
934 ACQUIRE_GETADDRINFO_LOCK
935 error = getaddrinfo(name, NULL, &hints, &res);
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000936#if defined(__digital__) && defined(__unix__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000937 if (error == EAI_NONAME && af == AF_UNSPEC) {
938 /* On Tru64 V5.1, numeric-to-addr conversion fails
939 if no address family is given. Assume IPv4 for now.*/
940 hints.ai_family = AF_INET;
941 error = getaddrinfo(name, NULL, &hints, &res);
942 }
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000943#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000944 Py_END_ALLOW_THREADS
945 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
946 if (error) {
947 set_gaierror(error);
948 return -1;
949 }
950 if (res->ai_addrlen < addr_ret_size)
951 addr_ret_size = res->ai_addrlen;
952 memcpy((char *) addr_ret, res->ai_addr, addr_ret_size);
953 freeaddrinfo(res);
954 switch (addr_ret->sa_family) {
955 case AF_INET:
956 return 4;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000957#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000958 case AF_INET6:
959 return 16;
Guido van Rossum955becc1999-03-22 20:14:53 +0000960#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000961 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200962 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000963 return -1;
964 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000965}
966
Guido van Rossum30a685f1991-06-27 15:51:29 +0000967
Guido van Rossum30a685f1991-06-27 15:51:29 +0000968/* Create a string object representing an IP address.
969 This is always a string of the form 'dd.dd.dd.dd' (with variable
970 size numbers). */
971
Guido van Rossum73624e91994-10-10 17:59:00 +0000972static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000973makeipaddr(struct sockaddr *addr, int addrlen)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000974{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000975 char buf[NI_MAXHOST];
976 int error;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000977
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000978 error = getnameinfo(addr, addrlen, buf, sizeof(buf), NULL, 0,
979 NI_NUMERICHOST);
980 if (error) {
981 set_gaierror(error);
982 return NULL;
983 }
984 return PyUnicode_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000985}
986
987
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000988#ifdef USE_BLUETOOTH
989/* Convert a string representation of a Bluetooth address into a numeric
990 address. Returns the length (6), or raises an exception and returns -1 if
991 an error occurred. */
992
993static int
994setbdaddr(char *name, bdaddr_t *bdaddr)
995{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000996 unsigned int b0, b1, b2, b3, b4, b5;
997 char ch;
998 int n;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000999
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001000 n = sscanf(name, "%X:%X:%X:%X:%X:%X%c",
1001 &b5, &b4, &b3, &b2, &b1, &b0, &ch);
1002 if (n == 6 && (b0 | b1 | b2 | b3 | b4 | b5) < 256) {
1003 bdaddr->b[0] = b0;
1004 bdaddr->b[1] = b1;
1005 bdaddr->b[2] = b2;
1006 bdaddr->b[3] = b3;
1007 bdaddr->b[4] = b4;
1008 bdaddr->b[5] = b5;
1009 return 6;
1010 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001011 PyErr_SetString(PyExc_OSError, "bad bluetooth address");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001012 return -1;
1013 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001014}
1015
1016/* Create a string representation of the Bluetooth address. This is always a
1017 string of the form 'XX:XX:XX:XX:XX:XX' where XX is a two digit hexadecimal
1018 value (zero padded if necessary). */
1019
1020static PyObject *
1021makebdaddr(bdaddr_t *bdaddr)
1022{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001023 char buf[(6 * 2) + 5 + 1];
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001024
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001025 sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X",
1026 bdaddr->b[5], bdaddr->b[4], bdaddr->b[3],
1027 bdaddr->b[2], bdaddr->b[1], bdaddr->b[0]);
1028 return PyUnicode_FromString(buf);
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001029}
1030#endif
1031
1032
Guido van Rossum30a685f1991-06-27 15:51:29 +00001033/* Create an object representing the given socket address,
1034 suitable for passing it back to bind(), connect() etc.
1035 The family field of the sockaddr structure is inspected
1036 to determine what kind of address it really is. */
1037
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001038/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001039static PyObject *
Antoine Pitrou19467d22010-08-17 19:33:30 +00001040makesockaddr(SOCKET_T sockfd, struct sockaddr *addr, size_t addrlen, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001041{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001042 if (addrlen == 0) {
1043 /* No address -- may be recvfrom() from known socket */
1044 Py_INCREF(Py_None);
1045 return Py_None;
1046 }
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001047
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001048 switch (addr->sa_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001049
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001050 case AF_INET:
1051 {
1052 struct sockaddr_in *a;
1053 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
1054 PyObject *ret = NULL;
1055 if (addrobj) {
1056 a = (struct sockaddr_in *)addr;
1057 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
1058 Py_DECREF(addrobj);
1059 }
1060 return ret;
1061 }
Guido van Rossum30a685f1991-06-27 15:51:29 +00001062
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001063#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001064 case AF_UNIX:
1065 {
1066 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001067#ifdef linux
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001068 if (a->sun_path[0] == 0) { /* Linux abstract namespace */
1069 addrlen -= offsetof(struct sockaddr_un, sun_path);
1070 return PyBytes_FromStringAndSize(a->sun_path, addrlen);
1071 }
1072 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001073#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001074 {
1075 /* regular NULL-terminated string */
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001076 return PyUnicode_DecodeFSDefault(a->sun_path);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001077 }
1078 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001079#endif /* AF_UNIX */
1080
Martin v. Löwis11017b12006-01-14 18:12:57 +00001081#if defined(AF_NETLINK)
1082 case AF_NETLINK:
1083 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001084 struct sockaddr_nl *a = (struct sockaddr_nl *) addr;
1085 return Py_BuildValue("II", a->nl_pid, a->nl_groups);
Martin v. Löwis11017b12006-01-14 18:12:57 +00001086 }
1087#endif /* AF_NETLINK */
1088
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001089#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001090 case AF_INET6:
1091 {
1092 struct sockaddr_in6 *a;
1093 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
1094 PyObject *ret = NULL;
1095 if (addrobj) {
1096 a = (struct sockaddr_in6 *)addr;
1097 ret = Py_BuildValue("Oiii",
1098 addrobj,
1099 ntohs(a->sin6_port),
1100 a->sin6_flowinfo,
1101 a->sin6_scope_id);
1102 Py_DECREF(addrobj);
1103 }
1104 return ret;
1105 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001106#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001107
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001108#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001109 case AF_BLUETOOTH:
1110 switch (proto) {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001111
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001112 case BTPROTO_L2CAP:
1113 {
1114 struct sockaddr_l2 *a = (struct sockaddr_l2 *) addr;
1115 PyObject *addrobj = makebdaddr(&_BT_L2_MEMB(a, bdaddr));
1116 PyObject *ret = NULL;
1117 if (addrobj) {
1118 ret = Py_BuildValue("Oi",
1119 addrobj,
1120 _BT_L2_MEMB(a, psm));
1121 Py_DECREF(addrobj);
1122 }
1123 return ret;
1124 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001125
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001126 case BTPROTO_RFCOMM:
1127 {
1128 struct sockaddr_rc *a = (struct sockaddr_rc *) addr;
1129 PyObject *addrobj = makebdaddr(&_BT_RC_MEMB(a, bdaddr));
1130 PyObject *ret = NULL;
1131 if (addrobj) {
1132 ret = Py_BuildValue("Oi",
1133 addrobj,
1134 _BT_RC_MEMB(a, channel));
1135 Py_DECREF(addrobj);
1136 }
1137 return ret;
1138 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001139
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001140 case BTPROTO_HCI:
1141 {
1142 struct sockaddr_hci *a = (struct sockaddr_hci *) addr;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001143#if defined(__NetBSD__) || defined(__DragonFly__)
1144 return makebdaddr(&_BT_HCI_MEMB(a, bdaddr));
1145#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001146 PyObject *ret = NULL;
1147 ret = Py_BuildValue("i", _BT_HCI_MEMB(a, dev));
1148 return ret;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001149#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001150 }
Thomas Wouterscf297e42007-02-23 15:07:44 +00001151
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001152#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001153 case BTPROTO_SCO:
1154 {
1155 struct sockaddr_sco *a = (struct sockaddr_sco *) addr;
1156 return makebdaddr(&_BT_SCO_MEMB(a, bdaddr));
1157 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001158#endif
1159
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001160 default:
1161 PyErr_SetString(PyExc_ValueError,
1162 "Unknown Bluetooth protocol");
1163 return NULL;
1164 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001165#endif
1166
Antoine Pitroub156a462010-10-27 20:13:57 +00001167#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFNAME)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001168 case AF_PACKET:
1169 {
1170 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
1171 char *ifname = "";
1172 struct ifreq ifr;
1173 /* need to look up interface name give index */
1174 if (a->sll_ifindex) {
1175 ifr.ifr_ifindex = a->sll_ifindex;
1176 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1177 ifname = ifr.ifr_name;
1178 }
1179 return Py_BuildValue("shbhy#",
1180 ifname,
1181 ntohs(a->sll_protocol),
1182 a->sll_pkttype,
1183 a->sll_hatype,
1184 a->sll_addr,
1185 a->sll_halen);
1186 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001187#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001188
Christian Heimes043d6f62008-01-07 17:19:16 +00001189#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001190 case AF_TIPC:
1191 {
1192 struct sockaddr_tipc *a = (struct sockaddr_tipc *) addr;
1193 if (a->addrtype == TIPC_ADDR_NAMESEQ) {
1194 return Py_BuildValue("IIIII",
1195 a->addrtype,
1196 a->addr.nameseq.type,
1197 a->addr.nameseq.lower,
1198 a->addr.nameseq.upper,
1199 a->scope);
1200 } else if (a->addrtype == TIPC_ADDR_NAME) {
1201 return Py_BuildValue("IIIII",
1202 a->addrtype,
1203 a->addr.name.name.type,
1204 a->addr.name.name.instance,
1205 a->addr.name.name.instance,
1206 a->scope);
1207 } else if (a->addrtype == TIPC_ADDR_ID) {
1208 return Py_BuildValue("IIIII",
1209 a->addrtype,
1210 a->addr.id.node,
1211 a->addr.id.ref,
1212 0,
1213 a->scope);
1214 } else {
1215 PyErr_SetString(PyExc_ValueError,
1216 "Invalid address type");
1217 return NULL;
1218 }
1219 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001220#endif
1221
Charles-François Natali30589c92011-10-07 22:47:08 +02001222#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02001223 case AF_CAN:
1224 {
1225 struct sockaddr_can *a = (struct sockaddr_can *)addr;
1226 char *ifname = "";
1227 struct ifreq ifr;
1228 /* need to look up interface name given index */
1229 if (a->can_ifindex) {
1230 ifr.ifr_ifindex = a->can_ifindex;
1231 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1232 ifname = ifr.ifr_name;
1233 }
1234
1235 return Py_BuildValue("O&h", PyUnicode_DecodeFSDefault,
1236 ifname,
1237 a->can_family);
1238 }
1239#endif
1240
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001241 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001242
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001243 default:
1244 /* If we don't know the address family, don't raise an
1245 exception -- return it as an (int, bytes) tuple. */
1246 return Py_BuildValue("iy#",
1247 addr->sa_family,
1248 addr->sa_data,
1249 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001250
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001251 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001252}
1253
Guido van Rossum30a685f1991-06-27 15:51:29 +00001254
1255/* Parse a socket address argument according to the socket object's
1256 address family. Return 1 if the address was in the proper format,
1257 0 of not. The address is returned through addr_ret, its length
1258 through len_ret. */
1259
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001260static int
Guido van Rossum48a680c2001-03-02 06:34:14 +00001261getsockaddrarg(PySocketSockObject *s, PyObject *args,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001262 struct sockaddr *addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001263{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001264 switch (s->sock_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001265
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001266#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001267 case AF_UNIX:
1268 {
1269 struct sockaddr_un* addr;
1270 char *path;
1271 int len;
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001272 int retval = 0;
1273
1274 /* PEP 383. Not using PyUnicode_FSConverter since we need to
1275 allow embedded nulls on Linux. */
1276 if (PyUnicode_Check(args)) {
1277 if ((args = PyUnicode_EncodeFSDefault(args)) == NULL)
1278 return 0;
1279 }
1280 else
1281 Py_INCREF(args);
1282 if (!PyArg_Parse(args, "y#", &path, &len))
1283 goto unix_out;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001284
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001285 addr = (struct sockaddr_un*)addr_ret;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001286#ifdef linux
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001287 if (len > 0 && path[0] == 0) {
1288 /* Linux abstract namespace extension */
1289 if (len > sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001290 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001291 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001292 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001293 }
1294 }
1295 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001296#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001297 {
1298 /* regular NULL-terminated string */
1299 if (len >= sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001300 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001301 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001302 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001303 }
1304 addr->sun_path[len] = 0;
1305 }
1306 addr->sun_family = s->sock_family;
1307 memcpy(addr->sun_path, path, len);
Andrew MacIntyredaedf212004-04-11 12:03:57 +00001308#if defined(PYOS_OS2)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001309 *len_ret = sizeof(*addr);
Andrew MacIntyredaedf212004-04-11 12:03:57 +00001310#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001311 *len_ret = len + offsetof(struct sockaddr_un, sun_path);
Andrew MacIntyredaedf212004-04-11 12:03:57 +00001312#endif
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001313 retval = 1;
1314 unix_out:
1315 Py_DECREF(args);
1316 return retval;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001317 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001318#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001319
Martin v. Löwis11017b12006-01-14 18:12:57 +00001320#if defined(AF_NETLINK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001321 case AF_NETLINK:
1322 {
1323 struct sockaddr_nl* addr;
1324 int pid, groups;
1325 addr = (struct sockaddr_nl *)addr_ret;
1326 if (!PyTuple_Check(args)) {
1327 PyErr_Format(
1328 PyExc_TypeError,
1329 "getsockaddrarg: "
1330 "AF_NETLINK address must be tuple, not %.500s",
1331 Py_TYPE(args)->tp_name);
1332 return 0;
1333 }
1334 if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &pid, &groups))
1335 return 0;
1336 addr->nl_family = AF_NETLINK;
1337 addr->nl_pid = pid;
1338 addr->nl_groups = groups;
1339 *len_ret = sizeof(*addr);
1340 return 1;
1341 }
Martin v. Löwis11017b12006-01-14 18:12:57 +00001342#endif
1343
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001344#ifdef AF_RDS
1345 case AF_RDS:
1346 /* RDS sockets use sockaddr_in: fall-through */
1347#endif
1348
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001349 case AF_INET:
1350 {
1351 struct sockaddr_in* addr;
1352 char *host;
1353 int port, result;
1354 if (!PyTuple_Check(args)) {
1355 PyErr_Format(
1356 PyExc_TypeError,
1357 "getsockaddrarg: "
1358 "AF_INET address must be tuple, not %.500s",
1359 Py_TYPE(args)->tp_name);
1360 return 0;
1361 }
1362 if (!PyArg_ParseTuple(args, "eti:getsockaddrarg",
1363 "idna", &host, &port))
1364 return 0;
1365 addr=(struct sockaddr_in*)addr_ret;
1366 result = setipaddr(host, (struct sockaddr *)addr,
1367 sizeof(*addr), AF_INET);
1368 PyMem_Free(host);
1369 if (result < 0)
1370 return 0;
1371 if (port < 0 || port > 0xffff) {
1372 PyErr_SetString(
1373 PyExc_OverflowError,
1374 "getsockaddrarg: port must be 0-65535.");
1375 return 0;
1376 }
1377 addr->sin_family = AF_INET;
1378 addr->sin_port = htons((short)port);
1379 *len_ret = sizeof *addr;
1380 return 1;
1381 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001382
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001383#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001384 case AF_INET6:
1385 {
1386 struct sockaddr_in6* addr;
1387 char *host;
1388 int port, flowinfo, scope_id, result;
1389 flowinfo = scope_id = 0;
1390 if (!PyTuple_Check(args)) {
1391 PyErr_Format(
1392 PyExc_TypeError,
1393 "getsockaddrarg: "
1394 "AF_INET6 address must be tuple, not %.500s",
1395 Py_TYPE(args)->tp_name);
1396 return 0;
1397 }
1398 if (!PyArg_ParseTuple(args, "eti|ii",
1399 "idna", &host, &port, &flowinfo,
1400 &scope_id)) {
1401 return 0;
1402 }
1403 addr = (struct sockaddr_in6*)addr_ret;
1404 result = setipaddr(host, (struct sockaddr *)addr,
1405 sizeof(*addr), AF_INET6);
1406 PyMem_Free(host);
1407 if (result < 0)
1408 return 0;
1409 if (port < 0 || port > 0xffff) {
1410 PyErr_SetString(
1411 PyExc_OverflowError,
1412 "getsockaddrarg: port must be 0-65535.");
1413 return 0;
1414 }
1415 addr->sin6_family = s->sock_family;
1416 addr->sin6_port = htons((short)port);
1417 addr->sin6_flowinfo = flowinfo;
1418 addr->sin6_scope_id = scope_id;
1419 *len_ret = sizeof *addr;
1420 return 1;
1421 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001422#endif
1423
Hye-Shik Chang81268602004-02-02 06:05:24 +00001424#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001425 case AF_BLUETOOTH:
1426 {
1427 switch (s->sock_proto) {
1428 case BTPROTO_L2CAP:
1429 {
1430 struct sockaddr_l2 *addr;
1431 char *straddr;
Martin v. Löwis12af0482004-01-31 12:34:17 +00001432
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001433 addr = (struct sockaddr_l2 *)addr_ret;
1434 memset(addr, 0, sizeof(struct sockaddr_l2));
1435 _BT_L2_MEMB(addr, family) = AF_BLUETOOTH;
1436 if (!PyArg_ParseTuple(args, "si", &straddr,
1437 &_BT_L2_MEMB(addr, psm))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001438 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001439 "wrong format");
1440 return 0;
1441 }
1442 if (setbdaddr(straddr, &_BT_L2_MEMB(addr, bdaddr)) < 0)
1443 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001444
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001445 *len_ret = sizeof *addr;
1446 return 1;
1447 }
1448 case BTPROTO_RFCOMM:
1449 {
1450 struct sockaddr_rc *addr;
1451 char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001452
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001453 addr = (struct sockaddr_rc *)addr_ret;
1454 _BT_RC_MEMB(addr, family) = AF_BLUETOOTH;
1455 if (!PyArg_ParseTuple(args, "si", &straddr,
1456 &_BT_RC_MEMB(addr, channel))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001457 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001458 "wrong format");
1459 return 0;
1460 }
1461 if (setbdaddr(straddr, &_BT_RC_MEMB(addr, bdaddr)) < 0)
1462 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001463
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001464 *len_ret = sizeof *addr;
1465 return 1;
1466 }
1467 case BTPROTO_HCI:
1468 {
1469 struct sockaddr_hci *addr = (struct sockaddr_hci *)addr_ret;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001470#if defined(__NetBSD__) || defined(__DragonFly__)
Alexander Belopolskye239d232010-12-08 23:31:48 +00001471 char *straddr = PyBytes_AS_STRING(args);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001472
Alexander Belopolskye239d232010-12-08 23:31:48 +00001473 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001474 if (straddr == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001475 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001476 "wrong format");
1477 return 0;
1478 }
1479 if (setbdaddr(straddr, &_BT_HCI_MEMB(addr, bdaddr)) < 0)
1480 return 0;
1481#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001482 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
1483 if (!PyArg_ParseTuple(args, "i", &_BT_HCI_MEMB(addr, dev))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001484 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001485 "wrong format");
1486 return 0;
1487 }
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001488#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001489 *len_ret = sizeof *addr;
1490 return 1;
1491 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001492#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001493 case BTPROTO_SCO:
1494 {
1495 struct sockaddr_sco *addr;
1496 char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001497
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001498 addr = (struct sockaddr_sco *)addr_ret;
1499 _BT_SCO_MEMB(addr, family) = AF_BLUETOOTH;
1500 if (!PyBytes_Check(args)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001501 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001502 "wrong format");
1503 return 0;
1504 }
1505 straddr = PyBytes_AS_STRING(args);
1506 if (setbdaddr(straddr, &_BT_SCO_MEMB(addr, bdaddr)) < 0)
1507 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001508
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001509 *len_ret = sizeof *addr;
1510 return 1;
1511 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001512#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001513 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001514 PyErr_SetString(PyExc_OSError, "getsockaddrarg: unknown Bluetooth protocol");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001515 return 0;
1516 }
1517 }
Martin v. Löwis12af0482004-01-31 12:34:17 +00001518#endif
1519
Antoine Pitroub156a462010-10-27 20:13:57 +00001520#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFINDEX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001521 case AF_PACKET:
1522 {
1523 struct sockaddr_ll* addr;
1524 struct ifreq ifr;
1525 char *interfaceName;
1526 int protoNumber;
1527 int hatype = 0;
1528 int pkttype = 0;
1529 char *haddr = NULL;
1530 unsigned int halen = 0;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001531
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001532 if (!PyTuple_Check(args)) {
1533 PyErr_Format(
1534 PyExc_TypeError,
1535 "getsockaddrarg: "
1536 "AF_PACKET address must be tuple, not %.500s",
1537 Py_TYPE(args)->tp_name);
1538 return 0;
1539 }
1540 if (!PyArg_ParseTuple(args, "si|iiy#", &interfaceName,
1541 &protoNumber, &pkttype, &hatype,
1542 &haddr, &halen))
1543 return 0;
1544 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
1545 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
1546 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1547 s->errorhandler();
1548 return 0;
1549 }
1550 if (halen > 8) {
1551 PyErr_SetString(PyExc_ValueError,
1552 "Hardware address must be 8 bytes or less");
1553 return 0;
1554 }
1555 if (protoNumber < 0 || protoNumber > 0xffff) {
1556 PyErr_SetString(
1557 PyExc_OverflowError,
1558 "getsockaddrarg: protoNumber must be 0-65535.");
1559 return 0;
1560 }
1561 addr = (struct sockaddr_ll*)addr_ret;
1562 addr->sll_family = AF_PACKET;
1563 addr->sll_protocol = htons((short)protoNumber);
1564 addr->sll_ifindex = ifr.ifr_ifindex;
1565 addr->sll_pkttype = pkttype;
1566 addr->sll_hatype = hatype;
1567 if (halen != 0) {
1568 memcpy(&addr->sll_addr, haddr, halen);
1569 }
1570 addr->sll_halen = halen;
1571 *len_ret = sizeof *addr;
1572 return 1;
1573 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00001574#endif
1575
Christian Heimes043d6f62008-01-07 17:19:16 +00001576#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001577 case AF_TIPC:
1578 {
1579 unsigned int atype, v1, v2, v3;
1580 unsigned int scope = TIPC_CLUSTER_SCOPE;
1581 struct sockaddr_tipc *addr;
Christian Heimes043d6f62008-01-07 17:19:16 +00001582
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001583 if (!PyTuple_Check(args)) {
1584 PyErr_Format(
1585 PyExc_TypeError,
1586 "getsockaddrarg: "
1587 "AF_TIPC address must be tuple, not %.500s",
1588 Py_TYPE(args)->tp_name);
1589 return 0;
1590 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001591
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001592 if (!PyArg_ParseTuple(args,
1593 "IIII|I;Invalid TIPC address format",
1594 &atype, &v1, &v2, &v3, &scope))
1595 return 0;
Christian Heimes043d6f62008-01-07 17:19:16 +00001596
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001597 addr = (struct sockaddr_tipc *) addr_ret;
1598 memset(addr, 0, sizeof(struct sockaddr_tipc));
Christian Heimes043d6f62008-01-07 17:19:16 +00001599
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001600 addr->family = AF_TIPC;
1601 addr->scope = scope;
1602 addr->addrtype = atype;
Christian Heimes043d6f62008-01-07 17:19:16 +00001603
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001604 if (atype == TIPC_ADDR_NAMESEQ) {
1605 addr->addr.nameseq.type = v1;
1606 addr->addr.nameseq.lower = v2;
1607 addr->addr.nameseq.upper = v3;
1608 } else if (atype == TIPC_ADDR_NAME) {
1609 addr->addr.name.name.type = v1;
1610 addr->addr.name.name.instance = v2;
1611 } else if (atype == TIPC_ADDR_ID) {
1612 addr->addr.id.node = v1;
1613 addr->addr.id.ref = v2;
1614 } else {
1615 /* Shouldn't happen */
1616 PyErr_SetString(PyExc_TypeError, "Invalid address type");
1617 return 0;
1618 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001619
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001620 *len_ret = sizeof(*addr);
Christian Heimes043d6f62008-01-07 17:19:16 +00001621
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001622 return 1;
1623 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001624#endif
1625
Charles-François Natali30589c92011-10-07 22:47:08 +02001626#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02001627 case AF_CAN:
1628 switch (s->sock_proto) {
1629 case CAN_RAW:
1630 {
1631 struct sockaddr_can *addr;
1632 PyObject *interfaceName;
1633 struct ifreq ifr;
1634 addr = (struct sockaddr_can *)addr_ret;
1635 Py_ssize_t len;
1636
1637 if (!PyArg_ParseTuple(args, "O&", PyUnicode_FSConverter,
1638 &interfaceName))
1639 return 0;
1640
1641 len = PyBytes_GET_SIZE(interfaceName);
1642
1643 if (len == 0) {
1644 ifr.ifr_ifindex = 0;
1645 } else if (len < sizeof(ifr.ifr_name)) {
1646 strcpy(ifr.ifr_name, PyBytes_AS_STRING(interfaceName));
1647 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1648 s->errorhandler();
1649 Py_DECREF(interfaceName);
1650 return 0;
1651 }
1652 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001653 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02001654 "AF_CAN interface name too long");
1655 Py_DECREF(interfaceName);
1656 return 0;
1657 }
1658
1659 addr->can_family = AF_CAN;
1660 addr->can_ifindex = ifr.ifr_ifindex;
1661
1662 *len_ret = sizeof(*addr);
1663 Py_DECREF(interfaceName);
1664 return 1;
1665 }
1666 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001667 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02001668 "getsockaddrarg: unsupported CAN protocol");
1669 return 0;
1670 }
1671#endif
1672
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001673 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001674
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001675 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001676 PyErr_SetString(PyExc_OSError, "getsockaddrarg: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001677 return 0;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001678
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001679 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001680}
1681
Guido van Rossum30a685f1991-06-27 15:51:29 +00001682
Guido van Rossum48a680c2001-03-02 06:34:14 +00001683/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +00001684 Return 1 if the family is known, 0 otherwise. The length is returned
1685 through len_ret. */
1686
1687static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +00001688getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +00001689{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001690 switch (s->sock_family) {
Guido van Rossum710e1df1992-06-12 10:39:36 +00001691
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001692#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001693 case AF_UNIX:
1694 {
1695 *len_ret = sizeof (struct sockaddr_un);
1696 return 1;
1697 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001698#endif /* AF_UNIX */
Martin v. Löwis11017b12006-01-14 18:12:57 +00001699#if defined(AF_NETLINK)
1700 case AF_NETLINK:
1701 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001702 *len_ret = sizeof (struct sockaddr_nl);
1703 return 1;
Martin v. Löwis11017b12006-01-14 18:12:57 +00001704 }
1705#endif
Guido van Rossum710e1df1992-06-12 10:39:36 +00001706
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001707#ifdef AF_RDS
1708 case AF_RDS:
1709 /* RDS sockets use sockaddr_in: fall-through */
1710#endif
1711
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001712 case AF_INET:
1713 {
1714 *len_ret = sizeof (struct sockaddr_in);
1715 return 1;
1716 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00001717
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001718#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001719 case AF_INET6:
1720 {
1721 *len_ret = sizeof (struct sockaddr_in6);
1722 return 1;
1723 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001724#endif
1725
Hye-Shik Chang81268602004-02-02 06:05:24 +00001726#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001727 case AF_BLUETOOTH:
1728 {
1729 switch(s->sock_proto)
1730 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001731
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001732 case BTPROTO_L2CAP:
1733 *len_ret = sizeof (struct sockaddr_l2);
1734 return 1;
1735 case BTPROTO_RFCOMM:
1736 *len_ret = sizeof (struct sockaddr_rc);
1737 return 1;
1738 case BTPROTO_HCI:
1739 *len_ret = sizeof (struct sockaddr_hci);
1740 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00001741#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001742 case BTPROTO_SCO:
1743 *len_ret = sizeof (struct sockaddr_sco);
1744 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00001745#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001746 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001747 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001748 "unknown BT protocol");
1749 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001750
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001751 }
1752 }
Martin v. Löwis12af0482004-01-31 12:34:17 +00001753#endif
1754
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00001755#ifdef HAVE_NETPACKET_PACKET_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001756 case AF_PACKET:
1757 {
1758 *len_ret = sizeof (struct sockaddr_ll);
1759 return 1;
1760 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001761#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001762
Christian Heimes043d6f62008-01-07 17:19:16 +00001763#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001764 case AF_TIPC:
1765 {
1766 *len_ret = sizeof (struct sockaddr_tipc);
1767 return 1;
1768 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001769#endif
1770
Charles-François Natali30589c92011-10-07 22:47:08 +02001771#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02001772 case AF_CAN:
1773 {
1774 *len_ret = sizeof (struct sockaddr_can);
1775 return 1;
1776 }
1777#endif
1778
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001779 /* More cases here... */
Guido van Rossum710e1df1992-06-12 10:39:36 +00001780
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001781 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001782 PyErr_SetString(PyExc_OSError, "getsockaddrlen: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001783 return 0;
Guido van Rossum710e1df1992-06-12 10:39:36 +00001784
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001785 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00001786}
1787
1788
Nick Coghlan96fe56a2011-08-22 11:55:57 +10001789/* Support functions for the sendmsg() and recvmsg[_into]() methods.
1790 Currently, these methods are only compiled if the RFC 2292/3542
1791 CMSG_LEN() macro is available. Older systems seem to have used
1792 sizeof(struct cmsghdr) + (length) where CMSG_LEN() is used now, so
1793 it may be possible to define CMSG_LEN() that way if it's not
1794 provided. Some architectures might need extra padding after the
1795 cmsghdr, however, and CMSG_LEN() would have to take account of
1796 this. */
1797#ifdef CMSG_LEN
1798/* If length is in range, set *result to CMSG_LEN(length) and return
1799 true; otherwise, return false. */
1800static int
1801get_CMSG_LEN(size_t length, size_t *result)
1802{
1803 size_t tmp;
1804
1805 if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0)))
1806 return 0;
1807 tmp = CMSG_LEN(length);
1808 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
1809 return 0;
1810 *result = tmp;
1811 return 1;
1812}
1813
1814#ifdef CMSG_SPACE
1815/* If length is in range, set *result to CMSG_SPACE(length) and return
1816 true; otherwise, return false. */
1817static int
1818get_CMSG_SPACE(size_t length, size_t *result)
1819{
1820 size_t tmp;
1821
1822 /* Use CMSG_SPACE(1) here in order to take account of the padding
1823 necessary before *and* after the data. */
1824 if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1)))
1825 return 0;
1826 tmp = CMSG_SPACE(length);
1827 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
1828 return 0;
1829 *result = tmp;
1830 return 1;
1831}
1832#endif
1833
1834/* Return true iff msg->msg_controllen is valid, cmsgh is a valid
1835 pointer in msg->msg_control with at least "space" bytes after it,
1836 and its cmsg_len member inside the buffer. */
1837static int
1838cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space)
1839{
1840 size_t cmsg_offset;
1841 static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) +
1842 sizeof(cmsgh->cmsg_len));
1843
Charles-François Natali466517d2011-08-28 18:23:43 +02001844 /* Note that POSIX allows msg_controllen to be of signed type. */
1845 if (cmsgh == NULL || msg->msg_control == NULL || msg->msg_controllen < 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10001846 return 0;
1847 if (space < cmsg_len_end)
1848 space = cmsg_len_end;
1849 cmsg_offset = (char *)cmsgh - (char *)msg->msg_control;
1850 return (cmsg_offset <= (size_t)-1 - space &&
1851 cmsg_offset + space <= msg->msg_controllen);
1852}
1853
1854/* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set
1855 *space to number of bytes following it in the buffer and return
1856 true; otherwise, return false. Assumes cmsgh, msg->msg_control and
1857 msg->msg_controllen are valid. */
1858static int
1859get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space)
1860{
1861 size_t data_offset;
1862 char *data_ptr;
1863
1864 if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL)
1865 return 0;
1866 data_offset = data_ptr - (char *)msg->msg_control;
1867 if (data_offset > msg->msg_controllen)
1868 return 0;
1869 *space = msg->msg_controllen - data_offset;
1870 return 1;
1871}
1872
1873/* If cmsgh is invalid or not contained in the buffer pointed to by
1874 msg->msg_control, return -1. If cmsgh is valid and its associated
1875 data is entirely contained in the buffer, set *data_len to the
1876 length of the associated data and return 0. If only part of the
1877 associated data is contained in the buffer but cmsgh is otherwise
1878 valid, set *data_len to the length contained in the buffer and
1879 return 1. */
1880static int
1881get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len)
1882{
1883 size_t space, cmsg_data_len;
1884
1885 if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) ||
1886 cmsgh->cmsg_len < CMSG_LEN(0))
1887 return -1;
1888 cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0);
1889 if (!get_cmsg_data_space(msg, cmsgh, &space))
1890 return -1;
1891 if (space >= cmsg_data_len) {
1892 *data_len = cmsg_data_len;
1893 return 0;
1894 }
1895 *data_len = space;
1896 return 1;
1897}
1898#endif /* CMSG_LEN */
1899
1900
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001901/* s._accept() -> (fd, address) */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001902
Guido van Rossum73624e91994-10-10 17:59:00 +00001903static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001904sock_accept(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001905{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001906 sock_addr_t addrbuf;
1907 SOCKET_T newfd = INVALID_SOCKET;
1908 socklen_t addrlen;
1909 PyObject *sock = NULL;
1910 PyObject *addr = NULL;
1911 PyObject *res = NULL;
1912 int timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001913 if (!getsockaddrlen(s, &addrlen))
1914 return NULL;
1915 memset(&addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001916
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001917 if (!IS_SELECTABLE(s))
1918 return select_error();
Neal Norwitz082b2df2006-02-07 07:04:46 +00001919
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00001920 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001921 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00001922 timeout = internal_select_ex(s, 0, interval);
Antoine Pitroub1c54962010-10-14 15:05:38 +00001923 if (!timeout) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001924 newfd = accept(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
Antoine Pitroub1c54962010-10-14 15:05:38 +00001925 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001926 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001927
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001928 if (timeout == 1) {
1929 PyErr_SetString(socket_timeout, "timed out");
1930 return NULL;
1931 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00001932 END_SELECT_LOOP(s)
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001933
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001934 if (newfd == INVALID_SOCKET)
1935 return s->errorhandler();
Barry Warsaw752300b1997-01-03 17:18:10 +00001936
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001937 sock = PyLong_FromSocket_t(newfd);
1938 if (sock == NULL) {
1939 SOCKETCLOSE(newfd);
1940 goto finally;
1941 }
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001942
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001943 addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
1944 addrlen, s->sock_proto);
1945 if (addr == NULL)
1946 goto finally;
Barry Warsaw752300b1997-01-03 17:18:10 +00001947
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001948 res = PyTuple_Pack(2, sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00001949
Guido van Rossum67f7a382002-06-06 21:08:16 +00001950finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001951 Py_XDECREF(sock);
1952 Py_XDECREF(addr);
1953 return res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001954}
1955
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001956PyDoc_STRVAR(accept_doc,
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001957"_accept() -> (integer, address info)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00001958\n\
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001959Wait for an incoming connection. Return a new socket file descriptor\n\
1960representing the connection, and the address of the client.\n\
1961For IP sockets, the address info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001962
Guido van Rossum11ba0942002-06-13 15:07:44 +00001963/* s.setblocking(flag) method. Argument:
1964 False -- non-blocking mode; same as settimeout(0)
1965 True -- blocking mode; same as settimeout(None)
1966*/
Guido van Rossume4485b01994-09-07 14:32:49 +00001967
Guido van Rossum73624e91994-10-10 17:59:00 +00001968static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001969sock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00001970{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001971 int block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001972
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001973 block = PyLong_AsLong(arg);
1974 if (block == -1 && PyErr_Occurred())
1975 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001976
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001977 s->sock_timeout = block ? -1.0 : 0.0;
1978 internal_setblocking(s, block);
Guido van Rossume4485b01994-09-07 14:32:49 +00001979
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001980 Py_INCREF(Py_None);
1981 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +00001982}
Guido van Rossume4485b01994-09-07 14:32:49 +00001983
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001984PyDoc_STRVAR(setblocking_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001985"setblocking(flag)\n\
1986\n\
1987Set the socket to blocking (flag is true) or non-blocking (false).\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00001988setblocking(True) is equivalent to settimeout(None);\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001989setblocking(False) is equivalent to settimeout(0.0).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001990
Guido van Rossum11ba0942002-06-13 15:07:44 +00001991/* s.settimeout(timeout) method. Argument:
1992 None -- no timeout, blocking mode; same as setblocking(True)
1993 0.0 -- non-blocking mode; same as setblocking(False)
1994 > 0 -- timeout mode; operations time out after timeout seconds
1995 < 0 -- illegal; raises an exception
1996*/
Guido van Rossum67f7a382002-06-06 21:08:16 +00001997static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001998sock_settimeout(PySocketSockObject *s, PyObject *arg)
Guido van Rossum67f7a382002-06-06 21:08:16 +00001999{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002000 double timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002001
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002002 if (arg == Py_None)
2003 timeout = -1.0;
2004 else {
2005 timeout = PyFloat_AsDouble(arg);
2006 if (timeout < 0.0) {
2007 if (!PyErr_Occurred())
2008 PyErr_SetString(PyExc_ValueError,
2009 "Timeout value out of range");
2010 return NULL;
2011 }
2012 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002013
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002014 s->sock_timeout = timeout;
2015 internal_setblocking(s, timeout < 0.0);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002016
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002017 Py_INCREF(Py_None);
2018 return Py_None;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002019}
2020
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002021PyDoc_STRVAR(settimeout_doc,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002022"settimeout(timeout)\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002023\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002024Set a timeout on socket operations. 'timeout' can be a float,\n\
2025giving in seconds, or None. Setting a timeout of None disables\n\
2026the timeout feature and is equivalent to setblocking(1).\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002027Setting a timeout of zero is the same as setblocking(0).");
Guido van Rossum67f7a382002-06-06 21:08:16 +00002028
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002029/* s.gettimeout() method.
2030 Returns the timeout associated with a socket. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00002031static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002032sock_gettimeout(PySocketSockObject *s)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002033{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002034 if (s->sock_timeout < 0.0) {
2035 Py_INCREF(Py_None);
2036 return Py_None;
2037 }
2038 else
2039 return PyFloat_FromDouble(s->sock_timeout);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002040}
2041
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002042PyDoc_STRVAR(gettimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002043"gettimeout() -> timeout\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002044\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03002045Returns the timeout in seconds (float) associated with socket \n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002046operations. A timeout of None indicates that timeouts on socket \n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002047operations are disabled.");
Guido van Rossume4485b01994-09-07 14:32:49 +00002048
Guido van Rossumaee08791992-09-08 09:05:33 +00002049/* s.setsockopt() method.
2050 With an integer third argument, sets an integer option.
2051 With a string third argument, sets an option from a buffer;
2052 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002053
Guido van Rossum73624e91994-10-10 17:59:00 +00002054static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002055sock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002056{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002057 int level;
2058 int optname;
2059 int res;
2060 char *buf;
2061 int buflen;
2062 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002063
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002064 if (PyArg_ParseTuple(args, "iii:setsockopt",
2065 &level, &optname, &flag)) {
2066 buf = (char *) &flag;
2067 buflen = sizeof flag;
2068 }
2069 else {
2070 PyErr_Clear();
2071 if (!PyArg_ParseTuple(args, "iiy#:setsockopt",
2072 &level, &optname, &buf, &buflen))
2073 return NULL;
2074 }
2075 res = setsockopt(s->sock_fd, level, optname, (void *)buf, buflen);
2076 if (res < 0)
2077 return s->errorhandler();
2078 Py_INCREF(Py_None);
2079 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002080}
2081
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002082PyDoc_STRVAR(setsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002083"setsockopt(level, option, value)\n\
2084\n\
2085Set a socket option. See the Unix manual for level and option.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002086The value argument can either be an integer or a string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002087
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002088
Guido van Rossumaee08791992-09-08 09:05:33 +00002089/* s.getsockopt() method.
2090 With two arguments, retrieves an integer option.
2091 With a third integer argument, retrieves a string buffer of that size;
2092 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002093
Guido van Rossum73624e91994-10-10 17:59:00 +00002094static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002095sock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002096{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002097 int level;
2098 int optname;
2099 int res;
2100 PyObject *buf;
2101 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002102
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002103 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
2104 &level, &optname, &buflen))
2105 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002106
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002107 if (buflen == 0) {
2108 int flag = 0;
2109 socklen_t flagsize = sizeof flag;
2110 res = getsockopt(s->sock_fd, level, optname,
2111 (void *)&flag, &flagsize);
2112 if (res < 0)
2113 return s->errorhandler();
2114 return PyLong_FromLong(flag);
2115 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002116#ifdef __VMS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002117 /* socklen_t is unsigned so no negative test is needed,
2118 test buflen == 0 is previously done */
2119 if (buflen > 1024) {
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002120#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002121 if (buflen <= 0 || buflen > 1024) {
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002122#endif
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002123 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002124 "getsockopt buflen out of range");
2125 return NULL;
2126 }
2127 buf = PyBytes_FromStringAndSize((char *)NULL, buflen);
2128 if (buf == NULL)
2129 return NULL;
2130 res = getsockopt(s->sock_fd, level, optname,
2131 (void *)PyBytes_AS_STRING(buf), &buflen);
2132 if (res < 0) {
2133 Py_DECREF(buf);
2134 return s->errorhandler();
2135 }
2136 _PyBytes_Resize(&buf, buflen);
2137 return buf;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002138}
2139
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002140PyDoc_STRVAR(getsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002141"getsockopt(level, option[, buffersize]) -> value\n\
2142\n\
2143Get a socket option. See the Unix manual for level and option.\n\
2144If a nonzero buffersize argument is given, the return value is a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002145string of that length; otherwise it is an integer.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002146
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002147
Fred Drake728819a2000-07-01 03:40:12 +00002148/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002149
Guido van Rossum73624e91994-10-10 17:59:00 +00002150static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002151sock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002152{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002153 sock_addr_t addrbuf;
2154 int addrlen;
2155 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002156
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002157 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2158 return NULL;
2159 Py_BEGIN_ALLOW_THREADS
2160 res = bind(s->sock_fd, SAS2SA(&addrbuf), addrlen);
2161 Py_END_ALLOW_THREADS
2162 if (res < 0)
2163 return s->errorhandler();
2164 Py_INCREF(Py_None);
2165 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002166}
2167
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002168PyDoc_STRVAR(bind_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002169"bind(address)\n\
2170\n\
2171Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00002172pair (host, port); the host must refer to the local host. For raw packet\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002173sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002174
Guido van Rossum30a685f1991-06-27 15:51:29 +00002175
2176/* s.close() method.
2177 Set the file descriptor to -1 so operations tried subsequently
2178 will surely fail. */
2179
Guido van Rossum73624e91994-10-10 17:59:00 +00002180static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002181sock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002182{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002183 SOCKET_T fd;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002184
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002185 if ((fd = s->sock_fd) != -1) {
2186 s->sock_fd = -1;
2187 Py_BEGIN_ALLOW_THREADS
2188 (void) SOCKETCLOSE(fd);
2189 Py_END_ALLOW_THREADS
2190 }
2191 Py_INCREF(Py_None);
2192 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002193}
2194
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002195PyDoc_STRVAR(close_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002196"close()\n\
2197\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002198Close the socket. It cannot be used after this call.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002199
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002200static PyObject *
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002201sock_detach(PySocketSockObject *s)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002202{
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002203 SOCKET_T fd = s->sock_fd;
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002204 s->sock_fd = -1;
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002205 return PyLong_FromSocket_t(fd);
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002206}
2207
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002208PyDoc_STRVAR(detach_doc,
2209"detach()\n\
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002210\n\
2211Close the socket object without closing the underlying file descriptor.\
2212The object cannot be used after this call, but the file descriptor\
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002213can be reused for other purposes. The file descriptor is returned.");
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002214
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002215static int
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002216internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002217 int *timeoutp)
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002218{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002219 int res, timeout;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002220
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002221 timeout = 0;
2222 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002223
2224#ifdef MS_WINDOWS
2225
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002226 if (s->sock_timeout > 0.0) {
2227 if (res < 0 && WSAGetLastError() == WSAEWOULDBLOCK &&
2228 IS_SELECTABLE(s)) {
2229 /* This is a mess. Best solution: trust select */
2230 fd_set fds;
2231 fd_set fds_exc;
2232 struct timeval tv;
2233 tv.tv_sec = (int)s->sock_timeout;
2234 tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6);
2235 FD_ZERO(&fds);
2236 FD_SET(s->sock_fd, &fds);
2237 FD_ZERO(&fds_exc);
2238 FD_SET(s->sock_fd, &fds_exc);
Antoine Pitrou19467d22010-08-17 19:33:30 +00002239 res = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
2240 NULL, &fds, &fds_exc, &tv);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002241 if (res == 0) {
2242 res = WSAEWOULDBLOCK;
2243 timeout = 1;
2244 } else if (res > 0) {
2245 if (FD_ISSET(s->sock_fd, &fds))
2246 /* The socket is in the writable set - this
2247 means connected */
2248 res = 0;
2249 else {
2250 /* As per MS docs, we need to call getsockopt()
2251 to get the underlying error */
2252 int res_size = sizeof res;
2253 /* It must be in the exception set */
2254 assert(FD_ISSET(s->sock_fd, &fds_exc));
2255 if (0 == getsockopt(s->sock_fd, SOL_SOCKET, SO_ERROR,
2256 (char *)&res, &res_size))
2257 /* getsockopt also clears WSAGetLastError,
2258 so reset it back. */
2259 WSASetLastError(res);
2260 else
2261 res = WSAGetLastError();
2262 }
2263 }
2264 /* else if (res < 0) an error occurred */
2265 }
2266 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002267
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002268 if (res < 0)
2269 res = WSAGetLastError();
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002270
2271#else
2272
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002273 if (s->sock_timeout > 0.0) {
2274 if (res < 0 && errno == EINPROGRESS && IS_SELECTABLE(s)) {
2275 timeout = internal_select(s, 1);
2276 if (timeout == 0) {
2277 /* Bug #1019808: in case of an EINPROGRESS,
2278 use getsockopt(SO_ERROR) to get the real
2279 error. */
2280 socklen_t res_size = sizeof res;
2281 (void)getsockopt(s->sock_fd, SOL_SOCKET,
2282 SO_ERROR, &res, &res_size);
2283 if (res == EISCONN)
2284 res = 0;
2285 errno = res;
2286 }
2287 else if (timeout == -1) {
2288 res = errno; /* had error */
2289 }
2290 else
2291 res = EWOULDBLOCK; /* timed out */
2292 }
2293 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002294
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002295 if (res < 0)
2296 res = errno;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002297
2298#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002299 *timeoutp = timeout;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002300
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002301 return res;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002302}
Guido van Rossum30a685f1991-06-27 15:51:29 +00002303
Fred Drake728819a2000-07-01 03:40:12 +00002304/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002305
Guido van Rossum73624e91994-10-10 17:59:00 +00002306static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002307sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002308{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002309 sock_addr_t addrbuf;
2310 int addrlen;
2311 int res;
2312 int timeout;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002313
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002314 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2315 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002316
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002317 Py_BEGIN_ALLOW_THREADS
2318 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, &timeout);
2319 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002320
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002321 if (timeout == 1) {
2322 PyErr_SetString(socket_timeout, "timed out");
2323 return NULL;
2324 }
2325 if (res != 0)
2326 return s->errorhandler();
2327 Py_INCREF(Py_None);
2328 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002329}
2330
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002331PyDoc_STRVAR(connect_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002332"connect(address)\n\
2333\n\
2334Connect the socket to a remote address. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002335is a pair (host, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002336
Guido van Rossum30a685f1991-06-27 15:51:29 +00002337
Fred Drake728819a2000-07-01 03:40:12 +00002338/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002339
2340static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002341sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002342{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002343 sock_addr_t addrbuf;
2344 int addrlen;
2345 int res;
2346 int timeout;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002347
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002348 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2349 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002350
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002351 Py_BEGIN_ALLOW_THREADS
2352 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, &timeout);
2353 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002354
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002355 /* Signals are not errors (though they may raise exceptions). Adapted
2356 from PyErr_SetFromErrnoWithFilenameObject(). */
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002357#ifdef EINTR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002358 if (res == EINTR && PyErr_CheckSignals())
2359 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002360#endif
2361
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002362 return PyLong_FromLong((long) res);
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002363}
2364
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002365PyDoc_STRVAR(connect_ex_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002366"connect_ex(address) -> errno\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002367\n\
2368This is like connect(address), but returns an error code (the errno value)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002369instead of raising an exception when an error occurs.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002370
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002371
Guido van Rossumed233a51992-06-23 09:07:03 +00002372/* s.fileno() method */
2373
Guido van Rossum73624e91994-10-10 17:59:00 +00002374static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002375sock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00002376{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002377 return PyLong_FromSocket_t(s->sock_fd);
Guido van Rossumed233a51992-06-23 09:07:03 +00002378}
2379
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002380PyDoc_STRVAR(fileno_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002381"fileno() -> integer\n\
2382\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002383Return the integer file descriptor of the socket.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002384
Guido van Rossumed233a51992-06-23 09:07:03 +00002385
Guido van Rossumc89705d1992-11-26 08:54:07 +00002386/* s.getsockname() method */
2387
Guido van Rossum73624e91994-10-10 17:59:00 +00002388static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002389sock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002390{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002391 sock_addr_t addrbuf;
2392 int res;
2393 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002394
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002395 if (!getsockaddrlen(s, &addrlen))
2396 return NULL;
2397 memset(&addrbuf, 0, addrlen);
2398 Py_BEGIN_ALLOW_THREADS
2399 res = getsockname(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2400 Py_END_ALLOW_THREADS
2401 if (res < 0)
2402 return s->errorhandler();
2403 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2404 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002405}
2406
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002407PyDoc_STRVAR(getsockname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002408"getsockname() -> address info\n\
2409\n\
2410Return the address of the local endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002411info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002412
Guido van Rossumc89705d1992-11-26 08:54:07 +00002413
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002414#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002415/* s.getpeername() method */
2416
Guido van Rossum73624e91994-10-10 17:59:00 +00002417static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002418sock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002419{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002420 sock_addr_t addrbuf;
2421 int res;
2422 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002423
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002424 if (!getsockaddrlen(s, &addrlen))
2425 return NULL;
2426 memset(&addrbuf, 0, addrlen);
2427 Py_BEGIN_ALLOW_THREADS
2428 res = getpeername(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2429 Py_END_ALLOW_THREADS
2430 if (res < 0)
2431 return s->errorhandler();
2432 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2433 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002434}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002435
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002436PyDoc_STRVAR(getpeername_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002437"getpeername() -> address info\n\
2438\n\
2439Return the address of the remote endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002440info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002441
Guido van Rossumb6775db1994-08-01 11:34:53 +00002442#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002443
2444
Guido van Rossum30a685f1991-06-27 15:51:29 +00002445/* s.listen(n) method */
2446
Guido van Rossum73624e91994-10-10 17:59:00 +00002447static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002448sock_listen(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002449{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002450 int backlog;
2451 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002452
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002453 backlog = PyLong_AsLong(arg);
2454 if (backlog == -1 && PyErr_Occurred())
2455 return NULL;
2456 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou1be815a2011-05-10 19:16:29 +02002457 /* To avoid problems on systems that don't allow a negative backlog
2458 * (which doesn't make sense anyway) we force a minimum value of 0. */
2459 if (backlog < 0)
2460 backlog = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002461 res = listen(s->sock_fd, backlog);
2462 Py_END_ALLOW_THREADS
2463 if (res < 0)
2464 return s->errorhandler();
2465 Py_INCREF(Py_None);
2466 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002467}
2468
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002469PyDoc_STRVAR(listen_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002470"listen(backlog)\n\
2471\n\
2472Enable a server to accept connections. The backlog argument must be at\n\
Antoine Pitrou1be815a2011-05-10 19:16:29 +02002473least 0 (if it is lower, it is set to 0); it specifies the number of\n\
2474unaccepted connections that the system will allow before refusing new\n\
2475connections.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002476
2477
Thomas Wouters477c8d52006-05-27 19:21:47 +00002478/*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002479 * This is the guts of the recv() and recv_into() methods, which reads into a
Thomas Wouters902d6eb2007-01-09 23:18:33 +00002480 * char buffer. If you have any inc/dec ref to do to the objects that contain
Thomas Wouters477c8d52006-05-27 19:21:47 +00002481 * the buffer, do it in the caller. This function returns the number of bytes
Ezio Melotti13925002011-03-16 11:05:33 +02002482 * successfully read. If there was an error, it returns -1. Note that it is
Thomas Wouters477c8d52006-05-27 19:21:47 +00002483 * also possible that we return a number of bytes smaller than the request
2484 * bytes.
2485 */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002486
Antoine Pitrou19467d22010-08-17 19:33:30 +00002487static Py_ssize_t
2488sock_recv_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002489{
Antoine Pitrou19467d22010-08-17 19:33:30 +00002490 Py_ssize_t outlen = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002491 int timeout;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002492#ifdef __VMS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002493 int remaining;
2494 char *read_buf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002495#endif
2496
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002497 if (!IS_SELECTABLE(s)) {
2498 select_error();
2499 return -1;
2500 }
2501 if (len == 0) {
2502 /* If 0 bytes were requested, do nothing. */
2503 return 0;
2504 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002505
2506#ifndef __VMS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002507 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002508 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002509 timeout = internal_select_ex(s, 0, interval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002510 if (!timeout)
2511 outlen = recv(s->sock_fd, cbuf, len, flags);
2512 Py_END_ALLOW_THREADS
Thomas Wouters477c8d52006-05-27 19:21:47 +00002513
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002514 if (timeout == 1) {
2515 PyErr_SetString(socket_timeout, "timed out");
2516 return -1;
2517 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002518 END_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002519 if (outlen < 0) {
2520 /* Note: the call to errorhandler() ALWAYS indirectly returned
2521 NULL, so ignore its return value */
2522 s->errorhandler();
2523 return -1;
2524 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002525#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002526 read_buf = cbuf;
2527 remaining = len;
2528 while (remaining != 0) {
2529 unsigned int segment;
2530 int nread = -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002531
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002532 segment = remaining /SEGMENT_SIZE;
2533 if (segment != 0) {
2534 segment = SEGMENT_SIZE;
2535 }
2536 else {
2537 segment = remaining;
2538 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002539
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002540 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002541 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002542 timeout = internal_select_ex(s, 0, interval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002543 if (!timeout)
2544 nread = recv(s->sock_fd, read_buf, segment, flags);
2545 Py_END_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002546 if (timeout == 1) {
2547 PyErr_SetString(socket_timeout, "timed out");
2548 return -1;
2549 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002550 END_SELECT_LOOP(s)
2551
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002552 if (nread < 0) {
2553 s->errorhandler();
2554 return -1;
2555 }
2556 if (nread != remaining) {
2557 read_buf += nread;
2558 break;
2559 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002560
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002561 remaining -= segment;
2562 read_buf += segment;
2563 }
2564 outlen = read_buf - cbuf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002565#endif /* !__VMS */
2566
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002567 return outlen;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002568}
2569
Guido van Rossum48a680c2001-03-02 06:34:14 +00002570
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002571/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002572
Guido van Rossum73624e91994-10-10 17:59:00 +00002573static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002574sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002575{
Antoine Pitrou19467d22010-08-17 19:33:30 +00002576 Py_ssize_t recvlen, outlen;
2577 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002578 PyObject *buf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002579
Antoine Pitrou19467d22010-08-17 19:33:30 +00002580 if (!PyArg_ParseTuple(args, "n|i:recv", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002581 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002582
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002583 if (recvlen < 0) {
2584 PyErr_SetString(PyExc_ValueError,
2585 "negative buffersize in recv");
2586 return NULL;
2587 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002588
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002589 /* Allocate a new string. */
2590 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
2591 if (buf == NULL)
2592 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002593
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002594 /* Call the guts */
2595 outlen = sock_recv_guts(s, PyBytes_AS_STRING(buf), recvlen, flags);
2596 if (outlen < 0) {
2597 /* An error occurred, release the string and return an
2598 error. */
2599 Py_DECREF(buf);
2600 return NULL;
2601 }
2602 if (outlen != recvlen) {
2603 /* We did not read as many bytes as we anticipated, resize the
2604 string if possible and be successful. */
2605 _PyBytes_Resize(&buf, outlen);
2606 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002607
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002608 return buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002609}
2610
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002611PyDoc_STRVAR(recv_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002612"recv(buffersize[, flags]) -> data\n\
2613\n\
2614Receive up to buffersize bytes from the socket. For the optional flags\n\
2615argument, see the Unix manual. When no data is available, block until\n\
2616at least one byte is available or until the remote end is closed. When\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002617the remote end is closed and all data is read, return the empty string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002618
Guido van Rossum30a685f1991-06-27 15:51:29 +00002619
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002620/* s.recv_into(buffer, [nbytes [,flags]]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002621
Thomas Wouters477c8d52006-05-27 19:21:47 +00002622static PyObject*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002623sock_recv_into(PySocketSockObject *s, PyObject *args, PyObject *kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002624{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002625 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00002626
Antoine Pitrou19467d22010-08-17 19:33:30 +00002627 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002628 Py_buffer pbuf;
2629 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002630 Py_ssize_t buflen, readlen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002631
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002632 /* Get the buffer's memory */
Antoine Pitrou19467d22010-08-17 19:33:30 +00002633 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recv_into", kwlist,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002634 &pbuf, &recvlen, &flags))
2635 return NULL;
2636 buf = pbuf.buf;
2637 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002638
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002639 if (recvlen < 0) {
2640 PyBuffer_Release(&pbuf);
2641 PyErr_SetString(PyExc_ValueError,
2642 "negative buffersize in recv_into");
2643 return NULL;
2644 }
2645 if (recvlen == 0) {
2646 /* If nbytes was not specified, use the buffer's length */
2647 recvlen = buflen;
2648 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002649
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002650 /* Check if the buffer is large enough */
2651 if (buflen < recvlen) {
2652 PyBuffer_Release(&pbuf);
2653 PyErr_SetString(PyExc_ValueError,
2654 "buffer too small for requested bytes");
2655 return NULL;
2656 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002657
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002658 /* Call the guts */
2659 readlen = sock_recv_guts(s, buf, recvlen, flags);
2660 if (readlen < 0) {
2661 /* Return an error. */
2662 PyBuffer_Release(&pbuf);
2663 return NULL;
2664 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002665
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002666 PyBuffer_Release(&pbuf);
2667 /* Return the number of bytes read. Note that we do not do anything
2668 special here in the case that readlen < recvlen. */
2669 return PyLong_FromSsize_t(readlen);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002670}
2671
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002672PyDoc_STRVAR(recv_into_doc,
2673"recv_into(buffer, [nbytes[, flags]]) -> nbytes_read\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00002674\n\
2675A version of recv() that stores its data into a buffer rather than creating \n\
2676a new string. Receive up to buffersize bytes from the socket. If buffersize \n\
2677is not specified (or 0), receive up to the size available in the given buffer.\n\
2678\n\
2679See recv() for documentation about the flags.");
2680
2681
2682/*
Christian Heimes99170a52007-12-19 02:07:34 +00002683 * This is the guts of the recvfrom() and recvfrom_into() methods, which reads
2684 * into a char buffer. If you have any inc/def ref to do to the objects that
2685 * contain the buffer, do it in the caller. This function returns the number
Ezio Melotti13925002011-03-16 11:05:33 +02002686 * of bytes successfully read. If there was an error, it returns -1. Note
Christian Heimes99170a52007-12-19 02:07:34 +00002687 * that it is also possible that we return a number of bytes smaller than the
2688 * request bytes.
Thomas Wouters477c8d52006-05-27 19:21:47 +00002689 *
2690 * 'addr' is a return value for the address object. Note that you must decref
2691 * it yourself.
2692 */
Antoine Pitrou19467d22010-08-17 19:33:30 +00002693static Py_ssize_t
2694sock_recvfrom_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002695 PyObject** addr)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002696{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002697 sock_addr_t addrbuf;
2698 int timeout;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002699 Py_ssize_t n = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002700 socklen_t addrlen;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002701
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002702 *addr = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002703
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002704 if (!getsockaddrlen(s, &addrlen))
2705 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002706
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002707 if (!IS_SELECTABLE(s)) {
2708 select_error();
2709 return -1;
2710 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00002711
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002712 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002713 Py_BEGIN_ALLOW_THREADS
2714 memset(&addrbuf, 0, addrlen);
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002715 timeout = internal_select_ex(s, 0, interval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002716 if (!timeout) {
Guido van Rossum8d665e61996-06-26 18:22:49 +00002717#ifndef MS_WINDOWS
Andrew MacIntyreba43e872002-03-03 03:03:52 +00002718#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002719 n = recvfrom(s->sock_fd, cbuf, len, flags,
2720 SAS2SA(&addrbuf), &addrlen);
Guido van Rossum32c575d1997-12-02 20:37:32 +00002721#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002722 n = recvfrom(s->sock_fd, cbuf, len, flags,
2723 (void *) &addrbuf, &addrlen);
Guido van Rossum32c575d1997-12-02 20:37:32 +00002724#endif
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002725#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002726 n = recvfrom(s->sock_fd, cbuf, len, flags,
2727 SAS2SA(&addrbuf), &addrlen);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002728#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002729 }
2730 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002731
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002732 if (timeout == 1) {
2733 PyErr_SetString(socket_timeout, "timed out");
2734 return -1;
2735 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002736 END_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002737 if (n < 0) {
2738 s->errorhandler();
2739 return -1;
2740 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002741
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002742 if (!(*addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
2743 addrlen, s->sock_proto)))
2744 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002745
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002746 return n;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002747}
2748
2749/* s.recvfrom(nbytes [,flags]) method */
2750
2751static PyObject *
2752sock_recvfrom(PySocketSockObject *s, PyObject *args)
2753{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002754 PyObject *buf = NULL;
2755 PyObject *addr = NULL;
2756 PyObject *ret = NULL;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002757 int flags = 0;
2758 Py_ssize_t recvlen, outlen;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002759
Antoine Pitrou19467d22010-08-17 19:33:30 +00002760 if (!PyArg_ParseTuple(args, "n|i:recvfrom", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002761 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002762
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002763 if (recvlen < 0) {
2764 PyErr_SetString(PyExc_ValueError,
2765 "negative buffersize in recvfrom");
2766 return NULL;
2767 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00002768
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002769 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
2770 if (buf == NULL)
2771 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002772
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002773 outlen = sock_recvfrom_guts(s, PyBytes_AS_STRING(buf),
2774 recvlen, flags, &addr);
2775 if (outlen < 0) {
2776 goto finally;
2777 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002778
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002779 if (outlen != recvlen) {
2780 /* We did not read as many bytes as we anticipated, resize the
Ezio Melotti13925002011-03-16 11:05:33 +02002781 string if possible and be successful. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002782 if (_PyBytes_Resize(&buf, outlen) < 0)
Ezio Melotti13925002011-03-16 11:05:33 +02002783 /* Oopsy, not so successful after all. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002784 goto finally;
2785 }
Barry Warsaw752300b1997-01-03 17:18:10 +00002786
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002787 ret = PyTuple_Pack(2, buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002788
2789finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002790 Py_XDECREF(buf);
2791 Py_XDECREF(addr);
2792 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002793}
2794
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002795PyDoc_STRVAR(recvfrom_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002796"recvfrom(buffersize[, flags]) -> (data, address info)\n\
2797\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002798Like recv(buffersize, flags) but also return the sender's address info.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002799
Thomas Wouters477c8d52006-05-27 19:21:47 +00002800
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002801/* s.recvfrom_into(buffer[, nbytes [,flags]]) method */
Thomas Wouters477c8d52006-05-27 19:21:47 +00002802
2803static PyObject *
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002804sock_recvfrom_into(PySocketSockObject *s, PyObject *args, PyObject* kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002805{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002806 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00002807
Antoine Pitrou19467d22010-08-17 19:33:30 +00002808 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002809 Py_buffer pbuf;
2810 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002811 Py_ssize_t readlen, buflen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002812
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002813 PyObject *addr = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002814
Antoine Pitrou19467d22010-08-17 19:33:30 +00002815 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recvfrom_into",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002816 kwlist, &pbuf,
2817 &recvlen, &flags))
2818 return NULL;
2819 buf = pbuf.buf;
2820 buflen = pbuf.len;
2821 assert(buf != 0 && buflen > 0);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002822
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002823 if (recvlen < 0) {
2824 PyBuffer_Release(&pbuf);
2825 PyErr_SetString(PyExc_ValueError,
2826 "negative buffersize in recvfrom_into");
2827 return NULL;
2828 }
2829 if (recvlen == 0) {
2830 /* If nbytes was not specified, use the buffer's length */
2831 recvlen = buflen;
2832 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002833
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002834 readlen = sock_recvfrom_guts(s, buf, recvlen, flags, &addr);
2835 if (readlen < 0) {
2836 PyBuffer_Release(&pbuf);
2837 /* Return an error */
2838 Py_XDECREF(addr);
2839 return NULL;
2840 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002841
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002842 PyBuffer_Release(&pbuf);
2843 /* Return the number of bytes read and the address. Note that we do
2844 not do anything special here in the case that readlen < recvlen. */
Antoine Pitrou19467d22010-08-17 19:33:30 +00002845 return Py_BuildValue("nN", readlen, addr);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002846}
2847
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002848PyDoc_STRVAR(recvfrom_into_doc,
2849"recvfrom_into(buffer[, nbytes[, flags]]) -> (nbytes, address info)\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00002850\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002851Like recv_into(buffer[, nbytes[, flags]]) but also return the sender's address info.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00002852
2853
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002854/* The sendmsg() and recvmsg[_into]() methods require a working
2855 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
2856#ifdef CMSG_LEN
2857/*
2858 * Call recvmsg() with the supplied iovec structures, flags, and
2859 * ancillary data buffer size (controllen). Returns the tuple return
2860 * value for recvmsg() or recvmsg_into(), with the first item provided
2861 * by the supplied makeval() function. makeval() will be called with
2862 * the length read and makeval_data as arguments, and must return a
2863 * new reference (which will be decrefed if there is a subsequent
2864 * error). On error, closes any file descriptors received via
2865 * SCM_RIGHTS.
2866 */
2867static PyObject *
2868sock_recvmsg_guts(PySocketSockObject *s, struct iovec *iov, int iovlen,
2869 int flags, Py_ssize_t controllen,
2870 PyObject *(*makeval)(ssize_t, void *), void *makeval_data)
2871{
2872 ssize_t bytes_received = -1;
2873 int timeout;
2874 sock_addr_t addrbuf;
2875 socklen_t addrbuflen;
Charles-François Natalie9e95ae2011-08-24 21:40:53 +02002876 struct msghdr msg = {0};
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002877 PyObject *cmsg_list = NULL, *retval = NULL;
2878 void *controlbuf = NULL;
2879 struct cmsghdr *cmsgh;
2880 size_t cmsgdatalen = 0;
2881 int cmsg_status;
2882
2883 /* XXX: POSIX says that msg_name and msg_namelen "shall be
2884 ignored" when the socket is connected (Linux fills them in
2885 anyway for AF_UNIX sockets at least). Normally msg_namelen
2886 seems to be set to 0 if there's no address, but try to
2887 initialize msg_name to something that won't be mistaken for a
2888 real address if that doesn't happen. */
2889 if (!getsockaddrlen(s, &addrbuflen))
2890 return NULL;
2891 memset(&addrbuf, 0, addrbuflen);
2892 SAS2SA(&addrbuf)->sa_family = AF_UNSPEC;
2893
2894 if (controllen < 0 || controllen > SOCKLEN_T_LIMIT) {
2895 PyErr_SetString(PyExc_ValueError,
2896 "invalid ancillary data buffer length");
2897 return NULL;
2898 }
2899 if (controllen > 0 && (controlbuf = PyMem_Malloc(controllen)) == NULL)
2900 return PyErr_NoMemory();
2901
2902 /* Make the system call. */
2903 if (!IS_SELECTABLE(s)) {
2904 select_error();
2905 goto finally;
2906 }
2907
2908 BEGIN_SELECT_LOOP(s)
2909 Py_BEGIN_ALLOW_THREADS;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002910 msg.msg_name = SAS2SA(&addrbuf);
2911 msg.msg_namelen = addrbuflen;
2912 msg.msg_iov = iov;
2913 msg.msg_iovlen = iovlen;
2914 msg.msg_control = controlbuf;
2915 msg.msg_controllen = controllen;
2916 timeout = internal_select_ex(s, 0, interval);
2917 if (!timeout)
2918 bytes_received = recvmsg(s->sock_fd, &msg, flags);
2919 Py_END_ALLOW_THREADS;
2920 if (timeout == 1) {
2921 PyErr_SetString(socket_timeout, "timed out");
2922 goto finally;
2923 }
2924 END_SELECT_LOOP(s)
2925
2926 if (bytes_received < 0) {
2927 s->errorhandler();
2928 goto finally;
2929 }
2930
2931 /* Make list of (level, type, data) tuples from control messages. */
2932 if ((cmsg_list = PyList_New(0)) == NULL)
2933 goto err_closefds;
2934 /* Check for empty ancillary data as old CMSG_FIRSTHDR()
2935 implementations didn't do so. */
2936 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
2937 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
2938 PyObject *bytes, *tuple;
2939 int tmp;
2940
2941 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
2942 if (cmsg_status != 0) {
2943 if (PyErr_WarnEx(PyExc_RuntimeWarning,
2944 "received malformed or improperly-truncated "
2945 "ancillary data", 1) == -1)
2946 goto err_closefds;
2947 }
2948 if (cmsg_status < 0)
2949 break;
2950 if (cmsgdatalen > PY_SSIZE_T_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002951 PyErr_SetString(PyExc_OSError, "control message too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002952 goto err_closefds;
2953 }
2954
2955 bytes = PyBytes_FromStringAndSize((char *)CMSG_DATA(cmsgh),
2956 cmsgdatalen);
2957 tuple = Py_BuildValue("iiN", (int)cmsgh->cmsg_level,
2958 (int)cmsgh->cmsg_type, bytes);
2959 if (tuple == NULL)
2960 goto err_closefds;
2961 tmp = PyList_Append(cmsg_list, tuple);
2962 Py_DECREF(tuple);
2963 if (tmp != 0)
2964 goto err_closefds;
2965
2966 if (cmsg_status != 0)
2967 break;
2968 }
2969
2970 retval = Py_BuildValue("NOiN",
2971 (*makeval)(bytes_received, makeval_data),
2972 cmsg_list,
2973 (int)msg.msg_flags,
2974 makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
2975 ((msg.msg_namelen > addrbuflen) ?
2976 addrbuflen : msg.msg_namelen),
2977 s->sock_proto));
2978 if (retval == NULL)
2979 goto err_closefds;
2980
2981finally:
2982 Py_XDECREF(cmsg_list);
2983 PyMem_Free(controlbuf);
2984 return retval;
2985
2986err_closefds:
2987#ifdef SCM_RIGHTS
2988 /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */
2989 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
2990 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
2991 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
2992 if (cmsg_status < 0)
2993 break;
2994 if (cmsgh->cmsg_level == SOL_SOCKET &&
2995 cmsgh->cmsg_type == SCM_RIGHTS) {
2996 size_t numfds;
2997 int *fdp;
2998
2999 numfds = cmsgdatalen / sizeof(int);
3000 fdp = (int *)CMSG_DATA(cmsgh);
3001 while (numfds-- > 0)
3002 close(*fdp++);
3003 }
3004 if (cmsg_status != 0)
3005 break;
3006 }
3007#endif /* SCM_RIGHTS */
3008 goto finally;
3009}
3010
3011
3012static PyObject *
3013makeval_recvmsg(ssize_t received, void *data)
3014{
3015 PyObject **buf = data;
3016
3017 if (received < PyBytes_GET_SIZE(*buf))
3018 _PyBytes_Resize(buf, received);
3019 Py_XINCREF(*buf);
3020 return *buf;
3021}
3022
3023/* s.recvmsg(bufsize[, ancbufsize[, flags]]) method */
3024
3025static PyObject *
3026sock_recvmsg(PySocketSockObject *s, PyObject *args)
3027{
3028 Py_ssize_t bufsize, ancbufsize = 0;
3029 int flags = 0;
3030 struct iovec iov;
3031 PyObject *buf = NULL, *retval = NULL;
3032
3033 if (!PyArg_ParseTuple(args, "n|ni:recvmsg", &bufsize, &ancbufsize, &flags))
3034 return NULL;
3035
3036 if (bufsize < 0) {
3037 PyErr_SetString(PyExc_ValueError, "negative buffer size in recvmsg()");
3038 return NULL;
3039 }
3040 if ((buf = PyBytes_FromStringAndSize(NULL, bufsize)) == NULL)
3041 return NULL;
3042 iov.iov_base = PyBytes_AS_STRING(buf);
3043 iov.iov_len = bufsize;
3044
3045 /* Note that we're passing a pointer to *our pointer* to the bytes
3046 object here (&buf); makeval_recvmsg() may incref the object, or
3047 deallocate it and set our pointer to NULL. */
3048 retval = sock_recvmsg_guts(s, &iov, 1, flags, ancbufsize,
3049 &makeval_recvmsg, &buf);
3050 Py_XDECREF(buf);
3051 return retval;
3052}
3053
3054PyDoc_STRVAR(recvmsg_doc,
3055"recvmsg(bufsize[, ancbufsize[, flags]]) -> (data, ancdata, msg_flags, address)\n\
3056\n\
3057Receive normal data (up to bufsize bytes) and ancillary data from the\n\
3058socket. The ancbufsize argument sets the size in bytes of the\n\
3059internal buffer used to receive the ancillary data; it defaults to 0,\n\
3060meaning that no ancillary data will be received. Appropriate buffer\n\
3061sizes for ancillary data can be calculated using CMSG_SPACE() or\n\
3062CMSG_LEN(), and items which do not fit into the buffer might be\n\
3063truncated or discarded. The flags argument defaults to 0 and has the\n\
3064same meaning as for recv().\n\
3065\n\
3066The return value is a 4-tuple: (data, ancdata, msg_flags, address).\n\
3067The data item is a bytes object holding the non-ancillary data\n\
3068received. The ancdata item is a list of zero or more tuples\n\
3069(cmsg_level, cmsg_type, cmsg_data) representing the ancillary data\n\
3070(control messages) received: cmsg_level and cmsg_type are integers\n\
3071specifying the protocol level and protocol-specific type respectively,\n\
3072and cmsg_data is a bytes object holding the associated data. The\n\
3073msg_flags item is the bitwise OR of various flags indicating\n\
3074conditions on the received message; see your system documentation for\n\
3075details. If the receiving socket is unconnected, address is the\n\
3076address of the sending socket, if available; otherwise, its value is\n\
3077unspecified.\n\
3078\n\
3079If recvmsg() raises an exception after the system call returns, it\n\
3080will first attempt to close any file descriptors received via the\n\
3081SCM_RIGHTS mechanism.");
3082
3083
3084static PyObject *
3085makeval_recvmsg_into(ssize_t received, void *data)
3086{
3087 return PyLong_FromSsize_t(received);
3088}
3089
3090/* s.recvmsg_into(buffers[, ancbufsize[, flags]]) method */
3091
3092static PyObject *
3093sock_recvmsg_into(PySocketSockObject *s, PyObject *args)
3094{
3095 Py_ssize_t ancbufsize = 0;
3096 int flags = 0;
3097 struct iovec *iovs = NULL;
3098 Py_ssize_t i, nitems, nbufs = 0;
3099 Py_buffer *bufs = NULL;
3100 PyObject *buffers_arg, *fast, *retval = NULL;
3101
3102 if (!PyArg_ParseTuple(args, "O|ni:recvmsg_into",
3103 &buffers_arg, &ancbufsize, &flags))
3104 return NULL;
3105
3106 if ((fast = PySequence_Fast(buffers_arg,
3107 "recvmsg_into() argument 1 must be an "
3108 "iterable")) == NULL)
3109 return NULL;
3110 nitems = PySequence_Fast_GET_SIZE(fast);
3111 if (nitems > INT_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003112 PyErr_SetString(PyExc_OSError, "recvmsg_into() argument 1 is too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003113 goto finally;
3114 }
3115
3116 /* Fill in an iovec for each item, and save the Py_buffer
3117 structs to release afterwards. */
3118 if (nitems > 0 && ((iovs = PyMem_New(struct iovec, nitems)) == NULL ||
3119 (bufs = PyMem_New(Py_buffer, nitems)) == NULL)) {
3120 PyErr_NoMemory();
3121 goto finally;
3122 }
3123 for (; nbufs < nitems; nbufs++) {
3124 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(fast, nbufs),
3125 "w*;recvmsg_into() argument 1 must be an iterable "
3126 "of single-segment read-write buffers",
3127 &bufs[nbufs]))
3128 goto finally;
3129 iovs[nbufs].iov_base = bufs[nbufs].buf;
3130 iovs[nbufs].iov_len = bufs[nbufs].len;
3131 }
3132
3133 retval = sock_recvmsg_guts(s, iovs, nitems, flags, ancbufsize,
3134 &makeval_recvmsg_into, NULL);
3135finally:
3136 for (i = 0; i < nbufs; i++)
3137 PyBuffer_Release(&bufs[i]);
3138 PyMem_Free(bufs);
3139 PyMem_Free(iovs);
3140 Py_DECREF(fast);
3141 return retval;
3142}
3143
3144PyDoc_STRVAR(recvmsg_into_doc,
3145"recvmsg_into(buffers[, ancbufsize[, flags]]) -> (nbytes, ancdata, msg_flags, address)\n\
3146\n\
3147Receive normal data and ancillary data from the socket, scattering the\n\
3148non-ancillary data into a series of buffers. The buffers argument\n\
3149must be an iterable of objects that export writable buffers\n\
3150(e.g. bytearray objects); these will be filled with successive chunks\n\
3151of the non-ancillary data until it has all been written or there are\n\
3152no more buffers. The ancbufsize argument sets the size in bytes of\n\
3153the internal buffer used to receive the ancillary data; it defaults to\n\
31540, meaning that no ancillary data will be received. Appropriate\n\
3155buffer sizes for ancillary data can be calculated using CMSG_SPACE()\n\
3156or CMSG_LEN(), and items which do not fit into the buffer might be\n\
3157truncated or discarded. The flags argument defaults to 0 and has the\n\
3158same meaning as for recv().\n\
3159\n\
3160The return value is a 4-tuple: (nbytes, ancdata, msg_flags, address).\n\
3161The nbytes item is the total number of bytes of non-ancillary data\n\
3162written into the buffers. The ancdata item is a list of zero or more\n\
3163tuples (cmsg_level, cmsg_type, cmsg_data) representing the ancillary\n\
3164data (control messages) received: cmsg_level and cmsg_type are\n\
3165integers specifying the protocol level and protocol-specific type\n\
3166respectively, and cmsg_data is a bytes object holding the associated\n\
3167data. The msg_flags item is the bitwise OR of various flags\n\
3168indicating conditions on the received message; see your system\n\
3169documentation for details. If the receiving socket is unconnected,\n\
3170address is the address of the sending socket, if available; otherwise,\n\
3171its value is unspecified.\n\
3172\n\
3173If recvmsg_into() raises an exception after the system call returns,\n\
3174it will first attempt to close any file descriptors received via the\n\
3175SCM_RIGHTS mechanism.");
3176#endif /* CMSG_LEN */
3177
3178
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003179/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003180
Guido van Rossum73624e91994-10-10 17:59:00 +00003181static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003182sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003183{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003184 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003185 Py_ssize_t len, n = -1;
3186 int flags = 0, timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003187 Py_buffer pbuf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003188
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003189 if (!PyArg_ParseTuple(args, "y*|i:send", &pbuf, &flags))
3190 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003191
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003192 if (!IS_SELECTABLE(s)) {
3193 PyBuffer_Release(&pbuf);
3194 return select_error();
3195 }
3196 buf = pbuf.buf;
3197 len = pbuf.len;
Neal Norwitz082b2df2006-02-07 07:04:46 +00003198
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003199 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003200 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003201 timeout = internal_select_ex(s, 1, interval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003202 if (!timeout)
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003203#ifdef __VMS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003204 n = sendsegmented(s->sock_fd, buf, len, flags);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003205#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003206 n = send(s->sock_fd, buf, len, flags);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003207#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003208 Py_END_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003209 if (timeout == 1) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003210 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003211 PyErr_SetString(socket_timeout, "timed out");
3212 return NULL;
3213 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003214 END_SELECT_LOOP(s)
3215
3216 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003217 if (n < 0)
3218 return s->errorhandler();
Antoine Pitrou19467d22010-08-17 19:33:30 +00003219 return PyLong_FromSsize_t(n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00003220}
3221
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003222PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003223"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003224\n\
3225Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003226argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003227sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003228
3229
3230/* s.sendall(data [,flags]) method */
3231
3232static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003233sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003234{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003235 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003236 Py_ssize_t len, n = -1;
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003237 int flags = 0, timeout, saved_errno;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003238 Py_buffer pbuf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003239
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003240 if (!PyArg_ParseTuple(args, "y*|i:sendall", &pbuf, &flags))
3241 return NULL;
3242 buf = pbuf.buf;
3243 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003244
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003245 if (!IS_SELECTABLE(s)) {
3246 PyBuffer_Release(&pbuf);
3247 return select_error();
3248 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003249
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003250 do {
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003251 Py_BEGIN_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003252 timeout = internal_select(s, 1);
3253 n = -1;
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003254 if (!timeout) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003255#ifdef __VMS
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003256 n = sendsegmented(s->sock_fd, buf, len, flags);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003257#else
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003258 n = send(s->sock_fd, buf, len, flags);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003259#endif
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003260 }
3261 Py_END_ALLOW_THREADS
3262 if (timeout == 1) {
3263 PyBuffer_Release(&pbuf);
3264 PyErr_SetString(socket_timeout, "timed out");
3265 return NULL;
3266 }
3267 /* PyErr_CheckSignals() might change errno */
3268 saved_errno = errno;
3269 /* We must run our signal handlers before looping again.
3270 send() can return a successful partial write when it is
3271 interrupted, so we can't restrict ourselves to EINTR. */
3272 if (PyErr_CheckSignals()) {
3273 PyBuffer_Release(&pbuf);
3274 return NULL;
3275 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003276 if (n < 0) {
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003277 /* If interrupted, try again */
3278 if (saved_errno == EINTR)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003279 continue;
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003280 else
3281 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003282 }
3283 buf += n;
3284 len -= n;
3285 } while (len > 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003286 PyBuffer_Release(&pbuf);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003287
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003288 if (n < 0)
3289 return s->errorhandler();
Guido van Rossum67f7a382002-06-06 21:08:16 +00003290
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003291 Py_INCREF(Py_None);
3292 return Py_None;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003293}
3294
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003295PyDoc_STRVAR(sendall_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003296"sendall(data[, flags])\n\
3297\n\
3298Send a data string to the socket. For the optional flags\n\
3299argument, see the Unix manual. This calls send() repeatedly\n\
3300until all data is sent. If an error occurs, it's impossible\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003301to tell how much data has been sent.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003302
Guido van Rossum30a685f1991-06-27 15:51:29 +00003303
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003304/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003305
Guido van Rossum73624e91994-10-10 17:59:00 +00003306static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003307sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003308{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003309 Py_buffer pbuf;
3310 PyObject *addro;
3311 char *buf;
Antoine Pitrou5e981412011-03-17 22:38:37 +01003312 Py_ssize_t len, arglen;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003313 sock_addr_t addrbuf;
3314 int addrlen, n = -1, flags, timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003315
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003316 flags = 0;
Antoine Pitrou5e981412011-03-17 22:38:37 +01003317 arglen = PyTuple_Size(args);
3318 switch (arglen) {
3319 case 2:
3320 PyArg_ParseTuple(args, "y*O:sendto", &pbuf, &addro);
3321 break;
3322 case 3:
3323 PyArg_ParseTuple(args, "y*iO:sendto",
3324 &pbuf, &flags, &addro);
3325 break;
3326 default:
3327 PyErr_Format(PyExc_TypeError,
3328 "sendto() takes 2 or 3 arguments (%d given)",
3329 arglen);
Victor Stinner77af1722011-05-26 14:05:59 +02003330 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003331 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01003332 if (PyErr_Occurred())
3333 return NULL;
3334
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003335 buf = pbuf.buf;
3336 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003337
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003338 if (!IS_SELECTABLE(s)) {
3339 PyBuffer_Release(&pbuf);
3340 return select_error();
3341 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003342
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003343 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen)) {
3344 PyBuffer_Release(&pbuf);
3345 return NULL;
3346 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003347
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003348 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003349 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003350 timeout = internal_select_ex(s, 1, interval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003351 if (!timeout)
3352 n = sendto(s->sock_fd, buf, len, flags, SAS2SA(&addrbuf), addrlen);
3353 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00003354
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003355 if (timeout == 1) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003356 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003357 PyErr_SetString(socket_timeout, "timed out");
3358 return NULL;
3359 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003360 END_SELECT_LOOP(s)
3361 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003362 if (n < 0)
3363 return s->errorhandler();
Antoine Pitrou19467d22010-08-17 19:33:30 +00003364 return PyLong_FromSsize_t(n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003365}
3366
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003367PyDoc_STRVAR(sendto_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003368"sendto(data[, flags], address) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003369\n\
3370Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003371For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003372
Guido van Rossum30a685f1991-06-27 15:51:29 +00003373
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003374/* The sendmsg() and recvmsg[_into]() methods require a working
3375 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
3376#ifdef CMSG_LEN
3377/* s.sendmsg(buffers[, ancdata[, flags[, address]]]) method */
3378
3379static PyObject *
3380sock_sendmsg(PySocketSockObject *s, PyObject *args)
3381{
3382 Py_ssize_t i, ndataparts, ndatabufs = 0, ncmsgs, ncmsgbufs = 0;
3383 Py_buffer *databufs = NULL;
3384 struct iovec *iovs = NULL;
3385 sock_addr_t addrbuf;
Charles-François Natalie9e95ae2011-08-24 21:40:53 +02003386 struct msghdr msg = {0};
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003387 struct cmsginfo {
3388 int level;
3389 int type;
3390 Py_buffer data;
3391 } *cmsgs = NULL;
3392 void *controlbuf = NULL;
3393 size_t controllen, controllen_last;
3394 ssize_t bytes_sent = -1;
3395 int addrlen, timeout, flags = 0;
3396 PyObject *data_arg, *cmsg_arg = NULL, *addr_arg = NULL, *data_fast = NULL,
3397 *cmsg_fast = NULL, *retval = NULL;
3398
3399 if (!PyArg_ParseTuple(args, "O|OiO:sendmsg",
3400 &data_arg, &cmsg_arg, &flags, &addr_arg))
3401 return NULL;
3402
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003403 /* Parse destination address. */
3404 if (addr_arg != NULL && addr_arg != Py_None) {
3405 if (!getsockaddrarg(s, addr_arg, SAS2SA(&addrbuf), &addrlen))
3406 goto finally;
3407 msg.msg_name = &addrbuf;
3408 msg.msg_namelen = addrlen;
3409 }
3410
3411 /* Fill in an iovec for each message part, and save the Py_buffer
3412 structs to release afterwards. */
3413 if ((data_fast = PySequence_Fast(data_arg,
3414 "sendmsg() argument 1 must be an "
3415 "iterable")) == NULL)
3416 goto finally;
3417 ndataparts = PySequence_Fast_GET_SIZE(data_fast);
3418 if (ndataparts > INT_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003419 PyErr_SetString(PyExc_OSError, "sendmsg() argument 1 is too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003420 goto finally;
3421 }
3422 msg.msg_iovlen = ndataparts;
3423 if (ndataparts > 0 &&
3424 ((msg.msg_iov = iovs = PyMem_New(struct iovec, ndataparts)) == NULL ||
3425 (databufs = PyMem_New(Py_buffer, ndataparts)) == NULL)) {
3426 PyErr_NoMemory();
3427 goto finally;
3428 }
3429 for (; ndatabufs < ndataparts; ndatabufs++) {
3430 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(data_fast, ndatabufs),
3431 "y*;sendmsg() argument 1 must be an iterable of "
3432 "buffer-compatible objects",
3433 &databufs[ndatabufs]))
3434 goto finally;
3435 iovs[ndatabufs].iov_base = databufs[ndatabufs].buf;
3436 iovs[ndatabufs].iov_len = databufs[ndatabufs].len;
3437 }
3438
3439 if (cmsg_arg == NULL)
3440 ncmsgs = 0;
3441 else {
3442 if ((cmsg_fast = PySequence_Fast(cmsg_arg,
3443 "sendmsg() argument 2 must be an "
3444 "iterable")) == NULL)
3445 goto finally;
3446 ncmsgs = PySequence_Fast_GET_SIZE(cmsg_fast);
3447 }
3448
3449#ifndef CMSG_SPACE
3450 if (ncmsgs > 1) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003451 PyErr_SetString(PyExc_OSError,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003452 "sending multiple control messages is not supported "
3453 "on this system");
3454 goto finally;
3455 }
3456#endif
3457 /* Save level, type and Py_buffer for each control message,
3458 and calculate total size. */
3459 if (ncmsgs > 0 && (cmsgs = PyMem_New(struct cmsginfo, ncmsgs)) == NULL) {
3460 PyErr_NoMemory();
3461 goto finally;
3462 }
3463 controllen = controllen_last = 0;
3464 while (ncmsgbufs < ncmsgs) {
3465 size_t bufsize, space;
3466
3467 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(cmsg_fast, ncmsgbufs),
3468 "(iiy*):[sendmsg() ancillary data items]",
3469 &cmsgs[ncmsgbufs].level,
3470 &cmsgs[ncmsgbufs].type,
3471 &cmsgs[ncmsgbufs].data))
3472 goto finally;
3473 bufsize = cmsgs[ncmsgbufs++].data.len;
3474
3475#ifdef CMSG_SPACE
3476 if (!get_CMSG_SPACE(bufsize, &space)) {
3477#else
3478 if (!get_CMSG_LEN(bufsize, &space)) {
3479#endif
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003480 PyErr_SetString(PyExc_OSError, "ancillary data item too large");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003481 goto finally;
3482 }
3483 controllen += space;
3484 if (controllen > SOCKLEN_T_LIMIT || controllen < controllen_last) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003485 PyErr_SetString(PyExc_OSError, "too much ancillary data");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003486 goto finally;
3487 }
3488 controllen_last = controllen;
3489 }
3490
3491 /* Construct ancillary data block from control message info. */
3492 if (ncmsgbufs > 0) {
3493 struct cmsghdr *cmsgh = NULL;
3494
3495 if ((msg.msg_control = controlbuf =
3496 PyMem_Malloc(controllen)) == NULL) {
3497 PyErr_NoMemory();
3498 goto finally;
3499 }
3500 msg.msg_controllen = controllen;
3501
3502 /* Need to zero out the buffer as a workaround for glibc's
3503 CMSG_NXTHDR() implementation. After getting the pointer to
3504 the next header, it checks its (uninitialized) cmsg_len
3505 member to see if the "message" fits in the buffer, and
3506 returns NULL if it doesn't. Zero-filling the buffer
3507 ensures that that doesn't happen. */
3508 memset(controlbuf, 0, controllen);
3509
3510 for (i = 0; i < ncmsgbufs; i++) {
3511 size_t msg_len, data_len = cmsgs[i].data.len;
3512 int enough_space = 0;
3513
3514 cmsgh = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsgh);
3515 if (cmsgh == NULL) {
3516 PyErr_Format(PyExc_RuntimeError,
3517 "unexpected NULL result from %s()",
3518 (i == 0) ? "CMSG_FIRSTHDR" : "CMSG_NXTHDR");
3519 goto finally;
3520 }
3521 if (!get_CMSG_LEN(data_len, &msg_len)) {
3522 PyErr_SetString(PyExc_RuntimeError,
3523 "item size out of range for CMSG_LEN()");
3524 goto finally;
3525 }
3526 if (cmsg_min_space(&msg, cmsgh, msg_len)) {
3527 size_t space;
3528
3529 cmsgh->cmsg_len = msg_len;
3530 if (get_cmsg_data_space(&msg, cmsgh, &space))
3531 enough_space = (space >= data_len);
3532 }
3533 if (!enough_space) {
3534 PyErr_SetString(PyExc_RuntimeError,
3535 "ancillary data does not fit in calculated "
3536 "space");
3537 goto finally;
3538 }
3539 cmsgh->cmsg_level = cmsgs[i].level;
3540 cmsgh->cmsg_type = cmsgs[i].type;
3541 memcpy(CMSG_DATA(cmsgh), cmsgs[i].data.buf, data_len);
3542 }
3543 }
3544
3545 /* Make the system call. */
3546 if (!IS_SELECTABLE(s)) {
3547 select_error();
3548 goto finally;
3549 }
3550
3551 BEGIN_SELECT_LOOP(s)
3552 Py_BEGIN_ALLOW_THREADS;
3553 timeout = internal_select_ex(s, 1, interval);
3554 if (!timeout)
3555 bytes_sent = sendmsg(s->sock_fd, &msg, flags);
3556 Py_END_ALLOW_THREADS;
3557 if (timeout == 1) {
3558 PyErr_SetString(socket_timeout, "timed out");
3559 goto finally;
3560 }
3561 END_SELECT_LOOP(s)
3562
3563 if (bytes_sent < 0) {
3564 s->errorhandler();
3565 goto finally;
3566 }
3567 retval = PyLong_FromSsize_t(bytes_sent);
3568
3569finally:
3570 PyMem_Free(controlbuf);
3571 for (i = 0; i < ncmsgbufs; i++)
3572 PyBuffer_Release(&cmsgs[i].data);
3573 PyMem_Free(cmsgs);
3574 Py_XDECREF(cmsg_fast);
3575 for (i = 0; i < ndatabufs; i++)
3576 PyBuffer_Release(&databufs[i]);
3577 PyMem_Free(databufs);
3578 PyMem_Free(iovs);
3579 Py_XDECREF(data_fast);
3580 return retval;
3581}
3582
3583PyDoc_STRVAR(sendmsg_doc,
3584"sendmsg(buffers[, ancdata[, flags[, address]]]) -> count\n\
3585\n\
3586Send normal and ancillary data to the socket, gathering the\n\
3587non-ancillary data from a series of buffers and concatenating it into\n\
3588a single message. The buffers argument specifies the non-ancillary\n\
3589data as an iterable of buffer-compatible objects (e.g. bytes objects).\n\
3590The ancdata argument specifies the ancillary data (control messages)\n\
3591as an iterable of zero or more tuples (cmsg_level, cmsg_type,\n\
3592cmsg_data), where cmsg_level and cmsg_type are integers specifying the\n\
3593protocol level and protocol-specific type respectively, and cmsg_data\n\
3594is a buffer-compatible object holding the associated data. The flags\n\
3595argument defaults to 0 and has the same meaning as for send(). If\n\
3596address is supplied and not None, it sets a destination address for\n\
3597the message. The return value is the number of bytes of non-ancillary\n\
3598data sent.");
3599#endif /* CMSG_LEN */
3600
3601
Guido van Rossum30a685f1991-06-27 15:51:29 +00003602/* s.shutdown(how) method */
3603
Guido van Rossum73624e91994-10-10 17:59:00 +00003604static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003605sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003606{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003607 int how;
3608 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003609
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003610 how = PyLong_AsLong(arg);
3611 if (how == -1 && PyErr_Occurred())
3612 return NULL;
3613 Py_BEGIN_ALLOW_THREADS
3614 res = shutdown(s->sock_fd, how);
3615 Py_END_ALLOW_THREADS
3616 if (res < 0)
3617 return s->errorhandler();
3618 Py_INCREF(Py_None);
3619 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003620}
3621
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003622PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003623"shutdown(flag)\n\
3624\n\
Martin v. Löwis94681fc2003-11-27 19:40:22 +00003625Shut down the reading side of the socket (flag == SHUT_RD), the writing side\n\
3626of the socket (flag == SHUT_WR), or both ends (flag == SHUT_RDWR).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003627
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00003628#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Christian Heimesfaf2f632008-01-06 16:59:19 +00003629static PyObject*
3630sock_ioctl(PySocketSockObject *s, PyObject *arg)
3631{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003632 unsigned long cmd = SIO_RCVALL;
3633 PyObject *argO;
3634 DWORD recv;
Christian Heimesfaf2f632008-01-06 16:59:19 +00003635
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003636 if (!PyArg_ParseTuple(arg, "kO:ioctl", &cmd, &argO))
3637 return NULL;
Christian Heimesfaf2f632008-01-06 16:59:19 +00003638
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003639 switch (cmd) {
3640 case SIO_RCVALL: {
3641 unsigned int option = RCVALL_ON;
3642 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
3643 return NULL;
3644 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
3645 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
3646 return set_error();
3647 }
3648 return PyLong_FromUnsignedLong(recv); }
3649 case SIO_KEEPALIVE_VALS: {
3650 struct tcp_keepalive ka;
3651 if (!PyArg_ParseTuple(arg, "k(kkk):ioctl", &cmd,
3652 &ka.onoff, &ka.keepalivetime, &ka.keepaliveinterval))
3653 return NULL;
3654 if (WSAIoctl(s->sock_fd, cmd, &ka, sizeof(ka),
3655 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
3656 return set_error();
3657 }
3658 return PyLong_FromUnsignedLong(recv); }
3659 default:
3660 PyErr_Format(PyExc_ValueError, "invalid ioctl command %d", cmd);
3661 return NULL;
3662 }
Christian Heimesfaf2f632008-01-06 16:59:19 +00003663}
3664PyDoc_STRVAR(sock_ioctl_doc,
3665"ioctl(cmd, option) -> long\n\
3666\n\
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00003667Control the socket with WSAIoctl syscall. Currently supported 'cmd' values are\n\
3668SIO_RCVALL: 'option' must be one of the socket.RCVALL_* constants.\n\
3669SIO_KEEPALIVE_VALS: 'option' is a tuple of (onoff, timeout, interval).");
Christian Heimesfaf2f632008-01-06 16:59:19 +00003670
3671#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00003672
3673/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003674
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003675static PyMethodDef sock_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003676 {"_accept", (PyCFunction)sock_accept, METH_NOARGS,
3677 accept_doc},
3678 {"bind", (PyCFunction)sock_bind, METH_O,
3679 bind_doc},
3680 {"close", (PyCFunction)sock_close, METH_NOARGS,
3681 close_doc},
3682 {"connect", (PyCFunction)sock_connect, METH_O,
3683 connect_doc},
3684 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
3685 connect_ex_doc},
Antoine Pitrou6e451df2010-08-09 20:39:54 +00003686 {"detach", (PyCFunction)sock_detach, METH_NOARGS,
3687 detach_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003688 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
3689 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00003690#ifdef HAVE_GETPEERNAME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003691 {"getpeername", (PyCFunction)sock_getpeername,
3692 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00003693#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003694 {"getsockname", (PyCFunction)sock_getsockname,
3695 METH_NOARGS, getsockname_doc},
3696 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
3697 getsockopt_doc},
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00003698#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003699 {"ioctl", (PyCFunction)sock_ioctl, METH_VARARGS,
3700 sock_ioctl_doc},
Christian Heimesfaf2f632008-01-06 16:59:19 +00003701#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003702 {"listen", (PyCFunction)sock_listen, METH_O,
3703 listen_doc},
3704 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
3705 recv_doc},
3706 {"recv_into", (PyCFunction)sock_recv_into, METH_VARARGS | METH_KEYWORDS,
3707 recv_into_doc},
3708 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
3709 recvfrom_doc},
3710 {"recvfrom_into", (PyCFunction)sock_recvfrom_into, METH_VARARGS | METH_KEYWORDS,
3711 recvfrom_into_doc},
3712 {"send", (PyCFunction)sock_send, METH_VARARGS,
3713 send_doc},
3714 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
3715 sendall_doc},
3716 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
3717 sendto_doc},
3718 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
3719 setblocking_doc},
3720 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
3721 settimeout_doc},
3722 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
3723 gettimeout_doc},
3724 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
3725 setsockopt_doc},
3726 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
3727 shutdown_doc},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003728#ifdef CMSG_LEN
3729 {"recvmsg", (PyCFunction)sock_recvmsg, METH_VARARGS,
3730 recvmsg_doc},
3731 {"recvmsg_into", (PyCFunction)sock_recvmsg_into, METH_VARARGS,
3732 recvmsg_into_doc,},
3733 {"sendmsg", (PyCFunction)sock_sendmsg, METH_VARARGS,
3734 sendmsg_doc},
3735#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003736 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003737};
3738
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003739/* SockObject members */
3740static PyMemberDef sock_memberlist[] = {
3741 {"family", T_INT, offsetof(PySocketSockObject, sock_family), READONLY, "the socket family"},
3742 {"type", T_INT, offsetof(PySocketSockObject, sock_type), READONLY, "the socket type"},
3743 {"proto", T_INT, offsetof(PySocketSockObject, sock_proto), READONLY, "the socket protocol"},
3744 {"timeout", T_DOUBLE, offsetof(PySocketSockObject, sock_timeout), READONLY, "the socket timeout"},
3745 {0},
3746};
Guido van Rossum30a685f1991-06-27 15:51:29 +00003747
Guido van Rossum73624e91994-10-10 17:59:00 +00003748/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00003749 First close the file description. */
3750
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003751static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003752sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003753{
Antoine Pitroue033e062010-10-29 10:38:18 +00003754 if (s->sock_fd != -1) {
3755 PyObject *exc, *val, *tb;
3756 Py_ssize_t old_refcount = Py_REFCNT(s);
3757 ++Py_REFCNT(s);
3758 PyErr_Fetch(&exc, &val, &tb);
3759 if (PyErr_WarnFormat(PyExc_ResourceWarning, 1,
3760 "unclosed %R", s))
3761 /* Spurious errors can appear at shutdown */
3762 if (PyErr_ExceptionMatches(PyExc_Warning))
3763 PyErr_WriteUnraisable((PyObject *) s);
3764 PyErr_Restore(exc, val, tb);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003765 (void) SOCKETCLOSE(s->sock_fd);
Antoine Pitroue033e062010-10-29 10:38:18 +00003766 Py_REFCNT(s) = old_refcount;
3767 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003768 Py_TYPE(s)->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003769}
3770
Guido van Rossum30a685f1991-06-27 15:51:29 +00003771
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003772static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003773sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003774{
Fred Drakea04eaad2000-06-30 02:46:07 +00003775#if SIZEOF_SOCKET_T > SIZEOF_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003776 if (s->sock_fd > LONG_MAX) {
3777 /* this can occur on Win64, and actually there is a special
3778 ugly printf formatter for decimal pointer length integer
3779 printing, only bother if necessary*/
3780 PyErr_SetString(PyExc_OverflowError,
3781 "no printf formatter to display "
3782 "the socket descriptor in decimal");
3783 return NULL;
3784 }
Fred Drakea04eaad2000-06-30 02:46:07 +00003785#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003786 return PyUnicode_FromFormat(
3787 "<socket object, fd=%ld, family=%d, type=%d, proto=%d>",
3788 (long)s->sock_fd, s->sock_family,
3789 s->sock_type,
3790 s->sock_proto);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003791}
3792
3793
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003794/* Create a new, uninitialized socket object. */
3795
3796static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003797sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003798{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003799 PyObject *new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003800
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003801 new = type->tp_alloc(type, 0);
3802 if (new != NULL) {
3803 ((PySocketSockObject *)new)->sock_fd = -1;
3804 ((PySocketSockObject *)new)->sock_timeout = -1.0;
3805 ((PySocketSockObject *)new)->errorhandler = &set_error;
3806 }
3807 return new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003808}
3809
3810
3811/* Initialize a new socket object. */
3812
3813/*ARGSUSED*/
3814static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00003815sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003816{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003817 PySocketSockObject *s = (PySocketSockObject *)self;
3818 PyObject *fdobj = NULL;
3819 SOCKET_T fd = INVALID_SOCKET;
3820 int family = AF_INET, type = SOCK_STREAM, proto = 0;
3821 static char *keywords[] = {"family", "type", "proto", "fileno", 0};
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003822
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003823 if (!PyArg_ParseTupleAndKeywords(args, kwds,
3824 "|iiiO:socket", keywords,
3825 &family, &type, &proto, &fdobj))
3826 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003827
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003828 if (fdobj != NULL && fdobj != Py_None) {
3829 fd = PyLong_AsSocket_t(fdobj);
3830 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
3831 return -1;
3832 if (fd == INVALID_SOCKET) {
3833 PyErr_SetString(PyExc_ValueError,
3834 "can't use invalid socket value");
3835 return -1;
3836 }
3837 }
3838 else {
3839 Py_BEGIN_ALLOW_THREADS
3840 fd = socket(family, type, proto);
3841 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00003842
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003843 if (fd == INVALID_SOCKET) {
3844 set_error();
3845 return -1;
3846 }
3847 }
3848 init_sockobject(s, fd, family, type, proto);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003849
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003850 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003851
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003852}
3853
3854
Guido van Rossumb6775db1994-08-01 11:34:53 +00003855/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003856
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003857static PyTypeObject sock_type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003858 PyVarObject_HEAD_INIT(0, 0) /* Must fill in type value later */
3859 "_socket.socket", /* tp_name */
3860 sizeof(PySocketSockObject), /* tp_basicsize */
3861 0, /* tp_itemsize */
3862 (destructor)sock_dealloc, /* tp_dealloc */
3863 0, /* tp_print */
3864 0, /* tp_getattr */
3865 0, /* tp_setattr */
3866 0, /* tp_reserved */
3867 (reprfunc)sock_repr, /* tp_repr */
3868 0, /* tp_as_number */
3869 0, /* tp_as_sequence */
3870 0, /* tp_as_mapping */
3871 0, /* tp_hash */
3872 0, /* tp_call */
3873 0, /* tp_str */
3874 PyObject_GenericGetAttr, /* tp_getattro */
3875 0, /* tp_setattro */
3876 0, /* tp_as_buffer */
3877 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
3878 sock_doc, /* tp_doc */
3879 0, /* tp_traverse */
3880 0, /* tp_clear */
3881 0, /* tp_richcompare */
3882 0, /* tp_weaklistoffset */
3883 0, /* tp_iter */
3884 0, /* tp_iternext */
3885 sock_methods, /* tp_methods */
3886 sock_memberlist, /* tp_members */
3887 0, /* tp_getset */
3888 0, /* tp_base */
3889 0, /* tp_dict */
3890 0, /* tp_descr_get */
3891 0, /* tp_descr_set */
3892 0, /* tp_dictoffset */
3893 sock_initobj, /* tp_init */
3894 PyType_GenericAlloc, /* tp_alloc */
3895 sock_new, /* tp_new */
3896 PyObject_Del, /* tp_free */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003897};
3898
Guido van Rossum30a685f1991-06-27 15:51:29 +00003899
Guido van Rossum81194471991-07-27 21:42:02 +00003900/* Python interface to gethostname(). */
3901
3902/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00003903static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00003904socket_gethostname(PyObject *self, PyObject *unused)
Guido van Rossum81194471991-07-27 21:42:02 +00003905{
Martin v. Löwis72f48422010-10-29 18:20:08 +00003906#ifdef MS_WINDOWS
3907 /* Don't use winsock's gethostname, as this returns the ANSI
3908 version of the hostname, whereas we need a Unicode string.
3909 Otherwise, gethostname apparently also returns the DNS name. */
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00003910 wchar_t buf[MAX_COMPUTERNAME_LENGTH + 1];
Victor Stinner63941882011-09-29 00:42:28 +02003911 DWORD size = Py_ARRAY_LENGTH(buf);
Victor Stinner74168972011-11-17 01:11:36 +01003912 wchar_t *name;
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00003913 PyObject *result;
Victor Stinner74168972011-11-17 01:11:36 +01003914
3915 if (GetComputerNameExW(ComputerNamePhysicalDnsHostname, buf, &size))
Victor Stinner9d3b93b2011-11-22 02:27:30 +01003916 return PyUnicode_FromWideChar(buf, size);
Victor Stinner74168972011-11-17 01:11:36 +01003917
3918 if (GetLastError() != ERROR_MORE_DATA)
3919 return PyErr_SetFromWindowsErr(0);
3920
3921 if (size == 0)
3922 return PyUnicode_New(0, 0);
3923
3924 /* MSDN says ERROR_MORE_DATA may occur because DNS allows longer
3925 names */
3926 name = PyMem_Malloc(size * sizeof(wchar_t));
3927 if (!name)
3928 return NULL;
3929 if (!GetComputerNameExW(ComputerNamePhysicalDnsHostname,
3930 name,
3931 &size))
3932 {
3933 PyMem_Free(name);
3934 return PyErr_SetFromWindowsErr(0);
Martin v. Löwis72f48422010-10-29 18:20:08 +00003935 }
Victor Stinner74168972011-11-17 01:11:36 +01003936
3937 result = PyUnicode_FromWideChar(name, size);
3938 PyMem_Free(name);
3939 return result;
Martin v. Löwis72f48422010-10-29 18:20:08 +00003940#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003941 char buf[1024];
3942 int res;
3943 Py_BEGIN_ALLOW_THREADS
3944 res = gethostname(buf, (int) sizeof buf - 1);
3945 Py_END_ALLOW_THREADS
3946 if (res < 0)
3947 return set_error();
3948 buf[sizeof buf - 1] = '\0';
3949 return PyUnicode_FromString(buf);
Martin v. Löwis72f48422010-10-29 18:20:08 +00003950#endif
Guido van Rossum81194471991-07-27 21:42:02 +00003951}
Guido van Rossumff4949e1992-08-05 19:58:53 +00003952
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003953PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003954"gethostname() -> string\n\
3955\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003956Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003957
Antoine Pitrou061cfb52011-02-28 22:25:22 +00003958#ifdef HAVE_SETHOSTNAME
3959PyDoc_STRVAR(sethostname_doc,
3960"sethostname(name)\n\n\
3961Sets the hostname to name.");
3962
3963static PyObject *
3964socket_sethostname(PyObject *self, PyObject *args)
3965{
3966 PyObject *hnobj;
3967 Py_buffer buf;
3968 int res, flag = 0;
3969
3970 if (!PyArg_ParseTuple(args, "S:sethostname", &hnobj)) {
3971 PyErr_Clear();
3972 if (!PyArg_ParseTuple(args, "O&:sethostname",
3973 PyUnicode_FSConverter, &hnobj))
3974 return NULL;
3975 flag = 1;
3976 }
3977 res = PyObject_GetBuffer(hnobj, &buf, PyBUF_SIMPLE);
3978 if (!res) {
3979 res = sethostname(buf.buf, buf.len);
3980 PyBuffer_Release(&buf);
3981 }
3982 if (flag)
3983 Py_DECREF(hnobj);
3984 if (res)
3985 return set_error();
3986 Py_RETURN_NONE;
3987}
3988#endif
Guido van Rossumff4949e1992-08-05 19:58:53 +00003989
Guido van Rossum30a685f1991-06-27 15:51:29 +00003990/* Python interface to gethostbyname(name). */
3991
3992/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00003993static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003994socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003995{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003996 char *name;
3997 sock_addr_t addrbuf;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00003998 PyObject *ret = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003999
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004000 if (!PyArg_ParseTuple(args, "et:gethostbyname", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004001 return NULL;
4002 if (setipaddr(name, SAS2SA(&addrbuf), sizeof(addrbuf), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004003 goto finally;
4004 ret = makeipaddr(SAS2SA(&addrbuf), sizeof(struct sockaddr_in));
4005finally:
4006 PyMem_Free(name);
4007 return ret;
Guido van Rossum30a685f1991-06-27 15:51:29 +00004008}
4009
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004010PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004011"gethostbyname(host) -> address\n\
4012\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004013Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004014
4015
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004016/* Convenience function common to gethostbyname_ex and gethostbyaddr */
4017
4018static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004019gethost_common(struct hostent *h, struct sockaddr *addr, int alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004020{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004021 char **pch;
4022 PyObject *rtn_tuple = (PyObject *)NULL;
4023 PyObject *name_list = (PyObject *)NULL;
4024 PyObject *addr_list = (PyObject *)NULL;
4025 PyObject *tmp;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004026
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004027 if (h == NULL) {
4028 /* Let's get real error message to return */
4029 set_herror(h_errno);
4030 return NULL;
4031 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004032
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004033 if (h->h_addrtype != af) {
4034 /* Let's get real error message to return */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004035 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004036 (char *)strerror(EAFNOSUPPORT));
Christian Heimesada8c3b2008-03-18 18:26:33 +00004037
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;
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00004152#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004153 struct sockaddr_storage addr;
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00004154#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004155 struct sockaddr_in addr;
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00004156#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004157 struct sockaddr *sa;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004158 PyObject *ret = NULL;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004159#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004160 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004161#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004162 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004163#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004164 char buf[16384];
4165 int buf_len = (sizeof buf) - 1;
4166 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004167#endif
4168#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004169 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004170#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004171#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004172
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004173 if (!PyArg_ParseTuple(args, "et:gethostbyname_ex", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004174 return NULL;
4175 if (setipaddr(name, (struct sockaddr *)&addr, sizeof(addr), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004176 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004177 Py_BEGIN_ALLOW_THREADS
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004178#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004179#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004180 result = gethostbyname_r(name, &hp_allocated, buf, buf_len,
4181 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004182#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004183 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004184#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004185 memset((void *) &data, '\0', sizeof(data));
4186 result = gethostbyname_r(name, &hp_allocated, &data);
4187 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004188#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004189#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00004190#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004191 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004192#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004193 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004194#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004195 Py_END_ALLOW_THREADS
4196 /* Some C libraries would require addr.__ss_family instead of
4197 addr.ss_family.
4198 Therefore, we cast the sockaddr_storage into sockaddr to
4199 access sa_family. */
4200 sa = (struct sockaddr*)&addr;
4201 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr),
4202 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00004203#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004204 PyThread_release_lock(netdb_lock);
Guido van Rossum955becc1999-03-22 20:14:53 +00004205#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004206finally:
4207 PyMem_Free(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004208 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004209}
4210
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004211PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004212"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
4213\n\
4214Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004215for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004216
4217
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004218/* Python interface to gethostbyaddr(IP). */
4219
4220/*ARGSUSED*/
4221static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004222socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004223{
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004224#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004225 struct sockaddr_storage addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004226#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004227 struct sockaddr_in addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004228#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004229 struct sockaddr *sa = (struct sockaddr *)&addr;
4230 char *ip_num;
4231 struct hostent *h;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004232 PyObject *ret = NULL;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004233#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004234 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004235#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004236 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004237#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004238 /* glibcs up to 2.10 assume that the buf argument to
4239 gethostbyaddr_r is 8-byte aligned, which at least llvm-gcc
4240 does not ensure. The attribute below instructs the compiler
4241 to maintain this alignment. */
4242 char buf[16384] Py_ALIGNED(8);
4243 int buf_len = (sizeof buf) - 1;
4244 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004245#endif
4246#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004247 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004248#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004249#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004250 char *ap;
4251 int al;
4252 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004253
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004254 if (!PyArg_ParseTuple(args, "et:gethostbyaddr", "idna", &ip_num))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004255 return NULL;
4256 af = AF_UNSPEC;
4257 if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004258 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004259 af = sa->sa_family;
4260 ap = NULL;
Brett Cannonb94767f2011-02-22 20:15:44 +00004261 /* al = 0; */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004262 switch (af) {
4263 case AF_INET:
4264 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
4265 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
4266 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004267#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004268 case AF_INET6:
4269 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
4270 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
4271 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004272#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004273 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004274 PyErr_SetString(PyExc_OSError, "unsupported address family");
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004275 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004276 }
4277 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004278#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004279#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004280 result = gethostbyaddr_r(ap, al, af,
4281 &hp_allocated, buf, buf_len,
4282 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004283#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004284 h = gethostbyaddr_r(ap, al, af,
4285 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004286#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004287 memset((void *) &data, '\0', sizeof(data));
4288 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
4289 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004290#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004291#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00004292#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004293 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004294#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004295 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004296#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004297 Py_END_ALLOW_THREADS
4298 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00004299#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004300 PyThread_release_lock(netdb_lock);
Guido van Rossum3baaa131999-03-22 21:44:51 +00004301#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004302finally:
4303 PyMem_Free(ip_num);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004304 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004305}
4306
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004307PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004308"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
4309\n\
4310Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004311for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004312
Guido van Rossum30a685f1991-06-27 15:51:29 +00004313
4314/* Python interface to getservbyname(name).
4315 This only returns the port number, since the other info is already
4316 known or not useful (like the list of aliases). */
4317
4318/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004319static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004320socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00004321{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004322 char *name, *proto=NULL;
4323 struct servent *sp;
4324 if (!PyArg_ParseTuple(args, "s|s:getservbyname", &name, &proto))
4325 return NULL;
4326 Py_BEGIN_ALLOW_THREADS
4327 sp = getservbyname(name, proto);
4328 Py_END_ALLOW_THREADS
4329 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004330 PyErr_SetString(PyExc_OSError, "service/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004331 return NULL;
4332 }
4333 return PyLong_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00004334}
4335
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004336PyDoc_STRVAR(getservbyname_doc,
Barry Warsaw11b91a02004-06-28 00:50:43 +00004337"getservbyname(servicename[, protocolname]) -> integer\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00004338\n\
4339Return a port number from a service name and protocol name.\n\
Barry Warsaw11b91a02004-06-28 00:50:43 +00004340The optional protocol name, if given, should be 'tcp' or 'udp',\n\
4341otherwise any protocol will match.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004342
Guido van Rossum30a685f1991-06-27 15:51:29 +00004343
Barry Warsaw11b91a02004-06-28 00:50:43 +00004344/* Python interface to getservbyport(port).
4345 This only returns the service name, since the other info is already
4346 known or not useful (like the list of aliases). */
4347
4348/*ARGSUSED*/
4349static PyObject *
4350socket_getservbyport(PyObject *self, PyObject *args)
4351{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004352 int port;
4353 char *proto=NULL;
4354 struct servent *sp;
4355 if (!PyArg_ParseTuple(args, "i|s:getservbyport", &port, &proto))
4356 return NULL;
4357 if (port < 0 || port > 0xffff) {
4358 PyErr_SetString(
4359 PyExc_OverflowError,
4360 "getservbyport: port must be 0-65535.");
4361 return NULL;
4362 }
4363 Py_BEGIN_ALLOW_THREADS
4364 sp = getservbyport(htons((short)port), proto);
4365 Py_END_ALLOW_THREADS
4366 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004367 PyErr_SetString(PyExc_OSError, "port/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004368 return NULL;
4369 }
4370 return PyUnicode_FromString(sp->s_name);
Barry Warsaw11b91a02004-06-28 00:50:43 +00004371}
4372
4373PyDoc_STRVAR(getservbyport_doc,
4374"getservbyport(port[, protocolname]) -> string\n\
4375\n\
4376Return the service name from a port number and protocol name.\n\
4377The optional protocol name, if given, should be 'tcp' or 'udp',\n\
4378otherwise any protocol will match.");
4379
Guido van Rossum3901d851996-12-19 16:35:04 +00004380/* Python interface to getprotobyname(name).
4381 This only returns the protocol number, since the other info is
4382 already known or not useful (like the list of aliases). */
4383
4384/*ARGSUSED*/
4385static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004386socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00004387{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004388 char *name;
4389 struct protoent *sp;
4390 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
4391 return NULL;
4392 Py_BEGIN_ALLOW_THREADS
4393 sp = getprotobyname(name);
4394 Py_END_ALLOW_THREADS
4395 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004396 PyErr_SetString(PyExc_OSError, "protocol not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004397 return NULL;
4398 }
4399 return PyLong_FromLong((long) sp->p_proto);
Guido van Rossum3901d851996-12-19 16:35:04 +00004400}
4401
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004402PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004403"getprotobyname(name) -> integer\n\
4404\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004405Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004406
Guido van Rossum3901d851996-12-19 16:35:04 +00004407
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004408#ifndef NO_DUP
4409/* dup() function for socket fds */
4410
4411static PyObject *
4412socket_dup(PyObject *self, PyObject *fdobj)
4413{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004414 SOCKET_T fd, newfd;
4415 PyObject *newfdobj;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004416
4417
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004418 fd = PyLong_AsSocket_t(fdobj);
4419 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
4420 return NULL;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004421
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004422 newfd = dup_socket(fd);
4423 if (newfd == INVALID_SOCKET)
4424 return set_error();
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004425
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004426 newfdobj = PyLong_FromSocket_t(newfd);
4427 if (newfdobj == NULL)
4428 SOCKETCLOSE(newfd);
4429 return newfdobj;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004430}
4431
4432PyDoc_STRVAR(dup_doc,
4433"dup(integer) -> integer\n\
4434\n\
4435Duplicate an integer socket file descriptor. This is like os.dup(), but for\n\
4436sockets; on some platforms os.dup() won't work for socket file descriptors.");
4437#endif
4438
4439
Dave Cole331708b2004-08-09 04:51:41 +00004440#ifdef HAVE_SOCKETPAIR
4441/* Create a pair of sockets using the socketpair() function.
Dave Cole07fda7e2004-08-23 05:16:23 +00004442 Arguments as for socket() except the default family is AF_UNIX if
Dave Colee8bbfe42004-08-26 00:51:16 +00004443 defined on the platform; otherwise, the default is AF_INET. */
Dave Cole331708b2004-08-09 04:51:41 +00004444
4445/*ARGSUSED*/
4446static PyObject *
4447socket_socketpair(PyObject *self, PyObject *args)
4448{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004449 PySocketSockObject *s0 = NULL, *s1 = NULL;
4450 SOCKET_T sv[2];
4451 int family, type = SOCK_STREAM, proto = 0;
4452 PyObject *res = NULL;
Dave Cole331708b2004-08-09 04:51:41 +00004453
4454#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004455 family = AF_UNIX;
Dave Cole331708b2004-08-09 04:51:41 +00004456#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004457 family = AF_INET;
Dave Cole331708b2004-08-09 04:51:41 +00004458#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004459 if (!PyArg_ParseTuple(args, "|iii:socketpair",
4460 &family, &type, &proto))
4461 return NULL;
4462 /* Create a pair of socket fds */
4463 if (socketpair(family, type, proto, sv) < 0)
4464 return set_error();
4465 s0 = new_sockobject(sv[0], family, type, proto);
4466 if (s0 == NULL)
4467 goto finally;
4468 s1 = new_sockobject(sv[1], family, type, proto);
4469 if (s1 == NULL)
4470 goto finally;
4471 res = PyTuple_Pack(2, s0, s1);
Dave Cole331708b2004-08-09 04:51:41 +00004472
4473finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004474 if (res == NULL) {
4475 if (s0 == NULL)
4476 SOCKETCLOSE(sv[0]);
4477 if (s1 == NULL)
4478 SOCKETCLOSE(sv[1]);
4479 }
4480 Py_XDECREF(s0);
4481 Py_XDECREF(s1);
4482 return res;
Dave Cole331708b2004-08-09 04:51:41 +00004483}
4484
4485PyDoc_STRVAR(socketpair_doc,
4486"socketpair([family[, type[, proto]]]) -> (socket object, socket object)\n\
4487\n\
4488Create a pair of socket objects from the sockets returned by the platform\n\
4489socketpair() function.\n\
Dave Cole07fda7e2004-08-23 05:16:23 +00004490The arguments are the same as for socket() except the default family is\n\
Dave Colee8bbfe42004-08-26 00:51:16 +00004491AF_UNIX if defined on the platform; otherwise, the default is AF_INET.");
Dave Cole331708b2004-08-09 04:51:41 +00004492
4493#endif /* HAVE_SOCKETPAIR */
4494
4495
Guido van Rossum006bf911996-06-12 04:04:55 +00004496static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004497socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00004498{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004499 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00004500
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004501 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
4502 return NULL;
4503 }
4504 if (x1 < 0) {
4505 PyErr_SetString(PyExc_OverflowError,
4506 "can't convert negative number to unsigned long");
4507 return NULL;
4508 }
4509 x2 = (unsigned int)ntohs((unsigned short)x1);
4510 return PyLong_FromLong(x2);
Guido van Rossum006bf911996-06-12 04:04:55 +00004511}
4512
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004513PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004514"ntohs(integer) -> integer\n\
4515\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004516Convert a 16-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004517
4518
Guido van Rossum006bf911996-06-12 04:04:55 +00004519static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004520socket_ntohl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00004521{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004522 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00004523
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004524 if (PyLong_Check(arg)) {
4525 x = PyLong_AsUnsignedLong(arg);
4526 if (x == (unsigned long) -1 && PyErr_Occurred())
4527 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004528#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004529 {
4530 unsigned long y;
4531 /* only want the trailing 32 bits */
4532 y = x & 0xFFFFFFFFUL;
4533 if (y ^ x)
4534 return PyErr_Format(PyExc_OverflowError,
4535 "long int larger than 32 bits");
4536 x = y;
4537 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004538#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004539 }
4540 else
4541 return PyErr_Format(PyExc_TypeError,
4542 "expected int/long, %s found",
4543 Py_TYPE(arg)->tp_name);
4544 if (x == (unsigned long) -1 && PyErr_Occurred())
4545 return NULL;
4546 return PyLong_FromUnsignedLong(ntohl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00004547}
4548
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004549PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004550"ntohl(integer) -> integer\n\
4551\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004552Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004553
4554
Guido van Rossum006bf911996-06-12 04:04:55 +00004555static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004556socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00004557{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004558 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00004559
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004560 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
4561 return NULL;
4562 }
4563 if (x1 < 0) {
4564 PyErr_SetString(PyExc_OverflowError,
4565 "can't convert negative number to unsigned long");
4566 return NULL;
4567 }
4568 x2 = (unsigned int)htons((unsigned short)x1);
4569 return PyLong_FromLong(x2);
Guido van Rossum006bf911996-06-12 04:04:55 +00004570}
4571
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004572PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004573"htons(integer) -> integer\n\
4574\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004575Convert a 16-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004576
4577
Guido van Rossum006bf911996-06-12 04:04:55 +00004578static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004579socket_htonl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00004580{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004581 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00004582
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004583 if (PyLong_Check(arg)) {
4584 x = PyLong_AsUnsignedLong(arg);
4585 if (x == (unsigned long) -1 && PyErr_Occurred())
4586 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004587#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004588 {
4589 unsigned long y;
4590 /* only want the trailing 32 bits */
4591 y = x & 0xFFFFFFFFUL;
4592 if (y ^ x)
4593 return PyErr_Format(PyExc_OverflowError,
4594 "long int larger than 32 bits");
4595 x = y;
4596 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004597#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004598 }
4599 else
4600 return PyErr_Format(PyExc_TypeError,
4601 "expected int/long, %s found",
4602 Py_TYPE(arg)->tp_name);
4603 return PyLong_FromUnsignedLong(htonl((unsigned long)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00004604}
4605
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004606PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004607"htonl(integer) -> integer\n\
4608\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004609Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004610
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004611/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004612
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004613PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004614"inet_aton(string) -> bytes giving packed 32-bit IP representation\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004615\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00004616Convert 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 +00004617binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004618
4619static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004620socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004621{
Guido van Rossuma2e48551999-09-09 15:42:59 +00004622#ifndef INADDR_NONE
4623#define INADDR_NONE (-1)
4624#endif
Neal Norwitz88f115b2003-02-13 02:15:42 +00004625#ifdef HAVE_INET_ATON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004626 struct in_addr buf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00004627#endif
4628
4629#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
Benjamin Petersonf91df042009-02-13 02:50:59 +00004630#if (SIZEOF_INT != 4)
4631#error "Not sure if in_addr_t exists and int is not 32-bits."
4632#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004633 /* Have to use inet_addr() instead */
4634 unsigned int packed_addr;
Tim Peters1df9fdd2003-02-13 03:13:40 +00004635#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004636 char *ip_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00004637
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004638 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))
4639 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00004640
Tim Peters1df9fdd2003-02-13 03:13:40 +00004641
4642#ifdef HAVE_INET_ATON
Thomas Wouters477c8d52006-05-27 19:21:47 +00004643
4644#ifdef USE_INET_ATON_WEAKLINK
4645 if (inet_aton != NULL) {
4646#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004647 if (inet_aton(ip_addr, &buf))
4648 return PyBytes_FromStringAndSize((char *)(&buf),
4649 sizeof(buf));
Guido van Rossumad05cdf2003-02-12 23:08:22 +00004650
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004651 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004652 "illegal IP address string passed to inet_aton");
4653 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00004654
Thomas Wouters477c8d52006-05-27 19:21:47 +00004655#ifdef USE_INET_ATON_WEAKLINK
4656 } else {
4657#endif
4658
4659#endif
4660
4661#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
4662
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004663 /* special-case this address as inet_addr might return INADDR_NONE
4664 * for this */
4665 if (strcmp(ip_addr, "255.255.255.255") == 0) {
4666 packed_addr = 0xFFFFFFFF;
4667 } else {
Thomas Wouters477c8d52006-05-27 19:21:47 +00004668
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004669 packed_addr = inet_addr(ip_addr);
Guido van Rossumc6a164b1999-08-20 19:11:27 +00004670
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004671 if (packed_addr == INADDR_NONE) { /* invalid address */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004672 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004673 "illegal IP address string passed to inet_aton");
4674 return NULL;
4675 }
4676 }
4677 return PyBytes_FromStringAndSize((char *) &packed_addr,
4678 sizeof(packed_addr));
Thomas Wouters477c8d52006-05-27 19:21:47 +00004679
4680#ifdef USE_INET_ATON_WEAKLINK
4681 }
4682#endif
4683
Guido van Rossumad05cdf2003-02-12 23:08:22 +00004684#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004685}
4686
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004687PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00004688"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004689\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004690Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004691
4692static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004693socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004694{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004695 char *packed_str;
4696 int addr_len;
4697 struct in_addr packed_addr;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004698
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004699 if (!PyArg_ParseTuple(args, "y#:inet_ntoa", &packed_str, &addr_len)) {
4700 return NULL;
4701 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00004702
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004703 if (addr_len != sizeof(packed_addr)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004704 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004705 "packed IP wrong length for inet_ntoa");
4706 return NULL;
4707 }
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004708
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004709 memcpy(&packed_addr, packed_str, addr_len);
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004710
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004711 return PyUnicode_FromString(inet_ntoa(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004712}
Guido van Rossum82a5c661998-07-07 20:45:43 +00004713
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004714#ifdef HAVE_INET_PTON
4715
4716PyDoc_STRVAR(inet_pton_doc,
4717"inet_pton(af, ip) -> packed IP address string\n\
4718\n\
4719Convert an IP address from string format to a packed string suitable\n\
4720for use with low-level network functions.");
4721
4722static PyObject *
4723socket_inet_pton(PyObject *self, PyObject *args)
4724{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004725 int af;
4726 char* ip;
4727 int retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004728#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004729 char packed[MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004730#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004731 char packed[sizeof(struct in_addr)];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004732#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004733 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
4734 return NULL;
4735 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004736
Martin v. Löwis04697e82004-06-02 12:35:29 +00004737#if !defined(ENABLE_IPV6) && defined(AF_INET6)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004738 if(af == AF_INET6) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004739 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004740 "can't use AF_INET6, IPv6 is disabled");
4741 return NULL;
4742 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00004743#endif
Martin v. Löwis10649092003-08-05 06:25:06 +00004744
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004745 retval = inet_pton(af, ip, packed);
4746 if (retval < 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004747 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004748 return NULL;
4749 } else if (retval == 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004750 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004751 "illegal IP address string passed to inet_pton");
4752 return NULL;
4753 } else if (af == AF_INET) {
4754 return PyBytes_FromStringAndSize(packed,
4755 sizeof(struct in_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004756#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004757 } else if (af == AF_INET6) {
4758 return PyBytes_FromStringAndSize(packed,
4759 sizeof(struct in6_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004760#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004761 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004762 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004763 return NULL;
4764 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004765}
Thomas Wouters477c8d52006-05-27 19:21:47 +00004766
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004767PyDoc_STRVAR(inet_ntop_doc,
4768"inet_ntop(af, packed_ip) -> string formatted IP address\n\
4769\n\
4770Convert a packed IP address of the given family to string format.");
4771
4772static PyObject *
4773socket_inet_ntop(PyObject *self, PyObject *args)
4774{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004775 int af;
4776 char* packed;
4777 int len;
4778 const char* retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004779#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004780 char ip[MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004781#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004782 char ip[INET_ADDRSTRLEN + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004783#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00004784
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004785 /* Guarantee NUL-termination for PyUnicode_FromString() below */
4786 memset((void *) &ip[0], '\0', sizeof(ip));
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004787
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004788 if (!PyArg_ParseTuple(args, "iy#:inet_ntop", &af, &packed, &len)) {
4789 return NULL;
4790 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004791
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004792 if (af == AF_INET) {
4793 if (len != sizeof(struct in_addr)) {
4794 PyErr_SetString(PyExc_ValueError,
4795 "invalid length of packed IP address string");
4796 return NULL;
4797 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004798#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004799 } else if (af == AF_INET6) {
4800 if (len != sizeof(struct in6_addr)) {
4801 PyErr_SetString(PyExc_ValueError,
4802 "invalid length of packed IP address string");
4803 return NULL;
4804 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004805#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004806 } else {
4807 PyErr_Format(PyExc_ValueError,
4808 "unknown address family %d", af);
4809 return NULL;
4810 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004811
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004812 retval = inet_ntop(af, packed, ip, sizeof(ip));
4813 if (!retval) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004814 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004815 return NULL;
4816 } else {
4817 return PyUnicode_FromString(retval);
4818 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004819
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004820 /* NOTREACHED */
4821 PyErr_SetString(PyExc_RuntimeError, "invalid handling of inet_ntop");
4822 return NULL;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004823}
4824
4825#endif /* HAVE_INET_PTON */
4826
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004827/* Python interface to getaddrinfo(host, port). */
4828
4829/*ARGSUSED*/
4830static PyObject *
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00004831socket_getaddrinfo(PyObject *self, PyObject *args, PyObject* kwargs)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004832{
Victor Stinner77af1722011-05-26 14:05:59 +02004833 static char* kwnames[] = {"host", "port", "family", "type", "proto",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00004834 "flags", 0};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004835 struct addrinfo hints, *res;
4836 struct addrinfo *res0 = NULL;
4837 PyObject *hobj = NULL;
4838 PyObject *pobj = (PyObject *)NULL;
4839 char pbuf[30];
4840 char *hptr, *pptr;
4841 int family, socktype, protocol, flags;
4842 int error;
4843 PyObject *all = (PyObject *)NULL;
4844 PyObject *idna = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004845
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004846 family = socktype = protocol = flags = 0;
4847 family = AF_UNSPEC;
Victor Stinner77af1722011-05-26 14:05:59 +02004848 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OO|iiii:getaddrinfo",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00004849 kwnames, &hobj, &pobj, &family, &socktype,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004850 &protocol, &flags)) {
4851 return NULL;
4852 }
4853 if (hobj == Py_None) {
4854 hptr = NULL;
4855 } else if (PyUnicode_Check(hobj)) {
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02004856 _Py_IDENTIFIER(encode);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02004857
4858 idna = _PyObject_CallMethodId(hobj, &PyId_encode, "s", "idna");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004859 if (!idna)
4860 return NULL;
4861 assert(PyBytes_Check(idna));
4862 hptr = PyBytes_AS_STRING(idna);
4863 } else if (PyBytes_Check(hobj)) {
4864 hptr = PyBytes_AsString(hobj);
4865 } else {
4866 PyErr_SetString(PyExc_TypeError,
4867 "getaddrinfo() argument 1 must be string or None");
4868 return NULL;
4869 }
4870 if (PyLong_CheckExact(pobj)) {
4871 long value = PyLong_AsLong(pobj);
4872 if (value == -1 && PyErr_Occurred())
4873 goto err;
4874 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", value);
4875 pptr = pbuf;
4876 } else if (PyUnicode_Check(pobj)) {
4877 pptr = _PyUnicode_AsString(pobj);
Alexander Belopolskye239d232010-12-08 23:31:48 +00004878 if (pptr == NULL)
4879 goto err;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004880 } else if (PyBytes_Check(pobj)) {
Alexander Belopolskye239d232010-12-08 23:31:48 +00004881 pptr = PyBytes_AS_STRING(pobj);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004882 } else if (pobj == Py_None) {
4883 pptr = (char *)NULL;
4884 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004885 PyErr_SetString(PyExc_OSError, "Int or String expected");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004886 goto err;
4887 }
4888 memset(&hints, 0, sizeof(hints));
4889 hints.ai_family = family;
4890 hints.ai_socktype = socktype;
4891 hints.ai_protocol = protocol;
4892 hints.ai_flags = flags;
4893 Py_BEGIN_ALLOW_THREADS
4894 ACQUIRE_GETADDRINFO_LOCK
4895 error = getaddrinfo(hptr, pptr, &hints, &res0);
4896 Py_END_ALLOW_THREADS
4897 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
4898 if (error) {
4899 set_gaierror(error);
4900 goto err;
4901 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004902
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004903 if ((all = PyList_New(0)) == NULL)
4904 goto err;
4905 for (res = res0; res; res = res->ai_next) {
4906 PyObject *single;
4907 PyObject *addr =
4908 makesockaddr(-1, res->ai_addr, res->ai_addrlen, protocol);
4909 if (addr == NULL)
4910 goto err;
4911 single = Py_BuildValue("iiisO", res->ai_family,
4912 res->ai_socktype, res->ai_protocol,
4913 res->ai_canonname ? res->ai_canonname : "",
4914 addr);
4915 Py_DECREF(addr);
4916 if (single == NULL)
4917 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004918
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004919 if (PyList_Append(all, single))
4920 goto err;
4921 Py_XDECREF(single);
4922 }
4923 Py_XDECREF(idna);
4924 if (res0)
4925 freeaddrinfo(res0);
4926 return all;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004927 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004928 Py_XDECREF(all);
4929 Py_XDECREF(idna);
4930 if (res0)
4931 freeaddrinfo(res0);
4932 return (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004933}
4934
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004935PyDoc_STRVAR(getaddrinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004936"getaddrinfo(host, port [, family, socktype, proto, flags])\n\
4937 -> list of (family, socktype, proto, canonname, sockaddr)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004938\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004939Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004940
4941/* Python interface to getnameinfo(sa, flags). */
4942
4943/*ARGSUSED*/
4944static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004945socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004946{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004947 PyObject *sa = (PyObject *)NULL;
4948 int flags;
4949 char *hostp;
4950 int port, flowinfo, scope_id;
4951 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
4952 struct addrinfo hints, *res = NULL;
4953 int error;
4954 PyObject *ret = (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004955
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004956 flags = flowinfo = scope_id = 0;
4957 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
4958 return NULL;
4959 if (!PyTuple_Check(sa)) {
4960 PyErr_SetString(PyExc_TypeError,
4961 "getnameinfo() argument 1 must be a tuple");
4962 return NULL;
4963 }
4964 if (!PyArg_ParseTuple(sa, "si|ii",
4965 &hostp, &port, &flowinfo, &scope_id))
4966 return NULL;
4967 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
4968 memset(&hints, 0, sizeof(hints));
4969 hints.ai_family = AF_UNSPEC;
4970 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Martin v. Löwis112c0f32010-08-25 07:38:15 +00004971 hints.ai_flags = AI_NUMERICHOST; /* don't do any name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004972 Py_BEGIN_ALLOW_THREADS
4973 ACQUIRE_GETADDRINFO_LOCK
4974 error = getaddrinfo(hostp, pbuf, &hints, &res);
4975 Py_END_ALLOW_THREADS
4976 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
4977 if (error) {
4978 set_gaierror(error);
4979 goto fail;
4980 }
4981 if (res->ai_next) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004982 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004983 "sockaddr resolved to multiple addresses");
4984 goto fail;
4985 }
4986 switch (res->ai_family) {
4987 case AF_INET:
4988 {
4989 if (PyTuple_GET_SIZE(sa) != 2) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004990 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004991 "IPv4 sockaddr must be 2 tuple");
4992 goto fail;
4993 }
4994 break;
4995 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004996#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004997 case AF_INET6:
4998 {
4999 struct sockaddr_in6 *sin6;
5000 sin6 = (struct sockaddr_in6 *)res->ai_addr;
5001 sin6->sin6_flowinfo = flowinfo;
5002 sin6->sin6_scope_id = scope_id;
5003 break;
5004 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005005#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005006 }
Antoine Pitrou19467d22010-08-17 19:33:30 +00005007 error = getnameinfo(res->ai_addr, (socklen_t) res->ai_addrlen,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005008 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
5009 if (error) {
5010 set_gaierror(error);
5011 goto fail;
5012 }
5013 ret = Py_BuildValue("ss", hbuf, pbuf);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005014
5015fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005016 if (res)
5017 freeaddrinfo(res);
5018 return ret;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005019}
5020
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005021PyDoc_STRVAR(getnameinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005022"getnameinfo(sockaddr, flags) --> (host, port)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005023\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005024Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005025
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005026
5027/* Python API to getting and setting the default timeout value. */
5028
5029static PyObject *
5030socket_getdefaulttimeout(PyObject *self)
5031{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005032 if (defaulttimeout < 0.0) {
5033 Py_INCREF(Py_None);
5034 return Py_None;
5035 }
5036 else
5037 return PyFloat_FromDouble(defaulttimeout);
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005038}
5039
5040PyDoc_STRVAR(getdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005041"getdefaulttimeout() -> timeout\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005042\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03005043Returns the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005044A value of None indicates that new socket objects have no timeout.\n\
5045When the socket module is first imported, the default is None.");
5046
5047static PyObject *
5048socket_setdefaulttimeout(PyObject *self, PyObject *arg)
5049{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005050 double timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005051
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005052 if (arg == Py_None)
5053 timeout = -1.0;
5054 else {
5055 timeout = PyFloat_AsDouble(arg);
5056 if (timeout < 0.0) {
5057 if (!PyErr_Occurred())
5058 PyErr_SetString(PyExc_ValueError,
5059 "Timeout value out of range");
5060 return NULL;
5061 }
5062 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005063
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005064 defaulttimeout = timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005065
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005066 Py_INCREF(Py_None);
5067 return Py_None;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005068}
5069
5070PyDoc_STRVAR(setdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005071"setdefaulttimeout(timeout)\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005072\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03005073Set the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005074A value of None indicates that new socket objects have no timeout.\n\
5075When the socket module is first imported, the default is None.");
5076
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005077#ifdef HAVE_IF_NAMEINDEX
5078/* Python API for getting interface indices and names */
5079
5080static PyObject *
5081socket_if_nameindex(PyObject *self, PyObject *arg)
5082{
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005083 PyObject *list;
Charles-François Natali60713592011-05-20 16:55:06 +02005084 int i;
5085 struct if_nameindex *ni;
Victor Stinner77af1722011-05-26 14:05:59 +02005086
Charles-François Natali60713592011-05-20 16:55:06 +02005087 ni = if_nameindex();
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005088 if (ni == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005089 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005090 return NULL;
5091 }
5092
5093 list = PyList_New(0);
5094 if (list == NULL) {
5095 if_freenameindex(ni);
5096 return NULL;
5097 }
5098
Charles-François Natali60713592011-05-20 16:55:06 +02005099 for (i = 0; ni[i].if_index != 0 && i < INT_MAX; i++) {
5100 PyObject *ni_tuple = Py_BuildValue("IO&",
5101 ni[i].if_index, PyUnicode_DecodeFSDefault, ni[i].if_name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005102
5103 if (ni_tuple == NULL || PyList_Append(list, ni_tuple) == -1) {
5104 Py_XDECREF(ni_tuple);
Charles-François Natali60713592011-05-20 16:55:06 +02005105 Py_DECREF(list);
5106 if_freenameindex(ni);
5107 return NULL;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005108 }
5109 Py_DECREF(ni_tuple);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005110 }
5111
5112 if_freenameindex(ni);
5113 return list;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005114}
5115
5116PyDoc_STRVAR(if_nameindex_doc,
5117"if_nameindex()\n\
5118\n\
5119Returns a list of network interface information (index, name) tuples.");
5120
Charles-François Natali60713592011-05-20 16:55:06 +02005121static PyObject *
5122socket_if_nametoindex(PyObject *self, PyObject *args)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005123{
Charles-François Natali60713592011-05-20 16:55:06 +02005124 PyObject *oname;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005125 unsigned long index;
5126
Charles-François Natali60713592011-05-20 16:55:06 +02005127 if (!PyArg_ParseTuple(args, "O&:if_nametoindex",
5128 PyUnicode_FSConverter, &oname))
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005129 return NULL;
5130
Charles-François Natali60713592011-05-20 16:55:06 +02005131 index = if_nametoindex(PyBytes_AS_STRING(oname));
5132 Py_DECREF(oname);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005133 if (index == 0) {
Charles-François Natali60713592011-05-20 16:55:06 +02005134 /* if_nametoindex() doesn't set errno */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005135 PyErr_SetString(PyExc_OSError, "no interface with this name");
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005136 return NULL;
5137 }
5138
5139 return PyLong_FromUnsignedLong(index);
5140}
5141
5142PyDoc_STRVAR(if_nametoindex_doc,
5143"if_nametoindex(if_name)\n\
5144\n\
5145Returns the interface index corresponding to the interface name if_name.");
5146
Charles-François Natali60713592011-05-20 16:55:06 +02005147static PyObject *
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005148socket_if_indextoname(PyObject *self, PyObject *arg)
5149{
Charles-François Natali60713592011-05-20 16:55:06 +02005150 unsigned long index;
5151 char name[IF_NAMESIZE + 1];
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005152
Charles-François Natali60713592011-05-20 16:55:06 +02005153 index = PyLong_AsUnsignedLong(arg);
5154 if (index == (unsigned long) -1)
5155 return NULL;
5156
5157 if (if_indextoname(index, name) == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005158 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005159 return NULL;
5160 }
5161
Charles-François Natali60713592011-05-20 16:55:06 +02005162 return PyUnicode_DecodeFSDefault(name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005163}
5164
5165PyDoc_STRVAR(if_indextoname_doc,
5166"if_indextoname(if_index)\n\
5167\n\
5168Returns the interface name corresponding to the interface index if_index.");
5169
5170#endif /* HAVE_IF_NAMEINDEX */
5171
5172
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005173#ifdef CMSG_LEN
5174/* Python interface to CMSG_LEN(length). */
5175
5176static PyObject *
5177socket_CMSG_LEN(PyObject *self, PyObject *args)
5178{
5179 Py_ssize_t length;
5180 size_t result;
5181
5182 if (!PyArg_ParseTuple(args, "n:CMSG_LEN", &length))
5183 return NULL;
5184 if (length < 0 || !get_CMSG_LEN(length, &result)) {
5185 PyErr_Format(PyExc_OverflowError, "CMSG_LEN() argument out of range");
5186 return NULL;
5187 }
5188 return PyLong_FromSize_t(result);
5189}
5190
5191PyDoc_STRVAR(CMSG_LEN_doc,
5192"CMSG_LEN(length) -> control message length\n\
5193\n\
5194Return the total length, without trailing padding, of an ancillary\n\
5195data item with associated data of the given length. This value can\n\
5196often be used as the buffer size for recvmsg() to receive a single\n\
5197item of ancillary data, but RFC 3542 requires portable applications to\n\
5198use CMSG_SPACE() and thus include space for padding, even when the\n\
5199item will be the last in the buffer. Raises OverflowError if length\n\
5200is outside the permissible range of values.");
5201
5202
5203#ifdef CMSG_SPACE
5204/* Python interface to CMSG_SPACE(length). */
5205
5206static PyObject *
5207socket_CMSG_SPACE(PyObject *self, PyObject *args)
5208{
5209 Py_ssize_t length;
5210 size_t result;
5211
5212 if (!PyArg_ParseTuple(args, "n:CMSG_SPACE", &length))
5213 return NULL;
5214 if (length < 0 || !get_CMSG_SPACE(length, &result)) {
5215 PyErr_SetString(PyExc_OverflowError,
5216 "CMSG_SPACE() argument out of range");
5217 return NULL;
5218 }
5219 return PyLong_FromSize_t(result);
5220}
5221
5222PyDoc_STRVAR(CMSG_SPACE_doc,
5223"CMSG_SPACE(length) -> buffer size\n\
5224\n\
5225Return the buffer size needed for recvmsg() to receive an ancillary\n\
5226data item with associated data of the given length, along with any\n\
5227trailing padding. The buffer space needed to receive multiple items\n\
5228is the sum of the CMSG_SPACE() values for their associated data\n\
5229lengths. Raises OverflowError if length is outside the permissible\n\
5230range of values.");
5231#endif /* CMSG_SPACE */
5232#endif /* CMSG_LEN */
5233
5234
Guido van Rossum30a685f1991-06-27 15:51:29 +00005235/* List of functions exported by this module. */
5236
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005237static PyMethodDef socket_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005238 {"gethostbyname", socket_gethostbyname,
5239 METH_VARARGS, gethostbyname_doc},
5240 {"gethostbyname_ex", socket_gethostbyname_ex,
5241 METH_VARARGS, ghbn_ex_doc},
5242 {"gethostbyaddr", socket_gethostbyaddr,
5243 METH_VARARGS, gethostbyaddr_doc},
5244 {"gethostname", socket_gethostname,
5245 METH_NOARGS, gethostname_doc},
Antoine Pitrou061cfb52011-02-28 22:25:22 +00005246#ifdef HAVE_SETHOSTNAME
5247 {"sethostname", socket_sethostname,
5248 METH_VARARGS, sethostname_doc},
5249#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005250 {"getservbyname", socket_getservbyname,
5251 METH_VARARGS, getservbyname_doc},
5252 {"getservbyport", socket_getservbyport,
5253 METH_VARARGS, getservbyport_doc},
5254 {"getprotobyname", socket_getprotobyname,
5255 METH_VARARGS, getprotobyname_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005256#ifndef NO_DUP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005257 {"dup", socket_dup,
5258 METH_O, dup_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005259#endif
Dave Cole331708b2004-08-09 04:51:41 +00005260#ifdef HAVE_SOCKETPAIR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005261 {"socketpair", socket_socketpair,
5262 METH_VARARGS, socketpair_doc},
Dave Cole331708b2004-08-09 04:51:41 +00005263#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005264 {"ntohs", socket_ntohs,
5265 METH_VARARGS, ntohs_doc},
5266 {"ntohl", socket_ntohl,
5267 METH_O, ntohl_doc},
5268 {"htons", socket_htons,
5269 METH_VARARGS, htons_doc},
5270 {"htonl", socket_htonl,
5271 METH_O, htonl_doc},
5272 {"inet_aton", socket_inet_aton,
5273 METH_VARARGS, inet_aton_doc},
5274 {"inet_ntoa", socket_inet_ntoa,
5275 METH_VARARGS, inet_ntoa_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005276#ifdef HAVE_INET_PTON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005277 {"inet_pton", socket_inet_pton,
5278 METH_VARARGS, inet_pton_doc},
5279 {"inet_ntop", socket_inet_ntop,
5280 METH_VARARGS, inet_ntop_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005281#endif
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005282 {"getaddrinfo", (PyCFunction)socket_getaddrinfo,
5283 METH_VARARGS | METH_KEYWORDS, getaddrinfo_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005284 {"getnameinfo", socket_getnameinfo,
5285 METH_VARARGS, getnameinfo_doc},
5286 {"getdefaulttimeout", (PyCFunction)socket_getdefaulttimeout,
5287 METH_NOARGS, getdefaulttimeout_doc},
5288 {"setdefaulttimeout", socket_setdefaulttimeout,
5289 METH_O, setdefaulttimeout_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005290#ifdef HAVE_IF_NAMEINDEX
5291 {"if_nameindex", socket_if_nameindex,
5292 METH_NOARGS, if_nameindex_doc},
5293 {"if_nametoindex", socket_if_nametoindex,
Charles-François Natali60713592011-05-20 16:55:06 +02005294 METH_VARARGS, if_nametoindex_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005295 {"if_indextoname", socket_if_indextoname,
5296 METH_O, if_indextoname_doc},
5297#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005298#ifdef CMSG_LEN
5299 {"CMSG_LEN", socket_CMSG_LEN,
5300 METH_VARARGS, CMSG_LEN_doc},
5301#ifdef CMSG_SPACE
5302 {"CMSG_SPACE", socket_CMSG_SPACE,
5303 METH_VARARGS, CMSG_SPACE_doc},
5304#endif
5305#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005306 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005307};
5308
Guido van Rossum30a685f1991-06-27 15:51:29 +00005309
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005310#ifdef MS_WINDOWS
5311#define OS_INIT_DEFINED
5312
5313/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00005314
5315static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005316os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00005317{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005318 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00005319}
5320
5321static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005322os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00005323{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005324 WSADATA WSAData;
5325 int ret;
5326 ret = WSAStartup(0x0101, &WSAData);
5327 switch (ret) {
5328 case 0: /* No error */
5329 Py_AtExit(os_cleanup);
5330 return 1; /* Success */
5331 case WSASYSNOTREADY:
5332 PyErr_SetString(PyExc_ImportError,
5333 "WSAStartup failed: network not ready");
5334 break;
5335 case WSAVERNOTSUPPORTED:
5336 case WSAEINVAL:
5337 PyErr_SetString(
5338 PyExc_ImportError,
5339 "WSAStartup failed: requested version not supported");
5340 break;
5341 default:
5342 PyErr_Format(PyExc_ImportError, "WSAStartup failed: error code %d", ret);
5343 break;
5344 }
5345 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00005346}
5347
Guido van Rossum8d665e61996-06-26 18:22:49 +00005348#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00005349
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005350
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005351#ifdef PYOS_OS2
5352#define OS_INIT_DEFINED
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005353
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005354/* Additional initialization for OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005355
5356static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005357os_init(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005358{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005359#ifndef PYCC_GCC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005360 int rc = sock_init();
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005361
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005362 if (rc == 0) {
5363 return 1; /* Success */
5364 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005365
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005366 PyErr_Format(PyExc_ImportError, "OS/2 TCP/IP Error# %d", sock_errno());
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005367
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005368 return 0; /* Failure */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00005369#else
Ezio Melotti13925002011-03-16 11:05:33 +02005370 /* No need to initialize sockets with GCC/EMX */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005371 return 1; /* Success */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00005372#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005373}
5374
5375#endif /* PYOS_OS2 */
5376
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005377
5378#ifndef OS_INIT_DEFINED
5379static int
5380os_init(void)
5381{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005382 return 1; /* Success */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005383}
5384#endif
5385
5386
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005387/* C API table - always add new things to the end for binary
5388 compatibility. */
5389static
5390PySocketModule_APIObject PySocketModuleAPI =
5391{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005392 &sock_type,
Antoine Pitrouc4df7842010-12-03 19:59:41 +00005393 NULL,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005394 NULL
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005395};
5396
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005397
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005398/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005399
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005400 This module is actually called "_socket", and there's a wrapper
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005401 "socket.py" which implements some additional functionality.
5402 The import of "_socket" may fail with an ImportError exception if
5403 os-specific initialization fails. On Windows, this does WINSOCK
Ezio Melotti13925002011-03-16 11:05:33 +02005404 initialization. When WINSOCK is initialized successfully, a call to
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005405 WSACleanup() is scheduled to be made at exit time.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005406*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005407
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005408PyDoc_STRVAR(socket_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005409"Implementation module for socket operations.\n\
5410\n\
5411See the socket module for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005412
Martin v. Löwis1a214512008-06-11 05:26:20 +00005413static struct PyModuleDef socketmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005414 PyModuleDef_HEAD_INIT,
5415 PySocket_MODULE_NAME,
5416 socket_doc,
5417 -1,
5418 socket_methods,
5419 NULL,
5420 NULL,
5421 NULL,
5422 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00005423};
5424
Mark Hammondfe51c6d2002-08-02 02:27:13 +00005425PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00005426PyInit__socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005427{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005428 PyObject *m, *has_ipv6;
Fred Drake4baedc12002-04-01 14:53:37 +00005429
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005430 if (!os_init())
5431 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005432
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005433 Py_TYPE(&sock_type) = &PyType_Type;
5434 m = PyModule_Create(&socketmodule);
5435 if (m == NULL)
5436 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005437
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005438 Py_INCREF(PyExc_OSError);
5439 PySocketModuleAPI.error = PyExc_OSError;
5440 Py_INCREF(PyExc_OSError);
5441 PyModule_AddObject(m, "error", PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005442 socket_herror = PyErr_NewException("socket.herror",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005443 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005444 if (socket_herror == NULL)
5445 return NULL;
5446 Py_INCREF(socket_herror);
5447 PyModule_AddObject(m, "herror", socket_herror);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005448 socket_gaierror = PyErr_NewException("socket.gaierror", PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005449 NULL);
5450 if (socket_gaierror == NULL)
5451 return NULL;
5452 Py_INCREF(socket_gaierror);
5453 PyModule_AddObject(m, "gaierror", socket_gaierror);
5454 socket_timeout = PyErr_NewException("socket.timeout",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005455 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005456 if (socket_timeout == NULL)
5457 return NULL;
Antoine Pitrouc4df7842010-12-03 19:59:41 +00005458 PySocketModuleAPI.timeout_error = socket_timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005459 Py_INCREF(socket_timeout);
5460 PyModule_AddObject(m, "timeout", socket_timeout);
5461 Py_INCREF((PyObject *)&sock_type);
5462 if (PyModule_AddObject(m, "SocketType",
5463 (PyObject *)&sock_type) != 0)
5464 return NULL;
5465 Py_INCREF((PyObject *)&sock_type);
5466 if (PyModule_AddObject(m, "socket",
5467 (PyObject *)&sock_type) != 0)
5468 return NULL;
Guido van Rossum09be4091999-08-09 14:40:40 +00005469
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005470#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005471 has_ipv6 = Py_True;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005472#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005473 has_ipv6 = Py_False;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005474#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005475 Py_INCREF(has_ipv6);
5476 PyModule_AddObject(m, "has_ipv6", has_ipv6);
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005477
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005478 /* Export C API */
5479 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
5480 PyCapsule_New(&PySocketModuleAPI, PySocket_CAPSULE_NAME, NULL)
5481 ) != 0)
5482 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005483
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005484 /* Address families (we only support AF_INET and AF_UNIX) */
Guido van Rossum09be4091999-08-09 14:40:40 +00005485#ifdef AF_UNSPEC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005486 PyModule_AddIntConstant(m, "AF_UNSPEC", AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00005487#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005488 PyModule_AddIntConstant(m, "AF_INET", AF_INET);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005489#ifdef AF_INET6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005490 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005491#endif /* AF_INET6 */
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00005492#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005493 PyModule_AddIntConstant(m, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00005494#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00005495#ifdef AF_AX25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005496 /* Amateur Radio AX.25 */
5497 PyModule_AddIntConstant(m, "AF_AX25", AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00005498#endif
5499#ifdef AF_IPX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005500 PyModule_AddIntConstant(m, "AF_IPX", AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00005501#endif
5502#ifdef AF_APPLETALK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005503 /* Appletalk DDP */
5504 PyModule_AddIntConstant(m, "AF_APPLETALK", AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00005505#endif
5506#ifdef AF_NETROM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005507 /* Amateur radio NetROM */
5508 PyModule_AddIntConstant(m, "AF_NETROM", AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00005509#endif
5510#ifdef AF_BRIDGE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005511 /* Multiprotocol bridge */
5512 PyModule_AddIntConstant(m, "AF_BRIDGE", AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00005513#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005514#ifdef AF_ATMPVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005515 /* ATM PVCs */
5516 PyModule_AddIntConstant(m, "AF_ATMPVC", AF_ATMPVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005517#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00005518#ifdef AF_AAL5
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005519 /* Reserved for Werner's ATM */
5520 PyModule_AddIntConstant(m, "AF_AAL5", AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00005521#endif
5522#ifdef AF_X25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005523 /* Reserved for X.25 project */
5524 PyModule_AddIntConstant(m, "AF_X25", AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00005525#endif
5526#ifdef AF_INET6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005527 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00005528#endif
5529#ifdef AF_ROSE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005530 /* Amateur Radio X.25 PLP */
5531 PyModule_AddIntConstant(m, "AF_ROSE", AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00005532#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005533#ifdef AF_DECnet
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005534 /* Reserved for DECnet project */
5535 PyModule_AddIntConstant(m, "AF_DECnet", AF_DECnet);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005536#endif
5537#ifdef AF_NETBEUI
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005538 /* Reserved for 802.2LLC project */
5539 PyModule_AddIntConstant(m, "AF_NETBEUI", AF_NETBEUI);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005540#endif
5541#ifdef AF_SECURITY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005542 /* Security callback pseudo AF */
5543 PyModule_AddIntConstant(m, "AF_SECURITY", AF_SECURITY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005544#endif
5545#ifdef AF_KEY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005546 /* PF_KEY key management API */
5547 PyModule_AddIntConstant(m, "AF_KEY", AF_KEY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005548#endif
5549#ifdef AF_NETLINK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005550 /* */
5551 PyModule_AddIntConstant(m, "AF_NETLINK", AF_NETLINK);
5552 PyModule_AddIntConstant(m, "NETLINK_ROUTE", NETLINK_ROUTE);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005553#ifdef NETLINK_SKIP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005554 PyModule_AddIntConstant(m, "NETLINK_SKIP", NETLINK_SKIP);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005555#endif
5556#ifdef NETLINK_W1
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005557 PyModule_AddIntConstant(m, "NETLINK_W1", NETLINK_W1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005558#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005559 PyModule_AddIntConstant(m, "NETLINK_USERSOCK", NETLINK_USERSOCK);
5560 PyModule_AddIntConstant(m, "NETLINK_FIREWALL", NETLINK_FIREWALL);
Guido van Rossum668a94a2006-02-21 01:07:27 +00005561#ifdef NETLINK_TCPDIAG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005562 PyModule_AddIntConstant(m, "NETLINK_TCPDIAG", NETLINK_TCPDIAG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00005563#endif
5564#ifdef NETLINK_NFLOG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005565 PyModule_AddIntConstant(m, "NETLINK_NFLOG", NETLINK_NFLOG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00005566#endif
Neal Norwitz65851662006-01-16 04:31:40 +00005567#ifdef NETLINK_XFRM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005568 PyModule_AddIntConstant(m, "NETLINK_XFRM", NETLINK_XFRM);
Neal Norwitz65851662006-01-16 04:31:40 +00005569#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005570#ifdef NETLINK_ARPD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005571 PyModule_AddIntConstant(m, "NETLINK_ARPD", NETLINK_ARPD);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005572#endif
5573#ifdef NETLINK_ROUTE6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005574 PyModule_AddIntConstant(m, "NETLINK_ROUTE6", NETLINK_ROUTE6);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005575#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005576 PyModule_AddIntConstant(m, "NETLINK_IP6_FW", NETLINK_IP6_FW);
Thomas Wouterscf297e42007-02-23 15:07:44 +00005577#ifdef NETLINK_DNRTMSG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005578 PyModule_AddIntConstant(m, "NETLINK_DNRTMSG", NETLINK_DNRTMSG);
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005579#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005580#ifdef NETLINK_TAPBASE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005581 PyModule_AddIntConstant(m, "NETLINK_TAPBASE", NETLINK_TAPBASE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005582#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005583#endif /* AF_NETLINK */
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005584#ifdef AF_ROUTE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005585 /* Alias to emulate 4.4BSD */
5586 PyModule_AddIntConstant(m, "AF_ROUTE", AF_ROUTE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005587#endif
5588#ifdef AF_ASH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005589 /* Ash */
5590 PyModule_AddIntConstant(m, "AF_ASH", AF_ASH);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005591#endif
5592#ifdef AF_ECONET
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005593 /* Acorn Econet */
5594 PyModule_AddIntConstant(m, "AF_ECONET", AF_ECONET);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005595#endif
5596#ifdef AF_ATMSVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005597 /* ATM SVCs */
5598 PyModule_AddIntConstant(m, "AF_ATMSVC", AF_ATMSVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005599#endif
5600#ifdef AF_SNA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005601 /* Linux SNA Project (nutters!) */
5602 PyModule_AddIntConstant(m, "AF_SNA", AF_SNA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005603#endif
5604#ifdef AF_IRDA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005605 /* IRDA sockets */
5606 PyModule_AddIntConstant(m, "AF_IRDA", AF_IRDA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005607#endif
5608#ifdef AF_PPPOX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005609 /* PPPoX sockets */
5610 PyModule_AddIntConstant(m, "AF_PPPOX", AF_PPPOX);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005611#endif
5612#ifdef AF_WANPIPE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005613 /* Wanpipe API Sockets */
5614 PyModule_AddIntConstant(m, "AF_WANPIPE", AF_WANPIPE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005615#endif
5616#ifdef AF_LLC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005617 /* Linux LLC */
5618 PyModule_AddIntConstant(m, "AF_LLC", AF_LLC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005619#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00005620
Hye-Shik Chang81268602004-02-02 06:05:24 +00005621#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005622 PyModule_AddIntConstant(m, "AF_BLUETOOTH", AF_BLUETOOTH);
5623 PyModule_AddIntConstant(m, "BTPROTO_L2CAP", BTPROTO_L2CAP);
5624 PyModule_AddIntConstant(m, "BTPROTO_HCI", BTPROTO_HCI);
5625 PyModule_AddIntConstant(m, "SOL_HCI", SOL_HCI);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00005626#if !defined(__NetBSD__) && !defined(__DragonFly__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005627 PyModule_AddIntConstant(m, "HCI_FILTER", HCI_FILTER);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00005628#endif
Hye-Shik Chang81268602004-02-02 06:05:24 +00005629#if !defined(__FreeBSD__)
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00005630#if !defined(__NetBSD__) && !defined(__DragonFly__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005631 PyModule_AddIntConstant(m, "HCI_TIME_STAMP", HCI_TIME_STAMP);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00005632#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005633 PyModule_AddIntConstant(m, "HCI_DATA_DIR", HCI_DATA_DIR);
5634 PyModule_AddIntConstant(m, "BTPROTO_SCO", BTPROTO_SCO);
Hye-Shik Chang81268602004-02-02 06:05:24 +00005635#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005636 PyModule_AddIntConstant(m, "BTPROTO_RFCOMM", BTPROTO_RFCOMM);
5637 PyModule_AddStringConstant(m, "BDADDR_ANY", "00:00:00:00:00:00");
5638 PyModule_AddStringConstant(m, "BDADDR_LOCAL", "00:00:00:FF:FF:FF");
Martin v. Löwis12af0482004-01-31 12:34:17 +00005639#endif
5640
Charles-François Natali47413c12011-10-06 19:47:44 +02005641#ifdef AF_CAN
5642 /* Controller Area Network */
5643 PyModule_AddIntConstant(m, "AF_CAN", AF_CAN);
5644#endif
5645#ifdef PF_CAN
5646 /* Controller Area Network */
5647 PyModule_AddIntConstant(m, "PF_CAN", PF_CAN);
5648#endif
5649
Charles-François Natali10b8cf42011-11-10 19:21:37 +01005650/* Reliable Datagram Sockets */
5651#ifdef AF_RDS
5652 PyModule_AddIntConstant(m, "AF_RDS", AF_RDS);
5653#endif
5654#ifdef PF_RDS
5655 PyModule_AddIntConstant(m, "PF_RDS", PF_RDS);
5656#endif
5657
Antoine Pitroub156a462010-10-27 20:13:57 +00005658#ifdef AF_PACKET
5659 PyModule_AddIntMacro(m, AF_PACKET);
5660#endif
5661#ifdef PF_PACKET
5662 PyModule_AddIntMacro(m, PF_PACKET);
5663#endif
5664#ifdef PACKET_HOST
5665 PyModule_AddIntMacro(m, PACKET_HOST);
5666#endif
5667#ifdef PACKET_BROADCAST
5668 PyModule_AddIntMacro(m, PACKET_BROADCAST);
5669#endif
5670#ifdef PACKET_MULTICAST
5671 PyModule_AddIntMacro(m, PACKET_MULTICAST);
5672#endif
5673#ifdef PACKET_OTHERHOST
5674 PyModule_AddIntMacro(m, PACKET_OTHERHOST);
5675#endif
5676#ifdef PACKET_OUTGOING
5677 PyModule_AddIntMacro(m, PACKET_OUTGOING);
5678#endif
5679#ifdef PACKET_LOOPBACK
5680 PyModule_AddIntMacro(m, PACKET_LOOPBACK);
5681#endif
5682#ifdef PACKET_FASTROUTE
5683 PyModule_AddIntMacro(m, PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00005684#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00005685
Christian Heimes043d6f62008-01-07 17:19:16 +00005686#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005687 PyModule_AddIntConstant(m, "AF_TIPC", AF_TIPC);
Christian Heimes043d6f62008-01-07 17:19:16 +00005688
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005689 /* for addresses */
5690 PyModule_AddIntConstant(m, "TIPC_ADDR_NAMESEQ", TIPC_ADDR_NAMESEQ);
5691 PyModule_AddIntConstant(m, "TIPC_ADDR_NAME", TIPC_ADDR_NAME);
5692 PyModule_AddIntConstant(m, "TIPC_ADDR_ID", TIPC_ADDR_ID);
Christian Heimes043d6f62008-01-07 17:19:16 +00005693
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005694 PyModule_AddIntConstant(m, "TIPC_ZONE_SCOPE", TIPC_ZONE_SCOPE);
5695 PyModule_AddIntConstant(m, "TIPC_CLUSTER_SCOPE", TIPC_CLUSTER_SCOPE);
5696 PyModule_AddIntConstant(m, "TIPC_NODE_SCOPE", TIPC_NODE_SCOPE);
Christian Heimes043d6f62008-01-07 17:19:16 +00005697
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005698 /* for setsockopt() */
5699 PyModule_AddIntConstant(m, "SOL_TIPC", SOL_TIPC);
5700 PyModule_AddIntConstant(m, "TIPC_IMPORTANCE", TIPC_IMPORTANCE);
5701 PyModule_AddIntConstant(m, "TIPC_SRC_DROPPABLE", TIPC_SRC_DROPPABLE);
5702 PyModule_AddIntConstant(m, "TIPC_DEST_DROPPABLE",
5703 TIPC_DEST_DROPPABLE);
5704 PyModule_AddIntConstant(m, "TIPC_CONN_TIMEOUT", TIPC_CONN_TIMEOUT);
Christian Heimes043d6f62008-01-07 17:19:16 +00005705
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005706 PyModule_AddIntConstant(m, "TIPC_LOW_IMPORTANCE",
5707 TIPC_LOW_IMPORTANCE);
5708 PyModule_AddIntConstant(m, "TIPC_MEDIUM_IMPORTANCE",
5709 TIPC_MEDIUM_IMPORTANCE);
5710 PyModule_AddIntConstant(m, "TIPC_HIGH_IMPORTANCE",
5711 TIPC_HIGH_IMPORTANCE);
5712 PyModule_AddIntConstant(m, "TIPC_CRITICAL_IMPORTANCE",
5713 TIPC_CRITICAL_IMPORTANCE);
Christian Heimes043d6f62008-01-07 17:19:16 +00005714
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005715 /* for subscriptions */
5716 PyModule_AddIntConstant(m, "TIPC_SUB_PORTS", TIPC_SUB_PORTS);
5717 PyModule_AddIntConstant(m, "TIPC_SUB_SERVICE", TIPC_SUB_SERVICE);
Christian Heimes25bb7832008-01-11 16:17:00 +00005718#ifdef TIPC_SUB_CANCEL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005719 /* doesn't seem to be available everywhere */
5720 PyModule_AddIntConstant(m, "TIPC_SUB_CANCEL", TIPC_SUB_CANCEL);
Christian Heimes25bb7832008-01-11 16:17:00 +00005721#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005722 PyModule_AddIntConstant(m, "TIPC_WAIT_FOREVER", TIPC_WAIT_FOREVER);
5723 PyModule_AddIntConstant(m, "TIPC_PUBLISHED", TIPC_PUBLISHED);
5724 PyModule_AddIntConstant(m, "TIPC_WITHDRAWN", TIPC_WITHDRAWN);
5725 PyModule_AddIntConstant(m, "TIPC_SUBSCR_TIMEOUT", TIPC_SUBSCR_TIMEOUT);
5726 PyModule_AddIntConstant(m, "TIPC_CFG_SRV", TIPC_CFG_SRV);
5727 PyModule_AddIntConstant(m, "TIPC_TOP_SRV", TIPC_TOP_SRV);
Christian Heimes043d6f62008-01-07 17:19:16 +00005728#endif
5729
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005730 /* Socket types */
5731 PyModule_AddIntConstant(m, "SOCK_STREAM", SOCK_STREAM);
5732 PyModule_AddIntConstant(m, "SOCK_DGRAM", SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00005733/* We have incomplete socket support. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005734 PyModule_AddIntConstant(m, "SOCK_RAW", SOCK_RAW);
5735 PyModule_AddIntConstant(m, "SOCK_SEQPACKET", SOCK_SEQPACKET);
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00005736#if defined(SOCK_RDM)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005737 PyModule_AddIntConstant(m, "SOCK_RDM", SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00005738#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +00005739#ifdef SOCK_CLOEXEC
5740 PyModule_AddIntConstant(m, "SOCK_CLOEXEC", SOCK_CLOEXEC);
5741#endif
5742#ifdef SOCK_NONBLOCK
5743 PyModule_AddIntConstant(m, "SOCK_NONBLOCK", SOCK_NONBLOCK);
5744#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005745
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005746#ifdef SO_DEBUG
5747 PyModule_AddIntConstant(m, "SO_DEBUG", SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005748#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005749#ifdef SO_ACCEPTCONN
5750 PyModule_AddIntConstant(m, "SO_ACCEPTCONN", SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005751#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005752#ifdef SO_REUSEADDR
5753 PyModule_AddIntConstant(m, "SO_REUSEADDR", SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005754#endif
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00005755#ifdef SO_EXCLUSIVEADDRUSE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005756 PyModule_AddIntConstant(m, "SO_EXCLUSIVEADDRUSE", SO_EXCLUSIVEADDRUSE);
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00005757#endif
5758
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005759#ifdef SO_KEEPALIVE
5760 PyModule_AddIntConstant(m, "SO_KEEPALIVE", SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005761#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005762#ifdef SO_DONTROUTE
5763 PyModule_AddIntConstant(m, "SO_DONTROUTE", SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005764#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005765#ifdef SO_BROADCAST
5766 PyModule_AddIntConstant(m, "SO_BROADCAST", SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005767#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005768#ifdef SO_USELOOPBACK
5769 PyModule_AddIntConstant(m, "SO_USELOOPBACK", SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005770#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005771#ifdef SO_LINGER
5772 PyModule_AddIntConstant(m, "SO_LINGER", SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005773#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005774#ifdef SO_OOBINLINE
5775 PyModule_AddIntConstant(m, "SO_OOBINLINE", SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005776#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005777#ifdef SO_REUSEPORT
5778 PyModule_AddIntConstant(m, "SO_REUSEPORT", SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005779#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005780#ifdef SO_SNDBUF
5781 PyModule_AddIntConstant(m, "SO_SNDBUF", SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005782#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005783#ifdef SO_RCVBUF
5784 PyModule_AddIntConstant(m, "SO_RCVBUF", SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005785#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005786#ifdef SO_SNDLOWAT
5787 PyModule_AddIntConstant(m, "SO_SNDLOWAT", SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005788#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005789#ifdef SO_RCVLOWAT
5790 PyModule_AddIntConstant(m, "SO_RCVLOWAT", SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005791#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005792#ifdef SO_SNDTIMEO
5793 PyModule_AddIntConstant(m, "SO_SNDTIMEO", SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005794#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005795#ifdef SO_RCVTIMEO
5796 PyModule_AddIntConstant(m, "SO_RCVTIMEO", SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005797#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005798#ifdef SO_ERROR
5799 PyModule_AddIntConstant(m, "SO_ERROR", SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005800#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005801#ifdef SO_TYPE
5802 PyModule_AddIntConstant(m, "SO_TYPE", SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005803#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005804#ifdef SO_SETFIB
5805 PyModule_AddIntConstant(m, "SO_SETFIB", SO_SETFIB);
Larry Hastingsf0f37952010-04-02 11:47:10 +00005806#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005807#ifdef SO_PASSCRED
5808 PyModule_AddIntConstant(m, "SO_PASSCRED", SO_PASSCRED);
5809#endif
5810#ifdef SO_PEERCRED
5811 PyModule_AddIntConstant(m, "SO_PEERCRED", SO_PEERCRED);
5812#endif
5813#ifdef LOCAL_PEERCRED
5814 PyModule_AddIntConstant(m, "LOCAL_PEERCRED", LOCAL_PEERCRED);
5815#endif
Victor Stinnercb98bed2011-10-25 13:45:48 +02005816#ifdef SO_BINDTODEVICE
5817 PyModule_AddIntMacro(m, SO_BINDTODEVICE);
5818#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005819
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005820 /* Maximum number of connections for "listen" */
5821#ifdef SOMAXCONN
5822 PyModule_AddIntConstant(m, "SOMAXCONN", SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005823#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005824 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005825#endif
5826
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005827 /* Ancilliary message types */
5828#ifdef SCM_RIGHTS
5829 PyModule_AddIntConstant(m, "SCM_RIGHTS", SCM_RIGHTS);
5830#endif
5831#ifdef SCM_CREDENTIALS
5832 PyModule_AddIntConstant(m, "SCM_CREDENTIALS", SCM_CREDENTIALS);
5833#endif
5834#ifdef SCM_CREDS
5835 PyModule_AddIntConstant(m, "SCM_CREDS", SCM_CREDS);
5836#endif
5837
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005838 /* Flags for send, recv */
5839#ifdef MSG_OOB
5840 PyModule_AddIntConstant(m, "MSG_OOB", MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005841#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005842#ifdef MSG_PEEK
5843 PyModule_AddIntConstant(m, "MSG_PEEK", MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005844#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005845#ifdef MSG_DONTROUTE
5846 PyModule_AddIntConstant(m, "MSG_DONTROUTE", MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005847#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005848#ifdef MSG_DONTWAIT
5849 PyModule_AddIntConstant(m, "MSG_DONTWAIT", MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00005850#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005851#ifdef MSG_EOR
5852 PyModule_AddIntConstant(m, "MSG_EOR", MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005853#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005854#ifdef MSG_TRUNC
5855 PyModule_AddIntConstant(m, "MSG_TRUNC", MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005856#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005857#ifdef MSG_CTRUNC
5858 PyModule_AddIntConstant(m, "MSG_CTRUNC", MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005859#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005860#ifdef MSG_WAITALL
5861 PyModule_AddIntConstant(m, "MSG_WAITALL", MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005862#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005863#ifdef MSG_BTAG
5864 PyModule_AddIntConstant(m, "MSG_BTAG", MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005865#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005866#ifdef MSG_ETAG
5867 PyModule_AddIntConstant(m, "MSG_ETAG", MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005868#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005869#ifdef MSG_NOSIGNAL
5870 PyModule_AddIntConstant(m, "MSG_NOSIGNAL", MSG_NOSIGNAL);
5871#endif
5872#ifdef MSG_NOTIFICATION
5873 PyModule_AddIntConstant(m, "MSG_NOTIFICATION", MSG_NOTIFICATION);
5874#endif
5875#ifdef MSG_CMSG_CLOEXEC
5876 PyModule_AddIntConstant(m, "MSG_CMSG_CLOEXEC", MSG_CMSG_CLOEXEC);
5877#endif
5878#ifdef MSG_ERRQUEUE
5879 PyModule_AddIntConstant(m, "MSG_ERRQUEUE", MSG_ERRQUEUE);
5880#endif
5881#ifdef MSG_CONFIRM
5882 PyModule_AddIntConstant(m, "MSG_CONFIRM", MSG_CONFIRM);
5883#endif
5884#ifdef MSG_MORE
5885 PyModule_AddIntConstant(m, "MSG_MORE", MSG_MORE);
5886#endif
5887#ifdef MSG_EOF
5888 PyModule_AddIntConstant(m, "MSG_EOF", MSG_EOF);
5889#endif
5890#ifdef MSG_BCAST
5891 PyModule_AddIntConstant(m, "MSG_BCAST", MSG_BCAST);
5892#endif
5893#ifdef MSG_MCAST
5894 PyModule_AddIntConstant(m, "MSG_MCAST", MSG_MCAST);
5895#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005896
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005897 /* Protocol level and numbers, usable for [gs]etsockopt */
5898#ifdef SOL_SOCKET
5899 PyModule_AddIntConstant(m, "SOL_SOCKET", SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005900#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005901#ifdef SOL_IP
5902 PyModule_AddIntConstant(m, "SOL_IP", SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00005903#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005904 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00005905#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005906#ifdef SOL_IPX
5907 PyModule_AddIntConstant(m, "SOL_IPX", SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00005908#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005909#ifdef SOL_AX25
5910 PyModule_AddIntConstant(m, "SOL_AX25", SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00005911#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005912#ifdef SOL_ATALK
5913 PyModule_AddIntConstant(m, "SOL_ATALK", SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00005914#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005915#ifdef SOL_NETROM
5916 PyModule_AddIntConstant(m, "SOL_NETROM", SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00005917#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005918#ifdef SOL_ROSE
5919 PyModule_AddIntConstant(m, "SOL_ROSE", SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00005920#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005921#ifdef SOL_TCP
5922 PyModule_AddIntConstant(m, "SOL_TCP", SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00005923#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005924 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00005925#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005926#ifdef SOL_UDP
5927 PyModule_AddIntConstant(m, "SOL_UDP", SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00005928#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005929 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00005930#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02005931#ifdef SOL_CAN_BASE
5932 PyModule_AddIntConstant(m, "SOL_CAN_BASE", SOL_CAN_BASE);
5933#endif
5934#ifdef SOL_CAN_RAW
5935 PyModule_AddIntConstant(m, "SOL_CAN_RAW", SOL_CAN_RAW);
5936 PyModule_AddIntConstant(m, "CAN_RAW", CAN_RAW);
5937#endif
5938#ifdef HAVE_LINUX_CAN_H
5939 PyModule_AddIntConstant(m, "CAN_EFF_FLAG", CAN_EFF_FLAG);
5940 PyModule_AddIntConstant(m, "CAN_RTR_FLAG", CAN_RTR_FLAG);
5941 PyModule_AddIntConstant(m, "CAN_ERR_FLAG", CAN_ERR_FLAG);
5942
5943 PyModule_AddIntConstant(m, "CAN_SFF_MASK", CAN_SFF_MASK);
5944 PyModule_AddIntConstant(m, "CAN_EFF_MASK", CAN_EFF_MASK);
5945 PyModule_AddIntConstant(m, "CAN_ERR_MASK", CAN_ERR_MASK);
5946#endif
5947#ifdef HAVE_LINUX_CAN_RAW_H
5948 PyModule_AddIntConstant(m, "CAN_RAW_FILTER", CAN_RAW_FILTER);
5949 PyModule_AddIntConstant(m, "CAN_RAW_ERR_FILTER", CAN_RAW_ERR_FILTER);
5950 PyModule_AddIntConstant(m, "CAN_RAW_LOOPBACK", CAN_RAW_LOOPBACK);
5951 PyModule_AddIntConstant(m, "CAN_RAW_RECV_OWN_MSGS", CAN_RAW_RECV_OWN_MSGS);
5952#endif
Charles-François Natali10b8cf42011-11-10 19:21:37 +01005953#ifdef SOL_RDS
5954 PyModule_AddIntConstant(m, "SOL_RDS", SOL_RDS);
5955#endif
5956#ifdef RDS_CANCEL_SENT_TO
5957 PyModule_AddIntConstant(m, "RDS_CANCEL_SENT_TO", RDS_CANCEL_SENT_TO);
5958#endif
5959#ifdef RDS_GET_MR
5960 PyModule_AddIntConstant(m, "RDS_GET_MR", RDS_GET_MR);
5961#endif
5962#ifdef RDS_FREE_MR
5963 PyModule_AddIntConstant(m, "RDS_FREE_MR", RDS_FREE_MR);
5964#endif
5965#ifdef RDS_RECVERR
5966 PyModule_AddIntConstant(m, "RDS_RECVERR", RDS_RECVERR);
5967#endif
5968#ifdef RDS_CONG_MONITOR
5969 PyModule_AddIntConstant(m, "RDS_CONG_MONITOR", RDS_CONG_MONITOR);
5970#endif
5971#ifdef RDS_GET_MR_FOR_DEST
5972 PyModule_AddIntConstant(m, "RDS_GET_MR_FOR_DEST", RDS_GET_MR_FOR_DEST);
5973#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005974#ifdef IPPROTO_IP
5975 PyModule_AddIntConstant(m, "IPPROTO_IP", IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00005976#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005977 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005978#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005979#ifdef IPPROTO_HOPOPTS
5980 PyModule_AddIntConstant(m, "IPPROTO_HOPOPTS", IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005981#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005982#ifdef IPPROTO_ICMP
5983 PyModule_AddIntConstant(m, "IPPROTO_ICMP", IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00005984#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005985 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005986#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005987#ifdef IPPROTO_IGMP
5988 PyModule_AddIntConstant(m, "IPPROTO_IGMP", IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005989#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005990#ifdef IPPROTO_GGP
5991 PyModule_AddIntConstant(m, "IPPROTO_GGP", IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005992#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005993#ifdef IPPROTO_IPV4
5994 PyModule_AddIntConstant(m, "IPPROTO_IPV4", IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005995#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005996#ifdef IPPROTO_IPV6
5997 PyModule_AddIntConstant(m, "IPPROTO_IPV6", IPPROTO_IPV6);
Martin v. Löwisa0f17342003-10-03 13:56:20 +00005998#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005999#ifdef IPPROTO_IPIP
6000 PyModule_AddIntConstant(m, "IPPROTO_IPIP", IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006001#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006002#ifdef IPPROTO_TCP
6003 PyModule_AddIntConstant(m, "IPPROTO_TCP", IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00006004#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006005 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006006#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006007#ifdef IPPROTO_EGP
6008 PyModule_AddIntConstant(m, "IPPROTO_EGP", IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006009#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006010#ifdef IPPROTO_PUP
6011 PyModule_AddIntConstant(m, "IPPROTO_PUP", IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006012#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006013#ifdef IPPROTO_UDP
6014 PyModule_AddIntConstant(m, "IPPROTO_UDP", IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00006015#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006016 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006017#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006018#ifdef IPPROTO_IDP
6019 PyModule_AddIntConstant(m, "IPPROTO_IDP", IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006020#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006021#ifdef IPPROTO_HELLO
6022 PyModule_AddIntConstant(m, "IPPROTO_HELLO", IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006023#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006024#ifdef IPPROTO_ND
6025 PyModule_AddIntConstant(m, "IPPROTO_ND", IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006026#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006027#ifdef IPPROTO_TP
6028 PyModule_AddIntConstant(m, "IPPROTO_TP", IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006029#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006030#ifdef IPPROTO_IPV6
6031 PyModule_AddIntConstant(m, "IPPROTO_IPV6", IPPROTO_IPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006032#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006033#ifdef IPPROTO_ROUTING
6034 PyModule_AddIntConstant(m, "IPPROTO_ROUTING", IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006035#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006036#ifdef IPPROTO_FRAGMENT
6037 PyModule_AddIntConstant(m, "IPPROTO_FRAGMENT", IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006038#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006039#ifdef IPPROTO_RSVP
6040 PyModule_AddIntConstant(m, "IPPROTO_RSVP", IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006041#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006042#ifdef IPPROTO_GRE
6043 PyModule_AddIntConstant(m, "IPPROTO_GRE", IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006044#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006045#ifdef IPPROTO_ESP
6046 PyModule_AddIntConstant(m, "IPPROTO_ESP", IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006047#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006048#ifdef IPPROTO_AH
6049 PyModule_AddIntConstant(m, "IPPROTO_AH", IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006050#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006051#ifdef IPPROTO_MOBILE
6052 PyModule_AddIntConstant(m, "IPPROTO_MOBILE", IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006053#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006054#ifdef IPPROTO_ICMPV6
6055 PyModule_AddIntConstant(m, "IPPROTO_ICMPV6", IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006056#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006057#ifdef IPPROTO_NONE
6058 PyModule_AddIntConstant(m, "IPPROTO_NONE", IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006059#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006060#ifdef IPPROTO_DSTOPTS
6061 PyModule_AddIntConstant(m, "IPPROTO_DSTOPTS", IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006062#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006063#ifdef IPPROTO_XTP
6064 PyModule_AddIntConstant(m, "IPPROTO_XTP", IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006065#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006066#ifdef IPPROTO_EON
6067 PyModule_AddIntConstant(m, "IPPROTO_EON", IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006068#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006069#ifdef IPPROTO_PIM
6070 PyModule_AddIntConstant(m, "IPPROTO_PIM", IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006071#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006072#ifdef IPPROTO_IPCOMP
6073 PyModule_AddIntConstant(m, "IPPROTO_IPCOMP", IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006074#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006075#ifdef IPPROTO_VRRP
6076 PyModule_AddIntConstant(m, "IPPROTO_VRRP", IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006077#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006078#ifdef IPPROTO_SCTP
6079 PyModule_AddIntConstant(m, "IPPROTO_SCTP", IPPROTO_SCTP);
6080#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006081#ifdef IPPROTO_BIP
6082 PyModule_AddIntConstant(m, "IPPROTO_BIP", IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006083#endif
6084/**/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006085#ifdef IPPROTO_RAW
6086 PyModule_AddIntConstant(m, "IPPROTO_RAW", IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00006087#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006088 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006089#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006090#ifdef IPPROTO_MAX
6091 PyModule_AddIntConstant(m, "IPPROTO_MAX", IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006092#endif
6093
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006094 /* Some port configuration */
6095#ifdef IPPORT_RESERVED
6096 PyModule_AddIntConstant(m, "IPPORT_RESERVED", IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006097#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006098 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006099#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006100#ifdef IPPORT_USERRESERVED
6101 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006102#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006103 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006104#endif
6105
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006106 /* Some reserved IP v.4 addresses */
6107#ifdef INADDR_ANY
6108 PyModule_AddIntConstant(m, "INADDR_ANY", INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006109#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006110 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006111#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006112#ifdef INADDR_BROADCAST
6113 PyModule_AddIntConstant(m, "INADDR_BROADCAST", INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006114#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006115 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006116#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006117#ifdef INADDR_LOOPBACK
6118 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006119#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006120 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006121#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006122#ifdef INADDR_UNSPEC_GROUP
6123 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006124#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006125 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006126#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006127#ifdef INADDR_ALLHOSTS_GROUP
6128 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
6129 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006130#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006131 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006132#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006133#ifdef INADDR_MAX_LOCAL_GROUP
6134 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP",
6135 INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006136#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006137 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006138#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006139#ifdef INADDR_NONE
6140 PyModule_AddIntConstant(m, "INADDR_NONE", INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006141#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006142 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006143#endif
6144
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006145 /* IPv4 [gs]etsockopt options */
6146#ifdef IP_OPTIONS
6147 PyModule_AddIntConstant(m, "IP_OPTIONS", IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006148#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006149#ifdef IP_HDRINCL
6150 PyModule_AddIntConstant(m, "IP_HDRINCL", IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006151#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006152#ifdef IP_TOS
6153 PyModule_AddIntConstant(m, "IP_TOS", IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006154#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006155#ifdef IP_TTL
6156 PyModule_AddIntConstant(m, "IP_TTL", IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006157#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006158#ifdef IP_RECVOPTS
6159 PyModule_AddIntConstant(m, "IP_RECVOPTS", IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006160#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006161#ifdef IP_RECVRETOPTS
6162 PyModule_AddIntConstant(m, "IP_RECVRETOPTS", IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006163#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006164#ifdef IP_RECVDSTADDR
6165 PyModule_AddIntConstant(m, "IP_RECVDSTADDR", IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006166#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006167#ifdef IP_RETOPTS
6168 PyModule_AddIntConstant(m, "IP_RETOPTS", IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006169#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006170#ifdef IP_MULTICAST_IF
6171 PyModule_AddIntConstant(m, "IP_MULTICAST_IF", IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006172#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006173#ifdef IP_MULTICAST_TTL
6174 PyModule_AddIntConstant(m, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006175#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006176#ifdef IP_MULTICAST_LOOP
6177 PyModule_AddIntConstant(m, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006178#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006179#ifdef IP_ADD_MEMBERSHIP
6180 PyModule_AddIntConstant(m, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006181#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006182#ifdef IP_DROP_MEMBERSHIP
6183 PyModule_AddIntConstant(m, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006184#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006185#ifdef IP_DEFAULT_MULTICAST_TTL
6186 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_TTL",
6187 IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00006188#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006189#ifdef IP_DEFAULT_MULTICAST_LOOP
6190 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_LOOP",
6191 IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006192#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006193#ifdef IP_MAX_MEMBERSHIPS
6194 PyModule_AddIntConstant(m, "IP_MAX_MEMBERSHIPS", IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00006195#endif
6196
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006197 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
6198#ifdef IPV6_JOIN_GROUP
6199 PyModule_AddIntConstant(m, "IPV6_JOIN_GROUP", IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006200#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006201#ifdef IPV6_LEAVE_GROUP
6202 PyModule_AddIntConstant(m, "IPV6_LEAVE_GROUP", IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006203#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006204#ifdef IPV6_MULTICAST_HOPS
6205 PyModule_AddIntConstant(m, "IPV6_MULTICAST_HOPS", IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006206#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006207#ifdef IPV6_MULTICAST_IF
6208 PyModule_AddIntConstant(m, "IPV6_MULTICAST_IF", IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006209#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006210#ifdef IPV6_MULTICAST_LOOP
6211 PyModule_AddIntConstant(m, "IPV6_MULTICAST_LOOP", IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006212#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006213#ifdef IPV6_UNICAST_HOPS
6214 PyModule_AddIntConstant(m, "IPV6_UNICAST_HOPS", IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006215#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006216 /* Additional IPV6 socket options, defined in RFC 3493 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00006217#ifdef IPV6_V6ONLY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006218 PyModule_AddIntConstant(m, "IPV6_V6ONLY", IPV6_V6ONLY);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006219#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006220 /* Advanced IPV6 socket options, from RFC 3542 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00006221#ifdef IPV6_CHECKSUM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006222 PyModule_AddIntConstant(m, "IPV6_CHECKSUM", IPV6_CHECKSUM);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006223#endif
6224#ifdef IPV6_DONTFRAG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006225 PyModule_AddIntConstant(m, "IPV6_DONTFRAG", IPV6_DONTFRAG);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006226#endif
6227#ifdef IPV6_DSTOPTS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006228 PyModule_AddIntConstant(m, "IPV6_DSTOPTS", IPV6_DSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006229#endif
6230#ifdef IPV6_HOPLIMIT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006231 PyModule_AddIntConstant(m, "IPV6_HOPLIMIT", IPV6_HOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006232#endif
6233#ifdef IPV6_HOPOPTS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006234 PyModule_AddIntConstant(m, "IPV6_HOPOPTS", IPV6_HOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006235#endif
6236#ifdef IPV6_NEXTHOP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006237 PyModule_AddIntConstant(m, "IPV6_NEXTHOP", IPV6_NEXTHOP);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006238#endif
6239#ifdef IPV6_PATHMTU
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006240 PyModule_AddIntConstant(m, "IPV6_PATHMTU", IPV6_PATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006241#endif
6242#ifdef IPV6_PKTINFO
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006243 PyModule_AddIntConstant(m, "IPV6_PKTINFO", IPV6_PKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006244#endif
6245#ifdef IPV6_RECVDSTOPTS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006246 PyModule_AddIntConstant(m, "IPV6_RECVDSTOPTS", IPV6_RECVDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006247#endif
6248#ifdef IPV6_RECVHOPLIMIT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006249 PyModule_AddIntConstant(m, "IPV6_RECVHOPLIMIT", IPV6_RECVHOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006250#endif
6251#ifdef IPV6_RECVHOPOPTS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006252 PyModule_AddIntConstant(m, "IPV6_RECVHOPOPTS", IPV6_RECVHOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006253#endif
6254#ifdef IPV6_RECVPKTINFO
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006255 PyModule_AddIntConstant(m, "IPV6_RECVPKTINFO", IPV6_RECVPKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006256#endif
6257#ifdef IPV6_RECVRTHDR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006258 PyModule_AddIntConstant(m, "IPV6_RECVRTHDR", IPV6_RECVRTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006259#endif
6260#ifdef IPV6_RECVTCLASS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006261 PyModule_AddIntConstant(m, "IPV6_RECVTCLASS", IPV6_RECVTCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006262#endif
6263#ifdef IPV6_RTHDR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006264 PyModule_AddIntConstant(m, "IPV6_RTHDR", IPV6_RTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006265#endif
6266#ifdef IPV6_RTHDRDSTOPTS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006267 PyModule_AddIntConstant(m, "IPV6_RTHDRDSTOPTS", IPV6_RTHDRDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006268#endif
6269#ifdef IPV6_RTHDR_TYPE_0
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006270 PyModule_AddIntConstant(m, "IPV6_RTHDR_TYPE_0", IPV6_RTHDR_TYPE_0);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006271#endif
6272#ifdef IPV6_RECVPATHMTU
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006273 PyModule_AddIntConstant(m, "IPV6_RECVPATHMTU", IPV6_RECVPATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006274#endif
6275#ifdef IPV6_TCLASS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006276 PyModule_AddIntConstant(m, "IPV6_TCLASS", IPV6_TCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006277#endif
6278#ifdef IPV6_USE_MIN_MTU
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006279 PyModule_AddIntConstant(m, "IPV6_USE_MIN_MTU", IPV6_USE_MIN_MTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006280#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006281
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006282 /* TCP options */
6283#ifdef TCP_NODELAY
6284 PyModule_AddIntConstant(m, "TCP_NODELAY", TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00006285#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006286#ifdef TCP_MAXSEG
6287 PyModule_AddIntConstant(m, "TCP_MAXSEG", TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00006288#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006289#ifdef TCP_CORK
6290 PyModule_AddIntConstant(m, "TCP_CORK", TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006291#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006292#ifdef TCP_KEEPIDLE
6293 PyModule_AddIntConstant(m, "TCP_KEEPIDLE", TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006294#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006295#ifdef TCP_KEEPINTVL
6296 PyModule_AddIntConstant(m, "TCP_KEEPINTVL", TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006297#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006298#ifdef TCP_KEEPCNT
6299 PyModule_AddIntConstant(m, "TCP_KEEPCNT", TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006300#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006301#ifdef TCP_SYNCNT
6302 PyModule_AddIntConstant(m, "TCP_SYNCNT", TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006303#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006304#ifdef TCP_LINGER2
6305 PyModule_AddIntConstant(m, "TCP_LINGER2", TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006306#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006307#ifdef TCP_DEFER_ACCEPT
6308 PyModule_AddIntConstant(m, "TCP_DEFER_ACCEPT", TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006309#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006310#ifdef TCP_WINDOW_CLAMP
6311 PyModule_AddIntConstant(m, "TCP_WINDOW_CLAMP", TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006312#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006313#ifdef TCP_INFO
6314 PyModule_AddIntConstant(m, "TCP_INFO", TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006315#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006316#ifdef TCP_QUICKACK
6317 PyModule_AddIntConstant(m, "TCP_QUICKACK", TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006318#endif
6319
Guido van Rossum09be4091999-08-09 14:40:40 +00006320
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006321 /* IPX options */
6322#ifdef IPX_TYPE
6323 PyModule_AddIntConstant(m, "IPX_TYPE", IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006324#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00006325
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006326/* Reliable Datagram Sockets */
6327#ifdef RDS_CMSG_RDMA_ARGS
6328 PyModule_AddIntConstant(m, "RDS_CMSG_RDMA_ARGS", RDS_CMSG_RDMA_ARGS);
6329#endif
6330#ifdef RDS_CMSG_RDMA_DEST
6331 PyModule_AddIntConstant(m, "RDS_CMSG_RDMA_DEST", RDS_CMSG_RDMA_DEST);
6332#endif
6333#ifdef RDS_CMSG_RDMA_MAP
6334 PyModule_AddIntConstant(m, "RDS_CMSG_RDMA_MAP", RDS_CMSG_RDMA_MAP);
6335#endif
6336#ifdef RDS_CMSG_RDMA_STATUS
6337 PyModule_AddIntConstant(m, "RDS_CMSG_RDMA_STATUS", RDS_CMSG_RDMA_STATUS);
6338#endif
6339#ifdef RDS_CMSG_RDMA_UPDATE
6340 PyModule_AddIntConstant(m, "RDS_CMSG_RDMA_UPDATE", RDS_CMSG_RDMA_UPDATE);
6341#endif
6342#ifdef RDS_RDMA_READWRITE
6343 PyModule_AddIntConstant(m, "RDS_RDMA_READWRITE", RDS_RDMA_READWRITE);
6344#endif
6345#ifdef RDS_RDMA_FENCE
6346 PyModule_AddIntConstant(m, "RDS_RDMA_FENCE", RDS_RDMA_FENCE);
6347#endif
6348#ifdef RDS_RDMA_INVALIDATE
6349 PyModule_AddIntConstant(m, "RDS_RDMA_INVALIDATE", RDS_RDMA_INVALIDATE);
6350#endif
6351#ifdef RDS_RDMA_USE_ONCE
6352 PyModule_AddIntConstant(m, "RDS_RDMA_USE_ONCE", RDS_RDMA_USE_ONCE);
6353#endif
6354#ifdef RDS_RDMA_DONTWAIT
6355 PyModule_AddIntConstant(m, "RDS_RDMA_DONTWAIT", RDS_RDMA_DONTWAIT);
6356#endif
6357#ifdef RDS_RDMA_NOTIFY_ME
6358 PyModule_AddIntConstant(m, "RDS_RDMA_NOTIFY_ME", RDS_RDMA_NOTIFY_ME);
6359#endif
6360#ifdef RDS_RDMA_SILENT
6361 PyModule_AddIntConstant(m, "RDS_RDMA_SILENT", RDS_RDMA_SILENT);
6362#endif
6363
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006364 /* get{addr,name}info parameters */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006365#ifdef EAI_ADDRFAMILY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006366 PyModule_AddIntConstant(m, "EAI_ADDRFAMILY", EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006367#endif
6368#ifdef EAI_AGAIN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006369 PyModule_AddIntConstant(m, "EAI_AGAIN", EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006370#endif
6371#ifdef EAI_BADFLAGS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006372 PyModule_AddIntConstant(m, "EAI_BADFLAGS", EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006373#endif
6374#ifdef EAI_FAIL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006375 PyModule_AddIntConstant(m, "EAI_FAIL", EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006376#endif
6377#ifdef EAI_FAMILY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006378 PyModule_AddIntConstant(m, "EAI_FAMILY", EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006379#endif
6380#ifdef EAI_MEMORY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006381 PyModule_AddIntConstant(m, "EAI_MEMORY", EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006382#endif
6383#ifdef EAI_NODATA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006384 PyModule_AddIntConstant(m, "EAI_NODATA", EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006385#endif
6386#ifdef EAI_NONAME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006387 PyModule_AddIntConstant(m, "EAI_NONAME", EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006388#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00006389#ifdef EAI_OVERFLOW
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006390 PyModule_AddIntConstant(m, "EAI_OVERFLOW", EAI_OVERFLOW);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006391#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006392#ifdef EAI_SERVICE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006393 PyModule_AddIntConstant(m, "EAI_SERVICE", EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006394#endif
6395#ifdef EAI_SOCKTYPE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006396 PyModule_AddIntConstant(m, "EAI_SOCKTYPE", EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006397#endif
6398#ifdef EAI_SYSTEM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006399 PyModule_AddIntConstant(m, "EAI_SYSTEM", EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006400#endif
6401#ifdef EAI_BADHINTS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006402 PyModule_AddIntConstant(m, "EAI_BADHINTS", EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006403#endif
6404#ifdef EAI_PROTOCOL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006405 PyModule_AddIntConstant(m, "EAI_PROTOCOL", EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006406#endif
6407#ifdef EAI_MAX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006408 PyModule_AddIntConstant(m, "EAI_MAX", EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006409#endif
6410#ifdef AI_PASSIVE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006411 PyModule_AddIntConstant(m, "AI_PASSIVE", AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006412#endif
6413#ifdef AI_CANONNAME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006414 PyModule_AddIntConstant(m, "AI_CANONNAME", AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006415#endif
6416#ifdef AI_NUMERICHOST
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006417 PyModule_AddIntConstant(m, "AI_NUMERICHOST", AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006418#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00006419#ifdef AI_NUMERICSERV
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006420 PyModule_AddIntConstant(m, "AI_NUMERICSERV", AI_NUMERICSERV);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006421#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006422#ifdef AI_MASK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006423 PyModule_AddIntConstant(m, "AI_MASK", AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006424#endif
6425#ifdef AI_ALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006426 PyModule_AddIntConstant(m, "AI_ALL", AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006427#endif
6428#ifdef AI_V4MAPPED_CFG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006429 PyModule_AddIntConstant(m, "AI_V4MAPPED_CFG", AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006430#endif
6431#ifdef AI_ADDRCONFIG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006432 PyModule_AddIntConstant(m, "AI_ADDRCONFIG", AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006433#endif
6434#ifdef AI_V4MAPPED
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006435 PyModule_AddIntConstant(m, "AI_V4MAPPED", AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006436#endif
6437#ifdef AI_DEFAULT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006438 PyModule_AddIntConstant(m, "AI_DEFAULT", AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006439#endif
6440#ifdef NI_MAXHOST
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006441 PyModule_AddIntConstant(m, "NI_MAXHOST", NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006442#endif
6443#ifdef NI_MAXSERV
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006444 PyModule_AddIntConstant(m, "NI_MAXSERV", NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006445#endif
6446#ifdef NI_NOFQDN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006447 PyModule_AddIntConstant(m, "NI_NOFQDN", NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006448#endif
6449#ifdef NI_NUMERICHOST
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006450 PyModule_AddIntConstant(m, "NI_NUMERICHOST", NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006451#endif
6452#ifdef NI_NAMEREQD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006453 PyModule_AddIntConstant(m, "NI_NAMEREQD", NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006454#endif
6455#ifdef NI_NUMERICSERV
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006456 PyModule_AddIntConstant(m, "NI_NUMERICSERV", NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006457#endif
6458#ifdef NI_DGRAM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006459 PyModule_AddIntConstant(m, "NI_DGRAM", NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006460#endif
6461
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006462 /* shutdown() parameters */
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006463#ifdef SHUT_RD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006464 PyModule_AddIntConstant(m, "SHUT_RD", SHUT_RD);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006465#elif defined(SD_RECEIVE)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006466 PyModule_AddIntConstant(m, "SHUT_RD", SD_RECEIVE);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006467#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006468 PyModule_AddIntConstant(m, "SHUT_RD", 0);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006469#endif
6470#ifdef SHUT_WR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006471 PyModule_AddIntConstant(m, "SHUT_WR", SHUT_WR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006472#elif defined(SD_SEND)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006473 PyModule_AddIntConstant(m, "SHUT_WR", SD_SEND);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006474#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006475 PyModule_AddIntConstant(m, "SHUT_WR", 1);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006476#endif
6477#ifdef SHUT_RDWR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006478 PyModule_AddIntConstant(m, "SHUT_RDWR", SHUT_RDWR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006479#elif defined(SD_BOTH)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006480 PyModule_AddIntConstant(m, "SHUT_RDWR", SD_BOTH);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006481#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006482 PyModule_AddIntConstant(m, "SHUT_RDWR", 2);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006483#endif
6484
Christian Heimesfaf2f632008-01-06 16:59:19 +00006485#ifdef SIO_RCVALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006486 {
6487 DWORD codes[] = {SIO_RCVALL, SIO_KEEPALIVE_VALS};
6488 const char *names[] = {"SIO_RCVALL", "SIO_KEEPALIVE_VALS"};
6489 int i;
Victor Stinner63941882011-09-29 00:42:28 +02006490 for(i = 0; i<Py_ARRAY_LENGTH(codes); ++i) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006491 PyObject *tmp;
6492 tmp = PyLong_FromUnsignedLong(codes[i]);
6493 if (tmp == NULL)
6494 return NULL;
6495 PyModule_AddObject(m, names[i], tmp);
6496 }
6497 }
6498 PyModule_AddIntConstant(m, "RCVALL_OFF", RCVALL_OFF);
6499 PyModule_AddIntConstant(m, "RCVALL_ON", RCVALL_ON);
6500 PyModule_AddIntConstant(m, "RCVALL_SOCKETLEVELONLY", RCVALL_SOCKETLEVELONLY);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00006501#ifdef RCVALL_IPLEVEL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006502 PyModule_AddIntConstant(m, "RCVALL_IPLEVEL", RCVALL_IPLEVEL);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00006503#endif
6504#ifdef RCVALL_MAX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006505 PyModule_AddIntConstant(m, "RCVALL_MAX", RCVALL_MAX);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00006506#endif
Christian Heimesfaf2f632008-01-06 16:59:19 +00006507#endif /* _MSTCPIP_ */
6508
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006509 /* Initialize gethostbyname lock */
Just van Rossum1040d2c2003-05-09 07:53:18 +00006510#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006511 netdb_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00006512#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006513 return m;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00006514}
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006515
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006516
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006517#ifndef HAVE_INET_PTON
Christian Heimes96e7b3d2007-11-20 06:51:17 +00006518#if !defined(NTDDI_VERSION) || (NTDDI_VERSION < NTDDI_LONGHORN)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006519
6520/* Simplistic emulation code for inet_pton that only works for IPv4 */
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006521/* These are not exposed because they do not set errno properly */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006522
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006523int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006524inet_pton(int af, const char *src, void *dst)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006525{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006526 if (af == AF_INET) {
Benjamin Petersonf91df042009-02-13 02:50:59 +00006527#if (SIZEOF_INT != 4)
6528#error "Not sure if in_addr_t exists and int is not 32-bits."
6529#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006530 unsigned int packed_addr;
6531 packed_addr = inet_addr(src);
6532 if (packed_addr == INADDR_NONE)
6533 return 0;
6534 memcpy(dst, &packed_addr, 4);
6535 return 1;
6536 }
6537 /* Should set errno to EAFNOSUPPORT */
6538 return -1;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006539}
6540
Martin v. Löwisc925b1532001-07-21 09:42:15 +00006541const char *
6542inet_ntop(int af, const void *src, char *dst, socklen_t size)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006543{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006544 if (af == AF_INET) {
6545 struct in_addr packed_addr;
6546 if (size < 16)
6547 /* Should set errno to ENOSPC. */
6548 return NULL;
6549 memcpy(&packed_addr, src, sizeof(packed_addr));
6550 return strncpy(dst, inet_ntoa(packed_addr), size);
6551 }
6552 /* Should set errno to EAFNOSUPPORT */
6553 return NULL;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006554}
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006555
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006556#endif
Christian Heimesb6150692007-11-15 23:37:07 +00006557#endif