blob: e64c960faf32d472afc8d06ec22682d15cfd0c31 [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_error;
461static PyObject *socket_herror;
462static PyObject *socket_gaierror;
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000463static PyObject *socket_timeout;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000464
Tim Peters643a7fc2002-02-17 04:13:21 +0000465/* A forward reference to the socket type object.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000466 The sock_type variable contains pointers to various functions,
467 some of which call new_sockobject(), which uses sock_type, so
Tim Peters643a7fc2002-02-17 04:13:21 +0000468 there has to be a circular reference. */
Jeremy Hylton938ace62002-07-17 16:30:39 +0000469static PyTypeObject sock_type;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000470
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000471#if defined(HAVE_POLL_H)
472#include <poll.h>
473#elif defined(HAVE_SYS_POLL_H)
474#include <sys/poll.h>
475#endif
476
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000477/* Largest value to try to store in a socklen_t (used when handling
478 ancillary data). POSIX requires socklen_t to hold at least
479 (2**31)-1 and recommends against storing larger values, but
480 socklen_t was originally int in the BSD interface, so to be on the
481 safe side we use the smaller of (2**31)-1 and INT_MAX. */
482#if INT_MAX > 0x7fffffff
483#define SOCKLEN_T_LIMIT 0x7fffffff
484#else
485#define SOCKLEN_T_LIMIT INT_MAX
486#endif
487
Charles-François Nataliaa26b272011-08-28 17:51:43 +0200488#ifdef HAVE_POLL
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000489/* Instead of select(), we'll use poll() since poll() works on any fd. */
490#define IS_SELECTABLE(s) 1
491/* Can we call select() with this socket without a buffer overrun? */
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000492#else
Charles-François Nataliaa26b272011-08-28 17:51:43 +0200493/* If there's no timeout left, we don't have to call select, so it's a safe,
494 * little white lie. */
495#define IS_SELECTABLE(s) (_PyIsSelectable_fd((s)->sock_fd) || (s)->sock_timeout <= 0.0)
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000496#endif
Neal Norwitz082b2df2006-02-07 07:04:46 +0000497
498static PyObject*
499select_error(void)
500{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000501 PyErr_SetString(socket_error, "unable to select on socket");
502 return NULL;
Neal Norwitz082b2df2006-02-07 07:04:46 +0000503}
504
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000505#ifdef MS_WINDOWS
Antoine Pitrouc8f01962010-09-28 22:03:27 +0000506#ifndef WSAEAGAIN
507#define WSAEAGAIN WSAEWOULDBLOCK
508#endif
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000509#define CHECK_ERRNO(expected) \
510 (WSAGetLastError() == WSA ## expected)
511#else
512#define CHECK_ERRNO(expected) \
513 (errno == expected)
514#endif
515
Guido van Rossum30a685f1991-06-27 15:51:29 +0000516/* Convenience function to raise an error according to errno
517 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000518
Guido van Rossum73624e91994-10-10 17:59:00 +0000519static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000520set_error(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000521{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000522#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000523 int err_no = WSAGetLastError();
524 /* PyErr_SetExcFromWindowsErr() invokes FormatMessage() which
525 recognizes the error codes used by both GetLastError() and
526 WSAGetLastError */
527 if (err_no)
528 return PyErr_SetExcFromWindowsErr(socket_error, err_no);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000529#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000530
Andrew MacIntyreba43e872002-03-03 03:03:52 +0000531#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000532 if (sock_errno() != NO_ERROR) {
533 APIRET rc;
534 ULONG msglen;
535 char outbuf[100];
536 int myerrorcode = sock_errno();
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000537
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000538 /* Retrieve socket-related error message from MPTN.MSG file */
539 rc = DosGetMessage(NULL, 0, outbuf, sizeof(outbuf),
540 myerrorcode - SOCBASEERR + 26,
541 "mptn.msg",
542 &msglen);
543 if (rc == NO_ERROR) {
544 PyObject *v;
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000545
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000546 /* OS/2 doesn't guarantee a terminator */
547 outbuf[msglen] = '\0';
548 if (strlen(outbuf) > 0) {
549 /* If non-empty msg, trim CRLF */
550 char *lastc = &outbuf[ strlen(outbuf)-1 ];
551 while (lastc > outbuf &&
552 isspace(Py_CHARMASK(*lastc))) {
553 /* Trim trailing whitespace (CRLF) */
554 *lastc-- = '\0';
555 }
556 }
557 v = Py_BuildValue("(is)", myerrorcode, outbuf);
558 if (v != NULL) {
559 PyErr_SetObject(socket_error, v);
560 Py_DECREF(v);
561 }
562 return NULL;
563 }
564 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000565#endif
566
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000567 return PyErr_SetFromErrno(socket_error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000568}
569
Guido van Rossum30a685f1991-06-27 15:51:29 +0000570
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000571static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000572set_herror(int h_error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000573{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000574 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000575
576#ifdef HAVE_HSTRERROR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000577 v = Py_BuildValue("(is)", h_error, (char *)hstrerror(h_error));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000578#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000579 v = Py_BuildValue("(is)", h_error, "host not found");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000580#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000581 if (v != NULL) {
582 PyErr_SetObject(socket_herror, v);
583 Py_DECREF(v);
584 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000585
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000586 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000587}
588
589
590static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000591set_gaierror(int error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000592{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000593 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000594
Martin v. Löwis272cb402002-03-01 08:31:07 +0000595#ifdef EAI_SYSTEM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000596 /* EAI_SYSTEM is not available on Windows XP. */
597 if (error == EAI_SYSTEM)
598 return set_error();
Martin v. Löwis272cb402002-03-01 08:31:07 +0000599#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000600
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000601#ifdef HAVE_GAI_STRERROR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000602 v = Py_BuildValue("(is)", error, gai_strerror(error));
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000603#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000604 v = Py_BuildValue("(is)", error, "getaddrinfo failed");
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000605#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000606 if (v != NULL) {
607 PyErr_SetObject(socket_gaierror, v);
608 Py_DECREF(v);
609 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000610
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000611 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000612}
613
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000614#ifdef __VMS
615/* Function to send in segments */
616static int
617sendsegmented(int sock_fd, char *buf, int len, int flags)
618{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000619 int n = 0;
620 int remaining = len;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000621
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000622 while (remaining > 0) {
623 unsigned int segment;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000624
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000625 segment = (remaining >= SEGMENT_SIZE ? SEGMENT_SIZE : remaining);
626 n = send(sock_fd, buf, segment, flags);
627 if (n < 0) {
628 return n;
629 }
630 remaining -= segment;
631 buf += segment;
632 } /* end while */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000633
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000634 return len;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000635}
636#endif
637
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000638/* Function to perform the setting of socket blocking mode
639 internally. block = (1 | 0). */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000640static int
641internal_setblocking(PySocketSockObject *s, int block)
642{
Guido van Rossum67f7a382002-06-06 21:08:16 +0000643#ifndef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000644 int delay_flag;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000645#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +0000646#ifdef SOCK_NONBLOCK
647 if (block)
648 s->sock_type &= (~SOCK_NONBLOCK);
649 else
650 s->sock_type |= SOCK_NONBLOCK;
651#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +0000652
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000653 Py_BEGIN_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000654#ifndef MS_WINDOWS
655#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000656 block = !block;
657 ioctl(s->sock_fd, FIONBIO, (caddr_t)&block, sizeof(block));
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000658#elif defined(__VMS)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000659 block = !block;
660 ioctl(s->sock_fd, FIONBIO, (unsigned int *)&block);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000661#else /* !PYOS_OS2 && !__VMS */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000662 delay_flag = fcntl(s->sock_fd, F_GETFL, 0);
663 if (block)
664 delay_flag &= (~O_NONBLOCK);
665 else
666 delay_flag |= O_NONBLOCK;
667 fcntl(s->sock_fd, F_SETFL, delay_flag);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000668#endif /* !PYOS_OS2 */
669#else /* MS_WINDOWS */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000670 block = !block;
671 ioctlsocket(s->sock_fd, FIONBIO, (u_long*)&block);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000672#endif /* MS_WINDOWS */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000673 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000674
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000675 /* Since these don't return anything */
676 return 1;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000677}
678
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000679/* Do a select()/poll() on the socket, if necessary (sock_timeout > 0).
Guido van Rossum11ba0942002-06-13 15:07:44 +0000680 The argument writing indicates the direction.
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000681 This does not raise an exception; we'll let our caller do that
682 after they've reacquired the interpreter lock.
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000683 Returns 1 on timeout, -1 on error, 0 otherwise. */
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000684static int
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000685internal_select_ex(PySocketSockObject *s, int writing, double interval)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000686{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000687 int n;
Guido van Rossum11ba0942002-06-13 15:07:44 +0000688
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000689 /* Nothing to do unless we're in timeout mode (not non-blocking) */
690 if (s->sock_timeout <= 0.0)
691 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000692
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000693 /* Guard against closed socket */
694 if (s->sock_fd < 0)
695 return 0;
Guido van Rossumad654902002-07-19 12:44:59 +0000696
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000697 /* Handling this condition here simplifies the select loops */
698 if (interval < 0.0)
699 return 1;
700
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000701 /* Prefer poll, if available, since you can poll() any fd
702 * which can't be done with select(). */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000703#ifdef HAVE_POLL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000704 {
705 struct pollfd pollfd;
706 int timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000707
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000708 pollfd.fd = s->sock_fd;
709 pollfd.events = writing ? POLLOUT : POLLIN;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000710
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000711 /* s->sock_timeout is in seconds, timeout in ms */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000712 timeout = (int)(interval * 1000 + 0.5);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000713 n = poll(&pollfd, 1, timeout);
714 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000715#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000716 {
717 /* Construct the arguments to select */
718 fd_set fds;
719 struct timeval tv;
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000720 tv.tv_sec = (int)interval;
721 tv.tv_usec = (int)((interval - tv.tv_sec) * 1e6);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000722 FD_ZERO(&fds);
723 FD_SET(s->sock_fd, &fds);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000724
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000725 /* See if the socket is ready */
726 if (writing)
Antoine Pitrou19467d22010-08-17 19:33:30 +0000727 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
728 NULL, &fds, NULL, &tv);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000729 else
Antoine Pitrou19467d22010-08-17 19:33:30 +0000730 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
731 &fds, NULL, NULL, &tv);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000732 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000733#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000734
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000735 if (n < 0)
736 return -1;
737 if (n == 0)
738 return 1;
739 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000740}
741
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000742static int
743internal_select(PySocketSockObject *s, int writing)
744{
745 return internal_select_ex(s, writing, s->sock_timeout);
746}
747
748/*
749 Two macros for automatic retry of select() in case of false positives
750 (for example, select() could indicate a socket is ready for reading
751 but the data then discarded by the OS because of a wrong checksum).
752 Here is an example of use:
753
754 BEGIN_SELECT_LOOP(s)
755 Py_BEGIN_ALLOW_THREADS
756 timeout = internal_select_ex(s, 0, interval);
757 if (!timeout)
758 outlen = recv(s->sock_fd, cbuf, len, flags);
759 Py_END_ALLOW_THREADS
760 if (timeout == 1) {
761 PyErr_SetString(socket_timeout, "timed out");
762 return -1;
763 }
764 END_SELECT_LOOP(s)
765*/
766
767#define BEGIN_SELECT_LOOP(s) \
768 { \
769 _PyTime_timeval now, deadline = {0, 0}; \
770 double interval = s->sock_timeout; \
771 int has_timeout = s->sock_timeout > 0.0; \
772 if (has_timeout) { \
773 _PyTime_gettimeofday(&now); \
774 deadline = now; \
775 _PyTime_ADD_SECONDS(deadline, s->sock_timeout); \
776 } \
777 while (1) { \
778 errno = 0; \
779
780#define END_SELECT_LOOP(s) \
781 if (!has_timeout || \
782 (!CHECK_ERRNO(EWOULDBLOCK) && !CHECK_ERRNO(EAGAIN))) \
783 break; \
784 _PyTime_gettimeofday(&now); \
785 interval = _PyTime_INTERVAL(now, deadline); \
786 } \
787 } \
788
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000789/* Initialize a new socket object. */
790
Tim Petersa12b4cf2002-07-18 22:38:44 +0000791static double defaulttimeout = -1.0; /* Default timeout for new sockets */
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000792
Martin v. Löwis1a214512008-06-11 05:26:20 +0000793static void
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000794init_sockobject(PySocketSockObject *s,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000795 SOCKET_T fd, int family, int type, int proto)
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000796{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000797 s->sock_fd = fd;
798 s->sock_family = family;
799 s->sock_type = type;
800 s->sock_proto = proto;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000801
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000802 s->errorhandler = &set_error;
Antoine Pitroub1c54962010-10-14 15:05:38 +0000803#ifdef SOCK_NONBLOCK
804 if (type & SOCK_NONBLOCK)
805 s->sock_timeout = 0.0;
806 else
807#endif
808 {
809 s->sock_timeout = defaulttimeout;
810 if (defaulttimeout >= 0.0)
811 internal_setblocking(s, 0);
812 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000813
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000814}
815
816
Guido van Rossum30a685f1991-06-27 15:51:29 +0000817/* Create a new socket object.
818 This just creates the object and initializes it.
819 If the creation fails, return NULL and set an exception (implicit
820 in NEWOBJ()). */
821
Guido van Rossum73624e91994-10-10 17:59:00 +0000822static PySocketSockObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000823new_sockobject(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000824{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000825 PySocketSockObject *s;
826 s = (PySocketSockObject *)
827 PyType_GenericNew(&sock_type, NULL, NULL);
828 if (s != NULL)
829 init_sockobject(s, fd, family, type, proto);
830 return s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000831}
832
Guido van Rossum30a685f1991-06-27 15:51:29 +0000833
Guido van Rossum48a680c2001-03-02 06:34:14 +0000834/* Lock to allow python interpreter to continue, but only allow one
Just van Rossum1040d2c2003-05-09 07:53:18 +0000835 thread to be in gethostbyname or getaddrinfo */
836#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
837PyThread_type_lock netdb_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000838#endif
839
840
Guido van Rossum30a685f1991-06-27 15:51:29 +0000841/* Convert a string specifying a host name or one of a few symbolic
842 names to a numeric IP address. This usually calls gethostbyname()
843 to do the work; the names "" and "<broadcast>" are special.
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000844 Return the length (IPv4 should be 4 bytes), or negative if
Guido van Rossum30a685f1991-06-27 15:51:29 +0000845 an error occurred; then an exception is raised. */
846
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000847static int
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000848setipaddr(char *name, struct sockaddr *addr_ret, size_t addr_ret_size, int af)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000849{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000850 struct addrinfo hints, *res;
851 int error;
852 int d1, d2, d3, d4;
853 char ch;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000854
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000855 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
856 if (name[0] == '\0') {
857 int siz;
858 memset(&hints, 0, sizeof(hints));
859 hints.ai_family = af;
860 hints.ai_socktype = SOCK_DGRAM; /*dummy*/
861 hints.ai_flags = AI_PASSIVE;
862 Py_BEGIN_ALLOW_THREADS
863 ACQUIRE_GETADDRINFO_LOCK
864 error = getaddrinfo(NULL, "0", &hints, &res);
865 Py_END_ALLOW_THREADS
866 /* We assume that those thread-unsafe getaddrinfo() versions
867 *are* safe regarding their return value, ie. that a
868 subsequent call to getaddrinfo() does not destroy the
869 outcome of the first call. */
870 RELEASE_GETADDRINFO_LOCK
871 if (error) {
872 set_gaierror(error);
873 return -1;
874 }
875 switch (res->ai_family) {
876 case AF_INET:
877 siz = 4;
878 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000879#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000880 case AF_INET6:
881 siz = 16;
882 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000883#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000884 default:
885 freeaddrinfo(res);
886 PyErr_SetString(socket_error,
887 "unsupported address family");
888 return -1;
889 }
890 if (res->ai_next) {
891 freeaddrinfo(res);
892 PyErr_SetString(socket_error,
893 "wildcard resolved to multiple address");
894 return -1;
895 }
896 if (res->ai_addrlen < addr_ret_size)
897 addr_ret_size = res->ai_addrlen;
898 memcpy(addr_ret, res->ai_addr, addr_ret_size);
899 freeaddrinfo(res);
900 return siz;
901 }
902 if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
903 struct sockaddr_in *sin;
904 if (af != AF_INET && af != AF_UNSPEC) {
905 PyErr_SetString(socket_error,
906 "address family mismatched");
907 return -1;
908 }
909 sin = (struct sockaddr_in *)addr_ret;
910 memset((void *) sin, '\0', sizeof(*sin));
911 sin->sin_family = AF_INET;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000912#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000913 sin->sin_len = sizeof(*sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000914#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000915 sin->sin_addr.s_addr = INADDR_BROADCAST;
916 return sizeof(sin->sin_addr);
917 }
918 if (sscanf(name, "%d.%d.%d.%d%c", &d1, &d2, &d3, &d4, &ch) == 4 &&
919 0 <= d1 && d1 <= 255 && 0 <= d2 && d2 <= 255 &&
920 0 <= d3 && d3 <= 255 && 0 <= d4 && d4 <= 255) {
921 struct sockaddr_in *sin;
922 sin = (struct sockaddr_in *)addr_ret;
923 sin->sin_addr.s_addr = htonl(
924 ((long) d1 << 24) | ((long) d2 << 16) |
925 ((long) d3 << 8) | ((long) d4 << 0));
926 sin->sin_family = AF_INET;
Anthony Baxter0e85f9d2003-05-02 15:40:46 +0000927#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000928 sin->sin_len = sizeof(*sin);
Anthony Baxter0e85f9d2003-05-02 15:40:46 +0000929#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000930 return 4;
931 }
932 memset(&hints, 0, sizeof(hints));
933 hints.ai_family = af;
934 Py_BEGIN_ALLOW_THREADS
935 ACQUIRE_GETADDRINFO_LOCK
936 error = getaddrinfo(name, NULL, &hints, &res);
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000937#if defined(__digital__) && defined(__unix__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000938 if (error == EAI_NONAME && af == AF_UNSPEC) {
939 /* On Tru64 V5.1, numeric-to-addr conversion fails
940 if no address family is given. Assume IPv4 for now.*/
941 hints.ai_family = AF_INET;
942 error = getaddrinfo(name, NULL, &hints, &res);
943 }
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000944#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000945 Py_END_ALLOW_THREADS
946 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
947 if (error) {
948 set_gaierror(error);
949 return -1;
950 }
951 if (res->ai_addrlen < addr_ret_size)
952 addr_ret_size = res->ai_addrlen;
953 memcpy((char *) addr_ret, res->ai_addr, addr_ret_size);
954 freeaddrinfo(res);
955 switch (addr_ret->sa_family) {
956 case AF_INET:
957 return 4;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000958#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000959 case AF_INET6:
960 return 16;
Guido van Rossum955becc1999-03-22 20:14:53 +0000961#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000962 default:
963 PyErr_SetString(socket_error, "unknown address family");
964 return -1;
965 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000966}
967
Guido van Rossum30a685f1991-06-27 15:51:29 +0000968
Guido van Rossum30a685f1991-06-27 15:51:29 +0000969/* Create a string object representing an IP address.
970 This is always a string of the form 'dd.dd.dd.dd' (with variable
971 size numbers). */
972
Guido van Rossum73624e91994-10-10 17:59:00 +0000973static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000974makeipaddr(struct sockaddr *addr, int addrlen)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000975{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000976 char buf[NI_MAXHOST];
977 int error;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000978
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000979 error = getnameinfo(addr, addrlen, buf, sizeof(buf), NULL, 0,
980 NI_NUMERICHOST);
981 if (error) {
982 set_gaierror(error);
983 return NULL;
984 }
985 return PyUnicode_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000986}
987
988
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000989#ifdef USE_BLUETOOTH
990/* Convert a string representation of a Bluetooth address into a numeric
991 address. Returns the length (6), or raises an exception and returns -1 if
992 an error occurred. */
993
994static int
995setbdaddr(char *name, bdaddr_t *bdaddr)
996{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000997 unsigned int b0, b1, b2, b3, b4, b5;
998 char ch;
999 int n;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001000
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001001 n = sscanf(name, "%X:%X:%X:%X:%X:%X%c",
1002 &b5, &b4, &b3, &b2, &b1, &b0, &ch);
1003 if (n == 6 && (b0 | b1 | b2 | b3 | b4 | b5) < 256) {
1004 bdaddr->b[0] = b0;
1005 bdaddr->b[1] = b1;
1006 bdaddr->b[2] = b2;
1007 bdaddr->b[3] = b3;
1008 bdaddr->b[4] = b4;
1009 bdaddr->b[5] = b5;
1010 return 6;
1011 } else {
1012 PyErr_SetString(socket_error, "bad bluetooth address");
1013 return -1;
1014 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001015}
1016
1017/* Create a string representation of the Bluetooth address. This is always a
1018 string of the form 'XX:XX:XX:XX:XX:XX' where XX is a two digit hexadecimal
1019 value (zero padded if necessary). */
1020
1021static PyObject *
1022makebdaddr(bdaddr_t *bdaddr)
1023{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001024 char buf[(6 * 2) + 5 + 1];
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001025
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001026 sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X",
1027 bdaddr->b[5], bdaddr->b[4], bdaddr->b[3],
1028 bdaddr->b[2], bdaddr->b[1], bdaddr->b[0]);
1029 return PyUnicode_FromString(buf);
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001030}
1031#endif
1032
1033
Guido van Rossum30a685f1991-06-27 15:51:29 +00001034/* Create an object representing the given socket address,
1035 suitable for passing it back to bind(), connect() etc.
1036 The family field of the sockaddr structure is inspected
1037 to determine what kind of address it really is. */
1038
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001039/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001040static PyObject *
Antoine Pitrou19467d22010-08-17 19:33:30 +00001041makesockaddr(SOCKET_T sockfd, struct sockaddr *addr, size_t addrlen, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001042{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001043 if (addrlen == 0) {
1044 /* No address -- may be recvfrom() from known socket */
1045 Py_INCREF(Py_None);
1046 return Py_None;
1047 }
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001048
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001049 switch (addr->sa_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001050
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001051 case AF_INET:
1052 {
1053 struct sockaddr_in *a;
1054 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
1055 PyObject *ret = NULL;
1056 if (addrobj) {
1057 a = (struct sockaddr_in *)addr;
1058 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
1059 Py_DECREF(addrobj);
1060 }
1061 return ret;
1062 }
Guido van Rossum30a685f1991-06-27 15:51:29 +00001063
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001064#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001065 case AF_UNIX:
1066 {
1067 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001068#ifdef linux
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001069 if (a->sun_path[0] == 0) { /* Linux abstract namespace */
1070 addrlen -= offsetof(struct sockaddr_un, sun_path);
1071 return PyBytes_FromStringAndSize(a->sun_path, addrlen);
1072 }
1073 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001074#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001075 {
1076 /* regular NULL-terminated string */
1077 return PyUnicode_FromString(a->sun_path);
1078 }
1079 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001080#endif /* AF_UNIX */
1081
Martin v. Löwis11017b12006-01-14 18:12:57 +00001082#if defined(AF_NETLINK)
1083 case AF_NETLINK:
1084 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001085 struct sockaddr_nl *a = (struct sockaddr_nl *) addr;
1086 return Py_BuildValue("II", a->nl_pid, a->nl_groups);
Martin v. Löwis11017b12006-01-14 18:12:57 +00001087 }
1088#endif /* AF_NETLINK */
1089
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001090#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001091 case AF_INET6:
1092 {
1093 struct sockaddr_in6 *a;
1094 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
1095 PyObject *ret = NULL;
1096 if (addrobj) {
1097 a = (struct sockaddr_in6 *)addr;
1098 ret = Py_BuildValue("Oiii",
1099 addrobj,
1100 ntohs(a->sin6_port),
1101 a->sin6_flowinfo,
1102 a->sin6_scope_id);
1103 Py_DECREF(addrobj);
1104 }
1105 return ret;
1106 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001107#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001108
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001109#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001110 case AF_BLUETOOTH:
1111 switch (proto) {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001112
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001113 case BTPROTO_L2CAP:
1114 {
1115 struct sockaddr_l2 *a = (struct sockaddr_l2 *) addr;
1116 PyObject *addrobj = makebdaddr(&_BT_L2_MEMB(a, bdaddr));
1117 PyObject *ret = NULL;
1118 if (addrobj) {
1119 ret = Py_BuildValue("Oi",
1120 addrobj,
1121 _BT_L2_MEMB(a, psm));
1122 Py_DECREF(addrobj);
1123 }
1124 return ret;
1125 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001126
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001127 case BTPROTO_RFCOMM:
1128 {
1129 struct sockaddr_rc *a = (struct sockaddr_rc *) addr;
1130 PyObject *addrobj = makebdaddr(&_BT_RC_MEMB(a, bdaddr));
1131 PyObject *ret = NULL;
1132 if (addrobj) {
1133 ret = Py_BuildValue("Oi",
1134 addrobj,
1135 _BT_RC_MEMB(a, channel));
1136 Py_DECREF(addrobj);
1137 }
1138 return ret;
1139 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001140
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001141 case BTPROTO_HCI:
1142 {
1143 struct sockaddr_hci *a = (struct sockaddr_hci *) addr;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001144#if defined(__NetBSD__) || defined(__DragonFly__)
1145 return makebdaddr(&_BT_HCI_MEMB(a, bdaddr));
1146#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001147 PyObject *ret = NULL;
1148 ret = Py_BuildValue("i", _BT_HCI_MEMB(a, dev));
1149 return ret;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001150#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001151 }
Thomas Wouterscf297e42007-02-23 15:07:44 +00001152
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001153#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001154 case BTPROTO_SCO:
1155 {
1156 struct sockaddr_sco *a = (struct sockaddr_sco *) addr;
1157 return makebdaddr(&_BT_SCO_MEMB(a, bdaddr));
1158 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001159#endif
1160
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001161 default:
1162 PyErr_SetString(PyExc_ValueError,
1163 "Unknown Bluetooth protocol");
1164 return NULL;
1165 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001166#endif
1167
Antoine Pitroub156a462010-10-27 20:13:57 +00001168#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFNAME)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001169 case AF_PACKET:
1170 {
1171 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
1172 char *ifname = "";
1173 struct ifreq ifr;
1174 /* need to look up interface name give index */
1175 if (a->sll_ifindex) {
1176 ifr.ifr_ifindex = a->sll_ifindex;
1177 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1178 ifname = ifr.ifr_name;
1179 }
1180 return Py_BuildValue("shbhy#",
1181 ifname,
1182 ntohs(a->sll_protocol),
1183 a->sll_pkttype,
1184 a->sll_hatype,
1185 a->sll_addr,
1186 a->sll_halen);
1187 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001188#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001189
Christian Heimes043d6f62008-01-07 17:19:16 +00001190#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001191 case AF_TIPC:
1192 {
1193 struct sockaddr_tipc *a = (struct sockaddr_tipc *) addr;
1194 if (a->addrtype == TIPC_ADDR_NAMESEQ) {
1195 return Py_BuildValue("IIIII",
1196 a->addrtype,
1197 a->addr.nameseq.type,
1198 a->addr.nameseq.lower,
1199 a->addr.nameseq.upper,
1200 a->scope);
1201 } else if (a->addrtype == TIPC_ADDR_NAME) {
1202 return Py_BuildValue("IIIII",
1203 a->addrtype,
1204 a->addr.name.name.type,
1205 a->addr.name.name.instance,
1206 a->addr.name.name.instance,
1207 a->scope);
1208 } else if (a->addrtype == TIPC_ADDR_ID) {
1209 return Py_BuildValue("IIIII",
1210 a->addrtype,
1211 a->addr.id.node,
1212 a->addr.id.ref,
1213 0,
1214 a->scope);
1215 } else {
1216 PyErr_SetString(PyExc_ValueError,
1217 "Invalid address type");
1218 return NULL;
1219 }
1220 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001221#endif
1222
Charles-François Natali30589c92011-10-07 22:47:08 +02001223#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02001224 case AF_CAN:
1225 {
1226 struct sockaddr_can *a = (struct sockaddr_can *)addr;
1227 char *ifname = "";
1228 struct ifreq ifr;
1229 /* need to look up interface name given index */
1230 if (a->can_ifindex) {
1231 ifr.ifr_ifindex = a->can_ifindex;
1232 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1233 ifname = ifr.ifr_name;
1234 }
1235
1236 return Py_BuildValue("O&h", PyUnicode_DecodeFSDefault,
1237 ifname,
1238 a->can_family);
1239 }
1240#endif
1241
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001242 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001243
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001244 default:
1245 /* If we don't know the address family, don't raise an
1246 exception -- return it as an (int, bytes) tuple. */
1247 return Py_BuildValue("iy#",
1248 addr->sa_family,
1249 addr->sa_data,
1250 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001251
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001252 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001253}
1254
Guido van Rossum30a685f1991-06-27 15:51:29 +00001255
1256/* Parse a socket address argument according to the socket object's
1257 address family. Return 1 if the address was in the proper format,
1258 0 of not. The address is returned through addr_ret, its length
1259 through len_ret. */
1260
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001261static int
Guido van Rossum48a680c2001-03-02 06:34:14 +00001262getsockaddrarg(PySocketSockObject *s, PyObject *args,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001263 struct sockaddr *addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001264{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001265 switch (s->sock_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001266
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001267#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001268 case AF_UNIX:
1269 {
1270 struct sockaddr_un* addr;
1271 char *path;
1272 int len;
1273 if (!PyArg_Parse(args, "s#", &path, &len))
1274 return 0;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001275
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001276 addr = (struct sockaddr_un*)addr_ret;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001277#ifdef linux
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001278 if (len > 0 && path[0] == 0) {
1279 /* Linux abstract namespace extension */
1280 if (len > sizeof addr->sun_path) {
1281 PyErr_SetString(socket_error,
1282 "AF_UNIX path too long");
1283 return 0;
1284 }
1285 }
1286 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001287#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001288 {
1289 /* regular NULL-terminated string */
1290 if (len >= sizeof addr->sun_path) {
1291 PyErr_SetString(socket_error,
1292 "AF_UNIX path too long");
1293 return 0;
1294 }
1295 addr->sun_path[len] = 0;
1296 }
1297 addr->sun_family = s->sock_family;
1298 memcpy(addr->sun_path, path, len);
Andrew MacIntyredaedf212004-04-11 12:03:57 +00001299#if defined(PYOS_OS2)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001300 *len_ret = sizeof(*addr);
Andrew MacIntyredaedf212004-04-11 12:03:57 +00001301#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001302 *len_ret = len + offsetof(struct sockaddr_un, sun_path);
Andrew MacIntyredaedf212004-04-11 12:03:57 +00001303#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001304 return 1;
1305 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001306#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001307
Martin v. Löwis11017b12006-01-14 18:12:57 +00001308#if defined(AF_NETLINK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001309 case AF_NETLINK:
1310 {
1311 struct sockaddr_nl* addr;
1312 int pid, groups;
1313 addr = (struct sockaddr_nl *)addr_ret;
1314 if (!PyTuple_Check(args)) {
1315 PyErr_Format(
1316 PyExc_TypeError,
1317 "getsockaddrarg: "
1318 "AF_NETLINK address must be tuple, not %.500s",
1319 Py_TYPE(args)->tp_name);
1320 return 0;
1321 }
1322 if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &pid, &groups))
1323 return 0;
1324 addr->nl_family = AF_NETLINK;
1325 addr->nl_pid = pid;
1326 addr->nl_groups = groups;
1327 *len_ret = sizeof(*addr);
1328 return 1;
1329 }
Martin v. Löwis11017b12006-01-14 18:12:57 +00001330#endif
1331
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001332 case AF_INET:
1333 {
1334 struct sockaddr_in* addr;
1335 char *host;
1336 int port, result;
1337 if (!PyTuple_Check(args)) {
1338 PyErr_Format(
1339 PyExc_TypeError,
1340 "getsockaddrarg: "
1341 "AF_INET address must be tuple, not %.500s",
1342 Py_TYPE(args)->tp_name);
1343 return 0;
1344 }
1345 if (!PyArg_ParseTuple(args, "eti:getsockaddrarg",
1346 "idna", &host, &port))
1347 return 0;
1348 addr=(struct sockaddr_in*)addr_ret;
1349 result = setipaddr(host, (struct sockaddr *)addr,
1350 sizeof(*addr), AF_INET);
1351 PyMem_Free(host);
1352 if (result < 0)
1353 return 0;
1354 if (port < 0 || port > 0xffff) {
1355 PyErr_SetString(
1356 PyExc_OverflowError,
1357 "getsockaddrarg: port must be 0-65535.");
1358 return 0;
1359 }
1360 addr->sin_family = AF_INET;
1361 addr->sin_port = htons((short)port);
1362 *len_ret = sizeof *addr;
1363 return 1;
1364 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001365
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001366#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001367 case AF_INET6:
1368 {
1369 struct sockaddr_in6* addr;
1370 char *host;
1371 int port, flowinfo, scope_id, result;
1372 flowinfo = scope_id = 0;
1373 if (!PyTuple_Check(args)) {
1374 PyErr_Format(
1375 PyExc_TypeError,
1376 "getsockaddrarg: "
1377 "AF_INET6 address must be tuple, not %.500s",
1378 Py_TYPE(args)->tp_name);
1379 return 0;
1380 }
1381 if (!PyArg_ParseTuple(args, "eti|ii",
1382 "idna", &host, &port, &flowinfo,
1383 &scope_id)) {
1384 return 0;
1385 }
1386 addr = (struct sockaddr_in6*)addr_ret;
1387 result = setipaddr(host, (struct sockaddr *)addr,
1388 sizeof(*addr), AF_INET6);
1389 PyMem_Free(host);
1390 if (result < 0)
1391 return 0;
1392 if (port < 0 || port > 0xffff) {
1393 PyErr_SetString(
1394 PyExc_OverflowError,
1395 "getsockaddrarg: port must be 0-65535.");
1396 return 0;
1397 }
1398 addr->sin6_family = s->sock_family;
1399 addr->sin6_port = htons((short)port);
1400 addr->sin6_flowinfo = flowinfo;
1401 addr->sin6_scope_id = scope_id;
1402 *len_ret = sizeof *addr;
1403 return 1;
1404 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001405#endif
1406
Hye-Shik Chang81268602004-02-02 06:05:24 +00001407#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001408 case AF_BLUETOOTH:
1409 {
1410 switch (s->sock_proto) {
1411 case BTPROTO_L2CAP:
1412 {
1413 struct sockaddr_l2 *addr;
1414 char *straddr;
Martin v. Löwis12af0482004-01-31 12:34:17 +00001415
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001416 addr = (struct sockaddr_l2 *)addr_ret;
1417 memset(addr, 0, sizeof(struct sockaddr_l2));
1418 _BT_L2_MEMB(addr, family) = AF_BLUETOOTH;
1419 if (!PyArg_ParseTuple(args, "si", &straddr,
1420 &_BT_L2_MEMB(addr, psm))) {
1421 PyErr_SetString(socket_error, "getsockaddrarg: "
1422 "wrong format");
1423 return 0;
1424 }
1425 if (setbdaddr(straddr, &_BT_L2_MEMB(addr, bdaddr)) < 0)
1426 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001427
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001428 *len_ret = sizeof *addr;
1429 return 1;
1430 }
1431 case BTPROTO_RFCOMM:
1432 {
1433 struct sockaddr_rc *addr;
1434 char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001435
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001436 addr = (struct sockaddr_rc *)addr_ret;
1437 _BT_RC_MEMB(addr, family) = AF_BLUETOOTH;
1438 if (!PyArg_ParseTuple(args, "si", &straddr,
1439 &_BT_RC_MEMB(addr, channel))) {
1440 PyErr_SetString(socket_error, "getsockaddrarg: "
1441 "wrong format");
1442 return 0;
1443 }
1444 if (setbdaddr(straddr, &_BT_RC_MEMB(addr, bdaddr)) < 0)
1445 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001446
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001447 *len_ret = sizeof *addr;
1448 return 1;
1449 }
1450 case BTPROTO_HCI:
1451 {
1452 struct sockaddr_hci *addr = (struct sockaddr_hci *)addr_ret;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001453#if defined(__NetBSD__) || defined(__DragonFly__)
Alexander Belopolskye239d232010-12-08 23:31:48 +00001454 char *straddr = PyBytes_AS_STRING(args);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001455
Alexander Belopolskye239d232010-12-08 23:31:48 +00001456 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001457 if (straddr == NULL) {
1458 PyErr_SetString(socket_error, "getsockaddrarg: "
1459 "wrong format");
1460 return 0;
1461 }
1462 if (setbdaddr(straddr, &_BT_HCI_MEMB(addr, bdaddr)) < 0)
1463 return 0;
1464#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001465 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
1466 if (!PyArg_ParseTuple(args, "i", &_BT_HCI_MEMB(addr, dev))) {
1467 PyErr_SetString(socket_error, "getsockaddrarg: "
1468 "wrong format");
1469 return 0;
1470 }
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001471#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001472 *len_ret = sizeof *addr;
1473 return 1;
1474 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001475#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001476 case BTPROTO_SCO:
1477 {
1478 struct sockaddr_sco *addr;
1479 char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001480
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001481 addr = (struct sockaddr_sco *)addr_ret;
1482 _BT_SCO_MEMB(addr, family) = AF_BLUETOOTH;
1483 if (!PyBytes_Check(args)) {
1484 PyErr_SetString(socket_error, "getsockaddrarg: "
1485 "wrong format");
1486 return 0;
1487 }
1488 straddr = PyBytes_AS_STRING(args);
1489 if (setbdaddr(straddr, &_BT_SCO_MEMB(addr, bdaddr)) < 0)
1490 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001491
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001492 *len_ret = sizeof *addr;
1493 return 1;
1494 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001495#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001496 default:
1497 PyErr_SetString(socket_error, "getsockaddrarg: unknown Bluetooth protocol");
1498 return 0;
1499 }
1500 }
Martin v. Löwis12af0482004-01-31 12:34:17 +00001501#endif
1502
Antoine Pitroub156a462010-10-27 20:13:57 +00001503#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFINDEX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001504 case AF_PACKET:
1505 {
1506 struct sockaddr_ll* addr;
1507 struct ifreq ifr;
1508 char *interfaceName;
1509 int protoNumber;
1510 int hatype = 0;
1511 int pkttype = 0;
1512 char *haddr = NULL;
1513 unsigned int halen = 0;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001514
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001515 if (!PyTuple_Check(args)) {
1516 PyErr_Format(
1517 PyExc_TypeError,
1518 "getsockaddrarg: "
1519 "AF_PACKET address must be tuple, not %.500s",
1520 Py_TYPE(args)->tp_name);
1521 return 0;
1522 }
1523 if (!PyArg_ParseTuple(args, "si|iiy#", &interfaceName,
1524 &protoNumber, &pkttype, &hatype,
1525 &haddr, &halen))
1526 return 0;
1527 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
1528 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
1529 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1530 s->errorhandler();
1531 return 0;
1532 }
1533 if (halen > 8) {
1534 PyErr_SetString(PyExc_ValueError,
1535 "Hardware address must be 8 bytes or less");
1536 return 0;
1537 }
1538 if (protoNumber < 0 || protoNumber > 0xffff) {
1539 PyErr_SetString(
1540 PyExc_OverflowError,
1541 "getsockaddrarg: protoNumber must be 0-65535.");
1542 return 0;
1543 }
1544 addr = (struct sockaddr_ll*)addr_ret;
1545 addr->sll_family = AF_PACKET;
1546 addr->sll_protocol = htons((short)protoNumber);
1547 addr->sll_ifindex = ifr.ifr_ifindex;
1548 addr->sll_pkttype = pkttype;
1549 addr->sll_hatype = hatype;
1550 if (halen != 0) {
1551 memcpy(&addr->sll_addr, haddr, halen);
1552 }
1553 addr->sll_halen = halen;
1554 *len_ret = sizeof *addr;
1555 return 1;
1556 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00001557#endif
1558
Christian Heimes043d6f62008-01-07 17:19:16 +00001559#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001560 case AF_TIPC:
1561 {
1562 unsigned int atype, v1, v2, v3;
1563 unsigned int scope = TIPC_CLUSTER_SCOPE;
1564 struct sockaddr_tipc *addr;
Christian Heimes043d6f62008-01-07 17:19:16 +00001565
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001566 if (!PyTuple_Check(args)) {
1567 PyErr_Format(
1568 PyExc_TypeError,
1569 "getsockaddrarg: "
1570 "AF_TIPC address must be tuple, not %.500s",
1571 Py_TYPE(args)->tp_name);
1572 return 0;
1573 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001574
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001575 if (!PyArg_ParseTuple(args,
1576 "IIII|I;Invalid TIPC address format",
1577 &atype, &v1, &v2, &v3, &scope))
1578 return 0;
Christian Heimes043d6f62008-01-07 17:19:16 +00001579
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001580 addr = (struct sockaddr_tipc *) addr_ret;
1581 memset(addr, 0, sizeof(struct sockaddr_tipc));
Christian Heimes043d6f62008-01-07 17:19:16 +00001582
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001583 addr->family = AF_TIPC;
1584 addr->scope = scope;
1585 addr->addrtype = atype;
Christian Heimes043d6f62008-01-07 17:19:16 +00001586
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001587 if (atype == TIPC_ADDR_NAMESEQ) {
1588 addr->addr.nameseq.type = v1;
1589 addr->addr.nameseq.lower = v2;
1590 addr->addr.nameseq.upper = v3;
1591 } else if (atype == TIPC_ADDR_NAME) {
1592 addr->addr.name.name.type = v1;
1593 addr->addr.name.name.instance = v2;
1594 } else if (atype == TIPC_ADDR_ID) {
1595 addr->addr.id.node = v1;
1596 addr->addr.id.ref = v2;
1597 } else {
1598 /* Shouldn't happen */
1599 PyErr_SetString(PyExc_TypeError, "Invalid address type");
1600 return 0;
1601 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001602
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001603 *len_ret = sizeof(*addr);
Christian Heimes043d6f62008-01-07 17:19:16 +00001604
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001605 return 1;
1606 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001607#endif
1608
Charles-François Natali30589c92011-10-07 22:47:08 +02001609#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02001610 case AF_CAN:
1611 switch (s->sock_proto) {
1612 case CAN_RAW:
1613 {
1614 struct sockaddr_can *addr;
1615 PyObject *interfaceName;
1616 struct ifreq ifr;
1617 addr = (struct sockaddr_can *)addr_ret;
1618 Py_ssize_t len;
1619
1620 if (!PyArg_ParseTuple(args, "O&", PyUnicode_FSConverter,
1621 &interfaceName))
1622 return 0;
1623
1624 len = PyBytes_GET_SIZE(interfaceName);
1625
1626 if (len == 0) {
1627 ifr.ifr_ifindex = 0;
1628 } else if (len < sizeof(ifr.ifr_name)) {
1629 strcpy(ifr.ifr_name, PyBytes_AS_STRING(interfaceName));
1630 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1631 s->errorhandler();
1632 Py_DECREF(interfaceName);
1633 return 0;
1634 }
1635 } else {
1636 PyErr_SetString(socket_error,
1637 "AF_CAN interface name too long");
1638 Py_DECREF(interfaceName);
1639 return 0;
1640 }
1641
1642 addr->can_family = AF_CAN;
1643 addr->can_ifindex = ifr.ifr_ifindex;
1644
1645 *len_ret = sizeof(*addr);
1646 Py_DECREF(interfaceName);
1647 return 1;
1648 }
1649 default:
1650 PyErr_SetString(socket_error,
1651 "getsockaddrarg: unsupported CAN protocol");
1652 return 0;
1653 }
1654#endif
1655
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001656 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001657
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001658 default:
1659 PyErr_SetString(socket_error, "getsockaddrarg: bad family");
1660 return 0;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001661
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001662 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001663}
1664
Guido van Rossum30a685f1991-06-27 15:51:29 +00001665
Guido van Rossum48a680c2001-03-02 06:34:14 +00001666/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +00001667 Return 1 if the family is known, 0 otherwise. The length is returned
1668 through len_ret. */
1669
1670static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +00001671getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +00001672{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001673 switch (s->sock_family) {
Guido van Rossum710e1df1992-06-12 10:39:36 +00001674
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001675#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001676 case AF_UNIX:
1677 {
1678 *len_ret = sizeof (struct sockaddr_un);
1679 return 1;
1680 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001681#endif /* AF_UNIX */
Martin v. Löwis11017b12006-01-14 18:12:57 +00001682#if defined(AF_NETLINK)
1683 case AF_NETLINK:
1684 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001685 *len_ret = sizeof (struct sockaddr_nl);
1686 return 1;
Martin v. Löwis11017b12006-01-14 18:12:57 +00001687 }
1688#endif
Guido van Rossum710e1df1992-06-12 10:39:36 +00001689
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001690 case AF_INET:
1691 {
1692 *len_ret = sizeof (struct sockaddr_in);
1693 return 1;
1694 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00001695
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001696#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001697 case AF_INET6:
1698 {
1699 *len_ret = sizeof (struct sockaddr_in6);
1700 return 1;
1701 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001702#endif
1703
Hye-Shik Chang81268602004-02-02 06:05:24 +00001704#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001705 case AF_BLUETOOTH:
1706 {
1707 switch(s->sock_proto)
1708 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001709
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001710 case BTPROTO_L2CAP:
1711 *len_ret = sizeof (struct sockaddr_l2);
1712 return 1;
1713 case BTPROTO_RFCOMM:
1714 *len_ret = sizeof (struct sockaddr_rc);
1715 return 1;
1716 case BTPROTO_HCI:
1717 *len_ret = sizeof (struct sockaddr_hci);
1718 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00001719#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001720 case BTPROTO_SCO:
1721 *len_ret = sizeof (struct sockaddr_sco);
1722 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00001723#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001724 default:
1725 PyErr_SetString(socket_error, "getsockaddrlen: "
1726 "unknown BT protocol");
1727 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001728
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001729 }
1730 }
Martin v. Löwis12af0482004-01-31 12:34:17 +00001731#endif
1732
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00001733#ifdef HAVE_NETPACKET_PACKET_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001734 case AF_PACKET:
1735 {
1736 *len_ret = sizeof (struct sockaddr_ll);
1737 return 1;
1738 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001739#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001740
Christian Heimes043d6f62008-01-07 17:19:16 +00001741#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001742 case AF_TIPC:
1743 {
1744 *len_ret = sizeof (struct sockaddr_tipc);
1745 return 1;
1746 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001747#endif
1748
Charles-François Natali30589c92011-10-07 22:47:08 +02001749#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02001750 case AF_CAN:
1751 {
1752 *len_ret = sizeof (struct sockaddr_can);
1753 return 1;
1754 }
1755#endif
1756
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001757 /* More cases here... */
Guido van Rossum710e1df1992-06-12 10:39:36 +00001758
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001759 default:
1760 PyErr_SetString(socket_error, "getsockaddrlen: bad family");
1761 return 0;
Guido van Rossum710e1df1992-06-12 10:39:36 +00001762
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001763 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00001764}
1765
1766
Nick Coghlan96fe56a2011-08-22 11:55:57 +10001767/* Support functions for the sendmsg() and recvmsg[_into]() methods.
1768 Currently, these methods are only compiled if the RFC 2292/3542
1769 CMSG_LEN() macro is available. Older systems seem to have used
1770 sizeof(struct cmsghdr) + (length) where CMSG_LEN() is used now, so
1771 it may be possible to define CMSG_LEN() that way if it's not
1772 provided. Some architectures might need extra padding after the
1773 cmsghdr, however, and CMSG_LEN() would have to take account of
1774 this. */
1775#ifdef CMSG_LEN
1776/* If length is in range, set *result to CMSG_LEN(length) and return
1777 true; otherwise, return false. */
1778static int
1779get_CMSG_LEN(size_t length, size_t *result)
1780{
1781 size_t tmp;
1782
1783 if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0)))
1784 return 0;
1785 tmp = CMSG_LEN(length);
1786 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
1787 return 0;
1788 *result = tmp;
1789 return 1;
1790}
1791
1792#ifdef CMSG_SPACE
1793/* If length is in range, set *result to CMSG_SPACE(length) and return
1794 true; otherwise, return false. */
1795static int
1796get_CMSG_SPACE(size_t length, size_t *result)
1797{
1798 size_t tmp;
1799
1800 /* Use CMSG_SPACE(1) here in order to take account of the padding
1801 necessary before *and* after the data. */
1802 if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1)))
1803 return 0;
1804 tmp = CMSG_SPACE(length);
1805 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
1806 return 0;
1807 *result = tmp;
1808 return 1;
1809}
1810#endif
1811
1812/* Return true iff msg->msg_controllen is valid, cmsgh is a valid
1813 pointer in msg->msg_control with at least "space" bytes after it,
1814 and its cmsg_len member inside the buffer. */
1815static int
1816cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space)
1817{
1818 size_t cmsg_offset;
1819 static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) +
1820 sizeof(cmsgh->cmsg_len));
1821
Charles-François Natali466517d2011-08-28 18:23:43 +02001822 /* Note that POSIX allows msg_controllen to be of signed type. */
1823 if (cmsgh == NULL || msg->msg_control == NULL || msg->msg_controllen < 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10001824 return 0;
1825 if (space < cmsg_len_end)
1826 space = cmsg_len_end;
1827 cmsg_offset = (char *)cmsgh - (char *)msg->msg_control;
1828 return (cmsg_offset <= (size_t)-1 - space &&
1829 cmsg_offset + space <= msg->msg_controllen);
1830}
1831
1832/* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set
1833 *space to number of bytes following it in the buffer and return
1834 true; otherwise, return false. Assumes cmsgh, msg->msg_control and
1835 msg->msg_controllen are valid. */
1836static int
1837get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space)
1838{
1839 size_t data_offset;
1840 char *data_ptr;
1841
1842 if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL)
1843 return 0;
1844 data_offset = data_ptr - (char *)msg->msg_control;
1845 if (data_offset > msg->msg_controllen)
1846 return 0;
1847 *space = msg->msg_controllen - data_offset;
1848 return 1;
1849}
1850
1851/* If cmsgh is invalid or not contained in the buffer pointed to by
1852 msg->msg_control, return -1. If cmsgh is valid and its associated
1853 data is entirely contained in the buffer, set *data_len to the
1854 length of the associated data and return 0. If only part of the
1855 associated data is contained in the buffer but cmsgh is otherwise
1856 valid, set *data_len to the length contained in the buffer and
1857 return 1. */
1858static int
1859get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len)
1860{
1861 size_t space, cmsg_data_len;
1862
1863 if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) ||
1864 cmsgh->cmsg_len < CMSG_LEN(0))
1865 return -1;
1866 cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0);
1867 if (!get_cmsg_data_space(msg, cmsgh, &space))
1868 return -1;
1869 if (space >= cmsg_data_len) {
1870 *data_len = cmsg_data_len;
1871 return 0;
1872 }
1873 *data_len = space;
1874 return 1;
1875}
1876#endif /* CMSG_LEN */
1877
1878
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001879/* s._accept() -> (fd, address) */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001880
Guido van Rossum73624e91994-10-10 17:59:00 +00001881static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001882sock_accept(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001883{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001884 sock_addr_t addrbuf;
1885 SOCKET_T newfd = INVALID_SOCKET;
1886 socklen_t addrlen;
1887 PyObject *sock = NULL;
1888 PyObject *addr = NULL;
1889 PyObject *res = NULL;
1890 int timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001891 if (!getsockaddrlen(s, &addrlen))
1892 return NULL;
1893 memset(&addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001894
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001895 if (!IS_SELECTABLE(s))
1896 return select_error();
Neal Norwitz082b2df2006-02-07 07:04:46 +00001897
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00001898 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001899 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00001900 timeout = internal_select_ex(s, 0, interval);
Antoine Pitroub1c54962010-10-14 15:05:38 +00001901 if (!timeout) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001902 newfd = accept(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
Antoine Pitroub1c54962010-10-14 15:05:38 +00001903 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001904 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001905
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001906 if (timeout == 1) {
1907 PyErr_SetString(socket_timeout, "timed out");
1908 return NULL;
1909 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00001910 END_SELECT_LOOP(s)
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001911
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001912 if (newfd == INVALID_SOCKET)
1913 return s->errorhandler();
Barry Warsaw752300b1997-01-03 17:18:10 +00001914
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001915 sock = PyLong_FromSocket_t(newfd);
1916 if (sock == NULL) {
1917 SOCKETCLOSE(newfd);
1918 goto finally;
1919 }
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001920
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001921 addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
1922 addrlen, s->sock_proto);
1923 if (addr == NULL)
1924 goto finally;
Barry Warsaw752300b1997-01-03 17:18:10 +00001925
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001926 res = PyTuple_Pack(2, sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00001927
Guido van Rossum67f7a382002-06-06 21:08:16 +00001928finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001929 Py_XDECREF(sock);
1930 Py_XDECREF(addr);
1931 return res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001932}
1933
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001934PyDoc_STRVAR(accept_doc,
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001935"_accept() -> (integer, address info)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00001936\n\
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001937Wait for an incoming connection. Return a new socket file descriptor\n\
1938representing the connection, and the address of the client.\n\
1939For IP sockets, the address info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001940
Guido van Rossum11ba0942002-06-13 15:07:44 +00001941/* s.setblocking(flag) method. Argument:
1942 False -- non-blocking mode; same as settimeout(0)
1943 True -- blocking mode; same as settimeout(None)
1944*/
Guido van Rossume4485b01994-09-07 14:32:49 +00001945
Guido van Rossum73624e91994-10-10 17:59:00 +00001946static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001947sock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00001948{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001949 int block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001950
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001951 block = PyLong_AsLong(arg);
1952 if (block == -1 && PyErr_Occurred())
1953 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001954
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001955 s->sock_timeout = block ? -1.0 : 0.0;
1956 internal_setblocking(s, block);
Guido van Rossume4485b01994-09-07 14:32:49 +00001957
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001958 Py_INCREF(Py_None);
1959 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +00001960}
Guido van Rossume4485b01994-09-07 14:32:49 +00001961
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001962PyDoc_STRVAR(setblocking_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001963"setblocking(flag)\n\
1964\n\
1965Set the socket to blocking (flag is true) or non-blocking (false).\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00001966setblocking(True) is equivalent to settimeout(None);\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001967setblocking(False) is equivalent to settimeout(0.0).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001968
Guido van Rossum11ba0942002-06-13 15:07:44 +00001969/* s.settimeout(timeout) method. Argument:
1970 None -- no timeout, blocking mode; same as setblocking(True)
1971 0.0 -- non-blocking mode; same as setblocking(False)
1972 > 0 -- timeout mode; operations time out after timeout seconds
1973 < 0 -- illegal; raises an exception
1974*/
Guido van Rossum67f7a382002-06-06 21:08:16 +00001975static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001976sock_settimeout(PySocketSockObject *s, PyObject *arg)
Guido van Rossum67f7a382002-06-06 21:08:16 +00001977{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001978 double timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001979
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001980 if (arg == Py_None)
1981 timeout = -1.0;
1982 else {
1983 timeout = PyFloat_AsDouble(arg);
1984 if (timeout < 0.0) {
1985 if (!PyErr_Occurred())
1986 PyErr_SetString(PyExc_ValueError,
1987 "Timeout value out of range");
1988 return NULL;
1989 }
1990 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00001991
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001992 s->sock_timeout = timeout;
1993 internal_setblocking(s, timeout < 0.0);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001994
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001995 Py_INCREF(Py_None);
1996 return Py_None;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001997}
1998
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001999PyDoc_STRVAR(settimeout_doc,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002000"settimeout(timeout)\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002001\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002002Set a timeout on socket operations. 'timeout' can be a float,\n\
2003giving in seconds, or None. Setting a timeout of None disables\n\
2004the timeout feature and is equivalent to setblocking(1).\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002005Setting a timeout of zero is the same as setblocking(0).");
Guido van Rossum67f7a382002-06-06 21:08:16 +00002006
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002007/* s.gettimeout() method.
2008 Returns the timeout associated with a socket. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00002009static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002010sock_gettimeout(PySocketSockObject *s)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002011{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002012 if (s->sock_timeout < 0.0) {
2013 Py_INCREF(Py_None);
2014 return Py_None;
2015 }
2016 else
2017 return PyFloat_FromDouble(s->sock_timeout);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002018}
2019
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002020PyDoc_STRVAR(gettimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002021"gettimeout() -> timeout\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002022\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03002023Returns the timeout in seconds (float) associated with socket \n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002024operations. A timeout of None indicates that timeouts on socket \n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002025operations are disabled.");
Guido van Rossume4485b01994-09-07 14:32:49 +00002026
Guido van Rossumaee08791992-09-08 09:05:33 +00002027/* s.setsockopt() method.
2028 With an integer third argument, sets an integer option.
2029 With a string third argument, sets an option from a buffer;
2030 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002031
Guido van Rossum73624e91994-10-10 17:59:00 +00002032static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002033sock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002034{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002035 int level;
2036 int optname;
2037 int res;
2038 char *buf;
2039 int buflen;
2040 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002041
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002042 if (PyArg_ParseTuple(args, "iii:setsockopt",
2043 &level, &optname, &flag)) {
2044 buf = (char *) &flag;
2045 buflen = sizeof flag;
2046 }
2047 else {
2048 PyErr_Clear();
2049 if (!PyArg_ParseTuple(args, "iiy#:setsockopt",
2050 &level, &optname, &buf, &buflen))
2051 return NULL;
2052 }
2053 res = setsockopt(s->sock_fd, level, optname, (void *)buf, buflen);
2054 if (res < 0)
2055 return s->errorhandler();
2056 Py_INCREF(Py_None);
2057 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002058}
2059
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002060PyDoc_STRVAR(setsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002061"setsockopt(level, option, value)\n\
2062\n\
2063Set a socket option. See the Unix manual for level and option.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002064The value argument can either be an integer or a string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002065
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002066
Guido van Rossumaee08791992-09-08 09:05:33 +00002067/* s.getsockopt() method.
2068 With two arguments, retrieves an integer option.
2069 With a third integer argument, retrieves a string buffer of that size;
2070 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002071
Guido van Rossum73624e91994-10-10 17:59:00 +00002072static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002073sock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002074{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002075 int level;
2076 int optname;
2077 int res;
2078 PyObject *buf;
2079 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002080
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002081 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
2082 &level, &optname, &buflen))
2083 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002084
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002085 if (buflen == 0) {
2086 int flag = 0;
2087 socklen_t flagsize = sizeof flag;
2088 res = getsockopt(s->sock_fd, level, optname,
2089 (void *)&flag, &flagsize);
2090 if (res < 0)
2091 return s->errorhandler();
2092 return PyLong_FromLong(flag);
2093 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002094#ifdef __VMS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002095 /* socklen_t is unsigned so no negative test is needed,
2096 test buflen == 0 is previously done */
2097 if (buflen > 1024) {
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002098#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002099 if (buflen <= 0 || buflen > 1024) {
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002100#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002101 PyErr_SetString(socket_error,
2102 "getsockopt buflen out of range");
2103 return NULL;
2104 }
2105 buf = PyBytes_FromStringAndSize((char *)NULL, buflen);
2106 if (buf == NULL)
2107 return NULL;
2108 res = getsockopt(s->sock_fd, level, optname,
2109 (void *)PyBytes_AS_STRING(buf), &buflen);
2110 if (res < 0) {
2111 Py_DECREF(buf);
2112 return s->errorhandler();
2113 }
2114 _PyBytes_Resize(&buf, buflen);
2115 return buf;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002116}
2117
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002118PyDoc_STRVAR(getsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002119"getsockopt(level, option[, buffersize]) -> value\n\
2120\n\
2121Get a socket option. See the Unix manual for level and option.\n\
2122If a nonzero buffersize argument is given, the return value is a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002123string of that length; otherwise it is an integer.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002124
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002125
Fred Drake728819a2000-07-01 03:40:12 +00002126/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002127
Guido van Rossum73624e91994-10-10 17:59:00 +00002128static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002129sock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002130{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002131 sock_addr_t addrbuf;
2132 int addrlen;
2133 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002134
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002135 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2136 return NULL;
2137 Py_BEGIN_ALLOW_THREADS
2138 res = bind(s->sock_fd, SAS2SA(&addrbuf), addrlen);
2139 Py_END_ALLOW_THREADS
2140 if (res < 0)
2141 return s->errorhandler();
2142 Py_INCREF(Py_None);
2143 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002144}
2145
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002146PyDoc_STRVAR(bind_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002147"bind(address)\n\
2148\n\
2149Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00002150pair (host, port); the host must refer to the local host. For raw packet\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002151sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002152
Guido van Rossum30a685f1991-06-27 15:51:29 +00002153
2154/* s.close() method.
2155 Set the file descriptor to -1 so operations tried subsequently
2156 will surely fail. */
2157
Guido van Rossum73624e91994-10-10 17:59:00 +00002158static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002159sock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002160{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002161 SOCKET_T fd;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002162
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002163 if ((fd = s->sock_fd) != -1) {
2164 s->sock_fd = -1;
2165 Py_BEGIN_ALLOW_THREADS
2166 (void) SOCKETCLOSE(fd);
2167 Py_END_ALLOW_THREADS
2168 }
2169 Py_INCREF(Py_None);
2170 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002171}
2172
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002173PyDoc_STRVAR(close_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002174"close()\n\
2175\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002176Close the socket. It cannot be used after this call.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002177
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002178static PyObject *
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002179sock_detach(PySocketSockObject *s)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002180{
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002181 SOCKET_T fd = s->sock_fd;
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002182 s->sock_fd = -1;
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002183 return PyLong_FromSocket_t(fd);
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002184}
2185
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002186PyDoc_STRVAR(detach_doc,
2187"detach()\n\
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002188\n\
2189Close the socket object without closing the underlying file descriptor.\
2190The object cannot be used after this call, but the file descriptor\
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002191can be reused for other purposes. The file descriptor is returned.");
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002192
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002193static int
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002194internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002195 int *timeoutp)
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002196{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002197 int res, timeout;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002198
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002199 timeout = 0;
2200 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002201
2202#ifdef MS_WINDOWS
2203
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002204 if (s->sock_timeout > 0.0) {
2205 if (res < 0 && WSAGetLastError() == WSAEWOULDBLOCK &&
2206 IS_SELECTABLE(s)) {
2207 /* This is a mess. Best solution: trust select */
2208 fd_set fds;
2209 fd_set fds_exc;
2210 struct timeval tv;
2211 tv.tv_sec = (int)s->sock_timeout;
2212 tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6);
2213 FD_ZERO(&fds);
2214 FD_SET(s->sock_fd, &fds);
2215 FD_ZERO(&fds_exc);
2216 FD_SET(s->sock_fd, &fds_exc);
Antoine Pitrou19467d22010-08-17 19:33:30 +00002217 res = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
2218 NULL, &fds, &fds_exc, &tv);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002219 if (res == 0) {
2220 res = WSAEWOULDBLOCK;
2221 timeout = 1;
2222 } else if (res > 0) {
2223 if (FD_ISSET(s->sock_fd, &fds))
2224 /* The socket is in the writable set - this
2225 means connected */
2226 res = 0;
2227 else {
2228 /* As per MS docs, we need to call getsockopt()
2229 to get the underlying error */
2230 int res_size = sizeof res;
2231 /* It must be in the exception set */
2232 assert(FD_ISSET(s->sock_fd, &fds_exc));
2233 if (0 == getsockopt(s->sock_fd, SOL_SOCKET, SO_ERROR,
2234 (char *)&res, &res_size))
2235 /* getsockopt also clears WSAGetLastError,
2236 so reset it back. */
2237 WSASetLastError(res);
2238 else
2239 res = WSAGetLastError();
2240 }
2241 }
2242 /* else if (res < 0) an error occurred */
2243 }
2244 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002245
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002246 if (res < 0)
2247 res = WSAGetLastError();
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002248
2249#else
2250
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002251 if (s->sock_timeout > 0.0) {
2252 if (res < 0 && errno == EINPROGRESS && IS_SELECTABLE(s)) {
2253 timeout = internal_select(s, 1);
2254 if (timeout == 0) {
2255 /* Bug #1019808: in case of an EINPROGRESS,
2256 use getsockopt(SO_ERROR) to get the real
2257 error. */
2258 socklen_t res_size = sizeof res;
2259 (void)getsockopt(s->sock_fd, SOL_SOCKET,
2260 SO_ERROR, &res, &res_size);
2261 if (res == EISCONN)
2262 res = 0;
2263 errno = res;
2264 }
2265 else if (timeout == -1) {
2266 res = errno; /* had error */
2267 }
2268 else
2269 res = EWOULDBLOCK; /* timed out */
2270 }
2271 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002272
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002273 if (res < 0)
2274 res = errno;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002275
2276#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002277 *timeoutp = timeout;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002278
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002279 return res;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002280}
Guido van Rossum30a685f1991-06-27 15:51:29 +00002281
Fred Drake728819a2000-07-01 03:40:12 +00002282/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002283
Guido van Rossum73624e91994-10-10 17:59:00 +00002284static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002285sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002286{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002287 sock_addr_t addrbuf;
2288 int addrlen;
2289 int res;
2290 int timeout;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002291
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002292 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2293 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002294
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002295 Py_BEGIN_ALLOW_THREADS
2296 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, &timeout);
2297 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002298
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002299 if (timeout == 1) {
2300 PyErr_SetString(socket_timeout, "timed out");
2301 return NULL;
2302 }
2303 if (res != 0)
2304 return s->errorhandler();
2305 Py_INCREF(Py_None);
2306 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002307}
2308
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002309PyDoc_STRVAR(connect_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002310"connect(address)\n\
2311\n\
2312Connect the socket to a remote address. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002313is a pair (host, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002314
Guido van Rossum30a685f1991-06-27 15:51:29 +00002315
Fred Drake728819a2000-07-01 03:40:12 +00002316/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002317
2318static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002319sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002320{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002321 sock_addr_t addrbuf;
2322 int addrlen;
2323 int res;
2324 int timeout;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002325
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002326 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2327 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002328
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002329 Py_BEGIN_ALLOW_THREADS
2330 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, &timeout);
2331 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002332
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002333 /* Signals are not errors (though they may raise exceptions). Adapted
2334 from PyErr_SetFromErrnoWithFilenameObject(). */
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002335#ifdef EINTR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002336 if (res == EINTR && PyErr_CheckSignals())
2337 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002338#endif
2339
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002340 return PyLong_FromLong((long) res);
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002341}
2342
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002343PyDoc_STRVAR(connect_ex_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002344"connect_ex(address) -> errno\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002345\n\
2346This is like connect(address), but returns an error code (the errno value)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002347instead of raising an exception when an error occurs.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002348
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002349
Guido van Rossumed233a51992-06-23 09:07:03 +00002350/* s.fileno() method */
2351
Guido van Rossum73624e91994-10-10 17:59:00 +00002352static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002353sock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00002354{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002355 return PyLong_FromSocket_t(s->sock_fd);
Guido van Rossumed233a51992-06-23 09:07:03 +00002356}
2357
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002358PyDoc_STRVAR(fileno_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002359"fileno() -> integer\n\
2360\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002361Return the integer file descriptor of the socket.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002362
Guido van Rossumed233a51992-06-23 09:07:03 +00002363
Guido van Rossumc89705d1992-11-26 08:54:07 +00002364/* s.getsockname() method */
2365
Guido van Rossum73624e91994-10-10 17:59:00 +00002366static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002367sock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002368{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002369 sock_addr_t addrbuf;
2370 int res;
2371 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002372
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002373 if (!getsockaddrlen(s, &addrlen))
2374 return NULL;
2375 memset(&addrbuf, 0, addrlen);
2376 Py_BEGIN_ALLOW_THREADS
2377 res = getsockname(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2378 Py_END_ALLOW_THREADS
2379 if (res < 0)
2380 return s->errorhandler();
2381 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2382 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002383}
2384
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002385PyDoc_STRVAR(getsockname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002386"getsockname() -> address info\n\
2387\n\
2388Return the address of the local endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002389info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002390
Guido van Rossumc89705d1992-11-26 08:54:07 +00002391
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002392#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002393/* s.getpeername() method */
2394
Guido van Rossum73624e91994-10-10 17:59:00 +00002395static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002396sock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002397{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002398 sock_addr_t addrbuf;
2399 int res;
2400 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002401
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002402 if (!getsockaddrlen(s, &addrlen))
2403 return NULL;
2404 memset(&addrbuf, 0, addrlen);
2405 Py_BEGIN_ALLOW_THREADS
2406 res = getpeername(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2407 Py_END_ALLOW_THREADS
2408 if (res < 0)
2409 return s->errorhandler();
2410 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2411 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002412}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002413
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002414PyDoc_STRVAR(getpeername_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002415"getpeername() -> address info\n\
2416\n\
2417Return the address of the remote endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002418info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002419
Guido van Rossumb6775db1994-08-01 11:34:53 +00002420#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002421
2422
Guido van Rossum30a685f1991-06-27 15:51:29 +00002423/* s.listen(n) method */
2424
Guido van Rossum73624e91994-10-10 17:59:00 +00002425static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002426sock_listen(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002427{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002428 int backlog;
2429 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002430
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002431 backlog = PyLong_AsLong(arg);
2432 if (backlog == -1 && PyErr_Occurred())
2433 return NULL;
2434 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou1be815a2011-05-10 19:16:29 +02002435 /* To avoid problems on systems that don't allow a negative backlog
2436 * (which doesn't make sense anyway) we force a minimum value of 0. */
2437 if (backlog < 0)
2438 backlog = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002439 res = listen(s->sock_fd, backlog);
2440 Py_END_ALLOW_THREADS
2441 if (res < 0)
2442 return s->errorhandler();
2443 Py_INCREF(Py_None);
2444 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002445}
2446
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002447PyDoc_STRVAR(listen_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002448"listen(backlog)\n\
2449\n\
2450Enable a server to accept connections. The backlog argument must be at\n\
Antoine Pitrou1be815a2011-05-10 19:16:29 +02002451least 0 (if it is lower, it is set to 0); it specifies the number of\n\
2452unaccepted connections that the system will allow before refusing new\n\
2453connections.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002454
2455
Thomas Wouters477c8d52006-05-27 19:21:47 +00002456/*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002457 * This is the guts of the recv() and recv_into() methods, which reads into a
Thomas Wouters902d6eb2007-01-09 23:18:33 +00002458 * char buffer. If you have any inc/dec ref to do to the objects that contain
Thomas Wouters477c8d52006-05-27 19:21:47 +00002459 * the buffer, do it in the caller. This function returns the number of bytes
Ezio Melotti13925002011-03-16 11:05:33 +02002460 * successfully read. If there was an error, it returns -1. Note that it is
Thomas Wouters477c8d52006-05-27 19:21:47 +00002461 * also possible that we return a number of bytes smaller than the request
2462 * bytes.
2463 */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002464
Antoine Pitrou19467d22010-08-17 19:33:30 +00002465static Py_ssize_t
2466sock_recv_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002467{
Antoine Pitrou19467d22010-08-17 19:33:30 +00002468 Py_ssize_t outlen = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002469 int timeout;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002470#ifdef __VMS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002471 int remaining;
2472 char *read_buf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002473#endif
2474
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002475 if (!IS_SELECTABLE(s)) {
2476 select_error();
2477 return -1;
2478 }
2479 if (len == 0) {
2480 /* If 0 bytes were requested, do nothing. */
2481 return 0;
2482 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002483
2484#ifndef __VMS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002485 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002486 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002487 timeout = internal_select_ex(s, 0, interval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002488 if (!timeout)
2489 outlen = recv(s->sock_fd, cbuf, len, flags);
2490 Py_END_ALLOW_THREADS
Thomas Wouters477c8d52006-05-27 19:21:47 +00002491
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002492 if (timeout == 1) {
2493 PyErr_SetString(socket_timeout, "timed out");
2494 return -1;
2495 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002496 END_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002497 if (outlen < 0) {
2498 /* Note: the call to errorhandler() ALWAYS indirectly returned
2499 NULL, so ignore its return value */
2500 s->errorhandler();
2501 return -1;
2502 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002503#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002504 read_buf = cbuf;
2505 remaining = len;
2506 while (remaining != 0) {
2507 unsigned int segment;
2508 int nread = -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002509
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002510 segment = remaining /SEGMENT_SIZE;
2511 if (segment != 0) {
2512 segment = SEGMENT_SIZE;
2513 }
2514 else {
2515 segment = remaining;
2516 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002517
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002518 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002519 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002520 timeout = internal_select_ex(s, 0, interval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002521 if (!timeout)
2522 nread = recv(s->sock_fd, read_buf, segment, flags);
2523 Py_END_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002524 if (timeout == 1) {
2525 PyErr_SetString(socket_timeout, "timed out");
2526 return -1;
2527 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002528 END_SELECT_LOOP(s)
2529
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002530 if (nread < 0) {
2531 s->errorhandler();
2532 return -1;
2533 }
2534 if (nread != remaining) {
2535 read_buf += nread;
2536 break;
2537 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002538
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002539 remaining -= segment;
2540 read_buf += segment;
2541 }
2542 outlen = read_buf - cbuf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002543#endif /* !__VMS */
2544
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002545 return outlen;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002546}
2547
Guido van Rossum48a680c2001-03-02 06:34:14 +00002548
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002549/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002550
Guido van Rossum73624e91994-10-10 17:59:00 +00002551static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002552sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002553{
Antoine Pitrou19467d22010-08-17 19:33:30 +00002554 Py_ssize_t recvlen, outlen;
2555 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002556 PyObject *buf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002557
Antoine Pitrou19467d22010-08-17 19:33:30 +00002558 if (!PyArg_ParseTuple(args, "n|i:recv", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002559 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002560
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002561 if (recvlen < 0) {
2562 PyErr_SetString(PyExc_ValueError,
2563 "negative buffersize in recv");
2564 return NULL;
2565 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002566
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002567 /* Allocate a new string. */
2568 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
2569 if (buf == NULL)
2570 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002571
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002572 /* Call the guts */
2573 outlen = sock_recv_guts(s, PyBytes_AS_STRING(buf), recvlen, flags);
2574 if (outlen < 0) {
2575 /* An error occurred, release the string and return an
2576 error. */
2577 Py_DECREF(buf);
2578 return NULL;
2579 }
2580 if (outlen != recvlen) {
2581 /* We did not read as many bytes as we anticipated, resize the
2582 string if possible and be successful. */
2583 _PyBytes_Resize(&buf, outlen);
2584 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002585
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002586 return buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002587}
2588
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002589PyDoc_STRVAR(recv_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002590"recv(buffersize[, flags]) -> data\n\
2591\n\
2592Receive up to buffersize bytes from the socket. For the optional flags\n\
2593argument, see the Unix manual. When no data is available, block until\n\
2594at least one byte is available or until the remote end is closed. When\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002595the remote end is closed and all data is read, return the empty string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002596
Guido van Rossum30a685f1991-06-27 15:51:29 +00002597
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002598/* s.recv_into(buffer, [nbytes [,flags]]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002599
Thomas Wouters477c8d52006-05-27 19:21:47 +00002600static PyObject*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002601sock_recv_into(PySocketSockObject *s, PyObject *args, PyObject *kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002602{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002603 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00002604
Antoine Pitrou19467d22010-08-17 19:33:30 +00002605 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002606 Py_buffer pbuf;
2607 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002608 Py_ssize_t buflen, readlen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002609
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002610 /* Get the buffer's memory */
Antoine Pitrou19467d22010-08-17 19:33:30 +00002611 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recv_into", kwlist,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002612 &pbuf, &recvlen, &flags))
2613 return NULL;
2614 buf = pbuf.buf;
2615 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002616
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002617 if (recvlen < 0) {
2618 PyBuffer_Release(&pbuf);
2619 PyErr_SetString(PyExc_ValueError,
2620 "negative buffersize in recv_into");
2621 return NULL;
2622 }
2623 if (recvlen == 0) {
2624 /* If nbytes was not specified, use the buffer's length */
2625 recvlen = buflen;
2626 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002627
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002628 /* Check if the buffer is large enough */
2629 if (buflen < recvlen) {
2630 PyBuffer_Release(&pbuf);
2631 PyErr_SetString(PyExc_ValueError,
2632 "buffer too small for requested bytes");
2633 return NULL;
2634 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002635
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002636 /* Call the guts */
2637 readlen = sock_recv_guts(s, buf, recvlen, flags);
2638 if (readlen < 0) {
2639 /* Return an error. */
2640 PyBuffer_Release(&pbuf);
2641 return NULL;
2642 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002643
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002644 PyBuffer_Release(&pbuf);
2645 /* Return the number of bytes read. Note that we do not do anything
2646 special here in the case that readlen < recvlen. */
2647 return PyLong_FromSsize_t(readlen);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002648}
2649
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002650PyDoc_STRVAR(recv_into_doc,
2651"recv_into(buffer, [nbytes[, flags]]) -> nbytes_read\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00002652\n\
2653A version of recv() that stores its data into a buffer rather than creating \n\
2654a new string. Receive up to buffersize bytes from the socket. If buffersize \n\
2655is not specified (or 0), receive up to the size available in the given buffer.\n\
2656\n\
2657See recv() for documentation about the flags.");
2658
2659
2660/*
Christian Heimes99170a52007-12-19 02:07:34 +00002661 * This is the guts of the recvfrom() and recvfrom_into() methods, which reads
2662 * into a char buffer. If you have any inc/def ref to do to the objects that
2663 * contain the buffer, do it in the caller. This function returns the number
Ezio Melotti13925002011-03-16 11:05:33 +02002664 * of bytes successfully read. If there was an error, it returns -1. Note
Christian Heimes99170a52007-12-19 02:07:34 +00002665 * that it is also possible that we return a number of bytes smaller than the
2666 * request bytes.
Thomas Wouters477c8d52006-05-27 19:21:47 +00002667 *
2668 * 'addr' is a return value for the address object. Note that you must decref
2669 * it yourself.
2670 */
Antoine Pitrou19467d22010-08-17 19:33:30 +00002671static Py_ssize_t
2672sock_recvfrom_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002673 PyObject** addr)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002674{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002675 sock_addr_t addrbuf;
2676 int timeout;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002677 Py_ssize_t n = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002678 socklen_t addrlen;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002679
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002680 *addr = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002681
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002682 if (!getsockaddrlen(s, &addrlen))
2683 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002684
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002685 if (!IS_SELECTABLE(s)) {
2686 select_error();
2687 return -1;
2688 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00002689
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002690 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002691 Py_BEGIN_ALLOW_THREADS
2692 memset(&addrbuf, 0, addrlen);
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002693 timeout = internal_select_ex(s, 0, interval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002694 if (!timeout) {
Guido van Rossum8d665e61996-06-26 18:22:49 +00002695#ifndef MS_WINDOWS
Andrew MacIntyreba43e872002-03-03 03:03:52 +00002696#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002697 n = recvfrom(s->sock_fd, cbuf, len, flags,
2698 SAS2SA(&addrbuf), &addrlen);
Guido van Rossum32c575d1997-12-02 20:37:32 +00002699#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002700 n = recvfrom(s->sock_fd, cbuf, len, flags,
2701 (void *) &addrbuf, &addrlen);
Guido van Rossum32c575d1997-12-02 20:37:32 +00002702#endif
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002703#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002704 n = recvfrom(s->sock_fd, cbuf, len, flags,
2705 SAS2SA(&addrbuf), &addrlen);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002706#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002707 }
2708 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002709
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002710 if (timeout == 1) {
2711 PyErr_SetString(socket_timeout, "timed out");
2712 return -1;
2713 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002714 END_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002715 if (n < 0) {
2716 s->errorhandler();
2717 return -1;
2718 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002719
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002720 if (!(*addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
2721 addrlen, s->sock_proto)))
2722 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002723
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002724 return n;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002725}
2726
2727/* s.recvfrom(nbytes [,flags]) method */
2728
2729static PyObject *
2730sock_recvfrom(PySocketSockObject *s, PyObject *args)
2731{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002732 PyObject *buf = NULL;
2733 PyObject *addr = NULL;
2734 PyObject *ret = NULL;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002735 int flags = 0;
2736 Py_ssize_t recvlen, outlen;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002737
Antoine Pitrou19467d22010-08-17 19:33:30 +00002738 if (!PyArg_ParseTuple(args, "n|i:recvfrom", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002739 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002740
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002741 if (recvlen < 0) {
2742 PyErr_SetString(PyExc_ValueError,
2743 "negative buffersize in recvfrom");
2744 return NULL;
2745 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00002746
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002747 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
2748 if (buf == NULL)
2749 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002750
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002751 outlen = sock_recvfrom_guts(s, PyBytes_AS_STRING(buf),
2752 recvlen, flags, &addr);
2753 if (outlen < 0) {
2754 goto finally;
2755 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002756
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002757 if (outlen != recvlen) {
2758 /* We did not read as many bytes as we anticipated, resize the
Ezio Melotti13925002011-03-16 11:05:33 +02002759 string if possible and be successful. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002760 if (_PyBytes_Resize(&buf, outlen) < 0)
Ezio Melotti13925002011-03-16 11:05:33 +02002761 /* Oopsy, not so successful after all. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002762 goto finally;
2763 }
Barry Warsaw752300b1997-01-03 17:18:10 +00002764
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002765 ret = PyTuple_Pack(2, buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002766
2767finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002768 Py_XDECREF(buf);
2769 Py_XDECREF(addr);
2770 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002771}
2772
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002773PyDoc_STRVAR(recvfrom_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002774"recvfrom(buffersize[, flags]) -> (data, address info)\n\
2775\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002776Like recv(buffersize, flags) but also return the sender's address info.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002777
Thomas Wouters477c8d52006-05-27 19:21:47 +00002778
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002779/* s.recvfrom_into(buffer[, nbytes [,flags]]) method */
Thomas Wouters477c8d52006-05-27 19:21:47 +00002780
2781static PyObject *
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002782sock_recvfrom_into(PySocketSockObject *s, PyObject *args, PyObject* kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002783{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002784 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00002785
Antoine Pitrou19467d22010-08-17 19:33:30 +00002786 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002787 Py_buffer pbuf;
2788 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002789 Py_ssize_t readlen, buflen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002790
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002791 PyObject *addr = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002792
Antoine Pitrou19467d22010-08-17 19:33:30 +00002793 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recvfrom_into",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002794 kwlist, &pbuf,
2795 &recvlen, &flags))
2796 return NULL;
2797 buf = pbuf.buf;
2798 buflen = pbuf.len;
2799 assert(buf != 0 && buflen > 0);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002800
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002801 if (recvlen < 0) {
2802 PyBuffer_Release(&pbuf);
2803 PyErr_SetString(PyExc_ValueError,
2804 "negative buffersize in recvfrom_into");
2805 return NULL;
2806 }
2807 if (recvlen == 0) {
2808 /* If nbytes was not specified, use the buffer's length */
2809 recvlen = buflen;
2810 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002811
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002812 readlen = sock_recvfrom_guts(s, buf, recvlen, flags, &addr);
2813 if (readlen < 0) {
2814 PyBuffer_Release(&pbuf);
2815 /* Return an error */
2816 Py_XDECREF(addr);
2817 return NULL;
2818 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002819
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002820 PyBuffer_Release(&pbuf);
2821 /* Return the number of bytes read and the address. Note that we do
2822 not do anything special here in the case that readlen < recvlen. */
Antoine Pitrou19467d22010-08-17 19:33:30 +00002823 return Py_BuildValue("nN", readlen, addr);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002824}
2825
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002826PyDoc_STRVAR(recvfrom_into_doc,
2827"recvfrom_into(buffer[, nbytes[, flags]]) -> (nbytes, address info)\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00002828\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002829Like recv_into(buffer[, nbytes[, flags]]) but also return the sender's address info.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00002830
2831
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002832/* The sendmsg() and recvmsg[_into]() methods require a working
2833 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
2834#ifdef CMSG_LEN
2835/*
2836 * Call recvmsg() with the supplied iovec structures, flags, and
2837 * ancillary data buffer size (controllen). Returns the tuple return
2838 * value for recvmsg() or recvmsg_into(), with the first item provided
2839 * by the supplied makeval() function. makeval() will be called with
2840 * the length read and makeval_data as arguments, and must return a
2841 * new reference (which will be decrefed if there is a subsequent
2842 * error). On error, closes any file descriptors received via
2843 * SCM_RIGHTS.
2844 */
2845static PyObject *
2846sock_recvmsg_guts(PySocketSockObject *s, struct iovec *iov, int iovlen,
2847 int flags, Py_ssize_t controllen,
2848 PyObject *(*makeval)(ssize_t, void *), void *makeval_data)
2849{
2850 ssize_t bytes_received = -1;
2851 int timeout;
2852 sock_addr_t addrbuf;
2853 socklen_t addrbuflen;
Charles-François Natalie9e95ae2011-08-24 21:40:53 +02002854 struct msghdr msg = {0};
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002855 PyObject *cmsg_list = NULL, *retval = NULL;
2856 void *controlbuf = NULL;
2857 struct cmsghdr *cmsgh;
2858 size_t cmsgdatalen = 0;
2859 int cmsg_status;
2860
2861 /* XXX: POSIX says that msg_name and msg_namelen "shall be
2862 ignored" when the socket is connected (Linux fills them in
2863 anyway for AF_UNIX sockets at least). Normally msg_namelen
2864 seems to be set to 0 if there's no address, but try to
2865 initialize msg_name to something that won't be mistaken for a
2866 real address if that doesn't happen. */
2867 if (!getsockaddrlen(s, &addrbuflen))
2868 return NULL;
2869 memset(&addrbuf, 0, addrbuflen);
2870 SAS2SA(&addrbuf)->sa_family = AF_UNSPEC;
2871
2872 if (controllen < 0 || controllen > SOCKLEN_T_LIMIT) {
2873 PyErr_SetString(PyExc_ValueError,
2874 "invalid ancillary data buffer length");
2875 return NULL;
2876 }
2877 if (controllen > 0 && (controlbuf = PyMem_Malloc(controllen)) == NULL)
2878 return PyErr_NoMemory();
2879
2880 /* Make the system call. */
2881 if (!IS_SELECTABLE(s)) {
2882 select_error();
2883 goto finally;
2884 }
2885
2886 BEGIN_SELECT_LOOP(s)
2887 Py_BEGIN_ALLOW_THREADS;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002888 msg.msg_name = SAS2SA(&addrbuf);
2889 msg.msg_namelen = addrbuflen;
2890 msg.msg_iov = iov;
2891 msg.msg_iovlen = iovlen;
2892 msg.msg_control = controlbuf;
2893 msg.msg_controllen = controllen;
2894 timeout = internal_select_ex(s, 0, interval);
2895 if (!timeout)
2896 bytes_received = recvmsg(s->sock_fd, &msg, flags);
2897 Py_END_ALLOW_THREADS;
2898 if (timeout == 1) {
2899 PyErr_SetString(socket_timeout, "timed out");
2900 goto finally;
2901 }
2902 END_SELECT_LOOP(s)
2903
2904 if (bytes_received < 0) {
2905 s->errorhandler();
2906 goto finally;
2907 }
2908
2909 /* Make list of (level, type, data) tuples from control messages. */
2910 if ((cmsg_list = PyList_New(0)) == NULL)
2911 goto err_closefds;
2912 /* Check for empty ancillary data as old CMSG_FIRSTHDR()
2913 implementations didn't do so. */
2914 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
2915 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
2916 PyObject *bytes, *tuple;
2917 int tmp;
2918
2919 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
2920 if (cmsg_status != 0) {
2921 if (PyErr_WarnEx(PyExc_RuntimeWarning,
2922 "received malformed or improperly-truncated "
2923 "ancillary data", 1) == -1)
2924 goto err_closefds;
2925 }
2926 if (cmsg_status < 0)
2927 break;
2928 if (cmsgdatalen > PY_SSIZE_T_MAX) {
2929 PyErr_SetString(socket_error, "control message too long");
2930 goto err_closefds;
2931 }
2932
2933 bytes = PyBytes_FromStringAndSize((char *)CMSG_DATA(cmsgh),
2934 cmsgdatalen);
2935 tuple = Py_BuildValue("iiN", (int)cmsgh->cmsg_level,
2936 (int)cmsgh->cmsg_type, bytes);
2937 if (tuple == NULL)
2938 goto err_closefds;
2939 tmp = PyList_Append(cmsg_list, tuple);
2940 Py_DECREF(tuple);
2941 if (tmp != 0)
2942 goto err_closefds;
2943
2944 if (cmsg_status != 0)
2945 break;
2946 }
2947
2948 retval = Py_BuildValue("NOiN",
2949 (*makeval)(bytes_received, makeval_data),
2950 cmsg_list,
2951 (int)msg.msg_flags,
2952 makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
2953 ((msg.msg_namelen > addrbuflen) ?
2954 addrbuflen : msg.msg_namelen),
2955 s->sock_proto));
2956 if (retval == NULL)
2957 goto err_closefds;
2958
2959finally:
2960 Py_XDECREF(cmsg_list);
2961 PyMem_Free(controlbuf);
2962 return retval;
2963
2964err_closefds:
2965#ifdef SCM_RIGHTS
2966 /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */
2967 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
2968 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
2969 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
2970 if (cmsg_status < 0)
2971 break;
2972 if (cmsgh->cmsg_level == SOL_SOCKET &&
2973 cmsgh->cmsg_type == SCM_RIGHTS) {
2974 size_t numfds;
2975 int *fdp;
2976
2977 numfds = cmsgdatalen / sizeof(int);
2978 fdp = (int *)CMSG_DATA(cmsgh);
2979 while (numfds-- > 0)
2980 close(*fdp++);
2981 }
2982 if (cmsg_status != 0)
2983 break;
2984 }
2985#endif /* SCM_RIGHTS */
2986 goto finally;
2987}
2988
2989
2990static PyObject *
2991makeval_recvmsg(ssize_t received, void *data)
2992{
2993 PyObject **buf = data;
2994
2995 if (received < PyBytes_GET_SIZE(*buf))
2996 _PyBytes_Resize(buf, received);
2997 Py_XINCREF(*buf);
2998 return *buf;
2999}
3000
3001/* s.recvmsg(bufsize[, ancbufsize[, flags]]) method */
3002
3003static PyObject *
3004sock_recvmsg(PySocketSockObject *s, PyObject *args)
3005{
3006 Py_ssize_t bufsize, ancbufsize = 0;
3007 int flags = 0;
3008 struct iovec iov;
3009 PyObject *buf = NULL, *retval = NULL;
3010
3011 if (!PyArg_ParseTuple(args, "n|ni:recvmsg", &bufsize, &ancbufsize, &flags))
3012 return NULL;
3013
3014 if (bufsize < 0) {
3015 PyErr_SetString(PyExc_ValueError, "negative buffer size in recvmsg()");
3016 return NULL;
3017 }
3018 if ((buf = PyBytes_FromStringAndSize(NULL, bufsize)) == NULL)
3019 return NULL;
3020 iov.iov_base = PyBytes_AS_STRING(buf);
3021 iov.iov_len = bufsize;
3022
3023 /* Note that we're passing a pointer to *our pointer* to the bytes
3024 object here (&buf); makeval_recvmsg() may incref the object, or
3025 deallocate it and set our pointer to NULL. */
3026 retval = sock_recvmsg_guts(s, &iov, 1, flags, ancbufsize,
3027 &makeval_recvmsg, &buf);
3028 Py_XDECREF(buf);
3029 return retval;
3030}
3031
3032PyDoc_STRVAR(recvmsg_doc,
3033"recvmsg(bufsize[, ancbufsize[, flags]]) -> (data, ancdata, msg_flags, address)\n\
3034\n\
3035Receive normal data (up to bufsize bytes) and ancillary data from the\n\
3036socket. The ancbufsize argument sets the size in bytes of the\n\
3037internal buffer used to receive the ancillary data; it defaults to 0,\n\
3038meaning that no ancillary data will be received. Appropriate buffer\n\
3039sizes for ancillary data can be calculated using CMSG_SPACE() or\n\
3040CMSG_LEN(), and items which do not fit into the buffer might be\n\
3041truncated or discarded. The flags argument defaults to 0 and has the\n\
3042same meaning as for recv().\n\
3043\n\
3044The return value is a 4-tuple: (data, ancdata, msg_flags, address).\n\
3045The data item is a bytes object holding the non-ancillary data\n\
3046received. The ancdata item is a list of zero or more tuples\n\
3047(cmsg_level, cmsg_type, cmsg_data) representing the ancillary data\n\
3048(control messages) received: cmsg_level and cmsg_type are integers\n\
3049specifying the protocol level and protocol-specific type respectively,\n\
3050and cmsg_data is a bytes object holding the associated data. The\n\
3051msg_flags item is the bitwise OR of various flags indicating\n\
3052conditions on the received message; see your system documentation for\n\
3053details. If the receiving socket is unconnected, address is the\n\
3054address of the sending socket, if available; otherwise, its value is\n\
3055unspecified.\n\
3056\n\
3057If recvmsg() raises an exception after the system call returns, it\n\
3058will first attempt to close any file descriptors received via the\n\
3059SCM_RIGHTS mechanism.");
3060
3061
3062static PyObject *
3063makeval_recvmsg_into(ssize_t received, void *data)
3064{
3065 return PyLong_FromSsize_t(received);
3066}
3067
3068/* s.recvmsg_into(buffers[, ancbufsize[, flags]]) method */
3069
3070static PyObject *
3071sock_recvmsg_into(PySocketSockObject *s, PyObject *args)
3072{
3073 Py_ssize_t ancbufsize = 0;
3074 int flags = 0;
3075 struct iovec *iovs = NULL;
3076 Py_ssize_t i, nitems, nbufs = 0;
3077 Py_buffer *bufs = NULL;
3078 PyObject *buffers_arg, *fast, *retval = NULL;
3079
3080 if (!PyArg_ParseTuple(args, "O|ni:recvmsg_into",
3081 &buffers_arg, &ancbufsize, &flags))
3082 return NULL;
3083
3084 if ((fast = PySequence_Fast(buffers_arg,
3085 "recvmsg_into() argument 1 must be an "
3086 "iterable")) == NULL)
3087 return NULL;
3088 nitems = PySequence_Fast_GET_SIZE(fast);
3089 if (nitems > INT_MAX) {
3090 PyErr_SetString(socket_error, "recvmsg_into() argument 1 is too long");
3091 goto finally;
3092 }
3093
3094 /* Fill in an iovec for each item, and save the Py_buffer
3095 structs to release afterwards. */
3096 if (nitems > 0 && ((iovs = PyMem_New(struct iovec, nitems)) == NULL ||
3097 (bufs = PyMem_New(Py_buffer, nitems)) == NULL)) {
3098 PyErr_NoMemory();
3099 goto finally;
3100 }
3101 for (; nbufs < nitems; nbufs++) {
3102 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(fast, nbufs),
3103 "w*;recvmsg_into() argument 1 must be an iterable "
3104 "of single-segment read-write buffers",
3105 &bufs[nbufs]))
3106 goto finally;
3107 iovs[nbufs].iov_base = bufs[nbufs].buf;
3108 iovs[nbufs].iov_len = bufs[nbufs].len;
3109 }
3110
3111 retval = sock_recvmsg_guts(s, iovs, nitems, flags, ancbufsize,
3112 &makeval_recvmsg_into, NULL);
3113finally:
3114 for (i = 0; i < nbufs; i++)
3115 PyBuffer_Release(&bufs[i]);
3116 PyMem_Free(bufs);
3117 PyMem_Free(iovs);
3118 Py_DECREF(fast);
3119 return retval;
3120}
3121
3122PyDoc_STRVAR(recvmsg_into_doc,
3123"recvmsg_into(buffers[, ancbufsize[, flags]]) -> (nbytes, ancdata, msg_flags, address)\n\
3124\n\
3125Receive normal data and ancillary data from the socket, scattering the\n\
3126non-ancillary data into a series of buffers. The buffers argument\n\
3127must be an iterable of objects that export writable buffers\n\
3128(e.g. bytearray objects); these will be filled with successive chunks\n\
3129of the non-ancillary data until it has all been written or there are\n\
3130no more buffers. The ancbufsize argument sets the size in bytes of\n\
3131the internal buffer used to receive the ancillary data; it defaults to\n\
31320, meaning that no ancillary data will be received. Appropriate\n\
3133buffer sizes for ancillary data can be calculated using CMSG_SPACE()\n\
3134or CMSG_LEN(), and items which do not fit into the buffer might be\n\
3135truncated or discarded. The flags argument defaults to 0 and has the\n\
3136same meaning as for recv().\n\
3137\n\
3138The return value is a 4-tuple: (nbytes, ancdata, msg_flags, address).\n\
3139The nbytes item is the total number of bytes of non-ancillary data\n\
3140written into the buffers. The ancdata item is a list of zero or more\n\
3141tuples (cmsg_level, cmsg_type, cmsg_data) representing the ancillary\n\
3142data (control messages) received: cmsg_level and cmsg_type are\n\
3143integers specifying the protocol level and protocol-specific type\n\
3144respectively, and cmsg_data is a bytes object holding the associated\n\
3145data. The msg_flags item is the bitwise OR of various flags\n\
3146indicating conditions on the received message; see your system\n\
3147documentation for details. If the receiving socket is unconnected,\n\
3148address is the address of the sending socket, if available; otherwise,\n\
3149its value is unspecified.\n\
3150\n\
3151If recvmsg_into() raises an exception after the system call returns,\n\
3152it will first attempt to close any file descriptors received via the\n\
3153SCM_RIGHTS mechanism.");
3154#endif /* CMSG_LEN */
3155
3156
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003157/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003158
Guido van Rossum73624e91994-10-10 17:59:00 +00003159static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003160sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003161{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003162 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003163 Py_ssize_t len, n = -1;
3164 int flags = 0, timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003165 Py_buffer pbuf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003166
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003167 if (!PyArg_ParseTuple(args, "y*|i:send", &pbuf, &flags))
3168 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003169
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003170 if (!IS_SELECTABLE(s)) {
3171 PyBuffer_Release(&pbuf);
3172 return select_error();
3173 }
3174 buf = pbuf.buf;
3175 len = pbuf.len;
Neal Norwitz082b2df2006-02-07 07:04:46 +00003176
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003177 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003178 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003179 timeout = internal_select_ex(s, 1, interval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003180 if (!timeout)
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003181#ifdef __VMS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003182 n = sendsegmented(s->sock_fd, buf, len, flags);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003183#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003184 n = send(s->sock_fd, buf, len, flags);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003185#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003186 Py_END_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003187 if (timeout == 1) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003188 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003189 PyErr_SetString(socket_timeout, "timed out");
3190 return NULL;
3191 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003192 END_SELECT_LOOP(s)
3193
3194 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003195 if (n < 0)
3196 return s->errorhandler();
Antoine Pitrou19467d22010-08-17 19:33:30 +00003197 return PyLong_FromSsize_t(n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00003198}
3199
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003200PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003201"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003202\n\
3203Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003204argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003205sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003206
3207
3208/* s.sendall(data [,flags]) method */
3209
3210static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003211sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003212{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003213 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003214 Py_ssize_t len, n = -1;
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003215 int flags = 0, timeout, saved_errno;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003216 Py_buffer pbuf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003217
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003218 if (!PyArg_ParseTuple(args, "y*|i:sendall", &pbuf, &flags))
3219 return NULL;
3220 buf = pbuf.buf;
3221 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003222
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003223 if (!IS_SELECTABLE(s)) {
3224 PyBuffer_Release(&pbuf);
3225 return select_error();
3226 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003227
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003228 do {
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003229 Py_BEGIN_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003230 timeout = internal_select(s, 1);
3231 n = -1;
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003232 if (!timeout) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003233#ifdef __VMS
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003234 n = sendsegmented(s->sock_fd, buf, len, flags);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003235#else
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003236 n = send(s->sock_fd, buf, len, flags);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003237#endif
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003238 }
3239 Py_END_ALLOW_THREADS
3240 if (timeout == 1) {
3241 PyBuffer_Release(&pbuf);
3242 PyErr_SetString(socket_timeout, "timed out");
3243 return NULL;
3244 }
3245 /* PyErr_CheckSignals() might change errno */
3246 saved_errno = errno;
3247 /* We must run our signal handlers before looping again.
3248 send() can return a successful partial write when it is
3249 interrupted, so we can't restrict ourselves to EINTR. */
3250 if (PyErr_CheckSignals()) {
3251 PyBuffer_Release(&pbuf);
3252 return NULL;
3253 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003254 if (n < 0) {
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003255 /* If interrupted, try again */
3256 if (saved_errno == EINTR)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003257 continue;
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003258 else
3259 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003260 }
3261 buf += n;
3262 len -= n;
3263 } while (len > 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003264 PyBuffer_Release(&pbuf);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003265
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003266 if (n < 0)
3267 return s->errorhandler();
Guido van Rossum67f7a382002-06-06 21:08:16 +00003268
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003269 Py_INCREF(Py_None);
3270 return Py_None;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003271}
3272
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003273PyDoc_STRVAR(sendall_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003274"sendall(data[, flags])\n\
3275\n\
3276Send a data string to the socket. For the optional flags\n\
3277argument, see the Unix manual. This calls send() repeatedly\n\
3278until all data is sent. If an error occurs, it's impossible\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003279to tell how much data has been sent.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003280
Guido van Rossum30a685f1991-06-27 15:51:29 +00003281
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003282/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003283
Guido van Rossum73624e91994-10-10 17:59:00 +00003284static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003285sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003286{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003287 Py_buffer pbuf;
3288 PyObject *addro;
3289 char *buf;
Antoine Pitrou5e981412011-03-17 22:38:37 +01003290 Py_ssize_t len, arglen;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003291 sock_addr_t addrbuf;
3292 int addrlen, n = -1, flags, timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003293
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003294 flags = 0;
Antoine Pitrou5e981412011-03-17 22:38:37 +01003295 arglen = PyTuple_Size(args);
3296 switch (arglen) {
3297 case 2:
3298 PyArg_ParseTuple(args, "y*O:sendto", &pbuf, &addro);
3299 break;
3300 case 3:
3301 PyArg_ParseTuple(args, "y*iO:sendto",
3302 &pbuf, &flags, &addro);
3303 break;
3304 default:
3305 PyErr_Format(PyExc_TypeError,
3306 "sendto() takes 2 or 3 arguments (%d given)",
3307 arglen);
Victor Stinner77af1722011-05-26 14:05:59 +02003308 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003309 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01003310 if (PyErr_Occurred())
3311 return NULL;
3312
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003313 buf = pbuf.buf;
3314 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003315
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003316 if (!IS_SELECTABLE(s)) {
3317 PyBuffer_Release(&pbuf);
3318 return select_error();
3319 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003320
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003321 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen)) {
3322 PyBuffer_Release(&pbuf);
3323 return NULL;
3324 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003325
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003326 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003327 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003328 timeout = internal_select_ex(s, 1, interval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003329 if (!timeout)
3330 n = sendto(s->sock_fd, buf, len, flags, SAS2SA(&addrbuf), addrlen);
3331 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00003332
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003333 if (timeout == 1) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003334 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003335 PyErr_SetString(socket_timeout, "timed out");
3336 return NULL;
3337 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003338 END_SELECT_LOOP(s)
3339 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003340 if (n < 0)
3341 return s->errorhandler();
Antoine Pitrou19467d22010-08-17 19:33:30 +00003342 return PyLong_FromSsize_t(n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003343}
3344
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003345PyDoc_STRVAR(sendto_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003346"sendto(data[, flags], address) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003347\n\
3348Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003349For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003350
Guido van Rossum30a685f1991-06-27 15:51:29 +00003351
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003352/* The sendmsg() and recvmsg[_into]() methods require a working
3353 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
3354#ifdef CMSG_LEN
3355/* s.sendmsg(buffers[, ancdata[, flags[, address]]]) method */
3356
3357static PyObject *
3358sock_sendmsg(PySocketSockObject *s, PyObject *args)
3359{
3360 Py_ssize_t i, ndataparts, ndatabufs = 0, ncmsgs, ncmsgbufs = 0;
3361 Py_buffer *databufs = NULL;
3362 struct iovec *iovs = NULL;
3363 sock_addr_t addrbuf;
Charles-François Natalie9e95ae2011-08-24 21:40:53 +02003364 struct msghdr msg = {0};
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003365 struct cmsginfo {
3366 int level;
3367 int type;
3368 Py_buffer data;
3369 } *cmsgs = NULL;
3370 void *controlbuf = NULL;
3371 size_t controllen, controllen_last;
3372 ssize_t bytes_sent = -1;
3373 int addrlen, timeout, flags = 0;
3374 PyObject *data_arg, *cmsg_arg = NULL, *addr_arg = NULL, *data_fast = NULL,
3375 *cmsg_fast = NULL, *retval = NULL;
3376
3377 if (!PyArg_ParseTuple(args, "O|OiO:sendmsg",
3378 &data_arg, &cmsg_arg, &flags, &addr_arg))
3379 return NULL;
3380
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003381 /* Parse destination address. */
3382 if (addr_arg != NULL && addr_arg != Py_None) {
3383 if (!getsockaddrarg(s, addr_arg, SAS2SA(&addrbuf), &addrlen))
3384 goto finally;
3385 msg.msg_name = &addrbuf;
3386 msg.msg_namelen = addrlen;
3387 }
3388
3389 /* Fill in an iovec for each message part, and save the Py_buffer
3390 structs to release afterwards. */
3391 if ((data_fast = PySequence_Fast(data_arg,
3392 "sendmsg() argument 1 must be an "
3393 "iterable")) == NULL)
3394 goto finally;
3395 ndataparts = PySequence_Fast_GET_SIZE(data_fast);
3396 if (ndataparts > INT_MAX) {
3397 PyErr_SetString(socket_error, "sendmsg() argument 1 is too long");
3398 goto finally;
3399 }
3400 msg.msg_iovlen = ndataparts;
3401 if (ndataparts > 0 &&
3402 ((msg.msg_iov = iovs = PyMem_New(struct iovec, ndataparts)) == NULL ||
3403 (databufs = PyMem_New(Py_buffer, ndataparts)) == NULL)) {
3404 PyErr_NoMemory();
3405 goto finally;
3406 }
3407 for (; ndatabufs < ndataparts; ndatabufs++) {
3408 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(data_fast, ndatabufs),
3409 "y*;sendmsg() argument 1 must be an iterable of "
3410 "buffer-compatible objects",
3411 &databufs[ndatabufs]))
3412 goto finally;
3413 iovs[ndatabufs].iov_base = databufs[ndatabufs].buf;
3414 iovs[ndatabufs].iov_len = databufs[ndatabufs].len;
3415 }
3416
3417 if (cmsg_arg == NULL)
3418 ncmsgs = 0;
3419 else {
3420 if ((cmsg_fast = PySequence_Fast(cmsg_arg,
3421 "sendmsg() argument 2 must be an "
3422 "iterable")) == NULL)
3423 goto finally;
3424 ncmsgs = PySequence_Fast_GET_SIZE(cmsg_fast);
3425 }
3426
3427#ifndef CMSG_SPACE
3428 if (ncmsgs > 1) {
3429 PyErr_SetString(socket_error,
3430 "sending multiple control messages is not supported "
3431 "on this system");
3432 goto finally;
3433 }
3434#endif
3435 /* Save level, type and Py_buffer for each control message,
3436 and calculate total size. */
3437 if (ncmsgs > 0 && (cmsgs = PyMem_New(struct cmsginfo, ncmsgs)) == NULL) {
3438 PyErr_NoMemory();
3439 goto finally;
3440 }
3441 controllen = controllen_last = 0;
3442 while (ncmsgbufs < ncmsgs) {
3443 size_t bufsize, space;
3444
3445 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(cmsg_fast, ncmsgbufs),
3446 "(iiy*):[sendmsg() ancillary data items]",
3447 &cmsgs[ncmsgbufs].level,
3448 &cmsgs[ncmsgbufs].type,
3449 &cmsgs[ncmsgbufs].data))
3450 goto finally;
3451 bufsize = cmsgs[ncmsgbufs++].data.len;
3452
3453#ifdef CMSG_SPACE
3454 if (!get_CMSG_SPACE(bufsize, &space)) {
3455#else
3456 if (!get_CMSG_LEN(bufsize, &space)) {
3457#endif
3458 PyErr_SetString(socket_error, "ancillary data item too large");
3459 goto finally;
3460 }
3461 controllen += space;
3462 if (controllen > SOCKLEN_T_LIMIT || controllen < controllen_last) {
3463 PyErr_SetString(socket_error, "too much ancillary data");
3464 goto finally;
3465 }
3466 controllen_last = controllen;
3467 }
3468
3469 /* Construct ancillary data block from control message info. */
3470 if (ncmsgbufs > 0) {
3471 struct cmsghdr *cmsgh = NULL;
3472
3473 if ((msg.msg_control = controlbuf =
3474 PyMem_Malloc(controllen)) == NULL) {
3475 PyErr_NoMemory();
3476 goto finally;
3477 }
3478 msg.msg_controllen = controllen;
3479
3480 /* Need to zero out the buffer as a workaround for glibc's
3481 CMSG_NXTHDR() implementation. After getting the pointer to
3482 the next header, it checks its (uninitialized) cmsg_len
3483 member to see if the "message" fits in the buffer, and
3484 returns NULL if it doesn't. Zero-filling the buffer
3485 ensures that that doesn't happen. */
3486 memset(controlbuf, 0, controllen);
3487
3488 for (i = 0; i < ncmsgbufs; i++) {
3489 size_t msg_len, data_len = cmsgs[i].data.len;
3490 int enough_space = 0;
3491
3492 cmsgh = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsgh);
3493 if (cmsgh == NULL) {
3494 PyErr_Format(PyExc_RuntimeError,
3495 "unexpected NULL result from %s()",
3496 (i == 0) ? "CMSG_FIRSTHDR" : "CMSG_NXTHDR");
3497 goto finally;
3498 }
3499 if (!get_CMSG_LEN(data_len, &msg_len)) {
3500 PyErr_SetString(PyExc_RuntimeError,
3501 "item size out of range for CMSG_LEN()");
3502 goto finally;
3503 }
3504 if (cmsg_min_space(&msg, cmsgh, msg_len)) {
3505 size_t space;
3506
3507 cmsgh->cmsg_len = msg_len;
3508 if (get_cmsg_data_space(&msg, cmsgh, &space))
3509 enough_space = (space >= data_len);
3510 }
3511 if (!enough_space) {
3512 PyErr_SetString(PyExc_RuntimeError,
3513 "ancillary data does not fit in calculated "
3514 "space");
3515 goto finally;
3516 }
3517 cmsgh->cmsg_level = cmsgs[i].level;
3518 cmsgh->cmsg_type = cmsgs[i].type;
3519 memcpy(CMSG_DATA(cmsgh), cmsgs[i].data.buf, data_len);
3520 }
3521 }
3522
3523 /* Make the system call. */
3524 if (!IS_SELECTABLE(s)) {
3525 select_error();
3526 goto finally;
3527 }
3528
3529 BEGIN_SELECT_LOOP(s)
3530 Py_BEGIN_ALLOW_THREADS;
3531 timeout = internal_select_ex(s, 1, interval);
3532 if (!timeout)
3533 bytes_sent = sendmsg(s->sock_fd, &msg, flags);
3534 Py_END_ALLOW_THREADS;
3535 if (timeout == 1) {
3536 PyErr_SetString(socket_timeout, "timed out");
3537 goto finally;
3538 }
3539 END_SELECT_LOOP(s)
3540
3541 if (bytes_sent < 0) {
3542 s->errorhandler();
3543 goto finally;
3544 }
3545 retval = PyLong_FromSsize_t(bytes_sent);
3546
3547finally:
3548 PyMem_Free(controlbuf);
3549 for (i = 0; i < ncmsgbufs; i++)
3550 PyBuffer_Release(&cmsgs[i].data);
3551 PyMem_Free(cmsgs);
3552 Py_XDECREF(cmsg_fast);
3553 for (i = 0; i < ndatabufs; i++)
3554 PyBuffer_Release(&databufs[i]);
3555 PyMem_Free(databufs);
3556 PyMem_Free(iovs);
3557 Py_XDECREF(data_fast);
3558 return retval;
3559}
3560
3561PyDoc_STRVAR(sendmsg_doc,
3562"sendmsg(buffers[, ancdata[, flags[, address]]]) -> count\n\
3563\n\
3564Send normal and ancillary data to the socket, gathering the\n\
3565non-ancillary data from a series of buffers and concatenating it into\n\
3566a single message. The buffers argument specifies the non-ancillary\n\
3567data as an iterable of buffer-compatible objects (e.g. bytes objects).\n\
3568The ancdata argument specifies the ancillary data (control messages)\n\
3569as an iterable of zero or more tuples (cmsg_level, cmsg_type,\n\
3570cmsg_data), where cmsg_level and cmsg_type are integers specifying the\n\
3571protocol level and protocol-specific type respectively, and cmsg_data\n\
3572is a buffer-compatible object holding the associated data. The flags\n\
3573argument defaults to 0 and has the same meaning as for send(). If\n\
3574address is supplied and not None, it sets a destination address for\n\
3575the message. The return value is the number of bytes of non-ancillary\n\
3576data sent.");
3577#endif /* CMSG_LEN */
3578
3579
Guido van Rossum30a685f1991-06-27 15:51:29 +00003580/* s.shutdown(how) method */
3581
Guido van Rossum73624e91994-10-10 17:59:00 +00003582static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003583sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003584{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003585 int how;
3586 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003587
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003588 how = PyLong_AsLong(arg);
3589 if (how == -1 && PyErr_Occurred())
3590 return NULL;
3591 Py_BEGIN_ALLOW_THREADS
3592 res = shutdown(s->sock_fd, how);
3593 Py_END_ALLOW_THREADS
3594 if (res < 0)
3595 return s->errorhandler();
3596 Py_INCREF(Py_None);
3597 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003598}
3599
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003600PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003601"shutdown(flag)\n\
3602\n\
Martin v. Löwis94681fc2003-11-27 19:40:22 +00003603Shut down the reading side of the socket (flag == SHUT_RD), the writing side\n\
3604of the socket (flag == SHUT_WR), or both ends (flag == SHUT_RDWR).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003605
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00003606#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Christian Heimesfaf2f632008-01-06 16:59:19 +00003607static PyObject*
3608sock_ioctl(PySocketSockObject *s, PyObject *arg)
3609{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003610 unsigned long cmd = SIO_RCVALL;
3611 PyObject *argO;
3612 DWORD recv;
Christian Heimesfaf2f632008-01-06 16:59:19 +00003613
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003614 if (!PyArg_ParseTuple(arg, "kO:ioctl", &cmd, &argO))
3615 return NULL;
Christian Heimesfaf2f632008-01-06 16:59:19 +00003616
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003617 switch (cmd) {
3618 case SIO_RCVALL: {
3619 unsigned int option = RCVALL_ON;
3620 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
3621 return NULL;
3622 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
3623 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
3624 return set_error();
3625 }
3626 return PyLong_FromUnsignedLong(recv); }
3627 case SIO_KEEPALIVE_VALS: {
3628 struct tcp_keepalive ka;
3629 if (!PyArg_ParseTuple(arg, "k(kkk):ioctl", &cmd,
3630 &ka.onoff, &ka.keepalivetime, &ka.keepaliveinterval))
3631 return NULL;
3632 if (WSAIoctl(s->sock_fd, cmd, &ka, sizeof(ka),
3633 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
3634 return set_error();
3635 }
3636 return PyLong_FromUnsignedLong(recv); }
3637 default:
3638 PyErr_Format(PyExc_ValueError, "invalid ioctl command %d", cmd);
3639 return NULL;
3640 }
Christian Heimesfaf2f632008-01-06 16:59:19 +00003641}
3642PyDoc_STRVAR(sock_ioctl_doc,
3643"ioctl(cmd, option) -> long\n\
3644\n\
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00003645Control the socket with WSAIoctl syscall. Currently supported 'cmd' values are\n\
3646SIO_RCVALL: 'option' must be one of the socket.RCVALL_* constants.\n\
3647SIO_KEEPALIVE_VALS: 'option' is a tuple of (onoff, timeout, interval).");
Christian Heimesfaf2f632008-01-06 16:59:19 +00003648
3649#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00003650
3651/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003652
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003653static PyMethodDef sock_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003654 {"_accept", (PyCFunction)sock_accept, METH_NOARGS,
3655 accept_doc},
3656 {"bind", (PyCFunction)sock_bind, METH_O,
3657 bind_doc},
3658 {"close", (PyCFunction)sock_close, METH_NOARGS,
3659 close_doc},
3660 {"connect", (PyCFunction)sock_connect, METH_O,
3661 connect_doc},
3662 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
3663 connect_ex_doc},
Antoine Pitrou6e451df2010-08-09 20:39:54 +00003664 {"detach", (PyCFunction)sock_detach, METH_NOARGS,
3665 detach_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003666 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
3667 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00003668#ifdef HAVE_GETPEERNAME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003669 {"getpeername", (PyCFunction)sock_getpeername,
3670 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00003671#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003672 {"getsockname", (PyCFunction)sock_getsockname,
3673 METH_NOARGS, getsockname_doc},
3674 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
3675 getsockopt_doc},
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00003676#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003677 {"ioctl", (PyCFunction)sock_ioctl, METH_VARARGS,
3678 sock_ioctl_doc},
Christian Heimesfaf2f632008-01-06 16:59:19 +00003679#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003680 {"listen", (PyCFunction)sock_listen, METH_O,
3681 listen_doc},
3682 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
3683 recv_doc},
3684 {"recv_into", (PyCFunction)sock_recv_into, METH_VARARGS | METH_KEYWORDS,
3685 recv_into_doc},
3686 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
3687 recvfrom_doc},
3688 {"recvfrom_into", (PyCFunction)sock_recvfrom_into, METH_VARARGS | METH_KEYWORDS,
3689 recvfrom_into_doc},
3690 {"send", (PyCFunction)sock_send, METH_VARARGS,
3691 send_doc},
3692 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
3693 sendall_doc},
3694 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
3695 sendto_doc},
3696 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
3697 setblocking_doc},
3698 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
3699 settimeout_doc},
3700 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
3701 gettimeout_doc},
3702 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
3703 setsockopt_doc},
3704 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
3705 shutdown_doc},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003706#ifdef CMSG_LEN
3707 {"recvmsg", (PyCFunction)sock_recvmsg, METH_VARARGS,
3708 recvmsg_doc},
3709 {"recvmsg_into", (PyCFunction)sock_recvmsg_into, METH_VARARGS,
3710 recvmsg_into_doc,},
3711 {"sendmsg", (PyCFunction)sock_sendmsg, METH_VARARGS,
3712 sendmsg_doc},
3713#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003714 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003715};
3716
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003717/* SockObject members */
3718static PyMemberDef sock_memberlist[] = {
3719 {"family", T_INT, offsetof(PySocketSockObject, sock_family), READONLY, "the socket family"},
3720 {"type", T_INT, offsetof(PySocketSockObject, sock_type), READONLY, "the socket type"},
3721 {"proto", T_INT, offsetof(PySocketSockObject, sock_proto), READONLY, "the socket protocol"},
3722 {"timeout", T_DOUBLE, offsetof(PySocketSockObject, sock_timeout), READONLY, "the socket timeout"},
3723 {0},
3724};
Guido van Rossum30a685f1991-06-27 15:51:29 +00003725
Guido van Rossum73624e91994-10-10 17:59:00 +00003726/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00003727 First close the file description. */
3728
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003729static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003730sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003731{
Antoine Pitroue033e062010-10-29 10:38:18 +00003732 if (s->sock_fd != -1) {
3733 PyObject *exc, *val, *tb;
3734 Py_ssize_t old_refcount = Py_REFCNT(s);
3735 ++Py_REFCNT(s);
3736 PyErr_Fetch(&exc, &val, &tb);
3737 if (PyErr_WarnFormat(PyExc_ResourceWarning, 1,
3738 "unclosed %R", s))
3739 /* Spurious errors can appear at shutdown */
3740 if (PyErr_ExceptionMatches(PyExc_Warning))
3741 PyErr_WriteUnraisable((PyObject *) s);
3742 PyErr_Restore(exc, val, tb);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003743 (void) SOCKETCLOSE(s->sock_fd);
Antoine Pitroue033e062010-10-29 10:38:18 +00003744 Py_REFCNT(s) = old_refcount;
3745 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003746 Py_TYPE(s)->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003747}
3748
Guido van Rossum30a685f1991-06-27 15:51:29 +00003749
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003750static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003751sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003752{
Fred Drakea04eaad2000-06-30 02:46:07 +00003753#if SIZEOF_SOCKET_T > SIZEOF_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003754 if (s->sock_fd > LONG_MAX) {
3755 /* this can occur on Win64, and actually there is a special
3756 ugly printf formatter for decimal pointer length integer
3757 printing, only bother if necessary*/
3758 PyErr_SetString(PyExc_OverflowError,
3759 "no printf formatter to display "
3760 "the socket descriptor in decimal");
3761 return NULL;
3762 }
Fred Drakea04eaad2000-06-30 02:46:07 +00003763#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003764 return PyUnicode_FromFormat(
3765 "<socket object, fd=%ld, family=%d, type=%d, proto=%d>",
3766 (long)s->sock_fd, s->sock_family,
3767 s->sock_type,
3768 s->sock_proto);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003769}
3770
3771
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003772/* Create a new, uninitialized socket object. */
3773
3774static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003775sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003776{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003777 PyObject *new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003778
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003779 new = type->tp_alloc(type, 0);
3780 if (new != NULL) {
3781 ((PySocketSockObject *)new)->sock_fd = -1;
3782 ((PySocketSockObject *)new)->sock_timeout = -1.0;
3783 ((PySocketSockObject *)new)->errorhandler = &set_error;
3784 }
3785 return new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003786}
3787
3788
3789/* Initialize a new socket object. */
3790
3791/*ARGSUSED*/
3792static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00003793sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003794{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003795 PySocketSockObject *s = (PySocketSockObject *)self;
3796 PyObject *fdobj = NULL;
3797 SOCKET_T fd = INVALID_SOCKET;
3798 int family = AF_INET, type = SOCK_STREAM, proto = 0;
3799 static char *keywords[] = {"family", "type", "proto", "fileno", 0};
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003800
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003801 if (!PyArg_ParseTupleAndKeywords(args, kwds,
3802 "|iiiO:socket", keywords,
3803 &family, &type, &proto, &fdobj))
3804 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003805
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003806 if (fdobj != NULL && fdobj != Py_None) {
3807 fd = PyLong_AsSocket_t(fdobj);
3808 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
3809 return -1;
3810 if (fd == INVALID_SOCKET) {
3811 PyErr_SetString(PyExc_ValueError,
3812 "can't use invalid socket value");
3813 return -1;
3814 }
3815 }
3816 else {
3817 Py_BEGIN_ALLOW_THREADS
3818 fd = socket(family, type, proto);
3819 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00003820
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003821 if (fd == INVALID_SOCKET) {
3822 set_error();
3823 return -1;
3824 }
3825 }
3826 init_sockobject(s, fd, family, type, proto);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003827
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003828 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003829
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003830}
3831
3832
Guido van Rossumb6775db1994-08-01 11:34:53 +00003833/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003834
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003835static PyTypeObject sock_type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003836 PyVarObject_HEAD_INIT(0, 0) /* Must fill in type value later */
3837 "_socket.socket", /* tp_name */
3838 sizeof(PySocketSockObject), /* tp_basicsize */
3839 0, /* tp_itemsize */
3840 (destructor)sock_dealloc, /* tp_dealloc */
3841 0, /* tp_print */
3842 0, /* tp_getattr */
3843 0, /* tp_setattr */
3844 0, /* tp_reserved */
3845 (reprfunc)sock_repr, /* tp_repr */
3846 0, /* tp_as_number */
3847 0, /* tp_as_sequence */
3848 0, /* tp_as_mapping */
3849 0, /* tp_hash */
3850 0, /* tp_call */
3851 0, /* tp_str */
3852 PyObject_GenericGetAttr, /* tp_getattro */
3853 0, /* tp_setattro */
3854 0, /* tp_as_buffer */
3855 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
3856 sock_doc, /* tp_doc */
3857 0, /* tp_traverse */
3858 0, /* tp_clear */
3859 0, /* tp_richcompare */
3860 0, /* tp_weaklistoffset */
3861 0, /* tp_iter */
3862 0, /* tp_iternext */
3863 sock_methods, /* tp_methods */
3864 sock_memberlist, /* tp_members */
3865 0, /* tp_getset */
3866 0, /* tp_base */
3867 0, /* tp_dict */
3868 0, /* tp_descr_get */
3869 0, /* tp_descr_set */
3870 0, /* tp_dictoffset */
3871 sock_initobj, /* tp_init */
3872 PyType_GenericAlloc, /* tp_alloc */
3873 sock_new, /* tp_new */
3874 PyObject_Del, /* tp_free */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003875};
3876
Guido van Rossum30a685f1991-06-27 15:51:29 +00003877
Guido van Rossum81194471991-07-27 21:42:02 +00003878/* Python interface to gethostname(). */
3879
3880/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00003881static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00003882socket_gethostname(PyObject *self, PyObject *unused)
Guido van Rossum81194471991-07-27 21:42:02 +00003883{
Martin v. Löwis72f48422010-10-29 18:20:08 +00003884#ifdef MS_WINDOWS
3885 /* Don't use winsock's gethostname, as this returns the ANSI
3886 version of the hostname, whereas we need a Unicode string.
3887 Otherwise, gethostname apparently also returns the DNS name. */
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00003888 wchar_t buf[MAX_COMPUTERNAME_LENGTH + 1];
Victor Stinner63941882011-09-29 00:42:28 +02003889 DWORD size = Py_ARRAY_LENGTH(buf);
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00003890 PyObject *result;
Martin v. Löwis72f48422010-10-29 18:20:08 +00003891 if (!GetComputerNameExW(ComputerNamePhysicalDnsHostname, buf, &size)) {
3892 if (GetLastError() == ERROR_MORE_DATA) {
3893 /* MSDN says this may occur "because DNS allows longer names */
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00003894 if (size == 0) /* XXX: I'm not sure how to handle this */
3895 return PyUnicode_FromUnicode(NULL, 0);
3896 result = PyUnicode_FromUnicode(NULL, size - 1);
Martin v. Löwis72f48422010-10-29 18:20:08 +00003897 if (!result)
3898 return NULL;
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00003899 if (GetComputerNameExW(ComputerNamePhysicalDnsHostname,
3900 PyUnicode_AS_UNICODE(result),
3901 &size))
Martin v. Löwis72f48422010-10-29 18:20:08 +00003902 return result;
Benjamin Petersone857b292010-10-29 21:37:26 +00003903 Py_DECREF(result);
Martin v. Löwis72f48422010-10-29 18:20:08 +00003904 }
3905 return PyErr_SetExcFromWindowsErr(PyExc_WindowsError, GetLastError());
3906 }
Victor Stinner77af1722011-05-26 14:05:59 +02003907 return PyUnicode_FromUnicode(buf, size);
Martin v. Löwis72f48422010-10-29 18:20:08 +00003908#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003909 char buf[1024];
3910 int res;
3911 Py_BEGIN_ALLOW_THREADS
3912 res = gethostname(buf, (int) sizeof buf - 1);
3913 Py_END_ALLOW_THREADS
3914 if (res < 0)
3915 return set_error();
3916 buf[sizeof buf - 1] = '\0';
3917 return PyUnicode_FromString(buf);
Martin v. Löwis72f48422010-10-29 18:20:08 +00003918#endif
Guido van Rossum81194471991-07-27 21:42:02 +00003919}
Guido van Rossumff4949e1992-08-05 19:58:53 +00003920
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003921PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003922"gethostname() -> string\n\
3923\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003924Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003925
Antoine Pitrou061cfb52011-02-28 22:25:22 +00003926#ifdef HAVE_SETHOSTNAME
3927PyDoc_STRVAR(sethostname_doc,
3928"sethostname(name)\n\n\
3929Sets the hostname to name.");
3930
3931static PyObject *
3932socket_sethostname(PyObject *self, PyObject *args)
3933{
3934 PyObject *hnobj;
3935 Py_buffer buf;
3936 int res, flag = 0;
3937
3938 if (!PyArg_ParseTuple(args, "S:sethostname", &hnobj)) {
3939 PyErr_Clear();
3940 if (!PyArg_ParseTuple(args, "O&:sethostname",
3941 PyUnicode_FSConverter, &hnobj))
3942 return NULL;
3943 flag = 1;
3944 }
3945 res = PyObject_GetBuffer(hnobj, &buf, PyBUF_SIMPLE);
3946 if (!res) {
3947 res = sethostname(buf.buf, buf.len);
3948 PyBuffer_Release(&buf);
3949 }
3950 if (flag)
3951 Py_DECREF(hnobj);
3952 if (res)
3953 return set_error();
3954 Py_RETURN_NONE;
3955}
3956#endif
Guido van Rossumff4949e1992-08-05 19:58:53 +00003957
Guido van Rossum30a685f1991-06-27 15:51:29 +00003958/* Python interface to gethostbyname(name). */
3959
3960/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00003961static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003962socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003963{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003964 char *name;
3965 sock_addr_t addrbuf;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00003966 PyObject *ret = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003967
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00003968 if (!PyArg_ParseTuple(args, "et:gethostbyname", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003969 return NULL;
3970 if (setipaddr(name, SAS2SA(&addrbuf), sizeof(addrbuf), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00003971 goto finally;
3972 ret = makeipaddr(SAS2SA(&addrbuf), sizeof(struct sockaddr_in));
3973finally:
3974 PyMem_Free(name);
3975 return ret;
Guido van Rossum30a685f1991-06-27 15:51:29 +00003976}
3977
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003978PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003979"gethostbyname(host) -> address\n\
3980\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003981Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003982
3983
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003984/* Convenience function common to gethostbyname_ex and gethostbyaddr */
3985
3986static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003987gethost_common(struct hostent *h, struct sockaddr *addr, int alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003988{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003989 char **pch;
3990 PyObject *rtn_tuple = (PyObject *)NULL;
3991 PyObject *name_list = (PyObject *)NULL;
3992 PyObject *addr_list = (PyObject *)NULL;
3993 PyObject *tmp;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003994
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003995 if (h == NULL) {
3996 /* Let's get real error message to return */
3997 set_herror(h_errno);
3998 return NULL;
3999 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004000
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004001 if (h->h_addrtype != af) {
4002 /* Let's get real error message to return */
4003 PyErr_SetString(socket_error,
4004 (char *)strerror(EAFNOSUPPORT));
Christian Heimesada8c3b2008-03-18 18:26:33 +00004005
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004006 return NULL;
4007 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004008
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004009 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00004010
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004011 case AF_INET:
4012 if (alen < sizeof(struct sockaddr_in))
4013 return NULL;
4014 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004015
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004016#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004017 case AF_INET6:
4018 if (alen < sizeof(struct sockaddr_in6))
4019 return NULL;
4020 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004021#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00004022
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004023 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004024
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004025 if ((name_list = PyList_New(0)) == NULL)
4026 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004027
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004028 if ((addr_list = PyList_New(0)) == NULL)
4029 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004030
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004031 /* SF #1511317: h_aliases can be NULL */
4032 if (h->h_aliases) {
4033 for (pch = h->h_aliases; *pch != NULL; pch++) {
4034 int status;
4035 tmp = PyUnicode_FromString(*pch);
4036 if (tmp == NULL)
4037 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004038
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004039 status = PyList_Append(name_list, tmp);
4040 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004041
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004042 if (status)
4043 goto err;
4044 }
4045 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004046
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004047 for (pch = h->h_addr_list; *pch != NULL; pch++) {
4048 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004049
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004050 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00004051
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004052 case AF_INET:
4053 {
4054 struct sockaddr_in sin;
4055 memset(&sin, 0, sizeof(sin));
4056 sin.sin_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004057#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004058 sin.sin_len = sizeof(sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004059#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004060 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
4061 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
Guido van Rossum67f7a382002-06-06 21:08:16 +00004062
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004063 if (pch == h->h_addr_list && alen >= sizeof(sin))
4064 memcpy((char *) addr, &sin, sizeof(sin));
4065 break;
4066 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004067
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004068#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004069 case AF_INET6:
4070 {
4071 struct sockaddr_in6 sin6;
4072 memset(&sin6, 0, sizeof(sin6));
4073 sin6.sin6_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004074#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004075 sin6.sin6_len = sizeof(sin6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004076#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004077 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
4078 tmp = makeipaddr((struct sockaddr *)&sin6,
4079 sizeof(sin6));
Guido van Rossum67f7a382002-06-06 21:08:16 +00004080
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004081 if (pch == h->h_addr_list && alen >= sizeof(sin6))
4082 memcpy((char *) addr, &sin6, sizeof(sin6));
4083 break;
4084 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004085#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00004086
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004087 default: /* can't happen */
4088 PyErr_SetString(socket_error,
4089 "unsupported address family");
4090 return NULL;
4091 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004092
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004093 if (tmp == NULL)
4094 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004095
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004096 status = PyList_Append(addr_list, tmp);
4097 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004098
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004099 if (status)
4100 goto err;
4101 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004102
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004103 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004104
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004105 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004106 Py_XDECREF(name_list);
4107 Py_XDECREF(addr_list);
4108 return rtn_tuple;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004109}
4110
4111
4112/* Python interface to gethostbyname_ex(name). */
4113
4114/*ARGSUSED*/
4115static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004116socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004117{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004118 char *name;
4119 struct hostent *h;
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00004120#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004121 struct sockaddr_storage addr;
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00004122#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004123 struct sockaddr_in addr;
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00004124#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004125 struct sockaddr *sa;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004126 PyObject *ret = NULL;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004127#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004128 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004129#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004130 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004131#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004132 char buf[16384];
4133 int buf_len = (sizeof buf) - 1;
4134 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004135#endif
4136#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004137 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004138#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004139#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004140
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004141 if (!PyArg_ParseTuple(args, "et:gethostbyname_ex", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004142 return NULL;
4143 if (setipaddr(name, (struct sockaddr *)&addr, sizeof(addr), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004144 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004145 Py_BEGIN_ALLOW_THREADS
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004146#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004147#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004148 result = gethostbyname_r(name, &hp_allocated, buf, buf_len,
4149 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004150#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004151 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004152#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004153 memset((void *) &data, '\0', sizeof(data));
4154 result = gethostbyname_r(name, &hp_allocated, &data);
4155 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004156#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004157#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00004158#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004159 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004160#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004161 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004162#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004163 Py_END_ALLOW_THREADS
4164 /* Some C libraries would require addr.__ss_family instead of
4165 addr.ss_family.
4166 Therefore, we cast the sockaddr_storage into sockaddr to
4167 access sa_family. */
4168 sa = (struct sockaddr*)&addr;
4169 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr),
4170 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00004171#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004172 PyThread_release_lock(netdb_lock);
Guido van Rossum955becc1999-03-22 20:14:53 +00004173#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004174finally:
4175 PyMem_Free(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004176 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004177}
4178
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004179PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004180"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
4181\n\
4182Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004183for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004184
4185
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004186/* Python interface to gethostbyaddr(IP). */
4187
4188/*ARGSUSED*/
4189static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004190socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004191{
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004192#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004193 struct sockaddr_storage addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004194#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004195 struct sockaddr_in addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004196#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004197 struct sockaddr *sa = (struct sockaddr *)&addr;
4198 char *ip_num;
4199 struct hostent *h;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004200 PyObject *ret = NULL;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004201#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004202 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004203#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004204 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004205#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004206 /* glibcs up to 2.10 assume that the buf argument to
4207 gethostbyaddr_r is 8-byte aligned, which at least llvm-gcc
4208 does not ensure. The attribute below instructs the compiler
4209 to maintain this alignment. */
4210 char buf[16384] Py_ALIGNED(8);
4211 int buf_len = (sizeof buf) - 1;
4212 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004213#endif
4214#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004215 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004216#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004217#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004218 char *ap;
4219 int al;
4220 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004221
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004222 if (!PyArg_ParseTuple(args, "et:gethostbyaddr", "idna", &ip_num))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004223 return NULL;
4224 af = AF_UNSPEC;
4225 if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004226 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004227 af = sa->sa_family;
4228 ap = NULL;
Brett Cannonb94767f2011-02-22 20:15:44 +00004229 /* al = 0; */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004230 switch (af) {
4231 case AF_INET:
4232 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
4233 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
4234 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004235#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004236 case AF_INET6:
4237 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
4238 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
4239 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004240#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004241 default:
4242 PyErr_SetString(socket_error, "unsupported address family");
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004243 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004244 }
4245 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004246#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004247#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004248 result = gethostbyaddr_r(ap, al, af,
4249 &hp_allocated, buf, buf_len,
4250 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004251#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004252 h = gethostbyaddr_r(ap, al, af,
4253 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004254#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004255 memset((void *) &data, '\0', sizeof(data));
4256 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
4257 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004258#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004259#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00004260#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004261 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004262#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004263 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004264#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004265 Py_END_ALLOW_THREADS
4266 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00004267#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004268 PyThread_release_lock(netdb_lock);
Guido van Rossum3baaa131999-03-22 21:44:51 +00004269#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004270finally:
4271 PyMem_Free(ip_num);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004272 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004273}
4274
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004275PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004276"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
4277\n\
4278Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004279for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004280
Guido van Rossum30a685f1991-06-27 15:51:29 +00004281
4282/* Python interface to getservbyname(name).
4283 This only returns the port number, since the other info is already
4284 known or not useful (like the list of aliases). */
4285
4286/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004287static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004288socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00004289{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004290 char *name, *proto=NULL;
4291 struct servent *sp;
4292 if (!PyArg_ParseTuple(args, "s|s:getservbyname", &name, &proto))
4293 return NULL;
4294 Py_BEGIN_ALLOW_THREADS
4295 sp = getservbyname(name, proto);
4296 Py_END_ALLOW_THREADS
4297 if (sp == NULL) {
4298 PyErr_SetString(socket_error, "service/proto not found");
4299 return NULL;
4300 }
4301 return PyLong_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00004302}
4303
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004304PyDoc_STRVAR(getservbyname_doc,
Barry Warsaw11b91a02004-06-28 00:50:43 +00004305"getservbyname(servicename[, protocolname]) -> integer\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00004306\n\
4307Return a port number from a service name and protocol name.\n\
Barry Warsaw11b91a02004-06-28 00:50:43 +00004308The optional protocol name, if given, should be 'tcp' or 'udp',\n\
4309otherwise any protocol will match.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004310
Guido van Rossum30a685f1991-06-27 15:51:29 +00004311
Barry Warsaw11b91a02004-06-28 00:50:43 +00004312/* Python interface to getservbyport(port).
4313 This only returns the service name, since the other info is already
4314 known or not useful (like the list of aliases). */
4315
4316/*ARGSUSED*/
4317static PyObject *
4318socket_getservbyport(PyObject *self, PyObject *args)
4319{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004320 int port;
4321 char *proto=NULL;
4322 struct servent *sp;
4323 if (!PyArg_ParseTuple(args, "i|s:getservbyport", &port, &proto))
4324 return NULL;
4325 if (port < 0 || port > 0xffff) {
4326 PyErr_SetString(
4327 PyExc_OverflowError,
4328 "getservbyport: port must be 0-65535.");
4329 return NULL;
4330 }
4331 Py_BEGIN_ALLOW_THREADS
4332 sp = getservbyport(htons((short)port), proto);
4333 Py_END_ALLOW_THREADS
4334 if (sp == NULL) {
4335 PyErr_SetString(socket_error, "port/proto not found");
4336 return NULL;
4337 }
4338 return PyUnicode_FromString(sp->s_name);
Barry Warsaw11b91a02004-06-28 00:50:43 +00004339}
4340
4341PyDoc_STRVAR(getservbyport_doc,
4342"getservbyport(port[, protocolname]) -> string\n\
4343\n\
4344Return the service name from a port number and protocol name.\n\
4345The optional protocol name, if given, should be 'tcp' or 'udp',\n\
4346otherwise any protocol will match.");
4347
Guido van Rossum3901d851996-12-19 16:35:04 +00004348/* Python interface to getprotobyname(name).
4349 This only returns the protocol number, since the other info is
4350 already known or not useful (like the list of aliases). */
4351
4352/*ARGSUSED*/
4353static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004354socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00004355{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004356 char *name;
4357 struct protoent *sp;
4358 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
4359 return NULL;
4360 Py_BEGIN_ALLOW_THREADS
4361 sp = getprotobyname(name);
4362 Py_END_ALLOW_THREADS
4363 if (sp == NULL) {
4364 PyErr_SetString(socket_error, "protocol not found");
4365 return NULL;
4366 }
4367 return PyLong_FromLong((long) sp->p_proto);
Guido van Rossum3901d851996-12-19 16:35:04 +00004368}
4369
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004370PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004371"getprotobyname(name) -> integer\n\
4372\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004373Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004374
Guido van Rossum3901d851996-12-19 16:35:04 +00004375
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004376#ifndef NO_DUP
4377/* dup() function for socket fds */
4378
4379static PyObject *
4380socket_dup(PyObject *self, PyObject *fdobj)
4381{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004382 SOCKET_T fd, newfd;
4383 PyObject *newfdobj;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004384
4385
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004386 fd = PyLong_AsSocket_t(fdobj);
4387 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
4388 return NULL;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004389
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004390 newfd = dup_socket(fd);
4391 if (newfd == INVALID_SOCKET)
4392 return set_error();
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004393
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004394 newfdobj = PyLong_FromSocket_t(newfd);
4395 if (newfdobj == NULL)
4396 SOCKETCLOSE(newfd);
4397 return newfdobj;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004398}
4399
4400PyDoc_STRVAR(dup_doc,
4401"dup(integer) -> integer\n\
4402\n\
4403Duplicate an integer socket file descriptor. This is like os.dup(), but for\n\
4404sockets; on some platforms os.dup() won't work for socket file descriptors.");
4405#endif
4406
4407
Dave Cole331708b2004-08-09 04:51:41 +00004408#ifdef HAVE_SOCKETPAIR
4409/* Create a pair of sockets using the socketpair() function.
Dave Cole07fda7e2004-08-23 05:16:23 +00004410 Arguments as for socket() except the default family is AF_UNIX if
Dave Colee8bbfe42004-08-26 00:51:16 +00004411 defined on the platform; otherwise, the default is AF_INET. */
Dave Cole331708b2004-08-09 04:51:41 +00004412
4413/*ARGSUSED*/
4414static PyObject *
4415socket_socketpair(PyObject *self, PyObject *args)
4416{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004417 PySocketSockObject *s0 = NULL, *s1 = NULL;
4418 SOCKET_T sv[2];
4419 int family, type = SOCK_STREAM, proto = 0;
4420 PyObject *res = NULL;
Dave Cole331708b2004-08-09 04:51:41 +00004421
4422#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004423 family = AF_UNIX;
Dave Cole331708b2004-08-09 04:51:41 +00004424#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004425 family = AF_INET;
Dave Cole331708b2004-08-09 04:51:41 +00004426#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004427 if (!PyArg_ParseTuple(args, "|iii:socketpair",
4428 &family, &type, &proto))
4429 return NULL;
4430 /* Create a pair of socket fds */
4431 if (socketpair(family, type, proto, sv) < 0)
4432 return set_error();
4433 s0 = new_sockobject(sv[0], family, type, proto);
4434 if (s0 == NULL)
4435 goto finally;
4436 s1 = new_sockobject(sv[1], family, type, proto);
4437 if (s1 == NULL)
4438 goto finally;
4439 res = PyTuple_Pack(2, s0, s1);
Dave Cole331708b2004-08-09 04:51:41 +00004440
4441finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004442 if (res == NULL) {
4443 if (s0 == NULL)
4444 SOCKETCLOSE(sv[0]);
4445 if (s1 == NULL)
4446 SOCKETCLOSE(sv[1]);
4447 }
4448 Py_XDECREF(s0);
4449 Py_XDECREF(s1);
4450 return res;
Dave Cole331708b2004-08-09 04:51:41 +00004451}
4452
4453PyDoc_STRVAR(socketpair_doc,
4454"socketpair([family[, type[, proto]]]) -> (socket object, socket object)\n\
4455\n\
4456Create a pair of socket objects from the sockets returned by the platform\n\
4457socketpair() function.\n\
Dave Cole07fda7e2004-08-23 05:16:23 +00004458The arguments are the same as for socket() except the default family is\n\
Dave Colee8bbfe42004-08-26 00:51:16 +00004459AF_UNIX if defined on the platform; otherwise, the default is AF_INET.");
Dave Cole331708b2004-08-09 04:51:41 +00004460
4461#endif /* HAVE_SOCKETPAIR */
4462
4463
Guido van Rossum006bf911996-06-12 04:04:55 +00004464static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004465socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00004466{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004467 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00004468
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004469 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
4470 return NULL;
4471 }
4472 if (x1 < 0) {
4473 PyErr_SetString(PyExc_OverflowError,
4474 "can't convert negative number to unsigned long");
4475 return NULL;
4476 }
4477 x2 = (unsigned int)ntohs((unsigned short)x1);
4478 return PyLong_FromLong(x2);
Guido van Rossum006bf911996-06-12 04:04:55 +00004479}
4480
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004481PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004482"ntohs(integer) -> integer\n\
4483\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004484Convert a 16-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004485
4486
Guido van Rossum006bf911996-06-12 04:04:55 +00004487static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004488socket_ntohl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00004489{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004490 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00004491
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004492 if (PyLong_Check(arg)) {
4493 x = PyLong_AsUnsignedLong(arg);
4494 if (x == (unsigned long) -1 && PyErr_Occurred())
4495 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004496#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004497 {
4498 unsigned long y;
4499 /* only want the trailing 32 bits */
4500 y = x & 0xFFFFFFFFUL;
4501 if (y ^ x)
4502 return PyErr_Format(PyExc_OverflowError,
4503 "long int larger than 32 bits");
4504 x = y;
4505 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004506#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004507 }
4508 else
4509 return PyErr_Format(PyExc_TypeError,
4510 "expected int/long, %s found",
4511 Py_TYPE(arg)->tp_name);
4512 if (x == (unsigned long) -1 && PyErr_Occurred())
4513 return NULL;
4514 return PyLong_FromUnsignedLong(ntohl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00004515}
4516
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004517PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004518"ntohl(integer) -> integer\n\
4519\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004520Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004521
4522
Guido van Rossum006bf911996-06-12 04:04:55 +00004523static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004524socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00004525{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004526 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00004527
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004528 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
4529 return NULL;
4530 }
4531 if (x1 < 0) {
4532 PyErr_SetString(PyExc_OverflowError,
4533 "can't convert negative number to unsigned long");
4534 return NULL;
4535 }
4536 x2 = (unsigned int)htons((unsigned short)x1);
4537 return PyLong_FromLong(x2);
Guido van Rossum006bf911996-06-12 04:04:55 +00004538}
4539
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004540PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004541"htons(integer) -> integer\n\
4542\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004543Convert a 16-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004544
4545
Guido van Rossum006bf911996-06-12 04:04:55 +00004546static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004547socket_htonl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00004548{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004549 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00004550
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004551 if (PyLong_Check(arg)) {
4552 x = PyLong_AsUnsignedLong(arg);
4553 if (x == (unsigned long) -1 && PyErr_Occurred())
4554 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004555#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004556 {
4557 unsigned long y;
4558 /* only want the trailing 32 bits */
4559 y = x & 0xFFFFFFFFUL;
4560 if (y ^ x)
4561 return PyErr_Format(PyExc_OverflowError,
4562 "long int larger than 32 bits");
4563 x = y;
4564 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004565#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004566 }
4567 else
4568 return PyErr_Format(PyExc_TypeError,
4569 "expected int/long, %s found",
4570 Py_TYPE(arg)->tp_name);
4571 return PyLong_FromUnsignedLong(htonl((unsigned long)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00004572}
4573
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004574PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004575"htonl(integer) -> integer\n\
4576\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004577Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004578
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004579/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004580
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004581PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004582"inet_aton(string) -> bytes giving packed 32-bit IP representation\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004583\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00004584Convert 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 +00004585binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004586
4587static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004588socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004589{
Guido van Rossuma2e48551999-09-09 15:42:59 +00004590#ifndef INADDR_NONE
4591#define INADDR_NONE (-1)
4592#endif
Neal Norwitz88f115b2003-02-13 02:15:42 +00004593#ifdef HAVE_INET_ATON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004594 struct in_addr buf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00004595#endif
4596
4597#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
Benjamin Petersonf91df042009-02-13 02:50:59 +00004598#if (SIZEOF_INT != 4)
4599#error "Not sure if in_addr_t exists and int is not 32-bits."
4600#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004601 /* Have to use inet_addr() instead */
4602 unsigned int packed_addr;
Tim Peters1df9fdd2003-02-13 03:13:40 +00004603#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004604 char *ip_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00004605
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004606 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))
4607 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00004608
Tim Peters1df9fdd2003-02-13 03:13:40 +00004609
4610#ifdef HAVE_INET_ATON
Thomas Wouters477c8d52006-05-27 19:21:47 +00004611
4612#ifdef USE_INET_ATON_WEAKLINK
4613 if (inet_aton != NULL) {
4614#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004615 if (inet_aton(ip_addr, &buf))
4616 return PyBytes_FromStringAndSize((char *)(&buf),
4617 sizeof(buf));
Guido van Rossumad05cdf2003-02-12 23:08:22 +00004618
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004619 PyErr_SetString(socket_error,
4620 "illegal IP address string passed to inet_aton");
4621 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00004622
Thomas Wouters477c8d52006-05-27 19:21:47 +00004623#ifdef USE_INET_ATON_WEAKLINK
4624 } else {
4625#endif
4626
4627#endif
4628
4629#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
4630
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004631 /* special-case this address as inet_addr might return INADDR_NONE
4632 * for this */
4633 if (strcmp(ip_addr, "255.255.255.255") == 0) {
4634 packed_addr = 0xFFFFFFFF;
4635 } else {
Thomas Wouters477c8d52006-05-27 19:21:47 +00004636
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004637 packed_addr = inet_addr(ip_addr);
Guido van Rossumc6a164b1999-08-20 19:11:27 +00004638
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004639 if (packed_addr == INADDR_NONE) { /* invalid address */
4640 PyErr_SetString(socket_error,
4641 "illegal IP address string passed to inet_aton");
4642 return NULL;
4643 }
4644 }
4645 return PyBytes_FromStringAndSize((char *) &packed_addr,
4646 sizeof(packed_addr));
Thomas Wouters477c8d52006-05-27 19:21:47 +00004647
4648#ifdef USE_INET_ATON_WEAKLINK
4649 }
4650#endif
4651
Guido van Rossumad05cdf2003-02-12 23:08:22 +00004652#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004653}
4654
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004655PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00004656"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004657\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004658Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004659
4660static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004661socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004662{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004663 char *packed_str;
4664 int addr_len;
4665 struct in_addr packed_addr;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004666
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004667 if (!PyArg_ParseTuple(args, "y#:inet_ntoa", &packed_str, &addr_len)) {
4668 return NULL;
4669 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00004670
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004671 if (addr_len != sizeof(packed_addr)) {
4672 PyErr_SetString(socket_error,
4673 "packed IP wrong length for inet_ntoa");
4674 return NULL;
4675 }
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004676
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004677 memcpy(&packed_addr, packed_str, addr_len);
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004678
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004679 return PyUnicode_FromString(inet_ntoa(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004680}
Guido van Rossum82a5c661998-07-07 20:45:43 +00004681
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004682#ifdef HAVE_INET_PTON
4683
4684PyDoc_STRVAR(inet_pton_doc,
4685"inet_pton(af, ip) -> packed IP address string\n\
4686\n\
4687Convert an IP address from string format to a packed string suitable\n\
4688for use with low-level network functions.");
4689
4690static PyObject *
4691socket_inet_pton(PyObject *self, PyObject *args)
4692{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004693 int af;
4694 char* ip;
4695 int retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004696#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004697 char packed[MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004698#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004699 char packed[sizeof(struct in_addr)];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004700#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004701 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
4702 return NULL;
4703 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004704
Martin v. Löwis04697e82004-06-02 12:35:29 +00004705#if !defined(ENABLE_IPV6) && defined(AF_INET6)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004706 if(af == AF_INET6) {
4707 PyErr_SetString(socket_error,
4708 "can't use AF_INET6, IPv6 is disabled");
4709 return NULL;
4710 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00004711#endif
Martin v. Löwis10649092003-08-05 06:25:06 +00004712
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004713 retval = inet_pton(af, ip, packed);
4714 if (retval < 0) {
4715 PyErr_SetFromErrno(socket_error);
4716 return NULL;
4717 } else if (retval == 0) {
4718 PyErr_SetString(socket_error,
4719 "illegal IP address string passed to inet_pton");
4720 return NULL;
4721 } else if (af == AF_INET) {
4722 return PyBytes_FromStringAndSize(packed,
4723 sizeof(struct in_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004724#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004725 } else if (af == AF_INET6) {
4726 return PyBytes_FromStringAndSize(packed,
4727 sizeof(struct in6_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004728#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004729 } else {
4730 PyErr_SetString(socket_error, "unknown address family");
4731 return NULL;
4732 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004733}
Thomas Wouters477c8d52006-05-27 19:21:47 +00004734
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004735PyDoc_STRVAR(inet_ntop_doc,
4736"inet_ntop(af, packed_ip) -> string formatted IP address\n\
4737\n\
4738Convert a packed IP address of the given family to string format.");
4739
4740static PyObject *
4741socket_inet_ntop(PyObject *self, PyObject *args)
4742{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004743 int af;
4744 char* packed;
4745 int len;
4746 const char* retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004747#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004748 char ip[MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004749#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004750 char ip[INET_ADDRSTRLEN + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004751#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00004752
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004753 /* Guarantee NUL-termination for PyUnicode_FromString() below */
4754 memset((void *) &ip[0], '\0', sizeof(ip));
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004755
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004756 if (!PyArg_ParseTuple(args, "iy#:inet_ntop", &af, &packed, &len)) {
4757 return NULL;
4758 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004759
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004760 if (af == AF_INET) {
4761 if (len != sizeof(struct in_addr)) {
4762 PyErr_SetString(PyExc_ValueError,
4763 "invalid length of packed IP address string");
4764 return NULL;
4765 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004766#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004767 } else if (af == AF_INET6) {
4768 if (len != sizeof(struct in6_addr)) {
4769 PyErr_SetString(PyExc_ValueError,
4770 "invalid length of packed IP address string");
4771 return NULL;
4772 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004773#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004774 } else {
4775 PyErr_Format(PyExc_ValueError,
4776 "unknown address family %d", af);
4777 return NULL;
4778 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004779
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004780 retval = inet_ntop(af, packed, ip, sizeof(ip));
4781 if (!retval) {
4782 PyErr_SetFromErrno(socket_error);
4783 return NULL;
4784 } else {
4785 return PyUnicode_FromString(retval);
4786 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004787
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004788 /* NOTREACHED */
4789 PyErr_SetString(PyExc_RuntimeError, "invalid handling of inet_ntop");
4790 return NULL;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004791}
4792
4793#endif /* HAVE_INET_PTON */
4794
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004795/* Python interface to getaddrinfo(host, port). */
4796
4797/*ARGSUSED*/
4798static PyObject *
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00004799socket_getaddrinfo(PyObject *self, PyObject *args, PyObject* kwargs)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004800{
Victor Stinner77af1722011-05-26 14:05:59 +02004801 static char* kwnames[] = {"host", "port", "family", "type", "proto",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00004802 "flags", 0};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004803 struct addrinfo hints, *res;
4804 struct addrinfo *res0 = NULL;
4805 PyObject *hobj = NULL;
4806 PyObject *pobj = (PyObject *)NULL;
4807 char pbuf[30];
4808 char *hptr, *pptr;
4809 int family, socktype, protocol, flags;
4810 int error;
4811 PyObject *all = (PyObject *)NULL;
4812 PyObject *idna = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004813
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004814 family = socktype = protocol = flags = 0;
4815 family = AF_UNSPEC;
Victor Stinner77af1722011-05-26 14:05:59 +02004816 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OO|iiii:getaddrinfo",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00004817 kwnames, &hobj, &pobj, &family, &socktype,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004818 &protocol, &flags)) {
4819 return NULL;
4820 }
4821 if (hobj == Py_None) {
4822 hptr = NULL;
4823 } else if (PyUnicode_Check(hobj)) {
4824 idna = PyObject_CallMethod(hobj, "encode", "s", "idna");
4825 if (!idna)
4826 return NULL;
4827 assert(PyBytes_Check(idna));
4828 hptr = PyBytes_AS_STRING(idna);
4829 } else if (PyBytes_Check(hobj)) {
4830 hptr = PyBytes_AsString(hobj);
4831 } else {
4832 PyErr_SetString(PyExc_TypeError,
4833 "getaddrinfo() argument 1 must be string or None");
4834 return NULL;
4835 }
4836 if (PyLong_CheckExact(pobj)) {
4837 long value = PyLong_AsLong(pobj);
4838 if (value == -1 && PyErr_Occurred())
4839 goto err;
4840 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", value);
4841 pptr = pbuf;
4842 } else if (PyUnicode_Check(pobj)) {
4843 pptr = _PyUnicode_AsString(pobj);
Alexander Belopolskye239d232010-12-08 23:31:48 +00004844 if (pptr == NULL)
4845 goto err;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004846 } else if (PyBytes_Check(pobj)) {
Alexander Belopolskye239d232010-12-08 23:31:48 +00004847 pptr = PyBytes_AS_STRING(pobj);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004848 } else if (pobj == Py_None) {
4849 pptr = (char *)NULL;
4850 } else {
4851 PyErr_SetString(socket_error, "Int or String expected");
4852 goto err;
4853 }
4854 memset(&hints, 0, sizeof(hints));
4855 hints.ai_family = family;
4856 hints.ai_socktype = socktype;
4857 hints.ai_protocol = protocol;
4858 hints.ai_flags = flags;
4859 Py_BEGIN_ALLOW_THREADS
4860 ACQUIRE_GETADDRINFO_LOCK
4861 error = getaddrinfo(hptr, pptr, &hints, &res0);
4862 Py_END_ALLOW_THREADS
4863 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
4864 if (error) {
4865 set_gaierror(error);
4866 goto err;
4867 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004868
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004869 if ((all = PyList_New(0)) == NULL)
4870 goto err;
4871 for (res = res0; res; res = res->ai_next) {
4872 PyObject *single;
4873 PyObject *addr =
4874 makesockaddr(-1, res->ai_addr, res->ai_addrlen, protocol);
4875 if (addr == NULL)
4876 goto err;
4877 single = Py_BuildValue("iiisO", res->ai_family,
4878 res->ai_socktype, res->ai_protocol,
4879 res->ai_canonname ? res->ai_canonname : "",
4880 addr);
4881 Py_DECREF(addr);
4882 if (single == NULL)
4883 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004884
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004885 if (PyList_Append(all, single))
4886 goto err;
4887 Py_XDECREF(single);
4888 }
4889 Py_XDECREF(idna);
4890 if (res0)
4891 freeaddrinfo(res0);
4892 return all;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004893 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004894 Py_XDECREF(all);
4895 Py_XDECREF(idna);
4896 if (res0)
4897 freeaddrinfo(res0);
4898 return (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004899}
4900
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004901PyDoc_STRVAR(getaddrinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004902"getaddrinfo(host, port [, family, socktype, proto, flags])\n\
4903 -> list of (family, socktype, proto, canonname, sockaddr)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004904\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004905Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004906
4907/* Python interface to getnameinfo(sa, flags). */
4908
4909/*ARGSUSED*/
4910static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004911socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004912{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004913 PyObject *sa = (PyObject *)NULL;
4914 int flags;
4915 char *hostp;
4916 int port, flowinfo, scope_id;
4917 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
4918 struct addrinfo hints, *res = NULL;
4919 int error;
4920 PyObject *ret = (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004921
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004922 flags = flowinfo = scope_id = 0;
4923 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
4924 return NULL;
4925 if (!PyTuple_Check(sa)) {
4926 PyErr_SetString(PyExc_TypeError,
4927 "getnameinfo() argument 1 must be a tuple");
4928 return NULL;
4929 }
4930 if (!PyArg_ParseTuple(sa, "si|ii",
4931 &hostp, &port, &flowinfo, &scope_id))
4932 return NULL;
4933 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
4934 memset(&hints, 0, sizeof(hints));
4935 hints.ai_family = AF_UNSPEC;
4936 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Martin v. Löwis112c0f32010-08-25 07:38:15 +00004937 hints.ai_flags = AI_NUMERICHOST; /* don't do any name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004938 Py_BEGIN_ALLOW_THREADS
4939 ACQUIRE_GETADDRINFO_LOCK
4940 error = getaddrinfo(hostp, pbuf, &hints, &res);
4941 Py_END_ALLOW_THREADS
4942 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
4943 if (error) {
4944 set_gaierror(error);
4945 goto fail;
4946 }
4947 if (res->ai_next) {
4948 PyErr_SetString(socket_error,
4949 "sockaddr resolved to multiple addresses");
4950 goto fail;
4951 }
4952 switch (res->ai_family) {
4953 case AF_INET:
4954 {
4955 if (PyTuple_GET_SIZE(sa) != 2) {
4956 PyErr_SetString(socket_error,
4957 "IPv4 sockaddr must be 2 tuple");
4958 goto fail;
4959 }
4960 break;
4961 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004962#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004963 case AF_INET6:
4964 {
4965 struct sockaddr_in6 *sin6;
4966 sin6 = (struct sockaddr_in6 *)res->ai_addr;
4967 sin6->sin6_flowinfo = flowinfo;
4968 sin6->sin6_scope_id = scope_id;
4969 break;
4970 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004971#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004972 }
Antoine Pitrou19467d22010-08-17 19:33:30 +00004973 error = getnameinfo(res->ai_addr, (socklen_t) res->ai_addrlen,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004974 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
4975 if (error) {
4976 set_gaierror(error);
4977 goto fail;
4978 }
4979 ret = Py_BuildValue("ss", hbuf, pbuf);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004980
4981fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004982 if (res)
4983 freeaddrinfo(res);
4984 return ret;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004985}
4986
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004987PyDoc_STRVAR(getnameinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004988"getnameinfo(sockaddr, flags) --> (host, port)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004989\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004990Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004991
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004992
4993/* Python API to getting and setting the default timeout value. */
4994
4995static PyObject *
4996socket_getdefaulttimeout(PyObject *self)
4997{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004998 if (defaulttimeout < 0.0) {
4999 Py_INCREF(Py_None);
5000 return Py_None;
5001 }
5002 else
5003 return PyFloat_FromDouble(defaulttimeout);
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005004}
5005
5006PyDoc_STRVAR(getdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005007"getdefaulttimeout() -> timeout\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005008\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03005009Returns the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005010A value of None indicates that new socket objects have no timeout.\n\
5011When the socket module is first imported, the default is None.");
5012
5013static PyObject *
5014socket_setdefaulttimeout(PyObject *self, PyObject *arg)
5015{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005016 double timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005017
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005018 if (arg == Py_None)
5019 timeout = -1.0;
5020 else {
5021 timeout = PyFloat_AsDouble(arg);
5022 if (timeout < 0.0) {
5023 if (!PyErr_Occurred())
5024 PyErr_SetString(PyExc_ValueError,
5025 "Timeout value out of range");
5026 return NULL;
5027 }
5028 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005029
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005030 defaulttimeout = timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005031
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005032 Py_INCREF(Py_None);
5033 return Py_None;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005034}
5035
5036PyDoc_STRVAR(setdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005037"setdefaulttimeout(timeout)\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005038\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03005039Set the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005040A value of None indicates that new socket objects have no timeout.\n\
5041When the socket module is first imported, the default is None.");
5042
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005043#ifdef HAVE_IF_NAMEINDEX
5044/* Python API for getting interface indices and names */
5045
5046static PyObject *
5047socket_if_nameindex(PyObject *self, PyObject *arg)
5048{
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005049 PyObject *list;
Charles-François Natali60713592011-05-20 16:55:06 +02005050 int i;
5051 struct if_nameindex *ni;
Victor Stinner77af1722011-05-26 14:05:59 +02005052
Charles-François Natali60713592011-05-20 16:55:06 +02005053 ni = if_nameindex();
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005054 if (ni == NULL) {
Charles-François Natali60713592011-05-20 16:55:06 +02005055 PyErr_SetFromErrno(socket_error);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005056 return NULL;
5057 }
5058
5059 list = PyList_New(0);
5060 if (list == NULL) {
5061 if_freenameindex(ni);
5062 return NULL;
5063 }
5064
Charles-François Natali60713592011-05-20 16:55:06 +02005065 for (i = 0; ni[i].if_index != 0 && i < INT_MAX; i++) {
5066 PyObject *ni_tuple = Py_BuildValue("IO&",
5067 ni[i].if_index, PyUnicode_DecodeFSDefault, ni[i].if_name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005068
5069 if (ni_tuple == NULL || PyList_Append(list, ni_tuple) == -1) {
5070 Py_XDECREF(ni_tuple);
Charles-François Natali60713592011-05-20 16:55:06 +02005071 Py_DECREF(list);
5072 if_freenameindex(ni);
5073 return NULL;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005074 }
5075 Py_DECREF(ni_tuple);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005076 }
5077
5078 if_freenameindex(ni);
5079 return list;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005080}
5081
5082PyDoc_STRVAR(if_nameindex_doc,
5083"if_nameindex()\n\
5084\n\
5085Returns a list of network interface information (index, name) tuples.");
5086
Charles-François Natali60713592011-05-20 16:55:06 +02005087static PyObject *
5088socket_if_nametoindex(PyObject *self, PyObject *args)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005089{
Charles-François Natali60713592011-05-20 16:55:06 +02005090 PyObject *oname;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005091 unsigned long index;
5092
Charles-François Natali60713592011-05-20 16:55:06 +02005093 if (!PyArg_ParseTuple(args, "O&:if_nametoindex",
5094 PyUnicode_FSConverter, &oname))
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005095 return NULL;
5096
Charles-François Natali60713592011-05-20 16:55:06 +02005097 index = if_nametoindex(PyBytes_AS_STRING(oname));
5098 Py_DECREF(oname);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005099 if (index == 0) {
Charles-François Natali60713592011-05-20 16:55:06 +02005100 /* if_nametoindex() doesn't set errno */
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005101 PyErr_SetString(socket_error, "no interface with this name");
5102 return NULL;
5103 }
5104
5105 return PyLong_FromUnsignedLong(index);
5106}
5107
5108PyDoc_STRVAR(if_nametoindex_doc,
5109"if_nametoindex(if_name)\n\
5110\n\
5111Returns the interface index corresponding to the interface name if_name.");
5112
Charles-François Natali60713592011-05-20 16:55:06 +02005113static PyObject *
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005114socket_if_indextoname(PyObject *self, PyObject *arg)
5115{
Charles-François Natali60713592011-05-20 16:55:06 +02005116 unsigned long index;
5117 char name[IF_NAMESIZE + 1];
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005118
Charles-François Natali60713592011-05-20 16:55:06 +02005119 index = PyLong_AsUnsignedLong(arg);
5120 if (index == (unsigned long) -1)
5121 return NULL;
5122
5123 if (if_indextoname(index, name) == NULL) {
5124 PyErr_SetFromErrno(socket_error);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005125 return NULL;
5126 }
5127
Charles-François Natali60713592011-05-20 16:55:06 +02005128 return PyUnicode_DecodeFSDefault(name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005129}
5130
5131PyDoc_STRVAR(if_indextoname_doc,
5132"if_indextoname(if_index)\n\
5133\n\
5134Returns the interface name corresponding to the interface index if_index.");
5135
5136#endif /* HAVE_IF_NAMEINDEX */
5137
5138
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005139#ifdef CMSG_LEN
5140/* Python interface to CMSG_LEN(length). */
5141
5142static PyObject *
5143socket_CMSG_LEN(PyObject *self, PyObject *args)
5144{
5145 Py_ssize_t length;
5146 size_t result;
5147
5148 if (!PyArg_ParseTuple(args, "n:CMSG_LEN", &length))
5149 return NULL;
5150 if (length < 0 || !get_CMSG_LEN(length, &result)) {
5151 PyErr_Format(PyExc_OverflowError, "CMSG_LEN() argument out of range");
5152 return NULL;
5153 }
5154 return PyLong_FromSize_t(result);
5155}
5156
5157PyDoc_STRVAR(CMSG_LEN_doc,
5158"CMSG_LEN(length) -> control message length\n\
5159\n\
5160Return the total length, without trailing padding, of an ancillary\n\
5161data item with associated data of the given length. This value can\n\
5162often be used as the buffer size for recvmsg() to receive a single\n\
5163item of ancillary data, but RFC 3542 requires portable applications to\n\
5164use CMSG_SPACE() and thus include space for padding, even when the\n\
5165item will be the last in the buffer. Raises OverflowError if length\n\
5166is outside the permissible range of values.");
5167
5168
5169#ifdef CMSG_SPACE
5170/* Python interface to CMSG_SPACE(length). */
5171
5172static PyObject *
5173socket_CMSG_SPACE(PyObject *self, PyObject *args)
5174{
5175 Py_ssize_t length;
5176 size_t result;
5177
5178 if (!PyArg_ParseTuple(args, "n:CMSG_SPACE", &length))
5179 return NULL;
5180 if (length < 0 || !get_CMSG_SPACE(length, &result)) {
5181 PyErr_SetString(PyExc_OverflowError,
5182 "CMSG_SPACE() argument out of range");
5183 return NULL;
5184 }
5185 return PyLong_FromSize_t(result);
5186}
5187
5188PyDoc_STRVAR(CMSG_SPACE_doc,
5189"CMSG_SPACE(length) -> buffer size\n\
5190\n\
5191Return the buffer size needed for recvmsg() to receive an ancillary\n\
5192data item with associated data of the given length, along with any\n\
5193trailing padding. The buffer space needed to receive multiple items\n\
5194is the sum of the CMSG_SPACE() values for their associated data\n\
5195lengths. Raises OverflowError if length is outside the permissible\n\
5196range of values.");
5197#endif /* CMSG_SPACE */
5198#endif /* CMSG_LEN */
5199
5200
Guido van Rossum30a685f1991-06-27 15:51:29 +00005201/* List of functions exported by this module. */
5202
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005203static PyMethodDef socket_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005204 {"gethostbyname", socket_gethostbyname,
5205 METH_VARARGS, gethostbyname_doc},
5206 {"gethostbyname_ex", socket_gethostbyname_ex,
5207 METH_VARARGS, ghbn_ex_doc},
5208 {"gethostbyaddr", socket_gethostbyaddr,
5209 METH_VARARGS, gethostbyaddr_doc},
5210 {"gethostname", socket_gethostname,
5211 METH_NOARGS, gethostname_doc},
Antoine Pitrou061cfb52011-02-28 22:25:22 +00005212#ifdef HAVE_SETHOSTNAME
5213 {"sethostname", socket_sethostname,
5214 METH_VARARGS, sethostname_doc},
5215#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005216 {"getservbyname", socket_getservbyname,
5217 METH_VARARGS, getservbyname_doc},
5218 {"getservbyport", socket_getservbyport,
5219 METH_VARARGS, getservbyport_doc},
5220 {"getprotobyname", socket_getprotobyname,
5221 METH_VARARGS, getprotobyname_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005222#ifndef NO_DUP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005223 {"dup", socket_dup,
5224 METH_O, dup_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005225#endif
Dave Cole331708b2004-08-09 04:51:41 +00005226#ifdef HAVE_SOCKETPAIR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005227 {"socketpair", socket_socketpair,
5228 METH_VARARGS, socketpair_doc},
Dave Cole331708b2004-08-09 04:51:41 +00005229#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005230 {"ntohs", socket_ntohs,
5231 METH_VARARGS, ntohs_doc},
5232 {"ntohl", socket_ntohl,
5233 METH_O, ntohl_doc},
5234 {"htons", socket_htons,
5235 METH_VARARGS, htons_doc},
5236 {"htonl", socket_htonl,
5237 METH_O, htonl_doc},
5238 {"inet_aton", socket_inet_aton,
5239 METH_VARARGS, inet_aton_doc},
5240 {"inet_ntoa", socket_inet_ntoa,
5241 METH_VARARGS, inet_ntoa_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005242#ifdef HAVE_INET_PTON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005243 {"inet_pton", socket_inet_pton,
5244 METH_VARARGS, inet_pton_doc},
5245 {"inet_ntop", socket_inet_ntop,
5246 METH_VARARGS, inet_ntop_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005247#endif
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005248 {"getaddrinfo", (PyCFunction)socket_getaddrinfo,
5249 METH_VARARGS | METH_KEYWORDS, getaddrinfo_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005250 {"getnameinfo", socket_getnameinfo,
5251 METH_VARARGS, getnameinfo_doc},
5252 {"getdefaulttimeout", (PyCFunction)socket_getdefaulttimeout,
5253 METH_NOARGS, getdefaulttimeout_doc},
5254 {"setdefaulttimeout", socket_setdefaulttimeout,
5255 METH_O, setdefaulttimeout_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005256#ifdef HAVE_IF_NAMEINDEX
5257 {"if_nameindex", socket_if_nameindex,
5258 METH_NOARGS, if_nameindex_doc},
5259 {"if_nametoindex", socket_if_nametoindex,
Charles-François Natali60713592011-05-20 16:55:06 +02005260 METH_VARARGS, if_nametoindex_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005261 {"if_indextoname", socket_if_indextoname,
5262 METH_O, if_indextoname_doc},
5263#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005264#ifdef CMSG_LEN
5265 {"CMSG_LEN", socket_CMSG_LEN,
5266 METH_VARARGS, CMSG_LEN_doc},
5267#ifdef CMSG_SPACE
5268 {"CMSG_SPACE", socket_CMSG_SPACE,
5269 METH_VARARGS, CMSG_SPACE_doc},
5270#endif
5271#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005272 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005273};
5274
Guido van Rossum30a685f1991-06-27 15:51:29 +00005275
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005276#ifdef MS_WINDOWS
5277#define OS_INIT_DEFINED
5278
5279/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00005280
5281static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005282os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00005283{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005284 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00005285}
5286
5287static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005288os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00005289{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005290 WSADATA WSAData;
5291 int ret;
5292 ret = WSAStartup(0x0101, &WSAData);
5293 switch (ret) {
5294 case 0: /* No error */
5295 Py_AtExit(os_cleanup);
5296 return 1; /* Success */
5297 case WSASYSNOTREADY:
5298 PyErr_SetString(PyExc_ImportError,
5299 "WSAStartup failed: network not ready");
5300 break;
5301 case WSAVERNOTSUPPORTED:
5302 case WSAEINVAL:
5303 PyErr_SetString(
5304 PyExc_ImportError,
5305 "WSAStartup failed: requested version not supported");
5306 break;
5307 default:
5308 PyErr_Format(PyExc_ImportError, "WSAStartup failed: error code %d", ret);
5309 break;
5310 }
5311 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00005312}
5313
Guido van Rossum8d665e61996-06-26 18:22:49 +00005314#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00005315
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005316
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005317#ifdef PYOS_OS2
5318#define OS_INIT_DEFINED
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005319
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005320/* Additional initialization for OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005321
5322static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005323os_init(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005324{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005325#ifndef PYCC_GCC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005326 int rc = sock_init();
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005327
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005328 if (rc == 0) {
5329 return 1; /* Success */
5330 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005331
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005332 PyErr_Format(PyExc_ImportError, "OS/2 TCP/IP Error# %d", sock_errno());
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005333
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005334 return 0; /* Failure */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00005335#else
Ezio Melotti13925002011-03-16 11:05:33 +02005336 /* No need to initialize sockets with GCC/EMX */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005337 return 1; /* Success */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00005338#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005339}
5340
5341#endif /* PYOS_OS2 */
5342
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005343
5344#ifndef OS_INIT_DEFINED
5345static int
5346os_init(void)
5347{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005348 return 1; /* Success */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005349}
5350#endif
5351
5352
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005353/* C API table - always add new things to the end for binary
5354 compatibility. */
5355static
5356PySocketModule_APIObject PySocketModuleAPI =
5357{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005358 &sock_type,
Antoine Pitrouc4df7842010-12-03 19:59:41 +00005359 NULL,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005360 NULL
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005361};
5362
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005363
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005364/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005365
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005366 This module is actually called "_socket", and there's a wrapper
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005367 "socket.py" which implements some additional functionality.
5368 The import of "_socket" may fail with an ImportError exception if
5369 os-specific initialization fails. On Windows, this does WINSOCK
Ezio Melotti13925002011-03-16 11:05:33 +02005370 initialization. When WINSOCK is initialized successfully, a call to
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005371 WSACleanup() is scheduled to be made at exit time.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005372*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005373
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005374PyDoc_STRVAR(socket_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005375"Implementation module for socket operations.\n\
5376\n\
5377See the socket module for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005378
Martin v. Löwis1a214512008-06-11 05:26:20 +00005379static struct PyModuleDef socketmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005380 PyModuleDef_HEAD_INIT,
5381 PySocket_MODULE_NAME,
5382 socket_doc,
5383 -1,
5384 socket_methods,
5385 NULL,
5386 NULL,
5387 NULL,
5388 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00005389};
5390
Mark Hammondfe51c6d2002-08-02 02:27:13 +00005391PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00005392PyInit__socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005393{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005394 PyObject *m, *has_ipv6;
Fred Drake4baedc12002-04-01 14:53:37 +00005395
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005396 if (!os_init())
5397 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005398
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005399 Py_TYPE(&sock_type) = &PyType_Type;
5400 m = PyModule_Create(&socketmodule);
5401 if (m == NULL)
5402 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005403
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005404 socket_error = PyErr_NewException("socket.error",
5405 PyExc_IOError, NULL);
5406 if (socket_error == NULL)
5407 return NULL;
5408 PySocketModuleAPI.error = socket_error;
5409 Py_INCREF(socket_error);
5410 PyModule_AddObject(m, "error", socket_error);
5411 socket_herror = PyErr_NewException("socket.herror",
5412 socket_error, NULL);
5413 if (socket_herror == NULL)
5414 return NULL;
5415 Py_INCREF(socket_herror);
5416 PyModule_AddObject(m, "herror", socket_herror);
5417 socket_gaierror = PyErr_NewException("socket.gaierror", socket_error,
5418 NULL);
5419 if (socket_gaierror == NULL)
5420 return NULL;
5421 Py_INCREF(socket_gaierror);
5422 PyModule_AddObject(m, "gaierror", socket_gaierror);
5423 socket_timeout = PyErr_NewException("socket.timeout",
5424 socket_error, NULL);
5425 if (socket_timeout == NULL)
5426 return NULL;
Antoine Pitrouc4df7842010-12-03 19:59:41 +00005427 PySocketModuleAPI.timeout_error = socket_timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005428 Py_INCREF(socket_timeout);
5429 PyModule_AddObject(m, "timeout", socket_timeout);
5430 Py_INCREF((PyObject *)&sock_type);
5431 if (PyModule_AddObject(m, "SocketType",
5432 (PyObject *)&sock_type) != 0)
5433 return NULL;
5434 Py_INCREF((PyObject *)&sock_type);
5435 if (PyModule_AddObject(m, "socket",
5436 (PyObject *)&sock_type) != 0)
5437 return NULL;
Guido van Rossum09be4091999-08-09 14:40:40 +00005438
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005439#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005440 has_ipv6 = Py_True;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005441#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005442 has_ipv6 = Py_False;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005443#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005444 Py_INCREF(has_ipv6);
5445 PyModule_AddObject(m, "has_ipv6", has_ipv6);
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005446
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005447 /* Export C API */
5448 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
5449 PyCapsule_New(&PySocketModuleAPI, PySocket_CAPSULE_NAME, NULL)
5450 ) != 0)
5451 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005452
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005453 /* Address families (we only support AF_INET and AF_UNIX) */
Guido van Rossum09be4091999-08-09 14:40:40 +00005454#ifdef AF_UNSPEC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005455 PyModule_AddIntConstant(m, "AF_UNSPEC", AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00005456#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005457 PyModule_AddIntConstant(m, "AF_INET", AF_INET);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005458#ifdef AF_INET6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005459 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005460#endif /* AF_INET6 */
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00005461#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005462 PyModule_AddIntConstant(m, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00005463#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00005464#ifdef AF_AX25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005465 /* Amateur Radio AX.25 */
5466 PyModule_AddIntConstant(m, "AF_AX25", AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00005467#endif
5468#ifdef AF_IPX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005469 PyModule_AddIntConstant(m, "AF_IPX", AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00005470#endif
5471#ifdef AF_APPLETALK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005472 /* Appletalk DDP */
5473 PyModule_AddIntConstant(m, "AF_APPLETALK", AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00005474#endif
5475#ifdef AF_NETROM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005476 /* Amateur radio NetROM */
5477 PyModule_AddIntConstant(m, "AF_NETROM", AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00005478#endif
5479#ifdef AF_BRIDGE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005480 /* Multiprotocol bridge */
5481 PyModule_AddIntConstant(m, "AF_BRIDGE", AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00005482#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005483#ifdef AF_ATMPVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005484 /* ATM PVCs */
5485 PyModule_AddIntConstant(m, "AF_ATMPVC", AF_ATMPVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005486#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00005487#ifdef AF_AAL5
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005488 /* Reserved for Werner's ATM */
5489 PyModule_AddIntConstant(m, "AF_AAL5", AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00005490#endif
5491#ifdef AF_X25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005492 /* Reserved for X.25 project */
5493 PyModule_AddIntConstant(m, "AF_X25", AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00005494#endif
5495#ifdef AF_INET6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005496 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00005497#endif
5498#ifdef AF_ROSE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005499 /* Amateur Radio X.25 PLP */
5500 PyModule_AddIntConstant(m, "AF_ROSE", AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00005501#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005502#ifdef AF_DECnet
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005503 /* Reserved for DECnet project */
5504 PyModule_AddIntConstant(m, "AF_DECnet", AF_DECnet);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005505#endif
5506#ifdef AF_NETBEUI
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005507 /* Reserved for 802.2LLC project */
5508 PyModule_AddIntConstant(m, "AF_NETBEUI", AF_NETBEUI);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005509#endif
5510#ifdef AF_SECURITY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005511 /* Security callback pseudo AF */
5512 PyModule_AddIntConstant(m, "AF_SECURITY", AF_SECURITY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005513#endif
5514#ifdef AF_KEY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005515 /* PF_KEY key management API */
5516 PyModule_AddIntConstant(m, "AF_KEY", AF_KEY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005517#endif
5518#ifdef AF_NETLINK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005519 /* */
5520 PyModule_AddIntConstant(m, "AF_NETLINK", AF_NETLINK);
5521 PyModule_AddIntConstant(m, "NETLINK_ROUTE", NETLINK_ROUTE);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005522#ifdef NETLINK_SKIP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005523 PyModule_AddIntConstant(m, "NETLINK_SKIP", NETLINK_SKIP);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005524#endif
5525#ifdef NETLINK_W1
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005526 PyModule_AddIntConstant(m, "NETLINK_W1", NETLINK_W1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005527#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005528 PyModule_AddIntConstant(m, "NETLINK_USERSOCK", NETLINK_USERSOCK);
5529 PyModule_AddIntConstant(m, "NETLINK_FIREWALL", NETLINK_FIREWALL);
Guido van Rossum668a94a2006-02-21 01:07:27 +00005530#ifdef NETLINK_TCPDIAG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005531 PyModule_AddIntConstant(m, "NETLINK_TCPDIAG", NETLINK_TCPDIAG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00005532#endif
5533#ifdef NETLINK_NFLOG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005534 PyModule_AddIntConstant(m, "NETLINK_NFLOG", NETLINK_NFLOG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00005535#endif
Neal Norwitz65851662006-01-16 04:31:40 +00005536#ifdef NETLINK_XFRM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005537 PyModule_AddIntConstant(m, "NETLINK_XFRM", NETLINK_XFRM);
Neal Norwitz65851662006-01-16 04:31:40 +00005538#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005539#ifdef NETLINK_ARPD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005540 PyModule_AddIntConstant(m, "NETLINK_ARPD", NETLINK_ARPD);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005541#endif
5542#ifdef NETLINK_ROUTE6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005543 PyModule_AddIntConstant(m, "NETLINK_ROUTE6", NETLINK_ROUTE6);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005544#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005545 PyModule_AddIntConstant(m, "NETLINK_IP6_FW", NETLINK_IP6_FW);
Thomas Wouterscf297e42007-02-23 15:07:44 +00005546#ifdef NETLINK_DNRTMSG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005547 PyModule_AddIntConstant(m, "NETLINK_DNRTMSG", NETLINK_DNRTMSG);
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005548#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005549#ifdef NETLINK_TAPBASE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005550 PyModule_AddIntConstant(m, "NETLINK_TAPBASE", NETLINK_TAPBASE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005551#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005552#endif /* AF_NETLINK */
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005553#ifdef AF_ROUTE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005554 /* Alias to emulate 4.4BSD */
5555 PyModule_AddIntConstant(m, "AF_ROUTE", AF_ROUTE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005556#endif
5557#ifdef AF_ASH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005558 /* Ash */
5559 PyModule_AddIntConstant(m, "AF_ASH", AF_ASH);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005560#endif
5561#ifdef AF_ECONET
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005562 /* Acorn Econet */
5563 PyModule_AddIntConstant(m, "AF_ECONET", AF_ECONET);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005564#endif
5565#ifdef AF_ATMSVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005566 /* ATM SVCs */
5567 PyModule_AddIntConstant(m, "AF_ATMSVC", AF_ATMSVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005568#endif
5569#ifdef AF_SNA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005570 /* Linux SNA Project (nutters!) */
5571 PyModule_AddIntConstant(m, "AF_SNA", AF_SNA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005572#endif
5573#ifdef AF_IRDA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005574 /* IRDA sockets */
5575 PyModule_AddIntConstant(m, "AF_IRDA", AF_IRDA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005576#endif
5577#ifdef AF_PPPOX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005578 /* PPPoX sockets */
5579 PyModule_AddIntConstant(m, "AF_PPPOX", AF_PPPOX);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005580#endif
5581#ifdef AF_WANPIPE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005582 /* Wanpipe API Sockets */
5583 PyModule_AddIntConstant(m, "AF_WANPIPE", AF_WANPIPE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005584#endif
5585#ifdef AF_LLC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005586 /* Linux LLC */
5587 PyModule_AddIntConstant(m, "AF_LLC", AF_LLC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005588#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00005589
Hye-Shik Chang81268602004-02-02 06:05:24 +00005590#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005591 PyModule_AddIntConstant(m, "AF_BLUETOOTH", AF_BLUETOOTH);
5592 PyModule_AddIntConstant(m, "BTPROTO_L2CAP", BTPROTO_L2CAP);
5593 PyModule_AddIntConstant(m, "BTPROTO_HCI", BTPROTO_HCI);
5594 PyModule_AddIntConstant(m, "SOL_HCI", SOL_HCI);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00005595#if !defined(__NetBSD__) && !defined(__DragonFly__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005596 PyModule_AddIntConstant(m, "HCI_FILTER", HCI_FILTER);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00005597#endif
Hye-Shik Chang81268602004-02-02 06:05:24 +00005598#if !defined(__FreeBSD__)
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00005599#if !defined(__NetBSD__) && !defined(__DragonFly__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005600 PyModule_AddIntConstant(m, "HCI_TIME_STAMP", HCI_TIME_STAMP);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00005601#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005602 PyModule_AddIntConstant(m, "HCI_DATA_DIR", HCI_DATA_DIR);
5603 PyModule_AddIntConstant(m, "BTPROTO_SCO", BTPROTO_SCO);
Hye-Shik Chang81268602004-02-02 06:05:24 +00005604#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005605 PyModule_AddIntConstant(m, "BTPROTO_RFCOMM", BTPROTO_RFCOMM);
5606 PyModule_AddStringConstant(m, "BDADDR_ANY", "00:00:00:00:00:00");
5607 PyModule_AddStringConstant(m, "BDADDR_LOCAL", "00:00:00:FF:FF:FF");
Martin v. Löwis12af0482004-01-31 12:34:17 +00005608#endif
5609
Charles-François Natali47413c12011-10-06 19:47:44 +02005610#ifdef AF_CAN
5611 /* Controller Area Network */
5612 PyModule_AddIntConstant(m, "AF_CAN", AF_CAN);
5613#endif
5614#ifdef PF_CAN
5615 /* Controller Area Network */
5616 PyModule_AddIntConstant(m, "PF_CAN", PF_CAN);
5617#endif
5618
Antoine Pitroub156a462010-10-27 20:13:57 +00005619#ifdef AF_PACKET
5620 PyModule_AddIntMacro(m, AF_PACKET);
5621#endif
5622#ifdef PF_PACKET
5623 PyModule_AddIntMacro(m, PF_PACKET);
5624#endif
5625#ifdef PACKET_HOST
5626 PyModule_AddIntMacro(m, PACKET_HOST);
5627#endif
5628#ifdef PACKET_BROADCAST
5629 PyModule_AddIntMacro(m, PACKET_BROADCAST);
5630#endif
5631#ifdef PACKET_MULTICAST
5632 PyModule_AddIntMacro(m, PACKET_MULTICAST);
5633#endif
5634#ifdef PACKET_OTHERHOST
5635 PyModule_AddIntMacro(m, PACKET_OTHERHOST);
5636#endif
5637#ifdef PACKET_OUTGOING
5638 PyModule_AddIntMacro(m, PACKET_OUTGOING);
5639#endif
5640#ifdef PACKET_LOOPBACK
5641 PyModule_AddIntMacro(m, PACKET_LOOPBACK);
5642#endif
5643#ifdef PACKET_FASTROUTE
5644 PyModule_AddIntMacro(m, PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00005645#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00005646
Christian Heimes043d6f62008-01-07 17:19:16 +00005647#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005648 PyModule_AddIntConstant(m, "AF_TIPC", AF_TIPC);
Christian Heimes043d6f62008-01-07 17:19:16 +00005649
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005650 /* for addresses */
5651 PyModule_AddIntConstant(m, "TIPC_ADDR_NAMESEQ", TIPC_ADDR_NAMESEQ);
5652 PyModule_AddIntConstant(m, "TIPC_ADDR_NAME", TIPC_ADDR_NAME);
5653 PyModule_AddIntConstant(m, "TIPC_ADDR_ID", TIPC_ADDR_ID);
Christian Heimes043d6f62008-01-07 17:19:16 +00005654
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005655 PyModule_AddIntConstant(m, "TIPC_ZONE_SCOPE", TIPC_ZONE_SCOPE);
5656 PyModule_AddIntConstant(m, "TIPC_CLUSTER_SCOPE", TIPC_CLUSTER_SCOPE);
5657 PyModule_AddIntConstant(m, "TIPC_NODE_SCOPE", TIPC_NODE_SCOPE);
Christian Heimes043d6f62008-01-07 17:19:16 +00005658
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005659 /* for setsockopt() */
5660 PyModule_AddIntConstant(m, "SOL_TIPC", SOL_TIPC);
5661 PyModule_AddIntConstant(m, "TIPC_IMPORTANCE", TIPC_IMPORTANCE);
5662 PyModule_AddIntConstant(m, "TIPC_SRC_DROPPABLE", TIPC_SRC_DROPPABLE);
5663 PyModule_AddIntConstant(m, "TIPC_DEST_DROPPABLE",
5664 TIPC_DEST_DROPPABLE);
5665 PyModule_AddIntConstant(m, "TIPC_CONN_TIMEOUT", TIPC_CONN_TIMEOUT);
Christian Heimes043d6f62008-01-07 17:19:16 +00005666
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005667 PyModule_AddIntConstant(m, "TIPC_LOW_IMPORTANCE",
5668 TIPC_LOW_IMPORTANCE);
5669 PyModule_AddIntConstant(m, "TIPC_MEDIUM_IMPORTANCE",
5670 TIPC_MEDIUM_IMPORTANCE);
5671 PyModule_AddIntConstant(m, "TIPC_HIGH_IMPORTANCE",
5672 TIPC_HIGH_IMPORTANCE);
5673 PyModule_AddIntConstant(m, "TIPC_CRITICAL_IMPORTANCE",
5674 TIPC_CRITICAL_IMPORTANCE);
Christian Heimes043d6f62008-01-07 17:19:16 +00005675
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005676 /* for subscriptions */
5677 PyModule_AddIntConstant(m, "TIPC_SUB_PORTS", TIPC_SUB_PORTS);
5678 PyModule_AddIntConstant(m, "TIPC_SUB_SERVICE", TIPC_SUB_SERVICE);
Christian Heimes25bb7832008-01-11 16:17:00 +00005679#ifdef TIPC_SUB_CANCEL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005680 /* doesn't seem to be available everywhere */
5681 PyModule_AddIntConstant(m, "TIPC_SUB_CANCEL", TIPC_SUB_CANCEL);
Christian Heimes25bb7832008-01-11 16:17:00 +00005682#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005683 PyModule_AddIntConstant(m, "TIPC_WAIT_FOREVER", TIPC_WAIT_FOREVER);
5684 PyModule_AddIntConstant(m, "TIPC_PUBLISHED", TIPC_PUBLISHED);
5685 PyModule_AddIntConstant(m, "TIPC_WITHDRAWN", TIPC_WITHDRAWN);
5686 PyModule_AddIntConstant(m, "TIPC_SUBSCR_TIMEOUT", TIPC_SUBSCR_TIMEOUT);
5687 PyModule_AddIntConstant(m, "TIPC_CFG_SRV", TIPC_CFG_SRV);
5688 PyModule_AddIntConstant(m, "TIPC_TOP_SRV", TIPC_TOP_SRV);
Christian Heimes043d6f62008-01-07 17:19:16 +00005689#endif
5690
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005691 /* Socket types */
5692 PyModule_AddIntConstant(m, "SOCK_STREAM", SOCK_STREAM);
5693 PyModule_AddIntConstant(m, "SOCK_DGRAM", SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00005694/* We have incomplete socket support. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005695 PyModule_AddIntConstant(m, "SOCK_RAW", SOCK_RAW);
5696 PyModule_AddIntConstant(m, "SOCK_SEQPACKET", SOCK_SEQPACKET);
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00005697#if defined(SOCK_RDM)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005698 PyModule_AddIntConstant(m, "SOCK_RDM", SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00005699#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +00005700#ifdef SOCK_CLOEXEC
5701 PyModule_AddIntConstant(m, "SOCK_CLOEXEC", SOCK_CLOEXEC);
5702#endif
5703#ifdef SOCK_NONBLOCK
5704 PyModule_AddIntConstant(m, "SOCK_NONBLOCK", SOCK_NONBLOCK);
5705#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005706
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005707#ifdef SO_DEBUG
5708 PyModule_AddIntConstant(m, "SO_DEBUG", SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005709#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005710#ifdef SO_ACCEPTCONN
5711 PyModule_AddIntConstant(m, "SO_ACCEPTCONN", SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005712#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005713#ifdef SO_REUSEADDR
5714 PyModule_AddIntConstant(m, "SO_REUSEADDR", SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005715#endif
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00005716#ifdef SO_EXCLUSIVEADDRUSE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005717 PyModule_AddIntConstant(m, "SO_EXCLUSIVEADDRUSE", SO_EXCLUSIVEADDRUSE);
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00005718#endif
5719
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005720#ifdef SO_KEEPALIVE
5721 PyModule_AddIntConstant(m, "SO_KEEPALIVE", SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005722#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005723#ifdef SO_DONTROUTE
5724 PyModule_AddIntConstant(m, "SO_DONTROUTE", SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005725#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005726#ifdef SO_BROADCAST
5727 PyModule_AddIntConstant(m, "SO_BROADCAST", SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005728#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005729#ifdef SO_USELOOPBACK
5730 PyModule_AddIntConstant(m, "SO_USELOOPBACK", SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005731#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005732#ifdef SO_LINGER
5733 PyModule_AddIntConstant(m, "SO_LINGER", SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005734#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005735#ifdef SO_OOBINLINE
5736 PyModule_AddIntConstant(m, "SO_OOBINLINE", SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005737#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005738#ifdef SO_REUSEPORT
5739 PyModule_AddIntConstant(m, "SO_REUSEPORT", SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005740#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005741#ifdef SO_SNDBUF
5742 PyModule_AddIntConstant(m, "SO_SNDBUF", SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005743#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005744#ifdef SO_RCVBUF
5745 PyModule_AddIntConstant(m, "SO_RCVBUF", SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005746#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005747#ifdef SO_SNDLOWAT
5748 PyModule_AddIntConstant(m, "SO_SNDLOWAT", SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005749#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005750#ifdef SO_RCVLOWAT
5751 PyModule_AddIntConstant(m, "SO_RCVLOWAT", SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005752#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005753#ifdef SO_SNDTIMEO
5754 PyModule_AddIntConstant(m, "SO_SNDTIMEO", SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005755#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005756#ifdef SO_RCVTIMEO
5757 PyModule_AddIntConstant(m, "SO_RCVTIMEO", SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005758#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005759#ifdef SO_ERROR
5760 PyModule_AddIntConstant(m, "SO_ERROR", SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005761#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005762#ifdef SO_TYPE
5763 PyModule_AddIntConstant(m, "SO_TYPE", SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005764#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005765#ifdef SO_SETFIB
5766 PyModule_AddIntConstant(m, "SO_SETFIB", SO_SETFIB);
Larry Hastingsf0f37952010-04-02 11:47:10 +00005767#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005768#ifdef SO_PASSCRED
5769 PyModule_AddIntConstant(m, "SO_PASSCRED", SO_PASSCRED);
5770#endif
5771#ifdef SO_PEERCRED
5772 PyModule_AddIntConstant(m, "SO_PEERCRED", SO_PEERCRED);
5773#endif
5774#ifdef LOCAL_PEERCRED
5775 PyModule_AddIntConstant(m, "LOCAL_PEERCRED", LOCAL_PEERCRED);
5776#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005777
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005778 /* Maximum number of connections for "listen" */
5779#ifdef SOMAXCONN
5780 PyModule_AddIntConstant(m, "SOMAXCONN", SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005781#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005782 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005783#endif
5784
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005785 /* Ancilliary message types */
5786#ifdef SCM_RIGHTS
5787 PyModule_AddIntConstant(m, "SCM_RIGHTS", SCM_RIGHTS);
5788#endif
5789#ifdef SCM_CREDENTIALS
5790 PyModule_AddIntConstant(m, "SCM_CREDENTIALS", SCM_CREDENTIALS);
5791#endif
5792#ifdef SCM_CREDS
5793 PyModule_AddIntConstant(m, "SCM_CREDS", SCM_CREDS);
5794#endif
5795
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005796 /* Flags for send, recv */
5797#ifdef MSG_OOB
5798 PyModule_AddIntConstant(m, "MSG_OOB", MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005799#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005800#ifdef MSG_PEEK
5801 PyModule_AddIntConstant(m, "MSG_PEEK", MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005802#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005803#ifdef MSG_DONTROUTE
5804 PyModule_AddIntConstant(m, "MSG_DONTROUTE", MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005805#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005806#ifdef MSG_DONTWAIT
5807 PyModule_AddIntConstant(m, "MSG_DONTWAIT", MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00005808#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005809#ifdef MSG_EOR
5810 PyModule_AddIntConstant(m, "MSG_EOR", MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005811#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005812#ifdef MSG_TRUNC
5813 PyModule_AddIntConstant(m, "MSG_TRUNC", MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005814#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005815#ifdef MSG_CTRUNC
5816 PyModule_AddIntConstant(m, "MSG_CTRUNC", MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005817#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005818#ifdef MSG_WAITALL
5819 PyModule_AddIntConstant(m, "MSG_WAITALL", MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005820#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005821#ifdef MSG_BTAG
5822 PyModule_AddIntConstant(m, "MSG_BTAG", MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005823#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005824#ifdef MSG_ETAG
5825 PyModule_AddIntConstant(m, "MSG_ETAG", MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005826#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005827#ifdef MSG_NOSIGNAL
5828 PyModule_AddIntConstant(m, "MSG_NOSIGNAL", MSG_NOSIGNAL);
5829#endif
5830#ifdef MSG_NOTIFICATION
5831 PyModule_AddIntConstant(m, "MSG_NOTIFICATION", MSG_NOTIFICATION);
5832#endif
5833#ifdef MSG_CMSG_CLOEXEC
5834 PyModule_AddIntConstant(m, "MSG_CMSG_CLOEXEC", MSG_CMSG_CLOEXEC);
5835#endif
5836#ifdef MSG_ERRQUEUE
5837 PyModule_AddIntConstant(m, "MSG_ERRQUEUE", MSG_ERRQUEUE);
5838#endif
5839#ifdef MSG_CONFIRM
5840 PyModule_AddIntConstant(m, "MSG_CONFIRM", MSG_CONFIRM);
5841#endif
5842#ifdef MSG_MORE
5843 PyModule_AddIntConstant(m, "MSG_MORE", MSG_MORE);
5844#endif
5845#ifdef MSG_EOF
5846 PyModule_AddIntConstant(m, "MSG_EOF", MSG_EOF);
5847#endif
5848#ifdef MSG_BCAST
5849 PyModule_AddIntConstant(m, "MSG_BCAST", MSG_BCAST);
5850#endif
5851#ifdef MSG_MCAST
5852 PyModule_AddIntConstant(m, "MSG_MCAST", MSG_MCAST);
5853#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005854
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005855 /* Protocol level and numbers, usable for [gs]etsockopt */
5856#ifdef SOL_SOCKET
5857 PyModule_AddIntConstant(m, "SOL_SOCKET", SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005858#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005859#ifdef SOL_IP
5860 PyModule_AddIntConstant(m, "SOL_IP", SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00005861#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005862 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00005863#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005864#ifdef SOL_IPX
5865 PyModule_AddIntConstant(m, "SOL_IPX", SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00005866#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005867#ifdef SOL_AX25
5868 PyModule_AddIntConstant(m, "SOL_AX25", SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00005869#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005870#ifdef SOL_ATALK
5871 PyModule_AddIntConstant(m, "SOL_ATALK", SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00005872#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005873#ifdef SOL_NETROM
5874 PyModule_AddIntConstant(m, "SOL_NETROM", SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00005875#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005876#ifdef SOL_ROSE
5877 PyModule_AddIntConstant(m, "SOL_ROSE", SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00005878#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005879#ifdef SOL_TCP
5880 PyModule_AddIntConstant(m, "SOL_TCP", SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00005881#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005882 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00005883#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005884#ifdef SOL_UDP
5885 PyModule_AddIntConstant(m, "SOL_UDP", SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00005886#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005887 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00005888#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02005889#ifdef SOL_CAN_BASE
5890 PyModule_AddIntConstant(m, "SOL_CAN_BASE", SOL_CAN_BASE);
5891#endif
5892#ifdef SOL_CAN_RAW
5893 PyModule_AddIntConstant(m, "SOL_CAN_RAW", SOL_CAN_RAW);
5894 PyModule_AddIntConstant(m, "CAN_RAW", CAN_RAW);
5895#endif
5896#ifdef HAVE_LINUX_CAN_H
5897 PyModule_AddIntConstant(m, "CAN_EFF_FLAG", CAN_EFF_FLAG);
5898 PyModule_AddIntConstant(m, "CAN_RTR_FLAG", CAN_RTR_FLAG);
5899 PyModule_AddIntConstant(m, "CAN_ERR_FLAG", CAN_ERR_FLAG);
5900
5901 PyModule_AddIntConstant(m, "CAN_SFF_MASK", CAN_SFF_MASK);
5902 PyModule_AddIntConstant(m, "CAN_EFF_MASK", CAN_EFF_MASK);
5903 PyModule_AddIntConstant(m, "CAN_ERR_MASK", CAN_ERR_MASK);
5904#endif
5905#ifdef HAVE_LINUX_CAN_RAW_H
5906 PyModule_AddIntConstant(m, "CAN_RAW_FILTER", CAN_RAW_FILTER);
5907 PyModule_AddIntConstant(m, "CAN_RAW_ERR_FILTER", CAN_RAW_ERR_FILTER);
5908 PyModule_AddIntConstant(m, "CAN_RAW_LOOPBACK", CAN_RAW_LOOPBACK);
5909 PyModule_AddIntConstant(m, "CAN_RAW_RECV_OWN_MSGS", CAN_RAW_RECV_OWN_MSGS);
5910#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005911#ifdef IPPROTO_IP
5912 PyModule_AddIntConstant(m, "IPPROTO_IP", IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00005913#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005914 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005915#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005916#ifdef IPPROTO_HOPOPTS
5917 PyModule_AddIntConstant(m, "IPPROTO_HOPOPTS", IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005918#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005919#ifdef IPPROTO_ICMP
5920 PyModule_AddIntConstant(m, "IPPROTO_ICMP", IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00005921#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005922 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005923#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005924#ifdef IPPROTO_IGMP
5925 PyModule_AddIntConstant(m, "IPPROTO_IGMP", IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005926#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005927#ifdef IPPROTO_GGP
5928 PyModule_AddIntConstant(m, "IPPROTO_GGP", IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005929#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005930#ifdef IPPROTO_IPV4
5931 PyModule_AddIntConstant(m, "IPPROTO_IPV4", IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005932#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005933#ifdef IPPROTO_IPV6
5934 PyModule_AddIntConstant(m, "IPPROTO_IPV6", IPPROTO_IPV6);
Martin v. Löwisa0f17342003-10-03 13:56:20 +00005935#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005936#ifdef IPPROTO_IPIP
5937 PyModule_AddIntConstant(m, "IPPROTO_IPIP", IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005938#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005939#ifdef IPPROTO_TCP
5940 PyModule_AddIntConstant(m, "IPPROTO_TCP", IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00005941#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005942 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005943#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005944#ifdef IPPROTO_EGP
5945 PyModule_AddIntConstant(m, "IPPROTO_EGP", IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005946#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005947#ifdef IPPROTO_PUP
5948 PyModule_AddIntConstant(m, "IPPROTO_PUP", IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005949#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005950#ifdef IPPROTO_UDP
5951 PyModule_AddIntConstant(m, "IPPROTO_UDP", IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00005952#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005953 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005954#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005955#ifdef IPPROTO_IDP
5956 PyModule_AddIntConstant(m, "IPPROTO_IDP", IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005957#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005958#ifdef IPPROTO_HELLO
5959 PyModule_AddIntConstant(m, "IPPROTO_HELLO", IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005960#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005961#ifdef IPPROTO_ND
5962 PyModule_AddIntConstant(m, "IPPROTO_ND", IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005963#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005964#ifdef IPPROTO_TP
5965 PyModule_AddIntConstant(m, "IPPROTO_TP", IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005966#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005967#ifdef IPPROTO_IPV6
5968 PyModule_AddIntConstant(m, "IPPROTO_IPV6", IPPROTO_IPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005969#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005970#ifdef IPPROTO_ROUTING
5971 PyModule_AddIntConstant(m, "IPPROTO_ROUTING", IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005972#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005973#ifdef IPPROTO_FRAGMENT
5974 PyModule_AddIntConstant(m, "IPPROTO_FRAGMENT", IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005975#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005976#ifdef IPPROTO_RSVP
5977 PyModule_AddIntConstant(m, "IPPROTO_RSVP", IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005978#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005979#ifdef IPPROTO_GRE
5980 PyModule_AddIntConstant(m, "IPPROTO_GRE", IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005981#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005982#ifdef IPPROTO_ESP
5983 PyModule_AddIntConstant(m, "IPPROTO_ESP", IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005984#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005985#ifdef IPPROTO_AH
5986 PyModule_AddIntConstant(m, "IPPROTO_AH", IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005987#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005988#ifdef IPPROTO_MOBILE
5989 PyModule_AddIntConstant(m, "IPPROTO_MOBILE", IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005990#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005991#ifdef IPPROTO_ICMPV6
5992 PyModule_AddIntConstant(m, "IPPROTO_ICMPV6", IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005993#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005994#ifdef IPPROTO_NONE
5995 PyModule_AddIntConstant(m, "IPPROTO_NONE", IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005996#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005997#ifdef IPPROTO_DSTOPTS
5998 PyModule_AddIntConstant(m, "IPPROTO_DSTOPTS", IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005999#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006000#ifdef IPPROTO_XTP
6001 PyModule_AddIntConstant(m, "IPPROTO_XTP", IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006002#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006003#ifdef IPPROTO_EON
6004 PyModule_AddIntConstant(m, "IPPROTO_EON", IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006005#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006006#ifdef IPPROTO_PIM
6007 PyModule_AddIntConstant(m, "IPPROTO_PIM", IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006008#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006009#ifdef IPPROTO_IPCOMP
6010 PyModule_AddIntConstant(m, "IPPROTO_IPCOMP", IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006011#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006012#ifdef IPPROTO_VRRP
6013 PyModule_AddIntConstant(m, "IPPROTO_VRRP", IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006014#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006015#ifdef IPPROTO_SCTP
6016 PyModule_AddIntConstant(m, "IPPROTO_SCTP", IPPROTO_SCTP);
6017#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006018#ifdef IPPROTO_BIP
6019 PyModule_AddIntConstant(m, "IPPROTO_BIP", IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006020#endif
6021/**/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006022#ifdef IPPROTO_RAW
6023 PyModule_AddIntConstant(m, "IPPROTO_RAW", IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00006024#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006025 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006026#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006027#ifdef IPPROTO_MAX
6028 PyModule_AddIntConstant(m, "IPPROTO_MAX", IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006029#endif
6030
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006031 /* Some port configuration */
6032#ifdef IPPORT_RESERVED
6033 PyModule_AddIntConstant(m, "IPPORT_RESERVED", IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006034#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006035 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006036#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006037#ifdef IPPORT_USERRESERVED
6038 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006039#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006040 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006041#endif
6042
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006043 /* Some reserved IP v.4 addresses */
6044#ifdef INADDR_ANY
6045 PyModule_AddIntConstant(m, "INADDR_ANY", INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006046#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006047 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006048#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006049#ifdef INADDR_BROADCAST
6050 PyModule_AddIntConstant(m, "INADDR_BROADCAST", INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006051#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006052 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006053#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006054#ifdef INADDR_LOOPBACK
6055 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006056#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006057 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006058#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006059#ifdef INADDR_UNSPEC_GROUP
6060 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006061#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006062 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006063#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006064#ifdef INADDR_ALLHOSTS_GROUP
6065 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
6066 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006067#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006068 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006069#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006070#ifdef INADDR_MAX_LOCAL_GROUP
6071 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP",
6072 INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006073#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006074 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006075#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006076#ifdef INADDR_NONE
6077 PyModule_AddIntConstant(m, "INADDR_NONE", INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006078#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006079 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006080#endif
6081
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006082 /* IPv4 [gs]etsockopt options */
6083#ifdef IP_OPTIONS
6084 PyModule_AddIntConstant(m, "IP_OPTIONS", IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006085#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006086#ifdef IP_HDRINCL
6087 PyModule_AddIntConstant(m, "IP_HDRINCL", IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006088#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006089#ifdef IP_TOS
6090 PyModule_AddIntConstant(m, "IP_TOS", IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006091#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006092#ifdef IP_TTL
6093 PyModule_AddIntConstant(m, "IP_TTL", IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006094#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006095#ifdef IP_RECVOPTS
6096 PyModule_AddIntConstant(m, "IP_RECVOPTS", IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006097#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006098#ifdef IP_RECVRETOPTS
6099 PyModule_AddIntConstant(m, "IP_RECVRETOPTS", IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006100#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006101#ifdef IP_RECVDSTADDR
6102 PyModule_AddIntConstant(m, "IP_RECVDSTADDR", IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006103#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006104#ifdef IP_RETOPTS
6105 PyModule_AddIntConstant(m, "IP_RETOPTS", IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006106#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006107#ifdef IP_MULTICAST_IF
6108 PyModule_AddIntConstant(m, "IP_MULTICAST_IF", IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006109#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006110#ifdef IP_MULTICAST_TTL
6111 PyModule_AddIntConstant(m, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006112#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006113#ifdef IP_MULTICAST_LOOP
6114 PyModule_AddIntConstant(m, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006115#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006116#ifdef IP_ADD_MEMBERSHIP
6117 PyModule_AddIntConstant(m, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006118#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006119#ifdef IP_DROP_MEMBERSHIP
6120 PyModule_AddIntConstant(m, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006121#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006122#ifdef IP_DEFAULT_MULTICAST_TTL
6123 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_TTL",
6124 IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00006125#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006126#ifdef IP_DEFAULT_MULTICAST_LOOP
6127 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_LOOP",
6128 IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006129#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006130#ifdef IP_MAX_MEMBERSHIPS
6131 PyModule_AddIntConstant(m, "IP_MAX_MEMBERSHIPS", IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00006132#endif
6133
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006134 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
6135#ifdef IPV6_JOIN_GROUP
6136 PyModule_AddIntConstant(m, "IPV6_JOIN_GROUP", IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006137#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006138#ifdef IPV6_LEAVE_GROUP
6139 PyModule_AddIntConstant(m, "IPV6_LEAVE_GROUP", IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006140#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006141#ifdef IPV6_MULTICAST_HOPS
6142 PyModule_AddIntConstant(m, "IPV6_MULTICAST_HOPS", IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006143#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006144#ifdef IPV6_MULTICAST_IF
6145 PyModule_AddIntConstant(m, "IPV6_MULTICAST_IF", IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006146#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006147#ifdef IPV6_MULTICAST_LOOP
6148 PyModule_AddIntConstant(m, "IPV6_MULTICAST_LOOP", IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006149#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006150#ifdef IPV6_UNICAST_HOPS
6151 PyModule_AddIntConstant(m, "IPV6_UNICAST_HOPS", IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006152#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006153 /* Additional IPV6 socket options, defined in RFC 3493 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00006154#ifdef IPV6_V6ONLY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006155 PyModule_AddIntConstant(m, "IPV6_V6ONLY", IPV6_V6ONLY);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006156#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006157 /* Advanced IPV6 socket options, from RFC 3542 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00006158#ifdef IPV6_CHECKSUM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006159 PyModule_AddIntConstant(m, "IPV6_CHECKSUM", IPV6_CHECKSUM);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006160#endif
6161#ifdef IPV6_DONTFRAG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006162 PyModule_AddIntConstant(m, "IPV6_DONTFRAG", IPV6_DONTFRAG);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006163#endif
6164#ifdef IPV6_DSTOPTS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006165 PyModule_AddIntConstant(m, "IPV6_DSTOPTS", IPV6_DSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006166#endif
6167#ifdef IPV6_HOPLIMIT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006168 PyModule_AddIntConstant(m, "IPV6_HOPLIMIT", IPV6_HOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006169#endif
6170#ifdef IPV6_HOPOPTS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006171 PyModule_AddIntConstant(m, "IPV6_HOPOPTS", IPV6_HOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006172#endif
6173#ifdef IPV6_NEXTHOP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006174 PyModule_AddIntConstant(m, "IPV6_NEXTHOP", IPV6_NEXTHOP);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006175#endif
6176#ifdef IPV6_PATHMTU
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006177 PyModule_AddIntConstant(m, "IPV6_PATHMTU", IPV6_PATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006178#endif
6179#ifdef IPV6_PKTINFO
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006180 PyModule_AddIntConstant(m, "IPV6_PKTINFO", IPV6_PKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006181#endif
6182#ifdef IPV6_RECVDSTOPTS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006183 PyModule_AddIntConstant(m, "IPV6_RECVDSTOPTS", IPV6_RECVDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006184#endif
6185#ifdef IPV6_RECVHOPLIMIT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006186 PyModule_AddIntConstant(m, "IPV6_RECVHOPLIMIT", IPV6_RECVHOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006187#endif
6188#ifdef IPV6_RECVHOPOPTS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006189 PyModule_AddIntConstant(m, "IPV6_RECVHOPOPTS", IPV6_RECVHOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006190#endif
6191#ifdef IPV6_RECVPKTINFO
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006192 PyModule_AddIntConstant(m, "IPV6_RECVPKTINFO", IPV6_RECVPKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006193#endif
6194#ifdef IPV6_RECVRTHDR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006195 PyModule_AddIntConstant(m, "IPV6_RECVRTHDR", IPV6_RECVRTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006196#endif
6197#ifdef IPV6_RECVTCLASS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006198 PyModule_AddIntConstant(m, "IPV6_RECVTCLASS", IPV6_RECVTCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006199#endif
6200#ifdef IPV6_RTHDR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006201 PyModule_AddIntConstant(m, "IPV6_RTHDR", IPV6_RTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006202#endif
6203#ifdef IPV6_RTHDRDSTOPTS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006204 PyModule_AddIntConstant(m, "IPV6_RTHDRDSTOPTS", IPV6_RTHDRDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006205#endif
6206#ifdef IPV6_RTHDR_TYPE_0
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006207 PyModule_AddIntConstant(m, "IPV6_RTHDR_TYPE_0", IPV6_RTHDR_TYPE_0);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006208#endif
6209#ifdef IPV6_RECVPATHMTU
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006210 PyModule_AddIntConstant(m, "IPV6_RECVPATHMTU", IPV6_RECVPATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006211#endif
6212#ifdef IPV6_TCLASS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006213 PyModule_AddIntConstant(m, "IPV6_TCLASS", IPV6_TCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006214#endif
6215#ifdef IPV6_USE_MIN_MTU
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006216 PyModule_AddIntConstant(m, "IPV6_USE_MIN_MTU", IPV6_USE_MIN_MTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006217#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006218
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006219 /* TCP options */
6220#ifdef TCP_NODELAY
6221 PyModule_AddIntConstant(m, "TCP_NODELAY", TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00006222#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006223#ifdef TCP_MAXSEG
6224 PyModule_AddIntConstant(m, "TCP_MAXSEG", TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00006225#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006226#ifdef TCP_CORK
6227 PyModule_AddIntConstant(m, "TCP_CORK", TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006228#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006229#ifdef TCP_KEEPIDLE
6230 PyModule_AddIntConstant(m, "TCP_KEEPIDLE", TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006231#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006232#ifdef TCP_KEEPINTVL
6233 PyModule_AddIntConstant(m, "TCP_KEEPINTVL", TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006234#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006235#ifdef TCP_KEEPCNT
6236 PyModule_AddIntConstant(m, "TCP_KEEPCNT", TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006237#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006238#ifdef TCP_SYNCNT
6239 PyModule_AddIntConstant(m, "TCP_SYNCNT", TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006240#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006241#ifdef TCP_LINGER2
6242 PyModule_AddIntConstant(m, "TCP_LINGER2", TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006243#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006244#ifdef TCP_DEFER_ACCEPT
6245 PyModule_AddIntConstant(m, "TCP_DEFER_ACCEPT", TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006246#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006247#ifdef TCP_WINDOW_CLAMP
6248 PyModule_AddIntConstant(m, "TCP_WINDOW_CLAMP", TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006249#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006250#ifdef TCP_INFO
6251 PyModule_AddIntConstant(m, "TCP_INFO", TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006252#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006253#ifdef TCP_QUICKACK
6254 PyModule_AddIntConstant(m, "TCP_QUICKACK", TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006255#endif
6256
Guido van Rossum09be4091999-08-09 14:40:40 +00006257
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006258 /* IPX options */
6259#ifdef IPX_TYPE
6260 PyModule_AddIntConstant(m, "IPX_TYPE", IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006261#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00006262
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006263 /* get{addr,name}info parameters */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006264#ifdef EAI_ADDRFAMILY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006265 PyModule_AddIntConstant(m, "EAI_ADDRFAMILY", EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006266#endif
6267#ifdef EAI_AGAIN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006268 PyModule_AddIntConstant(m, "EAI_AGAIN", EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006269#endif
6270#ifdef EAI_BADFLAGS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006271 PyModule_AddIntConstant(m, "EAI_BADFLAGS", EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006272#endif
6273#ifdef EAI_FAIL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006274 PyModule_AddIntConstant(m, "EAI_FAIL", EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006275#endif
6276#ifdef EAI_FAMILY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006277 PyModule_AddIntConstant(m, "EAI_FAMILY", EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006278#endif
6279#ifdef EAI_MEMORY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006280 PyModule_AddIntConstant(m, "EAI_MEMORY", EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006281#endif
6282#ifdef EAI_NODATA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006283 PyModule_AddIntConstant(m, "EAI_NODATA", EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006284#endif
6285#ifdef EAI_NONAME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006286 PyModule_AddIntConstant(m, "EAI_NONAME", EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006287#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00006288#ifdef EAI_OVERFLOW
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006289 PyModule_AddIntConstant(m, "EAI_OVERFLOW", EAI_OVERFLOW);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006290#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006291#ifdef EAI_SERVICE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006292 PyModule_AddIntConstant(m, "EAI_SERVICE", EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006293#endif
6294#ifdef EAI_SOCKTYPE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006295 PyModule_AddIntConstant(m, "EAI_SOCKTYPE", EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006296#endif
6297#ifdef EAI_SYSTEM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006298 PyModule_AddIntConstant(m, "EAI_SYSTEM", EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006299#endif
6300#ifdef EAI_BADHINTS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006301 PyModule_AddIntConstant(m, "EAI_BADHINTS", EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006302#endif
6303#ifdef EAI_PROTOCOL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006304 PyModule_AddIntConstant(m, "EAI_PROTOCOL", EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006305#endif
6306#ifdef EAI_MAX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006307 PyModule_AddIntConstant(m, "EAI_MAX", EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006308#endif
6309#ifdef AI_PASSIVE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006310 PyModule_AddIntConstant(m, "AI_PASSIVE", AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006311#endif
6312#ifdef AI_CANONNAME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006313 PyModule_AddIntConstant(m, "AI_CANONNAME", AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006314#endif
6315#ifdef AI_NUMERICHOST
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006316 PyModule_AddIntConstant(m, "AI_NUMERICHOST", AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006317#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00006318#ifdef AI_NUMERICSERV
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006319 PyModule_AddIntConstant(m, "AI_NUMERICSERV", AI_NUMERICSERV);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006320#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006321#ifdef AI_MASK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006322 PyModule_AddIntConstant(m, "AI_MASK", AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006323#endif
6324#ifdef AI_ALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006325 PyModule_AddIntConstant(m, "AI_ALL", AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006326#endif
6327#ifdef AI_V4MAPPED_CFG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006328 PyModule_AddIntConstant(m, "AI_V4MAPPED_CFG", AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006329#endif
6330#ifdef AI_ADDRCONFIG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006331 PyModule_AddIntConstant(m, "AI_ADDRCONFIG", AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006332#endif
6333#ifdef AI_V4MAPPED
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006334 PyModule_AddIntConstant(m, "AI_V4MAPPED", AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006335#endif
6336#ifdef AI_DEFAULT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006337 PyModule_AddIntConstant(m, "AI_DEFAULT", AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006338#endif
6339#ifdef NI_MAXHOST
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006340 PyModule_AddIntConstant(m, "NI_MAXHOST", NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006341#endif
6342#ifdef NI_MAXSERV
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006343 PyModule_AddIntConstant(m, "NI_MAXSERV", NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006344#endif
6345#ifdef NI_NOFQDN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006346 PyModule_AddIntConstant(m, "NI_NOFQDN", NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006347#endif
6348#ifdef NI_NUMERICHOST
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006349 PyModule_AddIntConstant(m, "NI_NUMERICHOST", NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006350#endif
6351#ifdef NI_NAMEREQD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006352 PyModule_AddIntConstant(m, "NI_NAMEREQD", NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006353#endif
6354#ifdef NI_NUMERICSERV
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006355 PyModule_AddIntConstant(m, "NI_NUMERICSERV", NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006356#endif
6357#ifdef NI_DGRAM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006358 PyModule_AddIntConstant(m, "NI_DGRAM", NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006359#endif
6360
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006361 /* shutdown() parameters */
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006362#ifdef SHUT_RD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006363 PyModule_AddIntConstant(m, "SHUT_RD", SHUT_RD);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006364#elif defined(SD_RECEIVE)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006365 PyModule_AddIntConstant(m, "SHUT_RD", SD_RECEIVE);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006366#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006367 PyModule_AddIntConstant(m, "SHUT_RD", 0);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006368#endif
6369#ifdef SHUT_WR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006370 PyModule_AddIntConstant(m, "SHUT_WR", SHUT_WR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006371#elif defined(SD_SEND)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006372 PyModule_AddIntConstant(m, "SHUT_WR", SD_SEND);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006373#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006374 PyModule_AddIntConstant(m, "SHUT_WR", 1);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006375#endif
6376#ifdef SHUT_RDWR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006377 PyModule_AddIntConstant(m, "SHUT_RDWR", SHUT_RDWR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006378#elif defined(SD_BOTH)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006379 PyModule_AddIntConstant(m, "SHUT_RDWR", SD_BOTH);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006380#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006381 PyModule_AddIntConstant(m, "SHUT_RDWR", 2);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006382#endif
6383
Christian Heimesfaf2f632008-01-06 16:59:19 +00006384#ifdef SIO_RCVALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006385 {
6386 DWORD codes[] = {SIO_RCVALL, SIO_KEEPALIVE_VALS};
6387 const char *names[] = {"SIO_RCVALL", "SIO_KEEPALIVE_VALS"};
6388 int i;
Victor Stinner63941882011-09-29 00:42:28 +02006389 for(i = 0; i<Py_ARRAY_LENGTH(codes); ++i) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006390 PyObject *tmp;
6391 tmp = PyLong_FromUnsignedLong(codes[i]);
6392 if (tmp == NULL)
6393 return NULL;
6394 PyModule_AddObject(m, names[i], tmp);
6395 }
6396 }
6397 PyModule_AddIntConstant(m, "RCVALL_OFF", RCVALL_OFF);
6398 PyModule_AddIntConstant(m, "RCVALL_ON", RCVALL_ON);
6399 PyModule_AddIntConstant(m, "RCVALL_SOCKETLEVELONLY", RCVALL_SOCKETLEVELONLY);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00006400#ifdef RCVALL_IPLEVEL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006401 PyModule_AddIntConstant(m, "RCVALL_IPLEVEL", RCVALL_IPLEVEL);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00006402#endif
6403#ifdef RCVALL_MAX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006404 PyModule_AddIntConstant(m, "RCVALL_MAX", RCVALL_MAX);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00006405#endif
Christian Heimesfaf2f632008-01-06 16:59:19 +00006406#endif /* _MSTCPIP_ */
6407
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006408 /* Initialize gethostbyname lock */
Just van Rossum1040d2c2003-05-09 07:53:18 +00006409#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006410 netdb_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00006411#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006412 return m;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00006413}
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006414
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006415
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006416#ifndef HAVE_INET_PTON
Christian Heimes96e7b3d2007-11-20 06:51:17 +00006417#if !defined(NTDDI_VERSION) || (NTDDI_VERSION < NTDDI_LONGHORN)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006418
6419/* Simplistic emulation code for inet_pton that only works for IPv4 */
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006420/* These are not exposed because they do not set errno properly */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006421
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006422int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006423inet_pton(int af, const char *src, void *dst)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006424{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006425 if (af == AF_INET) {
Benjamin Petersonf91df042009-02-13 02:50:59 +00006426#if (SIZEOF_INT != 4)
6427#error "Not sure if in_addr_t exists and int is not 32-bits."
6428#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006429 unsigned int packed_addr;
6430 packed_addr = inet_addr(src);
6431 if (packed_addr == INADDR_NONE)
6432 return 0;
6433 memcpy(dst, &packed_addr, 4);
6434 return 1;
6435 }
6436 /* Should set errno to EAFNOSUPPORT */
6437 return -1;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006438}
6439
Martin v. Löwisc925b1532001-07-21 09:42:15 +00006440const char *
6441inet_ntop(int af, const void *src, char *dst, socklen_t size)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006442{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006443 if (af == AF_INET) {
6444 struct in_addr packed_addr;
6445 if (size < 16)
6446 /* Should set errno to ENOSPC. */
6447 return NULL;
6448 memcpy(&packed_addr, src, sizeof(packed_addr));
6449 return strncpy(dst, inet_ntoa(packed_addr), size);
6450 }
6451 /* Should set errno to EAFNOSUPPORT */
6452 return NULL;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006453}
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006454
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006455#endif
Christian Heimesb6150692007-11-15 23:37:07 +00006456#endif