blob: 936e930a7504046b109e6dfbb00602541f269184 [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
Martin v. Löwis9d6c6692012-02-03 17:44:58 +0100221#ifdef __APPLE__
222# include <sys/ioctl.h>
223#endif
224
225
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000226#if defined(PYOS_OS2)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000227# define INCL_DOS
228# define INCL_DOSERRORS
229# define INCL_NOPMAPI
230# include <os2.h>
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000231#endif
232
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000233#if defined(__sgi) && _COMPILER_VERSION>700 && !_SGIAPI
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000234/* make sure that the reentrant (gethostbyaddr_r etc)
235 functions are declared correctly if compiling with
236 MIPSPro 7.x in ANSI C mode (default) */
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000237
Thomas Wouters477c8d52006-05-27 19:21:47 +0000238/* XXX Using _SGIAPI is the wrong thing,
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000239 but I don't know what the right thing is. */
Trent Mick8ea5bdf2004-09-13 17:48:41 +0000240#undef _SGIAPI /* to avoid warning */
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000241#define _SGIAPI 1
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000242
Trent Mick8ea5bdf2004-09-13 17:48:41 +0000243#undef _XOPEN_SOURCE
244#include <sys/socket.h>
245#include <sys/types.h>
246#include <netinet/in.h>
247#ifdef _SS_ALIGNSIZE
248#define HAVE_GETADDRINFO 1
249#define HAVE_GETNAMEINFO 1
250#endif
251
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000252#define HAVE_INET_PTON
253#include <netdb.h>
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000254#endif
255
Thomas Wouters477c8d52006-05-27 19:21:47 +0000256/* Irix 6.5 fails to define this variable at all. This is needed
257 for both GCC and SGI's compiler. I'd say that the SGI headers
Georg Brandldbd83392006-02-20 09:42:33 +0000258 are just busted. Same thing for Solaris. */
259#if (defined(__sgi) || defined(sun)) && !defined(INET_ADDRSTRLEN)
Anthony Baxterbab23cf2003-10-04 08:00:49 +0000260#define INET_ADDRSTRLEN 16
261#endif
262
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000263/* Generic includes */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000264#ifdef HAVE_SYS_TYPES_H
Guido van Rossumb6775db1994-08-01 11:34:53 +0000265#include <sys/types.h>
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000266#endif
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000267
Gregory P. Smith3b1f2c32011-05-15 12:18:23 -0700268#ifdef HAVE_SYS_SOCKET_H
269#include <sys/socket.h>
270#endif
271
272#ifdef HAVE_NET_IF_H
273#include <net/if.h>
274#endif
275
Marc-André Lemburg976ade62002-02-16 18:47:07 +0000276/* Generic socket object definitions and includes */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000277#define PySocket_BUILDING_SOCKET
Marc-André Lemburgbb8b78b2002-02-16 18:44:52 +0000278#include "socketmodule.h"
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000279
280/* Addressing includes */
281
Guido van Rossum6f489d91996-06-28 20:15:15 +0000282#ifndef MS_WINDOWS
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000283
284/* Non-MS WINDOWS includes */
285# include <netdb.h>
Nick Coghlan4ecf6cf2011-08-22 15:45:19 +1000286# include <unistd.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000287
Guido van Rossum9376b741999-09-15 22:01:40 +0000288/* Headers needed for inet_ntoa() and inet_addr() */
Skip Montanaroeb33e5a2007-08-17 12:57:41 +0000289# if defined(PYOS_OS2) && defined(PYCC_VACPP)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000290# include <netdb.h>
Tim Peters603c6832001-11-05 02:45:59 +0000291typedef size_t socklen_t;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000292# else
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000293# include <arpa/inet.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000294# endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000295
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000296# include <fcntl.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000297
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000298#else
Guido van Rossum48a680c2001-03-02 06:34:14 +0000299
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000300/* MS_WINDOWS includes */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000301# ifdef HAVE_FCNTL_H
302# include <fcntl.h>
303# endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000304
Jeremy Hylton22308652001-02-02 03:23:09 +0000305#endif
306
Skip Montanaro7befb992004-02-10 16:50:21 +0000307#include <stddef.h>
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000308
309#ifndef offsetof
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000310# define offsetof(type, member) ((size_t)(&((type *)0)->member))
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000311#endif
312
Neal Norwitz39d22e52002-11-02 19:55:21 +0000313#ifndef O_NONBLOCK
314# define O_NONBLOCK O_NDELAY
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000315#endif
316
Trent Micka708d6e2004-09-07 17:48:26 +0000317/* include Python's addrinfo.h unless it causes trouble */
318#if defined(__sgi) && _COMPILER_VERSION>700 && defined(_SS_ALIGNSIZE)
319 /* Do not include addinfo.h on some newer IRIX versions.
320 * _SS_ALIGNSIZE is defined in sys/socket.h by 6.5.21,
321 * for example, but not by 6.5.10.
322 */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000323#elif defined(_MSC_VER) && _MSC_VER>1201
Trent Micka708d6e2004-09-07 17:48:26 +0000324 /* Do not include addrinfo.h for MSVC7 or greater. 'addrinfo' and
325 * EAI_* constants are defined in (the already included) ws2tcpip.h.
326 */
327#else
328# include "addrinfo.h"
329#endif
Jason Tishlerc246cb72004-08-09 13:25:59 +0000330
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000331#ifndef HAVE_INET_PTON
Christian Heimes96e7b3d2007-11-20 06:51:17 +0000332#if !defined(NTDDI_VERSION) || (NTDDI_VERSION < NTDDI_LONGHORN)
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000333int inet_pton(int af, const char *src, void *dst);
Martin v. Löwisc925b1532001-07-21 09:42:15 +0000334const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000335#endif
Christian Heimesb6150692007-11-15 23:37:07 +0000336#endif
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000337
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000338#ifdef __APPLE__
339/* On OS X, getaddrinfo returns no error indication of lookup
340 failure, so we must use the emulation instead of the libinfo
341 implementation. Unfortunately, performing an autoconf test
342 for this bug would require DNS access for the machine performing
343 the configuration, which is not acceptable. Therefore, we
344 determine the bug just by checking for __APPLE__. If this bug
345 gets ever fixed, perhaps checking for sys/version.h would be
346 appropriate, which is 10/0 on the system with the bug. */
Jack Jansen84262fb2002-07-02 14:40:42 +0000347#ifndef HAVE_GETNAMEINFO
348/* This bug seems to be fixed in Jaguar. Ths easiest way I could
349 Find to check for Jaguar is that it has getnameinfo(), which
350 older releases don't have */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000351#undef HAVE_GETADDRINFO
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000352#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +0000353
354#ifdef HAVE_INET_ATON
355#define USE_INET_ATON_WEAKLINK
356#endif
357
Jack Jansen84262fb2002-07-02 14:40:42 +0000358#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000359
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000360/* I know this is a bad practice, but it is the easiest... */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000361#if !defined(HAVE_GETADDRINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000362/* avoid clashes with the C library definition of the symbol. */
363#define getaddrinfo fake_getaddrinfo
364#define gai_strerror fake_gai_strerror
365#define freeaddrinfo fake_freeaddrinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000366#include "getaddrinfo.c"
367#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000368#if !defined(HAVE_GETNAMEINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000369#define getnameinfo fake_getnameinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000370#include "getnameinfo.c"
371#endif
372
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000373#ifdef MS_WINDOWS
374/* On Windows a socket is really a handle not an fd */
375static SOCKET
376dup_socket(SOCKET handle)
377{
Daniel Stutzbach6c765282010-09-03 12:38:33 +0000378 WSAPROTOCOL_INFO info;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000379
Daniel Stutzbach6c765282010-09-03 12:38:33 +0000380 if (WSADuplicateSocket(handle, GetCurrentProcessId(), &info))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000381 return INVALID_SOCKET;
Daniel Stutzbach6c765282010-09-03 12:38:33 +0000382
383 return WSASocket(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
Antoine Pitrou9a54a262012-04-01 01:14:39 +0200384 FROM_PROTOCOL_INFO, &info, 0, WSA_FLAG_OVERLAPPED);
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000385}
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000386#define SOCKETCLOSE closesocket
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000387#else
388/* On Unix we can use dup to duplicate the file descriptor of a socket*/
389#define dup_socket(fd) dup(fd)
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000390#endif
391
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000392#ifdef MS_WIN32
Kristján Valur Jónsson310052c2012-03-31 13:35:00 +0000393#undef EAFNOSUPPORT
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000394#define EAFNOSUPPORT WSAEAFNOSUPPORT
395#define snprintf _snprintf
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000396#endif
Fred Drakea04eaad2000-06-30 02:46:07 +0000397
Andrew MacIntyreba43e872002-03-03 03:03:52 +0000398#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000399#define SOCKETCLOSE soclose
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000400#define NO_DUP /* Sockets are Not Actual File Handles under OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000401#endif
402
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000403#ifndef SOCKETCLOSE
404#define SOCKETCLOSE close
405#endif
406
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000407#if (defined(HAVE_BLUETOOTH_H) || defined(HAVE_BLUETOOTH_BLUETOOTH_H)) && !defined(__NetBSD__) && !defined(__DragonFly__)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000408#define USE_BLUETOOTH 1
409#if defined(__FreeBSD__)
410#define BTPROTO_L2CAP BLUETOOTH_PROTO_L2CAP
411#define BTPROTO_RFCOMM BLUETOOTH_PROTO_RFCOMM
Thomas Wouterscf297e42007-02-23 15:07:44 +0000412#define BTPROTO_HCI BLUETOOTH_PROTO_HCI
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000413#define SOL_HCI SOL_HCI_RAW
414#define HCI_FILTER SO_HCI_RAW_FILTER
Hye-Shik Chang81268602004-02-02 06:05:24 +0000415#define sockaddr_l2 sockaddr_l2cap
416#define sockaddr_rc sockaddr_rfcomm
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000417#define hci_dev hci_node
Hye-Shik Chang81268602004-02-02 06:05:24 +0000418#define _BT_L2_MEMB(sa, memb) ((sa)->l2cap_##memb)
419#define _BT_RC_MEMB(sa, memb) ((sa)->rfcomm_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000420#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000421#elif defined(__NetBSD__) || defined(__DragonFly__)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000422#define sockaddr_l2 sockaddr_bt
423#define sockaddr_rc sockaddr_bt
Thomas Wouterscf297e42007-02-23 15:07:44 +0000424#define sockaddr_hci sockaddr_bt
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000425#define sockaddr_sco sockaddr_bt
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000426#define SOL_HCI BTPROTO_HCI
427#define HCI_DATA_DIR SO_HCI_DIRECTION
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000428#define _BT_L2_MEMB(sa, memb) ((sa)->bt_##memb)
429#define _BT_RC_MEMB(sa, memb) ((sa)->bt_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000430#define _BT_HCI_MEMB(sa, memb) ((sa)->bt_##memb)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000431#define _BT_SCO_MEMB(sa, memb) ((sa)->bt_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000432#else
Hye-Shik Chang81268602004-02-02 06:05:24 +0000433#define _BT_L2_MEMB(sa, memb) ((sa)->l2_##memb)
434#define _BT_RC_MEMB(sa, memb) ((sa)->rc_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000435#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000436#define _BT_SCO_MEMB(sa, memb) ((sa)->sco_##memb)
437#endif
438#endif
439
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000440#ifdef __VMS
441/* TCP/IP Services for VMS uses a maximum send/recv buffer length */
442#define SEGMENT_SIZE (32 * 1024 -1)
443#endif
444
Charles-François Natali8b759652011-12-23 16:44:51 +0100445/* Convert "sock_addr_t *" to "struct sockaddr *". */
446#define SAS2SA(x) (&((x)->sa))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000447
Martin v. Löwise9416172003-05-03 10:12:45 +0000448/*
449 * Constants for getnameinfo()
450 */
451#if !defined(NI_MAXHOST)
452#define NI_MAXHOST 1025
453#endif
454#if !defined(NI_MAXSERV)
455#define NI_MAXSERV 32
456#endif
457
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000458#ifndef INVALID_SOCKET /* MS defines this */
459#define INVALID_SOCKET (-1)
460#endif
461
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000462/* XXX There's a problem here: *static* functions are not supposed to have
463 a Py prefix (or use CapitalizedWords). Later... */
464
Guido van Rossum30a685f1991-06-27 15:51:29 +0000465/* Global variable holding the exception type for errors detected
466 by this module (but not argument type or memory errors, etc.). */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000467static PyObject *socket_herror;
468static PyObject *socket_gaierror;
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000469static PyObject *socket_timeout;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000470
Tim Peters643a7fc2002-02-17 04:13:21 +0000471/* A forward reference to the socket type object.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000472 The sock_type variable contains pointers to various functions,
473 some of which call new_sockobject(), which uses sock_type, so
Tim Peters643a7fc2002-02-17 04:13:21 +0000474 there has to be a circular reference. */
Jeremy Hylton938ace62002-07-17 16:30:39 +0000475static PyTypeObject sock_type;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000476
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000477#if defined(HAVE_POLL_H)
478#include <poll.h>
479#elif defined(HAVE_SYS_POLL_H)
480#include <sys/poll.h>
481#endif
482
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000483/* Largest value to try to store in a socklen_t (used when handling
484 ancillary data). POSIX requires socklen_t to hold at least
485 (2**31)-1 and recommends against storing larger values, but
486 socklen_t was originally int in the BSD interface, so to be on the
487 safe side we use the smaller of (2**31)-1 and INT_MAX. */
488#if INT_MAX > 0x7fffffff
489#define SOCKLEN_T_LIMIT 0x7fffffff
490#else
491#define SOCKLEN_T_LIMIT INT_MAX
492#endif
493
Charles-François Nataliaa26b272011-08-28 17:51:43 +0200494#ifdef HAVE_POLL
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000495/* Instead of select(), we'll use poll() since poll() works on any fd. */
496#define IS_SELECTABLE(s) 1
497/* Can we call select() with this socket without a buffer overrun? */
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000498#else
Charles-François Nataliaa26b272011-08-28 17:51:43 +0200499/* If there's no timeout left, we don't have to call select, so it's a safe,
500 * little white lie. */
501#define IS_SELECTABLE(s) (_PyIsSelectable_fd((s)->sock_fd) || (s)->sock_timeout <= 0.0)
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000502#endif
Neal Norwitz082b2df2006-02-07 07:04:46 +0000503
504static PyObject*
505select_error(void)
506{
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200507 PyErr_SetString(PyExc_OSError, "unable to select on socket");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000508 return NULL;
Neal Norwitz082b2df2006-02-07 07:04:46 +0000509}
510
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000511#ifdef MS_WINDOWS
Antoine Pitrouc8f01962010-09-28 22:03:27 +0000512#ifndef WSAEAGAIN
513#define WSAEAGAIN WSAEWOULDBLOCK
514#endif
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000515#define CHECK_ERRNO(expected) \
516 (WSAGetLastError() == WSA ## expected)
517#else
518#define CHECK_ERRNO(expected) \
519 (errno == expected)
520#endif
521
Guido van Rossum30a685f1991-06-27 15:51:29 +0000522/* Convenience function to raise an error according to errno
523 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000524
Guido van Rossum73624e91994-10-10 17:59:00 +0000525static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000526set_error(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000527{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000528#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000529 int err_no = WSAGetLastError();
530 /* PyErr_SetExcFromWindowsErr() invokes FormatMessage() which
531 recognizes the error codes used by both GetLastError() and
532 WSAGetLastError */
533 if (err_no)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200534 return PyErr_SetExcFromWindowsErr(PyExc_OSError, err_no);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000535#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000536
Andrew MacIntyreba43e872002-03-03 03:03:52 +0000537#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000538 if (sock_errno() != NO_ERROR) {
539 APIRET rc;
540 ULONG msglen;
541 char outbuf[100];
542 int myerrorcode = sock_errno();
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000543
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000544 /* Retrieve socket-related error message from MPTN.MSG file */
545 rc = DosGetMessage(NULL, 0, outbuf, sizeof(outbuf),
546 myerrorcode - SOCBASEERR + 26,
547 "mptn.msg",
548 &msglen);
549 if (rc == NO_ERROR) {
550 PyObject *v;
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000551
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000552 /* OS/2 doesn't guarantee a terminator */
553 outbuf[msglen] = '\0';
554 if (strlen(outbuf) > 0) {
555 /* If non-empty msg, trim CRLF */
556 char *lastc = &outbuf[ strlen(outbuf)-1 ];
557 while (lastc > outbuf &&
558 isspace(Py_CHARMASK(*lastc))) {
559 /* Trim trailing whitespace (CRLF) */
560 *lastc-- = '\0';
561 }
562 }
563 v = Py_BuildValue("(is)", myerrorcode, outbuf);
564 if (v != NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200565 PyErr_SetObject(PyExc_OSError, v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000566 Py_DECREF(v);
567 }
568 return NULL;
569 }
570 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000571#endif
572
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200573 return PyErr_SetFromErrno(PyExc_OSError);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000574}
575
Guido van Rossum30a685f1991-06-27 15:51:29 +0000576
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000577static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000578set_herror(int h_error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000579{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000580 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000581
582#ifdef HAVE_HSTRERROR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000583 v = Py_BuildValue("(is)", h_error, (char *)hstrerror(h_error));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000584#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000585 v = Py_BuildValue("(is)", h_error, "host not found");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000586#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000587 if (v != NULL) {
588 PyErr_SetObject(socket_herror, v);
589 Py_DECREF(v);
590 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000591
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000592 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000593}
594
595
596static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000597set_gaierror(int error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000598{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000599 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000600
Martin v. Löwis272cb402002-03-01 08:31:07 +0000601#ifdef EAI_SYSTEM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000602 /* EAI_SYSTEM is not available on Windows XP. */
603 if (error == EAI_SYSTEM)
604 return set_error();
Martin v. Löwis272cb402002-03-01 08:31:07 +0000605#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000606
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000607#ifdef HAVE_GAI_STRERROR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000608 v = Py_BuildValue("(is)", error, gai_strerror(error));
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000609#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000610 v = Py_BuildValue("(is)", error, "getaddrinfo failed");
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000611#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000612 if (v != NULL) {
613 PyErr_SetObject(socket_gaierror, v);
614 Py_DECREF(v);
615 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000616
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000617 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000618}
619
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000620#ifdef __VMS
621/* Function to send in segments */
622static int
623sendsegmented(int sock_fd, char *buf, int len, int flags)
624{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000625 int n = 0;
626 int remaining = len;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000627
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000628 while (remaining > 0) {
629 unsigned int segment;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000630
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000631 segment = (remaining >= SEGMENT_SIZE ? SEGMENT_SIZE : remaining);
632 n = send(sock_fd, buf, segment, flags);
633 if (n < 0) {
634 return n;
635 }
636 remaining -= segment;
637 buf += segment;
638 } /* end while */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000639
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000640 return len;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000641}
642#endif
643
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000644/* Function to perform the setting of socket blocking mode
645 internally. block = (1 | 0). */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000646static int
647internal_setblocking(PySocketSockObject *s, int block)
648{
Guido van Rossum67f7a382002-06-06 21:08:16 +0000649#ifndef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000650 int delay_flag;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000651#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +0000652#ifdef SOCK_NONBLOCK
653 if (block)
654 s->sock_type &= (~SOCK_NONBLOCK);
655 else
656 s->sock_type |= SOCK_NONBLOCK;
657#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +0000658
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000659 Py_BEGIN_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000660#ifndef MS_WINDOWS
661#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000662 block = !block;
663 ioctl(s->sock_fd, FIONBIO, (caddr_t)&block, sizeof(block));
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000664#elif defined(__VMS)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000665 block = !block;
666 ioctl(s->sock_fd, FIONBIO, (unsigned int *)&block);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000667#else /* !PYOS_OS2 && !__VMS */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000668 delay_flag = fcntl(s->sock_fd, F_GETFL, 0);
669 if (block)
670 delay_flag &= (~O_NONBLOCK);
671 else
672 delay_flag |= O_NONBLOCK;
673 fcntl(s->sock_fd, F_SETFL, delay_flag);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000674#endif /* !PYOS_OS2 */
675#else /* MS_WINDOWS */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000676 block = !block;
677 ioctlsocket(s->sock_fd, FIONBIO, (u_long*)&block);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000678#endif /* MS_WINDOWS */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000679 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000680
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000681 /* Since these don't return anything */
682 return 1;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000683}
684
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000685/* Do a select()/poll() on the socket, if necessary (sock_timeout > 0).
Guido van Rossum11ba0942002-06-13 15:07:44 +0000686 The argument writing indicates the direction.
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000687 This does not raise an exception; we'll let our caller do that
688 after they've reacquired the interpreter lock.
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000689 Returns 1 on timeout, -1 on error, 0 otherwise. */
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000690static int
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000691internal_select_ex(PySocketSockObject *s, int writing, double interval)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000692{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000693 int n;
Guido van Rossum11ba0942002-06-13 15:07:44 +0000694
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000695 /* Nothing to do unless we're in timeout mode (not non-blocking) */
696 if (s->sock_timeout <= 0.0)
697 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000698
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000699 /* Guard against closed socket */
700 if (s->sock_fd < 0)
701 return 0;
Guido van Rossumad654902002-07-19 12:44:59 +0000702
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000703 /* Handling this condition here simplifies the select loops */
704 if (interval < 0.0)
705 return 1;
706
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000707 /* Prefer poll, if available, since you can poll() any fd
708 * which can't be done with select(). */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000709#ifdef HAVE_POLL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000710 {
711 struct pollfd pollfd;
712 int timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000713
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000714 pollfd.fd = s->sock_fd;
715 pollfd.events = writing ? POLLOUT : POLLIN;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000716
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000717 /* s->sock_timeout is in seconds, timeout in ms */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000718 timeout = (int)(interval * 1000 + 0.5);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000719 n = poll(&pollfd, 1, timeout);
720 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000721#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000722 {
723 /* Construct the arguments to select */
724 fd_set fds;
725 struct timeval tv;
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000726 tv.tv_sec = (int)interval;
727 tv.tv_usec = (int)((interval - tv.tv_sec) * 1e6);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000728 FD_ZERO(&fds);
729 FD_SET(s->sock_fd, &fds);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000730
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000731 /* See if the socket is ready */
732 if (writing)
Antoine Pitrou19467d22010-08-17 19:33:30 +0000733 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
734 NULL, &fds, NULL, &tv);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000735 else
Antoine Pitrou19467d22010-08-17 19:33:30 +0000736 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
737 &fds, NULL, NULL, &tv);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000738 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000739#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000740
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000741 if (n < 0)
742 return -1;
743 if (n == 0)
744 return 1;
745 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000746}
747
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000748static int
749internal_select(PySocketSockObject *s, int writing)
750{
751 return internal_select_ex(s, writing, s->sock_timeout);
752}
753
754/*
755 Two macros for automatic retry of select() in case of false positives
756 (for example, select() could indicate a socket is ready for reading
757 but the data then discarded by the OS because of a wrong checksum).
758 Here is an example of use:
759
760 BEGIN_SELECT_LOOP(s)
761 Py_BEGIN_ALLOW_THREADS
762 timeout = internal_select_ex(s, 0, interval);
763 if (!timeout)
764 outlen = recv(s->sock_fd, cbuf, len, flags);
765 Py_END_ALLOW_THREADS
766 if (timeout == 1) {
767 PyErr_SetString(socket_timeout, "timed out");
768 return -1;
769 }
770 END_SELECT_LOOP(s)
771*/
772
773#define BEGIN_SELECT_LOOP(s) \
774 { \
775 _PyTime_timeval now, deadline = {0, 0}; \
776 double interval = s->sock_timeout; \
777 int has_timeout = s->sock_timeout > 0.0; \
778 if (has_timeout) { \
779 _PyTime_gettimeofday(&now); \
780 deadline = now; \
781 _PyTime_ADD_SECONDS(deadline, s->sock_timeout); \
782 } \
783 while (1) { \
784 errno = 0; \
785
786#define END_SELECT_LOOP(s) \
787 if (!has_timeout || \
788 (!CHECK_ERRNO(EWOULDBLOCK) && !CHECK_ERRNO(EAGAIN))) \
789 break; \
790 _PyTime_gettimeofday(&now); \
791 interval = _PyTime_INTERVAL(now, deadline); \
792 } \
793 } \
794
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000795/* Initialize a new socket object. */
796
Tim Petersa12b4cf2002-07-18 22:38:44 +0000797static double defaulttimeout = -1.0; /* Default timeout for new sockets */
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000798
Martin v. Löwis1a214512008-06-11 05:26:20 +0000799static void
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000800init_sockobject(PySocketSockObject *s,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000801 SOCKET_T fd, int family, int type, int proto)
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000802{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000803 s->sock_fd = fd;
804 s->sock_family = family;
805 s->sock_type = type;
806 s->sock_proto = proto;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000807
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000808 s->errorhandler = &set_error;
Antoine Pitroub1c54962010-10-14 15:05:38 +0000809#ifdef SOCK_NONBLOCK
810 if (type & SOCK_NONBLOCK)
811 s->sock_timeout = 0.0;
812 else
813#endif
814 {
815 s->sock_timeout = defaulttimeout;
816 if (defaulttimeout >= 0.0)
817 internal_setblocking(s, 0);
818 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000819
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000820}
821
822
Guido van Rossum30a685f1991-06-27 15:51:29 +0000823/* Create a new socket object.
824 This just creates the object and initializes it.
825 If the creation fails, return NULL and set an exception (implicit
826 in NEWOBJ()). */
827
Guido van Rossum73624e91994-10-10 17:59:00 +0000828static PySocketSockObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000829new_sockobject(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000830{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000831 PySocketSockObject *s;
832 s = (PySocketSockObject *)
833 PyType_GenericNew(&sock_type, NULL, NULL);
834 if (s != NULL)
835 init_sockobject(s, fd, family, type, proto);
836 return s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000837}
838
Guido van Rossum30a685f1991-06-27 15:51:29 +0000839
Guido van Rossum48a680c2001-03-02 06:34:14 +0000840/* Lock to allow python interpreter to continue, but only allow one
Just van Rossum1040d2c2003-05-09 07:53:18 +0000841 thread to be in gethostbyname or getaddrinfo */
842#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
843PyThread_type_lock netdb_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000844#endif
845
846
Guido van Rossum30a685f1991-06-27 15:51:29 +0000847/* Convert a string specifying a host name or one of a few symbolic
848 names to a numeric IP address. This usually calls gethostbyname()
849 to do the work; the names "" and "<broadcast>" are special.
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000850 Return the length (IPv4 should be 4 bytes), or negative if
Guido van Rossum30a685f1991-06-27 15:51:29 +0000851 an error occurred; then an exception is raised. */
852
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000853static int
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000854setipaddr(char *name, struct sockaddr *addr_ret, size_t addr_ret_size, int af)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000855{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000856 struct addrinfo hints, *res;
857 int error;
858 int d1, d2, d3, d4;
859 char ch;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000860
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000861 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
862 if (name[0] == '\0') {
863 int siz;
864 memset(&hints, 0, sizeof(hints));
865 hints.ai_family = af;
866 hints.ai_socktype = SOCK_DGRAM; /*dummy*/
867 hints.ai_flags = AI_PASSIVE;
868 Py_BEGIN_ALLOW_THREADS
869 ACQUIRE_GETADDRINFO_LOCK
870 error = getaddrinfo(NULL, "0", &hints, &res);
871 Py_END_ALLOW_THREADS
872 /* We assume that those thread-unsafe getaddrinfo() versions
873 *are* safe regarding their return value, ie. that a
874 subsequent call to getaddrinfo() does not destroy the
875 outcome of the first call. */
876 RELEASE_GETADDRINFO_LOCK
877 if (error) {
878 set_gaierror(error);
879 return -1;
880 }
881 switch (res->ai_family) {
882 case AF_INET:
883 siz = 4;
884 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000885#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000886 case AF_INET6:
887 siz = 16;
888 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000889#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000890 default:
891 freeaddrinfo(res);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200892 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000893 "unsupported address family");
894 return -1;
895 }
896 if (res->ai_next) {
897 freeaddrinfo(res);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200898 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000899 "wildcard resolved to multiple address");
900 return -1;
901 }
902 if (res->ai_addrlen < addr_ret_size)
903 addr_ret_size = res->ai_addrlen;
904 memcpy(addr_ret, res->ai_addr, addr_ret_size);
905 freeaddrinfo(res);
906 return siz;
907 }
908 if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
909 struct sockaddr_in *sin;
910 if (af != AF_INET && af != AF_UNSPEC) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200911 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000912 "address family mismatched");
913 return -1;
914 }
915 sin = (struct sockaddr_in *)addr_ret;
916 memset((void *) sin, '\0', sizeof(*sin));
917 sin->sin_family = AF_INET;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000918#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000919 sin->sin_len = sizeof(*sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000920#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000921 sin->sin_addr.s_addr = INADDR_BROADCAST;
922 return sizeof(sin->sin_addr);
923 }
924 if (sscanf(name, "%d.%d.%d.%d%c", &d1, &d2, &d3, &d4, &ch) == 4 &&
925 0 <= d1 && d1 <= 255 && 0 <= d2 && d2 <= 255 &&
926 0 <= d3 && d3 <= 255 && 0 <= d4 && d4 <= 255) {
927 struct sockaddr_in *sin;
928 sin = (struct sockaddr_in *)addr_ret;
929 sin->sin_addr.s_addr = htonl(
930 ((long) d1 << 24) | ((long) d2 << 16) |
931 ((long) d3 << 8) | ((long) d4 << 0));
932 sin->sin_family = AF_INET;
Anthony Baxter0e85f9d2003-05-02 15:40:46 +0000933#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000934 sin->sin_len = sizeof(*sin);
Anthony Baxter0e85f9d2003-05-02 15:40:46 +0000935#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000936 return 4;
937 }
938 memset(&hints, 0, sizeof(hints));
939 hints.ai_family = af;
940 Py_BEGIN_ALLOW_THREADS
941 ACQUIRE_GETADDRINFO_LOCK
942 error = getaddrinfo(name, NULL, &hints, &res);
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000943#if defined(__digital__) && defined(__unix__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000944 if (error == EAI_NONAME && af == AF_UNSPEC) {
945 /* On Tru64 V5.1, numeric-to-addr conversion fails
946 if no address family is given. Assume IPv4 for now.*/
947 hints.ai_family = AF_INET;
948 error = getaddrinfo(name, NULL, &hints, &res);
949 }
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000950#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000951 Py_END_ALLOW_THREADS
952 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
953 if (error) {
954 set_gaierror(error);
955 return -1;
956 }
957 if (res->ai_addrlen < addr_ret_size)
958 addr_ret_size = res->ai_addrlen;
959 memcpy((char *) addr_ret, res->ai_addr, addr_ret_size);
960 freeaddrinfo(res);
961 switch (addr_ret->sa_family) {
962 case AF_INET:
963 return 4;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000964#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000965 case AF_INET6:
966 return 16;
Guido van Rossum955becc1999-03-22 20:14:53 +0000967#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000968 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200969 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000970 return -1;
971 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000972}
973
Guido van Rossum30a685f1991-06-27 15:51:29 +0000974
Guido van Rossum30a685f1991-06-27 15:51:29 +0000975/* Create a string object representing an IP address.
976 This is always a string of the form 'dd.dd.dd.dd' (with variable
977 size numbers). */
978
Guido van Rossum73624e91994-10-10 17:59:00 +0000979static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000980makeipaddr(struct sockaddr *addr, int addrlen)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000981{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000982 char buf[NI_MAXHOST];
983 int error;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000984
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000985 error = getnameinfo(addr, addrlen, buf, sizeof(buf), NULL, 0,
986 NI_NUMERICHOST);
987 if (error) {
988 set_gaierror(error);
989 return NULL;
990 }
991 return PyUnicode_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000992}
993
994
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000995#ifdef USE_BLUETOOTH
996/* Convert a string representation of a Bluetooth address into a numeric
997 address. Returns the length (6), or raises an exception and returns -1 if
998 an error occurred. */
999
1000static int
1001setbdaddr(char *name, bdaddr_t *bdaddr)
1002{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001003 unsigned int b0, b1, b2, b3, b4, b5;
1004 char ch;
1005 int n;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001006
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001007 n = sscanf(name, "%X:%X:%X:%X:%X:%X%c",
1008 &b5, &b4, &b3, &b2, &b1, &b0, &ch);
1009 if (n == 6 && (b0 | b1 | b2 | b3 | b4 | b5) < 256) {
1010 bdaddr->b[0] = b0;
1011 bdaddr->b[1] = b1;
1012 bdaddr->b[2] = b2;
1013 bdaddr->b[3] = b3;
1014 bdaddr->b[4] = b4;
1015 bdaddr->b[5] = b5;
1016 return 6;
1017 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001018 PyErr_SetString(PyExc_OSError, "bad bluetooth address");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001019 return -1;
1020 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001021}
1022
1023/* Create a string representation of the Bluetooth address. This is always a
1024 string of the form 'XX:XX:XX:XX:XX:XX' where XX is a two digit hexadecimal
1025 value (zero padded if necessary). */
1026
1027static PyObject *
1028makebdaddr(bdaddr_t *bdaddr)
1029{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001030 char buf[(6 * 2) + 5 + 1];
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001031
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001032 sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X",
1033 bdaddr->b[5], bdaddr->b[4], bdaddr->b[3],
1034 bdaddr->b[2], bdaddr->b[1], bdaddr->b[0]);
1035 return PyUnicode_FromString(buf);
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001036}
1037#endif
1038
1039
Guido van Rossum30a685f1991-06-27 15:51:29 +00001040/* Create an object representing the given socket address,
1041 suitable for passing it back to bind(), connect() etc.
1042 The family field of the sockaddr structure is inspected
1043 to determine what kind of address it really is. */
1044
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001045/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001046static PyObject *
Antoine Pitrou19467d22010-08-17 19:33:30 +00001047makesockaddr(SOCKET_T sockfd, struct sockaddr *addr, size_t addrlen, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001048{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001049 if (addrlen == 0) {
1050 /* No address -- may be recvfrom() from known socket */
1051 Py_INCREF(Py_None);
1052 return Py_None;
1053 }
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001054
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001055 switch (addr->sa_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001056
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001057 case AF_INET:
1058 {
1059 struct sockaddr_in *a;
1060 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
1061 PyObject *ret = NULL;
1062 if (addrobj) {
1063 a = (struct sockaddr_in *)addr;
1064 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
1065 Py_DECREF(addrobj);
1066 }
1067 return ret;
1068 }
Guido van Rossum30a685f1991-06-27 15:51:29 +00001069
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001070#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001071 case AF_UNIX:
1072 {
1073 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001074#ifdef linux
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001075 if (a->sun_path[0] == 0) { /* Linux abstract namespace */
1076 addrlen -= offsetof(struct sockaddr_un, sun_path);
1077 return PyBytes_FromStringAndSize(a->sun_path, addrlen);
1078 }
1079 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001080#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001081 {
1082 /* regular NULL-terminated string */
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001083 return PyUnicode_DecodeFSDefault(a->sun_path);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001084 }
1085 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001086#endif /* AF_UNIX */
1087
Martin v. Löwis11017b12006-01-14 18:12:57 +00001088#if defined(AF_NETLINK)
1089 case AF_NETLINK:
1090 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001091 struct sockaddr_nl *a = (struct sockaddr_nl *) addr;
1092 return Py_BuildValue("II", a->nl_pid, a->nl_groups);
Martin v. Löwis11017b12006-01-14 18:12:57 +00001093 }
1094#endif /* AF_NETLINK */
1095
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001096#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001097 case AF_INET6:
1098 {
1099 struct sockaddr_in6 *a;
1100 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
1101 PyObject *ret = NULL;
1102 if (addrobj) {
1103 a = (struct sockaddr_in6 *)addr;
Charles-François Natali366999a2012-01-02 15:47:29 +01001104 ret = Py_BuildValue("OiII",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001105 addrobj,
1106 ntohs(a->sin6_port),
Charles-François Natali366999a2012-01-02 15:47:29 +01001107 ntohl(a->sin6_flowinfo),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001108 a->sin6_scope_id);
1109 Py_DECREF(addrobj);
1110 }
1111 return ret;
1112 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001113#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001114
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001115#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001116 case AF_BLUETOOTH:
1117 switch (proto) {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001118
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001119 case BTPROTO_L2CAP:
1120 {
1121 struct sockaddr_l2 *a = (struct sockaddr_l2 *) addr;
1122 PyObject *addrobj = makebdaddr(&_BT_L2_MEMB(a, bdaddr));
1123 PyObject *ret = NULL;
1124 if (addrobj) {
1125 ret = Py_BuildValue("Oi",
1126 addrobj,
1127 _BT_L2_MEMB(a, psm));
1128 Py_DECREF(addrobj);
1129 }
1130 return ret;
1131 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001132
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001133 case BTPROTO_RFCOMM:
1134 {
1135 struct sockaddr_rc *a = (struct sockaddr_rc *) addr;
1136 PyObject *addrobj = makebdaddr(&_BT_RC_MEMB(a, bdaddr));
1137 PyObject *ret = NULL;
1138 if (addrobj) {
1139 ret = Py_BuildValue("Oi",
1140 addrobj,
1141 _BT_RC_MEMB(a, channel));
1142 Py_DECREF(addrobj);
1143 }
1144 return ret;
1145 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001146
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001147 case BTPROTO_HCI:
1148 {
1149 struct sockaddr_hci *a = (struct sockaddr_hci *) addr;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001150#if defined(__NetBSD__) || defined(__DragonFly__)
1151 return makebdaddr(&_BT_HCI_MEMB(a, bdaddr));
1152#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001153 PyObject *ret = NULL;
1154 ret = Py_BuildValue("i", _BT_HCI_MEMB(a, dev));
1155 return ret;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001156#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001157 }
Thomas Wouterscf297e42007-02-23 15:07:44 +00001158
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001159#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001160 case BTPROTO_SCO:
1161 {
1162 struct sockaddr_sco *a = (struct sockaddr_sco *) addr;
1163 return makebdaddr(&_BT_SCO_MEMB(a, bdaddr));
1164 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001165#endif
1166
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001167 default:
1168 PyErr_SetString(PyExc_ValueError,
1169 "Unknown Bluetooth protocol");
1170 return NULL;
1171 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001172#endif
1173
Antoine Pitroub156a462010-10-27 20:13:57 +00001174#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFNAME)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001175 case AF_PACKET:
1176 {
1177 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
1178 char *ifname = "";
1179 struct ifreq ifr;
1180 /* need to look up interface name give index */
1181 if (a->sll_ifindex) {
1182 ifr.ifr_ifindex = a->sll_ifindex;
1183 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1184 ifname = ifr.ifr_name;
1185 }
1186 return Py_BuildValue("shbhy#",
1187 ifname,
1188 ntohs(a->sll_protocol),
1189 a->sll_pkttype,
1190 a->sll_hatype,
1191 a->sll_addr,
1192 a->sll_halen);
1193 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001194#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001195
Christian Heimes043d6f62008-01-07 17:19:16 +00001196#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001197 case AF_TIPC:
1198 {
1199 struct sockaddr_tipc *a = (struct sockaddr_tipc *) addr;
1200 if (a->addrtype == TIPC_ADDR_NAMESEQ) {
1201 return Py_BuildValue("IIIII",
1202 a->addrtype,
1203 a->addr.nameseq.type,
1204 a->addr.nameseq.lower,
1205 a->addr.nameseq.upper,
1206 a->scope);
1207 } else if (a->addrtype == TIPC_ADDR_NAME) {
1208 return Py_BuildValue("IIIII",
1209 a->addrtype,
1210 a->addr.name.name.type,
1211 a->addr.name.name.instance,
1212 a->addr.name.name.instance,
1213 a->scope);
1214 } else if (a->addrtype == TIPC_ADDR_ID) {
1215 return Py_BuildValue("IIIII",
1216 a->addrtype,
1217 a->addr.id.node,
1218 a->addr.id.ref,
1219 0,
1220 a->scope);
1221 } else {
1222 PyErr_SetString(PyExc_ValueError,
1223 "Invalid address type");
1224 return NULL;
1225 }
1226 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001227#endif
1228
Charles-François Natali30589c92011-10-07 22:47:08 +02001229#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02001230 case AF_CAN:
1231 {
1232 struct sockaddr_can *a = (struct sockaddr_can *)addr;
1233 char *ifname = "";
1234 struct ifreq ifr;
1235 /* need to look up interface name given index */
1236 if (a->can_ifindex) {
1237 ifr.ifr_ifindex = a->can_ifindex;
1238 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1239 ifname = ifr.ifr_name;
1240 }
1241
1242 return Py_BuildValue("O&h", PyUnicode_DecodeFSDefault,
1243 ifname,
1244 a->can_family);
1245 }
1246#endif
1247
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001248#ifdef PF_SYSTEM
1249 case PF_SYSTEM:
1250 switch(proto) {
1251#ifdef SYSPROTO_CONTROL
1252 case SYSPROTO_CONTROL:
1253 {
1254 struct sockaddr_ctl *a = (struct sockaddr_ctl *)addr;
1255 return Py_BuildValue("(II)", a->sc_id, a->sc_unit);
1256 }
1257#endif
1258 default:
1259 PyErr_SetString(PyExc_ValueError,
1260 "Invalid address type");
1261 return 0;
1262 }
1263#endif
1264
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001265 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001266
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001267 default:
1268 /* If we don't know the address family, don't raise an
1269 exception -- return it as an (int, bytes) tuple. */
1270 return Py_BuildValue("iy#",
1271 addr->sa_family,
1272 addr->sa_data,
1273 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001274
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001275 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001276}
1277
Guido van Rossum30a685f1991-06-27 15:51:29 +00001278
1279/* Parse a socket address argument according to the socket object's
1280 address family. Return 1 if the address was in the proper format,
1281 0 of not. The address is returned through addr_ret, its length
1282 through len_ret. */
1283
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001284static int
Guido van Rossum48a680c2001-03-02 06:34:14 +00001285getsockaddrarg(PySocketSockObject *s, PyObject *args,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001286 struct sockaddr *addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001287{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001288 switch (s->sock_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001289
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001290#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001291 case AF_UNIX:
1292 {
1293 struct sockaddr_un* addr;
1294 char *path;
1295 int len;
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001296 int retval = 0;
1297
1298 /* PEP 383. Not using PyUnicode_FSConverter since we need to
1299 allow embedded nulls on Linux. */
1300 if (PyUnicode_Check(args)) {
1301 if ((args = PyUnicode_EncodeFSDefault(args)) == NULL)
1302 return 0;
1303 }
1304 else
1305 Py_INCREF(args);
1306 if (!PyArg_Parse(args, "y#", &path, &len))
1307 goto unix_out;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001308
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001309 addr = (struct sockaddr_un*)addr_ret;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001310#ifdef linux
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001311 if (len > 0 && path[0] == 0) {
1312 /* Linux abstract namespace extension */
1313 if (len > sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001314 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001315 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001316 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001317 }
1318 }
1319 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001320#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001321 {
1322 /* regular NULL-terminated string */
1323 if (len >= sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001324 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001325 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001326 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001327 }
1328 addr->sun_path[len] = 0;
1329 }
1330 addr->sun_family = s->sock_family;
1331 memcpy(addr->sun_path, path, len);
Andrew MacIntyredaedf212004-04-11 12:03:57 +00001332#if defined(PYOS_OS2)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001333 *len_ret = sizeof(*addr);
Andrew MacIntyredaedf212004-04-11 12:03:57 +00001334#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001335 *len_ret = len + offsetof(struct sockaddr_un, sun_path);
Andrew MacIntyredaedf212004-04-11 12:03:57 +00001336#endif
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001337 retval = 1;
1338 unix_out:
1339 Py_DECREF(args);
1340 return retval;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001341 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001342#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001343
Martin v. Löwis11017b12006-01-14 18:12:57 +00001344#if defined(AF_NETLINK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001345 case AF_NETLINK:
1346 {
1347 struct sockaddr_nl* addr;
1348 int pid, groups;
1349 addr = (struct sockaddr_nl *)addr_ret;
1350 if (!PyTuple_Check(args)) {
1351 PyErr_Format(
1352 PyExc_TypeError,
1353 "getsockaddrarg: "
1354 "AF_NETLINK address must be tuple, not %.500s",
1355 Py_TYPE(args)->tp_name);
1356 return 0;
1357 }
1358 if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &pid, &groups))
1359 return 0;
1360 addr->nl_family = AF_NETLINK;
1361 addr->nl_pid = pid;
1362 addr->nl_groups = groups;
1363 *len_ret = sizeof(*addr);
1364 return 1;
1365 }
Martin v. Löwis11017b12006-01-14 18:12:57 +00001366#endif
1367
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001368#ifdef AF_RDS
1369 case AF_RDS:
1370 /* RDS sockets use sockaddr_in: fall-through */
1371#endif
1372
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001373 case AF_INET:
1374 {
1375 struct sockaddr_in* addr;
1376 char *host;
1377 int port, result;
1378 if (!PyTuple_Check(args)) {
1379 PyErr_Format(
1380 PyExc_TypeError,
1381 "getsockaddrarg: "
1382 "AF_INET address must be tuple, not %.500s",
1383 Py_TYPE(args)->tp_name);
1384 return 0;
1385 }
1386 if (!PyArg_ParseTuple(args, "eti:getsockaddrarg",
1387 "idna", &host, &port))
1388 return 0;
1389 addr=(struct sockaddr_in*)addr_ret;
1390 result = setipaddr(host, (struct sockaddr *)addr,
1391 sizeof(*addr), AF_INET);
1392 PyMem_Free(host);
1393 if (result < 0)
1394 return 0;
1395 if (port < 0 || port > 0xffff) {
1396 PyErr_SetString(
1397 PyExc_OverflowError,
1398 "getsockaddrarg: port must be 0-65535.");
1399 return 0;
1400 }
1401 addr->sin_family = AF_INET;
1402 addr->sin_port = htons((short)port);
1403 *len_ret = sizeof *addr;
1404 return 1;
1405 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001406
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001407#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001408 case AF_INET6:
1409 {
1410 struct sockaddr_in6* addr;
1411 char *host;
Charles-François Natali366999a2012-01-02 15:47:29 +01001412 int port, result;
1413 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001414 flowinfo = scope_id = 0;
1415 if (!PyTuple_Check(args)) {
1416 PyErr_Format(
1417 PyExc_TypeError,
1418 "getsockaddrarg: "
1419 "AF_INET6 address must be tuple, not %.500s",
1420 Py_TYPE(args)->tp_name);
1421 return 0;
1422 }
Charles-François Natali366999a2012-01-02 15:47:29 +01001423 if (!PyArg_ParseTuple(args, "eti|II",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001424 "idna", &host, &port, &flowinfo,
1425 &scope_id)) {
1426 return 0;
1427 }
1428 addr = (struct sockaddr_in6*)addr_ret;
1429 result = setipaddr(host, (struct sockaddr *)addr,
1430 sizeof(*addr), AF_INET6);
1431 PyMem_Free(host);
1432 if (result < 0)
1433 return 0;
1434 if (port < 0 || port > 0xffff) {
1435 PyErr_SetString(
1436 PyExc_OverflowError,
1437 "getsockaddrarg: port must be 0-65535.");
1438 return 0;
1439 }
Charles-François Natali366999a2012-01-02 15:47:29 +01001440 if (flowinfo < 0 || flowinfo > 0xfffff) {
1441 PyErr_SetString(
1442 PyExc_OverflowError,
1443 "getsockaddrarg: flowinfo must be 0-1048575.");
1444 return 0;
1445 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001446 addr->sin6_family = s->sock_family;
1447 addr->sin6_port = htons((short)port);
Charles-François Natali366999a2012-01-02 15:47:29 +01001448 addr->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001449 addr->sin6_scope_id = scope_id;
1450 *len_ret = sizeof *addr;
1451 return 1;
1452 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001453#endif
1454
Hye-Shik Chang81268602004-02-02 06:05:24 +00001455#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001456 case AF_BLUETOOTH:
1457 {
1458 switch (s->sock_proto) {
1459 case BTPROTO_L2CAP:
1460 {
1461 struct sockaddr_l2 *addr;
1462 char *straddr;
Martin v. Löwis12af0482004-01-31 12:34:17 +00001463
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001464 addr = (struct sockaddr_l2 *)addr_ret;
1465 memset(addr, 0, sizeof(struct sockaddr_l2));
1466 _BT_L2_MEMB(addr, family) = AF_BLUETOOTH;
1467 if (!PyArg_ParseTuple(args, "si", &straddr,
1468 &_BT_L2_MEMB(addr, psm))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001469 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001470 "wrong format");
1471 return 0;
1472 }
1473 if (setbdaddr(straddr, &_BT_L2_MEMB(addr, bdaddr)) < 0)
1474 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001475
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001476 *len_ret = sizeof *addr;
1477 return 1;
1478 }
1479 case BTPROTO_RFCOMM:
1480 {
1481 struct sockaddr_rc *addr;
1482 char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001483
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001484 addr = (struct sockaddr_rc *)addr_ret;
1485 _BT_RC_MEMB(addr, family) = AF_BLUETOOTH;
1486 if (!PyArg_ParseTuple(args, "si", &straddr,
1487 &_BT_RC_MEMB(addr, channel))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001488 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001489 "wrong format");
1490 return 0;
1491 }
1492 if (setbdaddr(straddr, &_BT_RC_MEMB(addr, bdaddr)) < 0)
1493 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001494
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001495 *len_ret = sizeof *addr;
1496 return 1;
1497 }
1498 case BTPROTO_HCI:
1499 {
1500 struct sockaddr_hci *addr = (struct sockaddr_hci *)addr_ret;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001501#if defined(__NetBSD__) || defined(__DragonFly__)
Alexander Belopolskye239d232010-12-08 23:31:48 +00001502 char *straddr = PyBytes_AS_STRING(args);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001503
Alexander Belopolskye239d232010-12-08 23:31:48 +00001504 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001505 if (straddr == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001506 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001507 "wrong format");
1508 return 0;
1509 }
1510 if (setbdaddr(straddr, &_BT_HCI_MEMB(addr, bdaddr)) < 0)
1511 return 0;
1512#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001513 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
1514 if (!PyArg_ParseTuple(args, "i", &_BT_HCI_MEMB(addr, dev))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001515 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001516 "wrong format");
1517 return 0;
1518 }
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001519#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001520 *len_ret = sizeof *addr;
1521 return 1;
1522 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001523#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001524 case BTPROTO_SCO:
1525 {
1526 struct sockaddr_sco *addr;
1527 char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001528
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001529 addr = (struct sockaddr_sco *)addr_ret;
1530 _BT_SCO_MEMB(addr, family) = AF_BLUETOOTH;
1531 if (!PyBytes_Check(args)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001532 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001533 "wrong format");
1534 return 0;
1535 }
1536 straddr = PyBytes_AS_STRING(args);
1537 if (setbdaddr(straddr, &_BT_SCO_MEMB(addr, bdaddr)) < 0)
1538 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001539
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001540 *len_ret = sizeof *addr;
1541 return 1;
1542 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001543#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001544 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001545 PyErr_SetString(PyExc_OSError, "getsockaddrarg: unknown Bluetooth protocol");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001546 return 0;
1547 }
1548 }
Martin v. Löwis12af0482004-01-31 12:34:17 +00001549#endif
1550
Antoine Pitroub156a462010-10-27 20:13:57 +00001551#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFINDEX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001552 case AF_PACKET:
1553 {
1554 struct sockaddr_ll* addr;
1555 struct ifreq ifr;
1556 char *interfaceName;
1557 int protoNumber;
1558 int hatype = 0;
1559 int pkttype = 0;
1560 char *haddr = NULL;
1561 unsigned int halen = 0;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001562
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001563 if (!PyTuple_Check(args)) {
1564 PyErr_Format(
1565 PyExc_TypeError,
1566 "getsockaddrarg: "
1567 "AF_PACKET address must be tuple, not %.500s",
1568 Py_TYPE(args)->tp_name);
1569 return 0;
1570 }
1571 if (!PyArg_ParseTuple(args, "si|iiy#", &interfaceName,
1572 &protoNumber, &pkttype, &hatype,
1573 &haddr, &halen))
1574 return 0;
1575 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
1576 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
1577 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1578 s->errorhandler();
1579 return 0;
1580 }
1581 if (halen > 8) {
1582 PyErr_SetString(PyExc_ValueError,
1583 "Hardware address must be 8 bytes or less");
1584 return 0;
1585 }
1586 if (protoNumber < 0 || protoNumber > 0xffff) {
1587 PyErr_SetString(
1588 PyExc_OverflowError,
1589 "getsockaddrarg: protoNumber must be 0-65535.");
1590 return 0;
1591 }
1592 addr = (struct sockaddr_ll*)addr_ret;
1593 addr->sll_family = AF_PACKET;
1594 addr->sll_protocol = htons((short)protoNumber);
1595 addr->sll_ifindex = ifr.ifr_ifindex;
1596 addr->sll_pkttype = pkttype;
1597 addr->sll_hatype = hatype;
1598 if (halen != 0) {
1599 memcpy(&addr->sll_addr, haddr, halen);
1600 }
1601 addr->sll_halen = halen;
1602 *len_ret = sizeof *addr;
1603 return 1;
1604 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00001605#endif
1606
Christian Heimes043d6f62008-01-07 17:19:16 +00001607#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001608 case AF_TIPC:
1609 {
1610 unsigned int atype, v1, v2, v3;
1611 unsigned int scope = TIPC_CLUSTER_SCOPE;
1612 struct sockaddr_tipc *addr;
Christian Heimes043d6f62008-01-07 17:19:16 +00001613
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001614 if (!PyTuple_Check(args)) {
1615 PyErr_Format(
1616 PyExc_TypeError,
1617 "getsockaddrarg: "
1618 "AF_TIPC address must be tuple, not %.500s",
1619 Py_TYPE(args)->tp_name);
1620 return 0;
1621 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001622
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001623 if (!PyArg_ParseTuple(args,
1624 "IIII|I;Invalid TIPC address format",
1625 &atype, &v1, &v2, &v3, &scope))
1626 return 0;
Christian Heimes043d6f62008-01-07 17:19:16 +00001627
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001628 addr = (struct sockaddr_tipc *) addr_ret;
1629 memset(addr, 0, sizeof(struct sockaddr_tipc));
Christian Heimes043d6f62008-01-07 17:19:16 +00001630
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001631 addr->family = AF_TIPC;
1632 addr->scope = scope;
1633 addr->addrtype = atype;
Christian Heimes043d6f62008-01-07 17:19:16 +00001634
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001635 if (atype == TIPC_ADDR_NAMESEQ) {
1636 addr->addr.nameseq.type = v1;
1637 addr->addr.nameseq.lower = v2;
1638 addr->addr.nameseq.upper = v3;
1639 } else if (atype == TIPC_ADDR_NAME) {
1640 addr->addr.name.name.type = v1;
1641 addr->addr.name.name.instance = v2;
1642 } else if (atype == TIPC_ADDR_ID) {
1643 addr->addr.id.node = v1;
1644 addr->addr.id.ref = v2;
1645 } else {
1646 /* Shouldn't happen */
1647 PyErr_SetString(PyExc_TypeError, "Invalid address type");
1648 return 0;
1649 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001650
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001651 *len_ret = sizeof(*addr);
Christian Heimes043d6f62008-01-07 17:19:16 +00001652
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001653 return 1;
1654 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001655#endif
1656
Charles-François Natali30589c92011-10-07 22:47:08 +02001657#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02001658 case AF_CAN:
1659 switch (s->sock_proto) {
1660 case CAN_RAW:
1661 {
1662 struct sockaddr_can *addr;
1663 PyObject *interfaceName;
1664 struct ifreq ifr;
1665 addr = (struct sockaddr_can *)addr_ret;
1666 Py_ssize_t len;
1667
1668 if (!PyArg_ParseTuple(args, "O&", PyUnicode_FSConverter,
1669 &interfaceName))
1670 return 0;
1671
1672 len = PyBytes_GET_SIZE(interfaceName);
1673
1674 if (len == 0) {
1675 ifr.ifr_ifindex = 0;
1676 } else if (len < sizeof(ifr.ifr_name)) {
1677 strcpy(ifr.ifr_name, PyBytes_AS_STRING(interfaceName));
1678 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1679 s->errorhandler();
1680 Py_DECREF(interfaceName);
1681 return 0;
1682 }
1683 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001684 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02001685 "AF_CAN interface name too long");
1686 Py_DECREF(interfaceName);
1687 return 0;
1688 }
1689
1690 addr->can_family = AF_CAN;
1691 addr->can_ifindex = ifr.ifr_ifindex;
1692
1693 *len_ret = sizeof(*addr);
1694 Py_DECREF(interfaceName);
1695 return 1;
1696 }
1697 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001698 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02001699 "getsockaddrarg: unsupported CAN protocol");
1700 return 0;
1701 }
1702#endif
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001703
1704#ifdef PF_SYSTEM
1705 case PF_SYSTEM:
1706 switch (s->sock_proto) {
1707#ifdef SYSPROTO_CONTROL
1708 case SYSPROTO_CONTROL:
1709 {
1710 struct sockaddr_ctl *addr;
1711
1712 addr = (struct sockaddr_ctl *)addr_ret;
1713 addr->sc_family = AF_SYSTEM;
1714 addr->ss_sysaddr = AF_SYS_CONTROL;
1715
1716 if (PyUnicode_Check(args)) {
1717 struct ctl_info info;
1718 PyObject *ctl_name;
1719
1720 if (!PyArg_Parse(args, "O&",
1721 PyUnicode_FSConverter, &ctl_name)) {
1722 return 0;
1723 }
1724
1725 if (PyBytes_GET_SIZE(ctl_name) > sizeof(info.ctl_name)) {
1726 PyErr_SetString(PyExc_ValueError,
1727 "provided string is too long");
1728 Py_DECREF(ctl_name);
1729 return 0;
1730 }
1731 strncpy(info.ctl_name, PyBytes_AS_STRING(ctl_name),
1732 sizeof(info.ctl_name));
1733 Py_DECREF(ctl_name);
1734
1735 if (ioctl(s->sock_fd, CTLIOCGINFO, &info)) {
1736 PyErr_SetString(PyExc_OSError,
1737 "cannot find kernel control with provided name");
1738 return 0;
1739 }
1740
1741 addr->sc_id = info.ctl_id;
1742 addr->sc_unit = 0;
1743 } else if (!PyArg_ParseTuple(args, "II",
1744 &(addr->sc_id), &(addr->sc_unit))) {
1745 PyErr_SetString(PyExc_TypeError, "getsockaddrarg: "
1746 "expected str or tuple of two ints");
1747
1748 return 0;
1749 }
1750
1751 *len_ret = sizeof(*addr);
1752 return 1;
1753 }
1754#endif
1755 default:
1756 PyErr_SetString(PyExc_OSError,
1757 "getsockaddrarg: unsupported PF_SYSTEM protocol");
1758 return 0;
1759 }
1760#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02001761
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001762 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001763
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001764 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001765 PyErr_SetString(PyExc_OSError, "getsockaddrarg: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001766 return 0;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001767
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001768 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001769}
1770
Guido van Rossum30a685f1991-06-27 15:51:29 +00001771
Guido van Rossum48a680c2001-03-02 06:34:14 +00001772/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +00001773 Return 1 if the family is known, 0 otherwise. The length is returned
1774 through len_ret. */
1775
1776static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +00001777getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +00001778{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001779 switch (s->sock_family) {
Guido van Rossum710e1df1992-06-12 10:39:36 +00001780
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001781#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001782 case AF_UNIX:
1783 {
1784 *len_ret = sizeof (struct sockaddr_un);
1785 return 1;
1786 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001787#endif /* AF_UNIX */
Martin v. Löwis11017b12006-01-14 18:12:57 +00001788#if defined(AF_NETLINK)
1789 case AF_NETLINK:
1790 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001791 *len_ret = sizeof (struct sockaddr_nl);
1792 return 1;
Martin v. Löwis11017b12006-01-14 18:12:57 +00001793 }
1794#endif
Guido van Rossum710e1df1992-06-12 10:39:36 +00001795
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001796#ifdef AF_RDS
1797 case AF_RDS:
1798 /* RDS sockets use sockaddr_in: fall-through */
1799#endif
1800
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001801 case AF_INET:
1802 {
1803 *len_ret = sizeof (struct sockaddr_in);
1804 return 1;
1805 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00001806
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001807#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001808 case AF_INET6:
1809 {
1810 *len_ret = sizeof (struct sockaddr_in6);
1811 return 1;
1812 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001813#endif
1814
Hye-Shik Chang81268602004-02-02 06:05:24 +00001815#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001816 case AF_BLUETOOTH:
1817 {
1818 switch(s->sock_proto)
1819 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001820
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001821 case BTPROTO_L2CAP:
1822 *len_ret = sizeof (struct sockaddr_l2);
1823 return 1;
1824 case BTPROTO_RFCOMM:
1825 *len_ret = sizeof (struct sockaddr_rc);
1826 return 1;
1827 case BTPROTO_HCI:
1828 *len_ret = sizeof (struct sockaddr_hci);
1829 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00001830#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001831 case BTPROTO_SCO:
1832 *len_ret = sizeof (struct sockaddr_sco);
1833 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00001834#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001835 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001836 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001837 "unknown BT protocol");
1838 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001839
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001840 }
1841 }
Martin v. Löwis12af0482004-01-31 12:34:17 +00001842#endif
1843
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00001844#ifdef HAVE_NETPACKET_PACKET_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001845 case AF_PACKET:
1846 {
1847 *len_ret = sizeof (struct sockaddr_ll);
1848 return 1;
1849 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001850#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001851
Christian Heimes043d6f62008-01-07 17:19:16 +00001852#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001853 case AF_TIPC:
1854 {
1855 *len_ret = sizeof (struct sockaddr_tipc);
1856 return 1;
1857 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001858#endif
1859
Charles-François Natali30589c92011-10-07 22:47:08 +02001860#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02001861 case AF_CAN:
1862 {
1863 *len_ret = sizeof (struct sockaddr_can);
1864 return 1;
1865 }
1866#endif
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001867
1868#ifdef PF_SYSTEM
1869 case PF_SYSTEM:
1870 switch(s->sock_proto) {
1871#ifdef SYSPROTO_CONTROL
1872 case SYSPROTO_CONTROL:
1873 *len_ret = sizeof (struct sockaddr_ctl);
1874 return 1;
1875#endif
1876 default:
1877 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
1878 "unknown PF_SYSTEM protocol");
1879 return 0;
1880 }
1881#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02001882
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001883 /* More cases here... */
Guido van Rossum710e1df1992-06-12 10:39:36 +00001884
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001885 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001886 PyErr_SetString(PyExc_OSError, "getsockaddrlen: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001887 return 0;
Guido van Rossum710e1df1992-06-12 10:39:36 +00001888
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001889 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00001890}
1891
1892
Nick Coghlan96fe56a2011-08-22 11:55:57 +10001893/* Support functions for the sendmsg() and recvmsg[_into]() methods.
1894 Currently, these methods are only compiled if the RFC 2292/3542
1895 CMSG_LEN() macro is available. Older systems seem to have used
1896 sizeof(struct cmsghdr) + (length) where CMSG_LEN() is used now, so
1897 it may be possible to define CMSG_LEN() that way if it's not
1898 provided. Some architectures might need extra padding after the
1899 cmsghdr, however, and CMSG_LEN() would have to take account of
1900 this. */
1901#ifdef CMSG_LEN
1902/* If length is in range, set *result to CMSG_LEN(length) and return
1903 true; otherwise, return false. */
1904static int
1905get_CMSG_LEN(size_t length, size_t *result)
1906{
1907 size_t tmp;
1908
1909 if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0)))
1910 return 0;
1911 tmp = CMSG_LEN(length);
1912 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
1913 return 0;
1914 *result = tmp;
1915 return 1;
1916}
1917
1918#ifdef CMSG_SPACE
1919/* If length is in range, set *result to CMSG_SPACE(length) and return
1920 true; otherwise, return false. */
1921static int
1922get_CMSG_SPACE(size_t length, size_t *result)
1923{
1924 size_t tmp;
1925
1926 /* Use CMSG_SPACE(1) here in order to take account of the padding
1927 necessary before *and* after the data. */
1928 if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1)))
1929 return 0;
1930 tmp = CMSG_SPACE(length);
1931 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
1932 return 0;
1933 *result = tmp;
1934 return 1;
1935}
1936#endif
1937
1938/* Return true iff msg->msg_controllen is valid, cmsgh is a valid
1939 pointer in msg->msg_control with at least "space" bytes after it,
1940 and its cmsg_len member inside the buffer. */
1941static int
1942cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space)
1943{
1944 size_t cmsg_offset;
1945 static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) +
1946 sizeof(cmsgh->cmsg_len));
1947
Charles-François Natali466517d2011-08-28 18:23:43 +02001948 /* Note that POSIX allows msg_controllen to be of signed type. */
1949 if (cmsgh == NULL || msg->msg_control == NULL || msg->msg_controllen < 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10001950 return 0;
1951 if (space < cmsg_len_end)
1952 space = cmsg_len_end;
1953 cmsg_offset = (char *)cmsgh - (char *)msg->msg_control;
1954 return (cmsg_offset <= (size_t)-1 - space &&
1955 cmsg_offset + space <= msg->msg_controllen);
1956}
1957
1958/* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set
1959 *space to number of bytes following it in the buffer and return
1960 true; otherwise, return false. Assumes cmsgh, msg->msg_control and
1961 msg->msg_controllen are valid. */
1962static int
1963get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space)
1964{
1965 size_t data_offset;
1966 char *data_ptr;
1967
1968 if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL)
1969 return 0;
1970 data_offset = data_ptr - (char *)msg->msg_control;
1971 if (data_offset > msg->msg_controllen)
1972 return 0;
1973 *space = msg->msg_controllen - data_offset;
1974 return 1;
1975}
1976
1977/* If cmsgh is invalid or not contained in the buffer pointed to by
1978 msg->msg_control, return -1. If cmsgh is valid and its associated
1979 data is entirely contained in the buffer, set *data_len to the
1980 length of the associated data and return 0. If only part of the
1981 associated data is contained in the buffer but cmsgh is otherwise
1982 valid, set *data_len to the length contained in the buffer and
1983 return 1. */
1984static int
1985get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len)
1986{
1987 size_t space, cmsg_data_len;
1988
1989 if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) ||
1990 cmsgh->cmsg_len < CMSG_LEN(0))
1991 return -1;
1992 cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0);
1993 if (!get_cmsg_data_space(msg, cmsgh, &space))
1994 return -1;
1995 if (space >= cmsg_data_len) {
1996 *data_len = cmsg_data_len;
1997 return 0;
1998 }
1999 *data_len = space;
2000 return 1;
2001}
2002#endif /* CMSG_LEN */
2003
2004
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002005/* s._accept() -> (fd, address) */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002006
Guido van Rossum73624e91994-10-10 17:59:00 +00002007static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002008sock_accept(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002009{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002010 sock_addr_t addrbuf;
2011 SOCKET_T newfd = INVALID_SOCKET;
2012 socklen_t addrlen;
2013 PyObject *sock = NULL;
2014 PyObject *addr = NULL;
2015 PyObject *res = NULL;
2016 int timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002017 if (!getsockaddrlen(s, &addrlen))
2018 return NULL;
2019 memset(&addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002020
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002021 if (!IS_SELECTABLE(s))
2022 return select_error();
Neal Norwitz082b2df2006-02-07 07:04:46 +00002023
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002024 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002025 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002026 timeout = internal_select_ex(s, 0, interval);
Antoine Pitroub1c54962010-10-14 15:05:38 +00002027 if (!timeout) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002028 newfd = accept(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
Antoine Pitroub1c54962010-10-14 15:05:38 +00002029 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002030 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002031
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002032 if (timeout == 1) {
2033 PyErr_SetString(socket_timeout, "timed out");
2034 return NULL;
2035 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002036 END_SELECT_LOOP(s)
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002037
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002038 if (newfd == INVALID_SOCKET)
2039 return s->errorhandler();
Barry Warsaw752300b1997-01-03 17:18:10 +00002040
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002041 sock = PyLong_FromSocket_t(newfd);
2042 if (sock == NULL) {
2043 SOCKETCLOSE(newfd);
2044 goto finally;
2045 }
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002046
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002047 addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
2048 addrlen, s->sock_proto);
2049 if (addr == NULL)
2050 goto finally;
Barry Warsaw752300b1997-01-03 17:18:10 +00002051
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002052 res = PyTuple_Pack(2, sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00002053
Guido van Rossum67f7a382002-06-06 21:08:16 +00002054finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002055 Py_XDECREF(sock);
2056 Py_XDECREF(addr);
2057 return res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002058}
2059
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002060PyDoc_STRVAR(accept_doc,
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002061"_accept() -> (integer, address info)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002062\n\
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002063Wait for an incoming connection. Return a new socket file descriptor\n\
2064representing the connection, and the address of the client.\n\
2065For IP sockets, the address info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002066
Guido van Rossum11ba0942002-06-13 15:07:44 +00002067/* s.setblocking(flag) method. Argument:
2068 False -- non-blocking mode; same as settimeout(0)
2069 True -- blocking mode; same as settimeout(None)
2070*/
Guido van Rossume4485b01994-09-07 14:32:49 +00002071
Guido van Rossum73624e91994-10-10 17:59:00 +00002072static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002073sock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00002074{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002075 int block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002076
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002077 block = PyLong_AsLong(arg);
2078 if (block == -1 && PyErr_Occurred())
2079 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002080
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002081 s->sock_timeout = block ? -1.0 : 0.0;
2082 internal_setblocking(s, block);
Guido van Rossume4485b01994-09-07 14:32:49 +00002083
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002084 Py_INCREF(Py_None);
2085 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +00002086}
Guido van Rossume4485b01994-09-07 14:32:49 +00002087
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002088PyDoc_STRVAR(setblocking_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002089"setblocking(flag)\n\
2090\n\
2091Set the socket to blocking (flag is true) or non-blocking (false).\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002092setblocking(True) is equivalent to settimeout(None);\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002093setblocking(False) is equivalent to settimeout(0.0).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002094
Guido van Rossum11ba0942002-06-13 15:07:44 +00002095/* s.settimeout(timeout) method. Argument:
2096 None -- no timeout, blocking mode; same as setblocking(True)
2097 0.0 -- non-blocking mode; same as setblocking(False)
2098 > 0 -- timeout mode; operations time out after timeout seconds
2099 < 0 -- illegal; raises an exception
2100*/
Guido van Rossum67f7a382002-06-06 21:08:16 +00002101static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002102sock_settimeout(PySocketSockObject *s, PyObject *arg)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002103{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002104 double timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002105
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002106 if (arg == Py_None)
2107 timeout = -1.0;
2108 else {
2109 timeout = PyFloat_AsDouble(arg);
2110 if (timeout < 0.0) {
2111 if (!PyErr_Occurred())
2112 PyErr_SetString(PyExc_ValueError,
2113 "Timeout value out of range");
2114 return NULL;
2115 }
2116 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002117
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002118 s->sock_timeout = timeout;
2119 internal_setblocking(s, timeout < 0.0);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002120
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002121 Py_INCREF(Py_None);
2122 return Py_None;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002123}
2124
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002125PyDoc_STRVAR(settimeout_doc,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002126"settimeout(timeout)\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002127\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002128Set a timeout on socket operations. 'timeout' can be a float,\n\
2129giving in seconds, or None. Setting a timeout of None disables\n\
2130the timeout feature and is equivalent to setblocking(1).\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002131Setting a timeout of zero is the same as setblocking(0).");
Guido van Rossum67f7a382002-06-06 21:08:16 +00002132
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002133/* s.gettimeout() method.
2134 Returns the timeout associated with a socket. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00002135static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002136sock_gettimeout(PySocketSockObject *s)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002137{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002138 if (s->sock_timeout < 0.0) {
2139 Py_INCREF(Py_None);
2140 return Py_None;
2141 }
2142 else
2143 return PyFloat_FromDouble(s->sock_timeout);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002144}
2145
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002146PyDoc_STRVAR(gettimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002147"gettimeout() -> timeout\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002148\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03002149Returns the timeout in seconds (float) associated with socket \n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002150operations. A timeout of None indicates that timeouts on socket \n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002151operations are disabled.");
Guido van Rossume4485b01994-09-07 14:32:49 +00002152
Guido van Rossumaee08791992-09-08 09:05:33 +00002153/* s.setsockopt() method.
2154 With an integer third argument, sets an integer option.
2155 With a string third argument, sets an option from a buffer;
2156 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002157
Guido van Rossum73624e91994-10-10 17:59:00 +00002158static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002159sock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002160{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002161 int level;
2162 int optname;
2163 int res;
2164 char *buf;
2165 int buflen;
2166 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002167
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002168 if (PyArg_ParseTuple(args, "iii:setsockopt",
2169 &level, &optname, &flag)) {
2170 buf = (char *) &flag;
2171 buflen = sizeof flag;
2172 }
2173 else {
2174 PyErr_Clear();
2175 if (!PyArg_ParseTuple(args, "iiy#:setsockopt",
2176 &level, &optname, &buf, &buflen))
2177 return NULL;
2178 }
2179 res = setsockopt(s->sock_fd, level, optname, (void *)buf, buflen);
2180 if (res < 0)
2181 return s->errorhandler();
2182 Py_INCREF(Py_None);
2183 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002184}
2185
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002186PyDoc_STRVAR(setsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002187"setsockopt(level, option, value)\n\
2188\n\
2189Set a socket option. See the Unix manual for level and option.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002190The value argument can either be an integer or a string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002191
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002192
Guido van Rossumaee08791992-09-08 09:05:33 +00002193/* s.getsockopt() method.
2194 With two arguments, retrieves an integer option.
2195 With a third integer argument, retrieves a string buffer of that size;
2196 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002197
Guido van Rossum73624e91994-10-10 17:59:00 +00002198static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002199sock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002200{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002201 int level;
2202 int optname;
2203 int res;
2204 PyObject *buf;
2205 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002206
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002207 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
2208 &level, &optname, &buflen))
2209 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002210
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002211 if (buflen == 0) {
2212 int flag = 0;
2213 socklen_t flagsize = sizeof flag;
2214 res = getsockopt(s->sock_fd, level, optname,
2215 (void *)&flag, &flagsize);
2216 if (res < 0)
2217 return s->errorhandler();
2218 return PyLong_FromLong(flag);
2219 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002220#ifdef __VMS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002221 /* socklen_t is unsigned so no negative test is needed,
2222 test buflen == 0 is previously done */
2223 if (buflen > 1024) {
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002224#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002225 if (buflen <= 0 || buflen > 1024) {
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002226#endif
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002227 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002228 "getsockopt buflen out of range");
2229 return NULL;
2230 }
2231 buf = PyBytes_FromStringAndSize((char *)NULL, buflen);
2232 if (buf == NULL)
2233 return NULL;
2234 res = getsockopt(s->sock_fd, level, optname,
2235 (void *)PyBytes_AS_STRING(buf), &buflen);
2236 if (res < 0) {
2237 Py_DECREF(buf);
2238 return s->errorhandler();
2239 }
2240 _PyBytes_Resize(&buf, buflen);
2241 return buf;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002242}
2243
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002244PyDoc_STRVAR(getsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002245"getsockopt(level, option[, buffersize]) -> value\n\
2246\n\
2247Get a socket option. See the Unix manual for level and option.\n\
2248If a nonzero buffersize argument is given, the return value is a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002249string of that length; otherwise it is an integer.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002250
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002251
Fred Drake728819a2000-07-01 03:40:12 +00002252/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002253
Guido van Rossum73624e91994-10-10 17:59:00 +00002254static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002255sock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002256{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002257 sock_addr_t addrbuf;
2258 int addrlen;
2259 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002260
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002261 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2262 return NULL;
2263 Py_BEGIN_ALLOW_THREADS
2264 res = bind(s->sock_fd, SAS2SA(&addrbuf), addrlen);
2265 Py_END_ALLOW_THREADS
2266 if (res < 0)
2267 return s->errorhandler();
2268 Py_INCREF(Py_None);
2269 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002270}
2271
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002272PyDoc_STRVAR(bind_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002273"bind(address)\n\
2274\n\
2275Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00002276pair (host, port); the host must refer to the local host. For raw packet\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002277sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002278
Guido van Rossum30a685f1991-06-27 15:51:29 +00002279
2280/* s.close() method.
2281 Set the file descriptor to -1 so operations tried subsequently
2282 will surely fail. */
2283
Guido van Rossum73624e91994-10-10 17:59:00 +00002284static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002285sock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002286{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002287 SOCKET_T fd;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002288
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002289 if ((fd = s->sock_fd) != -1) {
2290 s->sock_fd = -1;
2291 Py_BEGIN_ALLOW_THREADS
2292 (void) SOCKETCLOSE(fd);
2293 Py_END_ALLOW_THREADS
2294 }
2295 Py_INCREF(Py_None);
2296 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002297}
2298
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002299PyDoc_STRVAR(close_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002300"close()\n\
2301\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002302Close the socket. It cannot be used after this call.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002303
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002304static PyObject *
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002305sock_detach(PySocketSockObject *s)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002306{
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002307 SOCKET_T fd = s->sock_fd;
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002308 s->sock_fd = -1;
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002309 return PyLong_FromSocket_t(fd);
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002310}
2311
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002312PyDoc_STRVAR(detach_doc,
2313"detach()\n\
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002314\n\
2315Close the socket object without closing the underlying file descriptor.\
2316The object cannot be used after this call, but the file descriptor\
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002317can be reused for other purposes. The file descriptor is returned.");
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002318
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002319static int
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002320internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002321 int *timeoutp)
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002322{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002323 int res, timeout;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002324
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002325 timeout = 0;
2326 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002327
2328#ifdef MS_WINDOWS
2329
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002330 if (s->sock_timeout > 0.0) {
2331 if (res < 0 && WSAGetLastError() == WSAEWOULDBLOCK &&
2332 IS_SELECTABLE(s)) {
2333 /* This is a mess. Best solution: trust select */
2334 fd_set fds;
2335 fd_set fds_exc;
2336 struct timeval tv;
2337 tv.tv_sec = (int)s->sock_timeout;
2338 tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6);
2339 FD_ZERO(&fds);
2340 FD_SET(s->sock_fd, &fds);
2341 FD_ZERO(&fds_exc);
2342 FD_SET(s->sock_fd, &fds_exc);
Antoine Pitrou19467d22010-08-17 19:33:30 +00002343 res = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
2344 NULL, &fds, &fds_exc, &tv);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002345 if (res == 0) {
2346 res = WSAEWOULDBLOCK;
2347 timeout = 1;
2348 } else if (res > 0) {
2349 if (FD_ISSET(s->sock_fd, &fds))
2350 /* The socket is in the writable set - this
2351 means connected */
2352 res = 0;
2353 else {
2354 /* As per MS docs, we need to call getsockopt()
2355 to get the underlying error */
2356 int res_size = sizeof res;
2357 /* It must be in the exception set */
2358 assert(FD_ISSET(s->sock_fd, &fds_exc));
2359 if (0 == getsockopt(s->sock_fd, SOL_SOCKET, SO_ERROR,
2360 (char *)&res, &res_size))
2361 /* getsockopt also clears WSAGetLastError,
2362 so reset it back. */
2363 WSASetLastError(res);
2364 else
2365 res = WSAGetLastError();
2366 }
2367 }
2368 /* else if (res < 0) an error occurred */
2369 }
2370 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002371
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002372 if (res < 0)
2373 res = WSAGetLastError();
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002374
2375#else
2376
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002377 if (s->sock_timeout > 0.0) {
2378 if (res < 0 && errno == EINPROGRESS && IS_SELECTABLE(s)) {
2379 timeout = internal_select(s, 1);
2380 if (timeout == 0) {
2381 /* Bug #1019808: in case of an EINPROGRESS,
2382 use getsockopt(SO_ERROR) to get the real
2383 error. */
2384 socklen_t res_size = sizeof res;
2385 (void)getsockopt(s->sock_fd, SOL_SOCKET,
2386 SO_ERROR, &res, &res_size);
2387 if (res == EISCONN)
2388 res = 0;
2389 errno = res;
2390 }
2391 else if (timeout == -1) {
2392 res = errno; /* had error */
2393 }
2394 else
2395 res = EWOULDBLOCK; /* timed out */
2396 }
2397 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002398
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002399 if (res < 0)
2400 res = errno;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002401
2402#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002403 *timeoutp = timeout;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002404
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002405 return res;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002406}
Guido van Rossum30a685f1991-06-27 15:51:29 +00002407
Fred Drake728819a2000-07-01 03:40:12 +00002408/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002409
Guido van Rossum73624e91994-10-10 17:59:00 +00002410static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002411sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002412{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002413 sock_addr_t addrbuf;
2414 int addrlen;
2415 int res;
2416 int timeout;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002417
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002418 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2419 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002420
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002421 Py_BEGIN_ALLOW_THREADS
2422 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, &timeout);
2423 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002424
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002425 if (timeout == 1) {
2426 PyErr_SetString(socket_timeout, "timed out");
2427 return NULL;
2428 }
2429 if (res != 0)
2430 return s->errorhandler();
2431 Py_INCREF(Py_None);
2432 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002433}
2434
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002435PyDoc_STRVAR(connect_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002436"connect(address)\n\
2437\n\
2438Connect the socket to a remote address. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002439is a pair (host, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002440
Guido van Rossum30a685f1991-06-27 15:51:29 +00002441
Fred Drake728819a2000-07-01 03:40:12 +00002442/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002443
2444static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002445sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002446{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002447 sock_addr_t addrbuf;
2448 int addrlen;
2449 int res;
2450 int timeout;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002451
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002452 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2453 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002454
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002455 Py_BEGIN_ALLOW_THREADS
2456 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, &timeout);
2457 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002458
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002459 /* Signals are not errors (though they may raise exceptions). Adapted
2460 from PyErr_SetFromErrnoWithFilenameObject(). */
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002461#ifdef EINTR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002462 if (res == EINTR && PyErr_CheckSignals())
2463 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002464#endif
2465
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002466 return PyLong_FromLong((long) res);
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002467}
2468
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002469PyDoc_STRVAR(connect_ex_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002470"connect_ex(address) -> errno\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002471\n\
2472This is like connect(address), but returns an error code (the errno value)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002473instead of raising an exception when an error occurs.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002474
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002475
Guido van Rossumed233a51992-06-23 09:07:03 +00002476/* s.fileno() method */
2477
Guido van Rossum73624e91994-10-10 17:59:00 +00002478static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002479sock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00002480{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002481 return PyLong_FromSocket_t(s->sock_fd);
Guido van Rossumed233a51992-06-23 09:07:03 +00002482}
2483
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002484PyDoc_STRVAR(fileno_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002485"fileno() -> integer\n\
2486\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002487Return the integer file descriptor of the socket.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002488
Guido van Rossumed233a51992-06-23 09:07:03 +00002489
Guido van Rossumc89705d1992-11-26 08:54:07 +00002490/* s.getsockname() method */
2491
Guido van Rossum73624e91994-10-10 17:59:00 +00002492static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002493sock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002494{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002495 sock_addr_t addrbuf;
2496 int res;
2497 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002498
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002499 if (!getsockaddrlen(s, &addrlen))
2500 return NULL;
2501 memset(&addrbuf, 0, addrlen);
2502 Py_BEGIN_ALLOW_THREADS
2503 res = getsockname(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2504 Py_END_ALLOW_THREADS
2505 if (res < 0)
2506 return s->errorhandler();
2507 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2508 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002509}
2510
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002511PyDoc_STRVAR(getsockname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002512"getsockname() -> address info\n\
2513\n\
2514Return the address of the local endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002515info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002516
Guido van Rossumc89705d1992-11-26 08:54:07 +00002517
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002518#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002519/* s.getpeername() method */
2520
Guido van Rossum73624e91994-10-10 17:59:00 +00002521static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002522sock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002523{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002524 sock_addr_t addrbuf;
2525 int res;
2526 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002527
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002528 if (!getsockaddrlen(s, &addrlen))
2529 return NULL;
2530 memset(&addrbuf, 0, addrlen);
2531 Py_BEGIN_ALLOW_THREADS
2532 res = getpeername(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2533 Py_END_ALLOW_THREADS
2534 if (res < 0)
2535 return s->errorhandler();
2536 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2537 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002538}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002539
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002540PyDoc_STRVAR(getpeername_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002541"getpeername() -> address info\n\
2542\n\
2543Return the address of the remote endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002544info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002545
Guido van Rossumb6775db1994-08-01 11:34:53 +00002546#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002547
2548
Guido van Rossum30a685f1991-06-27 15:51:29 +00002549/* s.listen(n) method */
2550
Guido van Rossum73624e91994-10-10 17:59:00 +00002551static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002552sock_listen(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002553{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002554 int backlog;
2555 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002556
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002557 backlog = PyLong_AsLong(arg);
2558 if (backlog == -1 && PyErr_Occurred())
2559 return NULL;
2560 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou1be815a2011-05-10 19:16:29 +02002561 /* To avoid problems on systems that don't allow a negative backlog
2562 * (which doesn't make sense anyway) we force a minimum value of 0. */
2563 if (backlog < 0)
2564 backlog = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002565 res = listen(s->sock_fd, backlog);
2566 Py_END_ALLOW_THREADS
2567 if (res < 0)
2568 return s->errorhandler();
2569 Py_INCREF(Py_None);
2570 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002571}
2572
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002573PyDoc_STRVAR(listen_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002574"listen(backlog)\n\
2575\n\
2576Enable a server to accept connections. The backlog argument must be at\n\
Antoine Pitrou1be815a2011-05-10 19:16:29 +02002577least 0 (if it is lower, it is set to 0); it specifies the number of\n\
2578unaccepted connections that the system will allow before refusing new\n\
2579connections.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002580
2581
Thomas Wouters477c8d52006-05-27 19:21:47 +00002582/*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002583 * This is the guts of the recv() and recv_into() methods, which reads into a
Thomas Wouters902d6eb2007-01-09 23:18:33 +00002584 * char buffer. If you have any inc/dec ref to do to the objects that contain
Thomas Wouters477c8d52006-05-27 19:21:47 +00002585 * the buffer, do it in the caller. This function returns the number of bytes
Ezio Melotti13925002011-03-16 11:05:33 +02002586 * successfully read. If there was an error, it returns -1. Note that it is
Thomas Wouters477c8d52006-05-27 19:21:47 +00002587 * also possible that we return a number of bytes smaller than the request
2588 * bytes.
2589 */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002590
Antoine Pitrou19467d22010-08-17 19:33:30 +00002591static Py_ssize_t
2592sock_recv_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002593{
Antoine Pitrou19467d22010-08-17 19:33:30 +00002594 Py_ssize_t outlen = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002595 int timeout;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002596#ifdef __VMS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002597 int remaining;
2598 char *read_buf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002599#endif
2600
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002601 if (!IS_SELECTABLE(s)) {
2602 select_error();
2603 return -1;
2604 }
2605 if (len == 0) {
2606 /* If 0 bytes were requested, do nothing. */
2607 return 0;
2608 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002609
2610#ifndef __VMS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002611 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002612 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002613 timeout = internal_select_ex(s, 0, interval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002614 if (!timeout)
2615 outlen = recv(s->sock_fd, cbuf, len, flags);
2616 Py_END_ALLOW_THREADS
Thomas Wouters477c8d52006-05-27 19:21:47 +00002617
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002618 if (timeout == 1) {
2619 PyErr_SetString(socket_timeout, "timed out");
2620 return -1;
2621 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002622 END_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002623 if (outlen < 0) {
2624 /* Note: the call to errorhandler() ALWAYS indirectly returned
2625 NULL, so ignore its return value */
2626 s->errorhandler();
2627 return -1;
2628 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002629#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002630 read_buf = cbuf;
2631 remaining = len;
2632 while (remaining != 0) {
2633 unsigned int segment;
2634 int nread = -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002635
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002636 segment = remaining /SEGMENT_SIZE;
2637 if (segment != 0) {
2638 segment = SEGMENT_SIZE;
2639 }
2640 else {
2641 segment = remaining;
2642 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002643
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002644 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002645 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002646 timeout = internal_select_ex(s, 0, interval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002647 if (!timeout)
2648 nread = recv(s->sock_fd, read_buf, segment, flags);
2649 Py_END_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002650 if (timeout == 1) {
2651 PyErr_SetString(socket_timeout, "timed out");
2652 return -1;
2653 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002654 END_SELECT_LOOP(s)
2655
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002656 if (nread < 0) {
2657 s->errorhandler();
2658 return -1;
2659 }
2660 if (nread != remaining) {
2661 read_buf += nread;
2662 break;
2663 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002664
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002665 remaining -= segment;
2666 read_buf += segment;
2667 }
2668 outlen = read_buf - cbuf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002669#endif /* !__VMS */
2670
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002671 return outlen;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002672}
2673
Guido van Rossum48a680c2001-03-02 06:34:14 +00002674
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002675/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002676
Guido van Rossum73624e91994-10-10 17:59:00 +00002677static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002678sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002679{
Antoine Pitrou19467d22010-08-17 19:33:30 +00002680 Py_ssize_t recvlen, outlen;
2681 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002682 PyObject *buf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002683
Antoine Pitrou19467d22010-08-17 19:33:30 +00002684 if (!PyArg_ParseTuple(args, "n|i:recv", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002685 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002686
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002687 if (recvlen < 0) {
2688 PyErr_SetString(PyExc_ValueError,
2689 "negative buffersize in recv");
2690 return NULL;
2691 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002692
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002693 /* Allocate a new string. */
2694 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
2695 if (buf == NULL)
2696 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002697
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002698 /* Call the guts */
2699 outlen = sock_recv_guts(s, PyBytes_AS_STRING(buf), recvlen, flags);
2700 if (outlen < 0) {
2701 /* An error occurred, release the string and return an
2702 error. */
2703 Py_DECREF(buf);
2704 return NULL;
2705 }
2706 if (outlen != recvlen) {
2707 /* We did not read as many bytes as we anticipated, resize the
2708 string if possible and be successful. */
2709 _PyBytes_Resize(&buf, outlen);
2710 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002711
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002712 return buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002713}
2714
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002715PyDoc_STRVAR(recv_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002716"recv(buffersize[, flags]) -> data\n\
2717\n\
2718Receive up to buffersize bytes from the socket. For the optional flags\n\
2719argument, see the Unix manual. When no data is available, block until\n\
2720at least one byte is available or until the remote end is closed. When\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002721the remote end is closed and all data is read, return the empty string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002722
Guido van Rossum30a685f1991-06-27 15:51:29 +00002723
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002724/* s.recv_into(buffer, [nbytes [,flags]]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002725
Thomas Wouters477c8d52006-05-27 19:21:47 +00002726static PyObject*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002727sock_recv_into(PySocketSockObject *s, PyObject *args, PyObject *kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002728{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002729 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00002730
Antoine Pitrou19467d22010-08-17 19:33:30 +00002731 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002732 Py_buffer pbuf;
2733 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002734 Py_ssize_t buflen, readlen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002735
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002736 /* Get the buffer's memory */
Antoine Pitrou19467d22010-08-17 19:33:30 +00002737 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recv_into", kwlist,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002738 &pbuf, &recvlen, &flags))
2739 return NULL;
2740 buf = pbuf.buf;
2741 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002742
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002743 if (recvlen < 0) {
2744 PyBuffer_Release(&pbuf);
2745 PyErr_SetString(PyExc_ValueError,
2746 "negative buffersize in recv_into");
2747 return NULL;
2748 }
2749 if (recvlen == 0) {
2750 /* If nbytes was not specified, use the buffer's length */
2751 recvlen = buflen;
2752 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002753
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002754 /* Check if the buffer is large enough */
2755 if (buflen < recvlen) {
2756 PyBuffer_Release(&pbuf);
2757 PyErr_SetString(PyExc_ValueError,
2758 "buffer too small for requested bytes");
2759 return NULL;
2760 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002761
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002762 /* Call the guts */
2763 readlen = sock_recv_guts(s, buf, recvlen, flags);
2764 if (readlen < 0) {
2765 /* Return an error. */
2766 PyBuffer_Release(&pbuf);
2767 return NULL;
2768 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002769
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002770 PyBuffer_Release(&pbuf);
2771 /* Return the number of bytes read. Note that we do not do anything
2772 special here in the case that readlen < recvlen. */
2773 return PyLong_FromSsize_t(readlen);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002774}
2775
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002776PyDoc_STRVAR(recv_into_doc,
2777"recv_into(buffer, [nbytes[, flags]]) -> nbytes_read\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00002778\n\
2779A version of recv() that stores its data into a buffer rather than creating \n\
2780a new string. Receive up to buffersize bytes from the socket. If buffersize \n\
2781is not specified (or 0), receive up to the size available in the given buffer.\n\
2782\n\
2783See recv() for documentation about the flags.");
2784
2785
2786/*
Christian Heimes99170a52007-12-19 02:07:34 +00002787 * This is the guts of the recvfrom() and recvfrom_into() methods, which reads
2788 * into a char buffer. If you have any inc/def ref to do to the objects that
2789 * contain the buffer, do it in the caller. This function returns the number
Ezio Melotti13925002011-03-16 11:05:33 +02002790 * of bytes successfully read. If there was an error, it returns -1. Note
Christian Heimes99170a52007-12-19 02:07:34 +00002791 * that it is also possible that we return a number of bytes smaller than the
2792 * request bytes.
Thomas Wouters477c8d52006-05-27 19:21:47 +00002793 *
2794 * 'addr' is a return value for the address object. Note that you must decref
2795 * it yourself.
2796 */
Antoine Pitrou19467d22010-08-17 19:33:30 +00002797static Py_ssize_t
2798sock_recvfrom_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002799 PyObject** addr)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002800{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002801 sock_addr_t addrbuf;
2802 int timeout;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002803 Py_ssize_t n = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002804 socklen_t addrlen;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002805
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002806 *addr = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002807
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002808 if (!getsockaddrlen(s, &addrlen))
2809 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002810
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002811 if (!IS_SELECTABLE(s)) {
2812 select_error();
2813 return -1;
2814 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00002815
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002816 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002817 Py_BEGIN_ALLOW_THREADS
2818 memset(&addrbuf, 0, addrlen);
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002819 timeout = internal_select_ex(s, 0, interval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002820 if (!timeout) {
Guido van Rossum8d665e61996-06-26 18:22:49 +00002821#ifndef MS_WINDOWS
Andrew MacIntyreba43e872002-03-03 03:03:52 +00002822#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002823 n = recvfrom(s->sock_fd, cbuf, len, flags,
2824 SAS2SA(&addrbuf), &addrlen);
Guido van Rossum32c575d1997-12-02 20:37:32 +00002825#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002826 n = recvfrom(s->sock_fd, cbuf, len, flags,
2827 (void *) &addrbuf, &addrlen);
Guido van Rossum32c575d1997-12-02 20:37:32 +00002828#endif
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002829#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002830 n = recvfrom(s->sock_fd, cbuf, len, flags,
2831 SAS2SA(&addrbuf), &addrlen);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002832#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002833 }
2834 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002835
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002836 if (timeout == 1) {
2837 PyErr_SetString(socket_timeout, "timed out");
2838 return -1;
2839 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002840 END_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002841 if (n < 0) {
2842 s->errorhandler();
2843 return -1;
2844 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002845
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002846 if (!(*addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
2847 addrlen, s->sock_proto)))
2848 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002849
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002850 return n;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002851}
2852
2853/* s.recvfrom(nbytes [,flags]) method */
2854
2855static PyObject *
2856sock_recvfrom(PySocketSockObject *s, PyObject *args)
2857{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002858 PyObject *buf = NULL;
2859 PyObject *addr = NULL;
2860 PyObject *ret = NULL;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002861 int flags = 0;
2862 Py_ssize_t recvlen, outlen;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002863
Antoine Pitrou19467d22010-08-17 19:33:30 +00002864 if (!PyArg_ParseTuple(args, "n|i:recvfrom", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002865 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002866
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002867 if (recvlen < 0) {
2868 PyErr_SetString(PyExc_ValueError,
2869 "negative buffersize in recvfrom");
2870 return NULL;
2871 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00002872
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002873 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
2874 if (buf == NULL)
2875 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002876
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002877 outlen = sock_recvfrom_guts(s, PyBytes_AS_STRING(buf),
2878 recvlen, flags, &addr);
2879 if (outlen < 0) {
2880 goto finally;
2881 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002882
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002883 if (outlen != recvlen) {
2884 /* We did not read as many bytes as we anticipated, resize the
Ezio Melotti13925002011-03-16 11:05:33 +02002885 string if possible and be successful. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002886 if (_PyBytes_Resize(&buf, outlen) < 0)
Ezio Melotti13925002011-03-16 11:05:33 +02002887 /* Oopsy, not so successful after all. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002888 goto finally;
2889 }
Barry Warsaw752300b1997-01-03 17:18:10 +00002890
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002891 ret = PyTuple_Pack(2, buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002892
2893finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002894 Py_XDECREF(buf);
2895 Py_XDECREF(addr);
2896 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002897}
2898
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002899PyDoc_STRVAR(recvfrom_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002900"recvfrom(buffersize[, flags]) -> (data, address info)\n\
2901\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002902Like recv(buffersize, flags) but also return the sender's address info.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002903
Thomas Wouters477c8d52006-05-27 19:21:47 +00002904
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002905/* s.recvfrom_into(buffer[, nbytes [,flags]]) method */
Thomas Wouters477c8d52006-05-27 19:21:47 +00002906
2907static PyObject *
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002908sock_recvfrom_into(PySocketSockObject *s, PyObject *args, PyObject* kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002909{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002910 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00002911
Antoine Pitrou19467d22010-08-17 19:33:30 +00002912 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002913 Py_buffer pbuf;
2914 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002915 Py_ssize_t readlen, buflen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002916
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002917 PyObject *addr = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002918
Antoine Pitrou19467d22010-08-17 19:33:30 +00002919 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recvfrom_into",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002920 kwlist, &pbuf,
2921 &recvlen, &flags))
2922 return NULL;
2923 buf = pbuf.buf;
2924 buflen = pbuf.len;
2925 assert(buf != 0 && buflen > 0);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002926
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002927 if (recvlen < 0) {
2928 PyBuffer_Release(&pbuf);
2929 PyErr_SetString(PyExc_ValueError,
2930 "negative buffersize in recvfrom_into");
2931 return NULL;
2932 }
2933 if (recvlen == 0) {
2934 /* If nbytes was not specified, use the buffer's length */
2935 recvlen = buflen;
2936 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002937
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002938 readlen = sock_recvfrom_guts(s, buf, recvlen, flags, &addr);
2939 if (readlen < 0) {
2940 PyBuffer_Release(&pbuf);
2941 /* Return an error */
2942 Py_XDECREF(addr);
2943 return NULL;
2944 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002945
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002946 PyBuffer_Release(&pbuf);
2947 /* Return the number of bytes read and the address. Note that we do
2948 not do anything special here in the case that readlen < recvlen. */
Antoine Pitrou19467d22010-08-17 19:33:30 +00002949 return Py_BuildValue("nN", readlen, addr);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002950}
2951
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002952PyDoc_STRVAR(recvfrom_into_doc,
2953"recvfrom_into(buffer[, nbytes[, flags]]) -> (nbytes, address info)\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00002954\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002955Like recv_into(buffer[, nbytes[, flags]]) but also return the sender's address info.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00002956
2957
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002958/* The sendmsg() and recvmsg[_into]() methods require a working
2959 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
2960#ifdef CMSG_LEN
2961/*
2962 * Call recvmsg() with the supplied iovec structures, flags, and
2963 * ancillary data buffer size (controllen). Returns the tuple return
2964 * value for recvmsg() or recvmsg_into(), with the first item provided
2965 * by the supplied makeval() function. makeval() will be called with
2966 * the length read and makeval_data as arguments, and must return a
2967 * new reference (which will be decrefed if there is a subsequent
2968 * error). On error, closes any file descriptors received via
2969 * SCM_RIGHTS.
2970 */
2971static PyObject *
2972sock_recvmsg_guts(PySocketSockObject *s, struct iovec *iov, int iovlen,
2973 int flags, Py_ssize_t controllen,
2974 PyObject *(*makeval)(ssize_t, void *), void *makeval_data)
2975{
2976 ssize_t bytes_received = -1;
2977 int timeout;
2978 sock_addr_t addrbuf;
2979 socklen_t addrbuflen;
Charles-François Natalie9e95ae2011-08-24 21:40:53 +02002980 struct msghdr msg = {0};
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002981 PyObject *cmsg_list = NULL, *retval = NULL;
2982 void *controlbuf = NULL;
2983 struct cmsghdr *cmsgh;
2984 size_t cmsgdatalen = 0;
2985 int cmsg_status;
2986
2987 /* XXX: POSIX says that msg_name and msg_namelen "shall be
2988 ignored" when the socket is connected (Linux fills them in
2989 anyway for AF_UNIX sockets at least). Normally msg_namelen
2990 seems to be set to 0 if there's no address, but try to
2991 initialize msg_name to something that won't be mistaken for a
2992 real address if that doesn't happen. */
2993 if (!getsockaddrlen(s, &addrbuflen))
2994 return NULL;
2995 memset(&addrbuf, 0, addrbuflen);
2996 SAS2SA(&addrbuf)->sa_family = AF_UNSPEC;
2997
2998 if (controllen < 0 || controllen > SOCKLEN_T_LIMIT) {
2999 PyErr_SetString(PyExc_ValueError,
3000 "invalid ancillary data buffer length");
3001 return NULL;
3002 }
3003 if (controllen > 0 && (controlbuf = PyMem_Malloc(controllen)) == NULL)
3004 return PyErr_NoMemory();
3005
3006 /* Make the system call. */
3007 if (!IS_SELECTABLE(s)) {
3008 select_error();
3009 goto finally;
3010 }
3011
3012 BEGIN_SELECT_LOOP(s)
3013 Py_BEGIN_ALLOW_THREADS;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003014 msg.msg_name = SAS2SA(&addrbuf);
3015 msg.msg_namelen = addrbuflen;
3016 msg.msg_iov = iov;
3017 msg.msg_iovlen = iovlen;
3018 msg.msg_control = controlbuf;
3019 msg.msg_controllen = controllen;
3020 timeout = internal_select_ex(s, 0, interval);
3021 if (!timeout)
3022 bytes_received = recvmsg(s->sock_fd, &msg, flags);
3023 Py_END_ALLOW_THREADS;
3024 if (timeout == 1) {
3025 PyErr_SetString(socket_timeout, "timed out");
3026 goto finally;
3027 }
3028 END_SELECT_LOOP(s)
3029
3030 if (bytes_received < 0) {
3031 s->errorhandler();
3032 goto finally;
3033 }
3034
3035 /* Make list of (level, type, data) tuples from control messages. */
3036 if ((cmsg_list = PyList_New(0)) == NULL)
3037 goto err_closefds;
3038 /* Check for empty ancillary data as old CMSG_FIRSTHDR()
3039 implementations didn't do so. */
3040 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3041 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3042 PyObject *bytes, *tuple;
3043 int tmp;
3044
3045 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3046 if (cmsg_status != 0) {
3047 if (PyErr_WarnEx(PyExc_RuntimeWarning,
3048 "received malformed or improperly-truncated "
3049 "ancillary data", 1) == -1)
3050 goto err_closefds;
3051 }
3052 if (cmsg_status < 0)
3053 break;
3054 if (cmsgdatalen > PY_SSIZE_T_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003055 PyErr_SetString(PyExc_OSError, "control message too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003056 goto err_closefds;
3057 }
3058
3059 bytes = PyBytes_FromStringAndSize((char *)CMSG_DATA(cmsgh),
3060 cmsgdatalen);
3061 tuple = Py_BuildValue("iiN", (int)cmsgh->cmsg_level,
3062 (int)cmsgh->cmsg_type, bytes);
3063 if (tuple == NULL)
3064 goto err_closefds;
3065 tmp = PyList_Append(cmsg_list, tuple);
3066 Py_DECREF(tuple);
3067 if (tmp != 0)
3068 goto err_closefds;
3069
3070 if (cmsg_status != 0)
3071 break;
3072 }
3073
3074 retval = Py_BuildValue("NOiN",
3075 (*makeval)(bytes_received, makeval_data),
3076 cmsg_list,
3077 (int)msg.msg_flags,
3078 makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
3079 ((msg.msg_namelen > addrbuflen) ?
3080 addrbuflen : msg.msg_namelen),
3081 s->sock_proto));
3082 if (retval == NULL)
3083 goto err_closefds;
3084
3085finally:
3086 Py_XDECREF(cmsg_list);
3087 PyMem_Free(controlbuf);
3088 return retval;
3089
3090err_closefds:
3091#ifdef SCM_RIGHTS
3092 /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */
3093 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3094 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3095 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3096 if (cmsg_status < 0)
3097 break;
3098 if (cmsgh->cmsg_level == SOL_SOCKET &&
3099 cmsgh->cmsg_type == SCM_RIGHTS) {
3100 size_t numfds;
3101 int *fdp;
3102
3103 numfds = cmsgdatalen / sizeof(int);
3104 fdp = (int *)CMSG_DATA(cmsgh);
3105 while (numfds-- > 0)
3106 close(*fdp++);
3107 }
3108 if (cmsg_status != 0)
3109 break;
3110 }
3111#endif /* SCM_RIGHTS */
3112 goto finally;
3113}
3114
3115
3116static PyObject *
3117makeval_recvmsg(ssize_t received, void *data)
3118{
3119 PyObject **buf = data;
3120
3121 if (received < PyBytes_GET_SIZE(*buf))
3122 _PyBytes_Resize(buf, received);
3123 Py_XINCREF(*buf);
3124 return *buf;
3125}
3126
3127/* s.recvmsg(bufsize[, ancbufsize[, flags]]) method */
3128
3129static PyObject *
3130sock_recvmsg(PySocketSockObject *s, PyObject *args)
3131{
3132 Py_ssize_t bufsize, ancbufsize = 0;
3133 int flags = 0;
3134 struct iovec iov;
3135 PyObject *buf = NULL, *retval = NULL;
3136
3137 if (!PyArg_ParseTuple(args, "n|ni:recvmsg", &bufsize, &ancbufsize, &flags))
3138 return NULL;
3139
3140 if (bufsize < 0) {
3141 PyErr_SetString(PyExc_ValueError, "negative buffer size in recvmsg()");
3142 return NULL;
3143 }
3144 if ((buf = PyBytes_FromStringAndSize(NULL, bufsize)) == NULL)
3145 return NULL;
3146 iov.iov_base = PyBytes_AS_STRING(buf);
3147 iov.iov_len = bufsize;
3148
3149 /* Note that we're passing a pointer to *our pointer* to the bytes
3150 object here (&buf); makeval_recvmsg() may incref the object, or
3151 deallocate it and set our pointer to NULL. */
3152 retval = sock_recvmsg_guts(s, &iov, 1, flags, ancbufsize,
3153 &makeval_recvmsg, &buf);
3154 Py_XDECREF(buf);
3155 return retval;
3156}
3157
3158PyDoc_STRVAR(recvmsg_doc,
3159"recvmsg(bufsize[, ancbufsize[, flags]]) -> (data, ancdata, msg_flags, address)\n\
3160\n\
3161Receive normal data (up to bufsize bytes) and ancillary data from the\n\
3162socket. The ancbufsize argument sets the size in bytes of the\n\
3163internal buffer used to receive the ancillary data; it defaults to 0,\n\
3164meaning that no ancillary data will be received. Appropriate buffer\n\
3165sizes for ancillary data can be calculated using CMSG_SPACE() or\n\
3166CMSG_LEN(), and items which do not fit into the buffer might be\n\
3167truncated or discarded. The flags argument defaults to 0 and has the\n\
3168same meaning as for recv().\n\
3169\n\
3170The return value is a 4-tuple: (data, ancdata, msg_flags, address).\n\
3171The data item is a bytes object holding the non-ancillary data\n\
3172received. The ancdata item is a list of zero or more tuples\n\
3173(cmsg_level, cmsg_type, cmsg_data) representing the ancillary data\n\
3174(control messages) received: cmsg_level and cmsg_type are integers\n\
3175specifying the protocol level and protocol-specific type respectively,\n\
3176and cmsg_data is a bytes object holding the associated data. The\n\
3177msg_flags item is the bitwise OR of various flags indicating\n\
3178conditions on the received message; see your system documentation for\n\
3179details. If the receiving socket is unconnected, address is the\n\
3180address of the sending socket, if available; otherwise, its value is\n\
3181unspecified.\n\
3182\n\
3183If recvmsg() raises an exception after the system call returns, it\n\
3184will first attempt to close any file descriptors received via the\n\
3185SCM_RIGHTS mechanism.");
3186
3187
3188static PyObject *
3189makeval_recvmsg_into(ssize_t received, void *data)
3190{
3191 return PyLong_FromSsize_t(received);
3192}
3193
3194/* s.recvmsg_into(buffers[, ancbufsize[, flags]]) method */
3195
3196static PyObject *
3197sock_recvmsg_into(PySocketSockObject *s, PyObject *args)
3198{
3199 Py_ssize_t ancbufsize = 0;
3200 int flags = 0;
3201 struct iovec *iovs = NULL;
3202 Py_ssize_t i, nitems, nbufs = 0;
3203 Py_buffer *bufs = NULL;
3204 PyObject *buffers_arg, *fast, *retval = NULL;
3205
3206 if (!PyArg_ParseTuple(args, "O|ni:recvmsg_into",
3207 &buffers_arg, &ancbufsize, &flags))
3208 return NULL;
3209
3210 if ((fast = PySequence_Fast(buffers_arg,
3211 "recvmsg_into() argument 1 must be an "
3212 "iterable")) == NULL)
3213 return NULL;
3214 nitems = PySequence_Fast_GET_SIZE(fast);
3215 if (nitems > INT_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003216 PyErr_SetString(PyExc_OSError, "recvmsg_into() argument 1 is too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003217 goto finally;
3218 }
3219
3220 /* Fill in an iovec for each item, and save the Py_buffer
3221 structs to release afterwards. */
3222 if (nitems > 0 && ((iovs = PyMem_New(struct iovec, nitems)) == NULL ||
3223 (bufs = PyMem_New(Py_buffer, nitems)) == NULL)) {
3224 PyErr_NoMemory();
3225 goto finally;
3226 }
3227 for (; nbufs < nitems; nbufs++) {
3228 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(fast, nbufs),
3229 "w*;recvmsg_into() argument 1 must be an iterable "
3230 "of single-segment read-write buffers",
3231 &bufs[nbufs]))
3232 goto finally;
3233 iovs[nbufs].iov_base = bufs[nbufs].buf;
3234 iovs[nbufs].iov_len = bufs[nbufs].len;
3235 }
3236
3237 retval = sock_recvmsg_guts(s, iovs, nitems, flags, ancbufsize,
3238 &makeval_recvmsg_into, NULL);
3239finally:
3240 for (i = 0; i < nbufs; i++)
3241 PyBuffer_Release(&bufs[i]);
3242 PyMem_Free(bufs);
3243 PyMem_Free(iovs);
3244 Py_DECREF(fast);
3245 return retval;
3246}
3247
3248PyDoc_STRVAR(recvmsg_into_doc,
3249"recvmsg_into(buffers[, ancbufsize[, flags]]) -> (nbytes, ancdata, msg_flags, address)\n\
3250\n\
3251Receive normal data and ancillary data from the socket, scattering the\n\
3252non-ancillary data into a series of buffers. The buffers argument\n\
3253must be an iterable of objects that export writable buffers\n\
3254(e.g. bytearray objects); these will be filled with successive chunks\n\
3255of the non-ancillary data until it has all been written or there are\n\
3256no more buffers. The ancbufsize argument sets the size in bytes of\n\
3257the internal buffer used to receive the ancillary data; it defaults to\n\
32580, meaning that no ancillary data will be received. Appropriate\n\
3259buffer sizes for ancillary data can be calculated using CMSG_SPACE()\n\
3260or CMSG_LEN(), and items which do not fit into the buffer might be\n\
3261truncated or discarded. The flags argument defaults to 0 and has the\n\
3262same meaning as for recv().\n\
3263\n\
3264The return value is a 4-tuple: (nbytes, ancdata, msg_flags, address).\n\
3265The nbytes item is the total number of bytes of non-ancillary data\n\
3266written into the buffers. The ancdata item is a list of zero or more\n\
3267tuples (cmsg_level, cmsg_type, cmsg_data) representing the ancillary\n\
3268data (control messages) received: cmsg_level and cmsg_type are\n\
3269integers specifying the protocol level and protocol-specific type\n\
3270respectively, and cmsg_data is a bytes object holding the associated\n\
3271data. The msg_flags item is the bitwise OR of various flags\n\
3272indicating conditions on the received message; see your system\n\
3273documentation for details. If the receiving socket is unconnected,\n\
3274address is the address of the sending socket, if available; otherwise,\n\
3275its value is unspecified.\n\
3276\n\
3277If recvmsg_into() raises an exception after the system call returns,\n\
3278it will first attempt to close any file descriptors received via the\n\
3279SCM_RIGHTS mechanism.");
3280#endif /* CMSG_LEN */
3281
3282
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003283/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003284
Guido van Rossum73624e91994-10-10 17:59:00 +00003285static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003286sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003287{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003288 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003289 Py_ssize_t len, n = -1;
3290 int flags = 0, timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003291 Py_buffer pbuf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003292
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003293 if (!PyArg_ParseTuple(args, "y*|i:send", &pbuf, &flags))
3294 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003295
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003296 if (!IS_SELECTABLE(s)) {
3297 PyBuffer_Release(&pbuf);
3298 return select_error();
3299 }
3300 buf = pbuf.buf;
3301 len = pbuf.len;
Neal Norwitz082b2df2006-02-07 07:04:46 +00003302
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003303 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003304 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003305 timeout = internal_select_ex(s, 1, interval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003306 if (!timeout)
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003307#ifdef __VMS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003308 n = sendsegmented(s->sock_fd, buf, len, flags);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003309#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003310 n = send(s->sock_fd, buf, len, flags);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003311#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003312 Py_END_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003313 if (timeout == 1) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003314 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003315 PyErr_SetString(socket_timeout, "timed out");
3316 return NULL;
3317 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003318 END_SELECT_LOOP(s)
3319
3320 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003321 if (n < 0)
3322 return s->errorhandler();
Antoine Pitrou19467d22010-08-17 19:33:30 +00003323 return PyLong_FromSsize_t(n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00003324}
3325
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003326PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003327"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003328\n\
3329Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003330argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003331sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003332
3333
3334/* s.sendall(data [,flags]) method */
3335
3336static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003337sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003338{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003339 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003340 Py_ssize_t len, n = -1;
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003341 int flags = 0, timeout, saved_errno;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003342 Py_buffer pbuf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003343
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003344 if (!PyArg_ParseTuple(args, "y*|i:sendall", &pbuf, &flags))
3345 return NULL;
3346 buf = pbuf.buf;
3347 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003348
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003349 if (!IS_SELECTABLE(s)) {
3350 PyBuffer_Release(&pbuf);
3351 return select_error();
3352 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003353
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003354 do {
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003355 Py_BEGIN_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003356 timeout = internal_select(s, 1);
3357 n = -1;
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003358 if (!timeout) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003359#ifdef __VMS
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003360 n = sendsegmented(s->sock_fd, buf, len, flags);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003361#else
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003362 n = send(s->sock_fd, buf, len, flags);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003363#endif
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003364 }
3365 Py_END_ALLOW_THREADS
3366 if (timeout == 1) {
3367 PyBuffer_Release(&pbuf);
3368 PyErr_SetString(socket_timeout, "timed out");
3369 return NULL;
3370 }
3371 /* PyErr_CheckSignals() might change errno */
3372 saved_errno = errno;
3373 /* We must run our signal handlers before looping again.
3374 send() can return a successful partial write when it is
3375 interrupted, so we can't restrict ourselves to EINTR. */
3376 if (PyErr_CheckSignals()) {
3377 PyBuffer_Release(&pbuf);
3378 return NULL;
3379 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003380 if (n < 0) {
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003381 /* If interrupted, try again */
3382 if (saved_errno == EINTR)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003383 continue;
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003384 else
3385 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003386 }
3387 buf += n;
3388 len -= n;
3389 } while (len > 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003390 PyBuffer_Release(&pbuf);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003391
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003392 if (n < 0)
3393 return s->errorhandler();
Guido van Rossum67f7a382002-06-06 21:08:16 +00003394
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003395 Py_INCREF(Py_None);
3396 return Py_None;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003397}
3398
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003399PyDoc_STRVAR(sendall_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003400"sendall(data[, flags])\n\
3401\n\
3402Send a data string to the socket. For the optional flags\n\
3403argument, see the Unix manual. This calls send() repeatedly\n\
3404until all data is sent. If an error occurs, it's impossible\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003405to tell how much data has been sent.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003406
Guido van Rossum30a685f1991-06-27 15:51:29 +00003407
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003408/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003409
Guido van Rossum73624e91994-10-10 17:59:00 +00003410static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003411sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003412{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003413 Py_buffer pbuf;
3414 PyObject *addro;
3415 char *buf;
Antoine Pitrou5e981412011-03-17 22:38:37 +01003416 Py_ssize_t len, arglen;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003417 sock_addr_t addrbuf;
3418 int addrlen, n = -1, flags, timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003419
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003420 flags = 0;
Antoine Pitrou5e981412011-03-17 22:38:37 +01003421 arglen = PyTuple_Size(args);
3422 switch (arglen) {
3423 case 2:
3424 PyArg_ParseTuple(args, "y*O:sendto", &pbuf, &addro);
3425 break;
3426 case 3:
3427 PyArg_ParseTuple(args, "y*iO:sendto",
3428 &pbuf, &flags, &addro);
3429 break;
3430 default:
3431 PyErr_Format(PyExc_TypeError,
3432 "sendto() takes 2 or 3 arguments (%d given)",
3433 arglen);
Victor Stinner77af1722011-05-26 14:05:59 +02003434 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003435 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01003436 if (PyErr_Occurred())
3437 return NULL;
3438
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003439 buf = pbuf.buf;
3440 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003441
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003442 if (!IS_SELECTABLE(s)) {
3443 PyBuffer_Release(&pbuf);
3444 return select_error();
3445 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003446
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003447 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen)) {
3448 PyBuffer_Release(&pbuf);
3449 return NULL;
3450 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003451
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003452 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003453 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003454 timeout = internal_select_ex(s, 1, interval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003455 if (!timeout)
3456 n = sendto(s->sock_fd, buf, len, flags, SAS2SA(&addrbuf), addrlen);
3457 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00003458
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003459 if (timeout == 1) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003460 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003461 PyErr_SetString(socket_timeout, "timed out");
3462 return NULL;
3463 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003464 END_SELECT_LOOP(s)
3465 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003466 if (n < 0)
3467 return s->errorhandler();
Antoine Pitrou19467d22010-08-17 19:33:30 +00003468 return PyLong_FromSsize_t(n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003469}
3470
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003471PyDoc_STRVAR(sendto_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003472"sendto(data[, flags], address) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003473\n\
3474Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003475For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003476
Guido van Rossum30a685f1991-06-27 15:51:29 +00003477
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003478/* The sendmsg() and recvmsg[_into]() methods require a working
3479 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
3480#ifdef CMSG_LEN
3481/* s.sendmsg(buffers[, ancdata[, flags[, address]]]) method */
3482
3483static PyObject *
3484sock_sendmsg(PySocketSockObject *s, PyObject *args)
3485{
3486 Py_ssize_t i, ndataparts, ndatabufs = 0, ncmsgs, ncmsgbufs = 0;
3487 Py_buffer *databufs = NULL;
3488 struct iovec *iovs = NULL;
3489 sock_addr_t addrbuf;
Charles-François Natalie9e95ae2011-08-24 21:40:53 +02003490 struct msghdr msg = {0};
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003491 struct cmsginfo {
3492 int level;
3493 int type;
3494 Py_buffer data;
3495 } *cmsgs = NULL;
3496 void *controlbuf = NULL;
3497 size_t controllen, controllen_last;
3498 ssize_t bytes_sent = -1;
3499 int addrlen, timeout, flags = 0;
3500 PyObject *data_arg, *cmsg_arg = NULL, *addr_arg = NULL, *data_fast = NULL,
3501 *cmsg_fast = NULL, *retval = NULL;
3502
3503 if (!PyArg_ParseTuple(args, "O|OiO:sendmsg",
3504 &data_arg, &cmsg_arg, &flags, &addr_arg))
3505 return NULL;
3506
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003507 /* Parse destination address. */
3508 if (addr_arg != NULL && addr_arg != Py_None) {
3509 if (!getsockaddrarg(s, addr_arg, SAS2SA(&addrbuf), &addrlen))
3510 goto finally;
3511 msg.msg_name = &addrbuf;
3512 msg.msg_namelen = addrlen;
3513 }
3514
3515 /* Fill in an iovec for each message part, and save the Py_buffer
3516 structs to release afterwards. */
3517 if ((data_fast = PySequence_Fast(data_arg,
3518 "sendmsg() argument 1 must be an "
3519 "iterable")) == NULL)
3520 goto finally;
3521 ndataparts = PySequence_Fast_GET_SIZE(data_fast);
3522 if (ndataparts > INT_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003523 PyErr_SetString(PyExc_OSError, "sendmsg() argument 1 is too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003524 goto finally;
3525 }
3526 msg.msg_iovlen = ndataparts;
3527 if (ndataparts > 0 &&
3528 ((msg.msg_iov = iovs = PyMem_New(struct iovec, ndataparts)) == NULL ||
3529 (databufs = PyMem_New(Py_buffer, ndataparts)) == NULL)) {
3530 PyErr_NoMemory();
3531 goto finally;
3532 }
3533 for (; ndatabufs < ndataparts; ndatabufs++) {
3534 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(data_fast, ndatabufs),
3535 "y*;sendmsg() argument 1 must be an iterable of "
3536 "buffer-compatible objects",
3537 &databufs[ndatabufs]))
3538 goto finally;
3539 iovs[ndatabufs].iov_base = databufs[ndatabufs].buf;
3540 iovs[ndatabufs].iov_len = databufs[ndatabufs].len;
3541 }
3542
3543 if (cmsg_arg == NULL)
3544 ncmsgs = 0;
3545 else {
3546 if ((cmsg_fast = PySequence_Fast(cmsg_arg,
3547 "sendmsg() argument 2 must be an "
3548 "iterable")) == NULL)
3549 goto finally;
3550 ncmsgs = PySequence_Fast_GET_SIZE(cmsg_fast);
3551 }
3552
3553#ifndef CMSG_SPACE
3554 if (ncmsgs > 1) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003555 PyErr_SetString(PyExc_OSError,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003556 "sending multiple control messages is not supported "
3557 "on this system");
3558 goto finally;
3559 }
3560#endif
3561 /* Save level, type and Py_buffer for each control message,
3562 and calculate total size. */
3563 if (ncmsgs > 0 && (cmsgs = PyMem_New(struct cmsginfo, ncmsgs)) == NULL) {
3564 PyErr_NoMemory();
3565 goto finally;
3566 }
3567 controllen = controllen_last = 0;
3568 while (ncmsgbufs < ncmsgs) {
3569 size_t bufsize, space;
3570
3571 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(cmsg_fast, ncmsgbufs),
3572 "(iiy*):[sendmsg() ancillary data items]",
3573 &cmsgs[ncmsgbufs].level,
3574 &cmsgs[ncmsgbufs].type,
3575 &cmsgs[ncmsgbufs].data))
3576 goto finally;
3577 bufsize = cmsgs[ncmsgbufs++].data.len;
3578
3579#ifdef CMSG_SPACE
3580 if (!get_CMSG_SPACE(bufsize, &space)) {
3581#else
3582 if (!get_CMSG_LEN(bufsize, &space)) {
3583#endif
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003584 PyErr_SetString(PyExc_OSError, "ancillary data item too large");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003585 goto finally;
3586 }
3587 controllen += space;
3588 if (controllen > SOCKLEN_T_LIMIT || controllen < controllen_last) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003589 PyErr_SetString(PyExc_OSError, "too much ancillary data");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003590 goto finally;
3591 }
3592 controllen_last = controllen;
3593 }
3594
3595 /* Construct ancillary data block from control message info. */
3596 if (ncmsgbufs > 0) {
3597 struct cmsghdr *cmsgh = NULL;
3598
3599 if ((msg.msg_control = controlbuf =
3600 PyMem_Malloc(controllen)) == NULL) {
3601 PyErr_NoMemory();
3602 goto finally;
3603 }
3604 msg.msg_controllen = controllen;
3605
3606 /* Need to zero out the buffer as a workaround for glibc's
3607 CMSG_NXTHDR() implementation. After getting the pointer to
3608 the next header, it checks its (uninitialized) cmsg_len
3609 member to see if the "message" fits in the buffer, and
3610 returns NULL if it doesn't. Zero-filling the buffer
3611 ensures that that doesn't happen. */
3612 memset(controlbuf, 0, controllen);
3613
3614 for (i = 0; i < ncmsgbufs; i++) {
3615 size_t msg_len, data_len = cmsgs[i].data.len;
3616 int enough_space = 0;
3617
3618 cmsgh = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsgh);
3619 if (cmsgh == NULL) {
3620 PyErr_Format(PyExc_RuntimeError,
3621 "unexpected NULL result from %s()",
3622 (i == 0) ? "CMSG_FIRSTHDR" : "CMSG_NXTHDR");
3623 goto finally;
3624 }
3625 if (!get_CMSG_LEN(data_len, &msg_len)) {
3626 PyErr_SetString(PyExc_RuntimeError,
3627 "item size out of range for CMSG_LEN()");
3628 goto finally;
3629 }
3630 if (cmsg_min_space(&msg, cmsgh, msg_len)) {
3631 size_t space;
3632
3633 cmsgh->cmsg_len = msg_len;
3634 if (get_cmsg_data_space(&msg, cmsgh, &space))
3635 enough_space = (space >= data_len);
3636 }
3637 if (!enough_space) {
3638 PyErr_SetString(PyExc_RuntimeError,
3639 "ancillary data does not fit in calculated "
3640 "space");
3641 goto finally;
3642 }
3643 cmsgh->cmsg_level = cmsgs[i].level;
3644 cmsgh->cmsg_type = cmsgs[i].type;
3645 memcpy(CMSG_DATA(cmsgh), cmsgs[i].data.buf, data_len);
3646 }
3647 }
3648
3649 /* Make the system call. */
3650 if (!IS_SELECTABLE(s)) {
3651 select_error();
3652 goto finally;
3653 }
3654
3655 BEGIN_SELECT_LOOP(s)
3656 Py_BEGIN_ALLOW_THREADS;
3657 timeout = internal_select_ex(s, 1, interval);
3658 if (!timeout)
3659 bytes_sent = sendmsg(s->sock_fd, &msg, flags);
3660 Py_END_ALLOW_THREADS;
3661 if (timeout == 1) {
3662 PyErr_SetString(socket_timeout, "timed out");
3663 goto finally;
3664 }
3665 END_SELECT_LOOP(s)
3666
3667 if (bytes_sent < 0) {
3668 s->errorhandler();
3669 goto finally;
3670 }
3671 retval = PyLong_FromSsize_t(bytes_sent);
3672
3673finally:
3674 PyMem_Free(controlbuf);
3675 for (i = 0; i < ncmsgbufs; i++)
3676 PyBuffer_Release(&cmsgs[i].data);
3677 PyMem_Free(cmsgs);
3678 Py_XDECREF(cmsg_fast);
3679 for (i = 0; i < ndatabufs; i++)
3680 PyBuffer_Release(&databufs[i]);
3681 PyMem_Free(databufs);
3682 PyMem_Free(iovs);
3683 Py_XDECREF(data_fast);
3684 return retval;
3685}
3686
3687PyDoc_STRVAR(sendmsg_doc,
3688"sendmsg(buffers[, ancdata[, flags[, address]]]) -> count\n\
3689\n\
3690Send normal and ancillary data to the socket, gathering the\n\
3691non-ancillary data from a series of buffers and concatenating it into\n\
3692a single message. The buffers argument specifies the non-ancillary\n\
3693data as an iterable of buffer-compatible objects (e.g. bytes objects).\n\
3694The ancdata argument specifies the ancillary data (control messages)\n\
3695as an iterable of zero or more tuples (cmsg_level, cmsg_type,\n\
3696cmsg_data), where cmsg_level and cmsg_type are integers specifying the\n\
3697protocol level and protocol-specific type respectively, and cmsg_data\n\
3698is a buffer-compatible object holding the associated data. The flags\n\
3699argument defaults to 0 and has the same meaning as for send(). If\n\
3700address is supplied and not None, it sets a destination address for\n\
3701the message. The return value is the number of bytes of non-ancillary\n\
3702data sent.");
3703#endif /* CMSG_LEN */
3704
3705
Guido van Rossum30a685f1991-06-27 15:51:29 +00003706/* s.shutdown(how) method */
3707
Guido van Rossum73624e91994-10-10 17:59:00 +00003708static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003709sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003710{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003711 int how;
3712 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003713
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003714 how = PyLong_AsLong(arg);
3715 if (how == -1 && PyErr_Occurred())
3716 return NULL;
3717 Py_BEGIN_ALLOW_THREADS
3718 res = shutdown(s->sock_fd, how);
3719 Py_END_ALLOW_THREADS
3720 if (res < 0)
3721 return s->errorhandler();
3722 Py_INCREF(Py_None);
3723 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003724}
3725
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003726PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003727"shutdown(flag)\n\
3728\n\
Martin v. Löwis94681fc2003-11-27 19:40:22 +00003729Shut down the reading side of the socket (flag == SHUT_RD), the writing side\n\
3730of the socket (flag == SHUT_WR), or both ends (flag == SHUT_RDWR).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003731
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00003732#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Christian Heimesfaf2f632008-01-06 16:59:19 +00003733static PyObject*
3734sock_ioctl(PySocketSockObject *s, PyObject *arg)
3735{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003736 unsigned long cmd = SIO_RCVALL;
3737 PyObject *argO;
3738 DWORD recv;
Christian Heimesfaf2f632008-01-06 16:59:19 +00003739
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003740 if (!PyArg_ParseTuple(arg, "kO:ioctl", &cmd, &argO))
3741 return NULL;
Christian Heimesfaf2f632008-01-06 16:59:19 +00003742
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003743 switch (cmd) {
3744 case SIO_RCVALL: {
3745 unsigned int option = RCVALL_ON;
3746 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
3747 return NULL;
3748 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
3749 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
3750 return set_error();
3751 }
3752 return PyLong_FromUnsignedLong(recv); }
3753 case SIO_KEEPALIVE_VALS: {
3754 struct tcp_keepalive ka;
3755 if (!PyArg_ParseTuple(arg, "k(kkk):ioctl", &cmd,
3756 &ka.onoff, &ka.keepalivetime, &ka.keepaliveinterval))
3757 return NULL;
3758 if (WSAIoctl(s->sock_fd, cmd, &ka, sizeof(ka),
3759 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
3760 return set_error();
3761 }
3762 return PyLong_FromUnsignedLong(recv); }
3763 default:
3764 PyErr_Format(PyExc_ValueError, "invalid ioctl command %d", cmd);
3765 return NULL;
3766 }
Christian Heimesfaf2f632008-01-06 16:59:19 +00003767}
3768PyDoc_STRVAR(sock_ioctl_doc,
3769"ioctl(cmd, option) -> long\n\
3770\n\
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00003771Control the socket with WSAIoctl syscall. Currently supported 'cmd' values are\n\
3772SIO_RCVALL: 'option' must be one of the socket.RCVALL_* constants.\n\
3773SIO_KEEPALIVE_VALS: 'option' is a tuple of (onoff, timeout, interval).");
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00003774#endif
3775
3776#if defined(MS_WINDOWS)
3777static PyObject*
3778sock_share(PySocketSockObject *s, PyObject *arg)
3779{
3780 WSAPROTOCOL_INFO info;
3781 DWORD processId;
3782 int result;
3783
3784 if (!PyArg_ParseTuple(arg, "I", &processId))
3785 return NULL;
3786
3787 Py_BEGIN_ALLOW_THREADS
3788 result = WSADuplicateSocket(s->sock_fd, processId, &info);
3789 Py_END_ALLOW_THREADS
3790 if (result == SOCKET_ERROR)
3791 return set_error();
3792 return PyBytes_FromStringAndSize((const char*)&info, sizeof(info));
3793}
3794PyDoc_STRVAR(sock_share_doc,
3795"share(process_id) -> bytes\n\
3796\n\
3797Share the socket with another process. The target process id\n\
3798must be provided and the resulting bytes object passed to the target\n\
3799process. There the shared socket can be instantiated by calling\n\
3800socket.fromshare().");
3801
Christian Heimesfaf2f632008-01-06 16:59:19 +00003802
3803#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00003804
3805/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003806
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003807static PyMethodDef sock_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003808 {"_accept", (PyCFunction)sock_accept, METH_NOARGS,
3809 accept_doc},
3810 {"bind", (PyCFunction)sock_bind, METH_O,
3811 bind_doc},
3812 {"close", (PyCFunction)sock_close, METH_NOARGS,
3813 close_doc},
3814 {"connect", (PyCFunction)sock_connect, METH_O,
3815 connect_doc},
3816 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
3817 connect_ex_doc},
Antoine Pitrou6e451df2010-08-09 20:39:54 +00003818 {"detach", (PyCFunction)sock_detach, METH_NOARGS,
3819 detach_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003820 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
3821 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00003822#ifdef HAVE_GETPEERNAME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003823 {"getpeername", (PyCFunction)sock_getpeername,
3824 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00003825#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003826 {"getsockname", (PyCFunction)sock_getsockname,
3827 METH_NOARGS, getsockname_doc},
3828 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
3829 getsockopt_doc},
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00003830#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003831 {"ioctl", (PyCFunction)sock_ioctl, METH_VARARGS,
3832 sock_ioctl_doc},
Christian Heimesfaf2f632008-01-06 16:59:19 +00003833#endif
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00003834#if defined(MS_WINDOWS)
3835 {"share", (PyCFunction)sock_share, METH_VARARGS,
3836 sock_share_doc},
3837#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003838 {"listen", (PyCFunction)sock_listen, METH_O,
3839 listen_doc},
3840 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
3841 recv_doc},
3842 {"recv_into", (PyCFunction)sock_recv_into, METH_VARARGS | METH_KEYWORDS,
3843 recv_into_doc},
3844 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
3845 recvfrom_doc},
3846 {"recvfrom_into", (PyCFunction)sock_recvfrom_into, METH_VARARGS | METH_KEYWORDS,
3847 recvfrom_into_doc},
3848 {"send", (PyCFunction)sock_send, METH_VARARGS,
3849 send_doc},
3850 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
3851 sendall_doc},
3852 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
3853 sendto_doc},
3854 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
3855 setblocking_doc},
3856 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
3857 settimeout_doc},
3858 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
3859 gettimeout_doc},
3860 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
3861 setsockopt_doc},
3862 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
3863 shutdown_doc},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003864#ifdef CMSG_LEN
3865 {"recvmsg", (PyCFunction)sock_recvmsg, METH_VARARGS,
3866 recvmsg_doc},
3867 {"recvmsg_into", (PyCFunction)sock_recvmsg_into, METH_VARARGS,
3868 recvmsg_into_doc,},
3869 {"sendmsg", (PyCFunction)sock_sendmsg, METH_VARARGS,
3870 sendmsg_doc},
3871#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003872 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003873};
3874
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003875/* SockObject members */
3876static PyMemberDef sock_memberlist[] = {
3877 {"family", T_INT, offsetof(PySocketSockObject, sock_family), READONLY, "the socket family"},
3878 {"type", T_INT, offsetof(PySocketSockObject, sock_type), READONLY, "the socket type"},
3879 {"proto", T_INT, offsetof(PySocketSockObject, sock_proto), READONLY, "the socket protocol"},
3880 {"timeout", T_DOUBLE, offsetof(PySocketSockObject, sock_timeout), READONLY, "the socket timeout"},
3881 {0},
3882};
Guido van Rossum30a685f1991-06-27 15:51:29 +00003883
Guido van Rossum73624e91994-10-10 17:59:00 +00003884/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00003885 First close the file description. */
3886
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003887static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003888sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003889{
Antoine Pitroue033e062010-10-29 10:38:18 +00003890 if (s->sock_fd != -1) {
3891 PyObject *exc, *val, *tb;
3892 Py_ssize_t old_refcount = Py_REFCNT(s);
3893 ++Py_REFCNT(s);
3894 PyErr_Fetch(&exc, &val, &tb);
3895 if (PyErr_WarnFormat(PyExc_ResourceWarning, 1,
3896 "unclosed %R", s))
3897 /* Spurious errors can appear at shutdown */
3898 if (PyErr_ExceptionMatches(PyExc_Warning))
3899 PyErr_WriteUnraisable((PyObject *) s);
3900 PyErr_Restore(exc, val, tb);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003901 (void) SOCKETCLOSE(s->sock_fd);
Antoine Pitroue033e062010-10-29 10:38:18 +00003902 Py_REFCNT(s) = old_refcount;
3903 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003904 Py_TYPE(s)->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003905}
3906
Guido van Rossum30a685f1991-06-27 15:51:29 +00003907
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003908static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003909sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003910{
Fred Drakea04eaad2000-06-30 02:46:07 +00003911#if SIZEOF_SOCKET_T > SIZEOF_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003912 if (s->sock_fd > LONG_MAX) {
3913 /* this can occur on Win64, and actually there is a special
3914 ugly printf formatter for decimal pointer length integer
3915 printing, only bother if necessary*/
3916 PyErr_SetString(PyExc_OverflowError,
3917 "no printf formatter to display "
3918 "the socket descriptor in decimal");
3919 return NULL;
3920 }
Fred Drakea04eaad2000-06-30 02:46:07 +00003921#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003922 return PyUnicode_FromFormat(
3923 "<socket object, fd=%ld, family=%d, type=%d, proto=%d>",
3924 (long)s->sock_fd, s->sock_family,
3925 s->sock_type,
3926 s->sock_proto);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003927}
3928
3929
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003930/* Create a new, uninitialized socket object. */
3931
3932static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003933sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003934{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003935 PyObject *new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003936
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003937 new = type->tp_alloc(type, 0);
3938 if (new != NULL) {
3939 ((PySocketSockObject *)new)->sock_fd = -1;
3940 ((PySocketSockObject *)new)->sock_timeout = -1.0;
3941 ((PySocketSockObject *)new)->errorhandler = &set_error;
3942 }
3943 return new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003944}
3945
3946
3947/* Initialize a new socket object. */
3948
3949/*ARGSUSED*/
3950static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00003951sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003952{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003953 PySocketSockObject *s = (PySocketSockObject *)self;
3954 PyObject *fdobj = NULL;
3955 SOCKET_T fd = INVALID_SOCKET;
3956 int family = AF_INET, type = SOCK_STREAM, proto = 0;
3957 static char *keywords[] = {"family", "type", "proto", "fileno", 0};
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003958
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003959 if (!PyArg_ParseTupleAndKeywords(args, kwds,
3960 "|iiiO:socket", keywords,
3961 &family, &type, &proto, &fdobj))
3962 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003963
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003964 if (fdobj != NULL && fdobj != Py_None) {
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00003965#ifdef MS_WINDOWS
3966 /* recreate a socket that was duplicated */
3967 if (PyBytes_Check(fdobj)) {
3968 WSAPROTOCOL_INFO info;
3969 if (PyBytes_GET_SIZE(fdobj) != sizeof(info)) {
3970 PyErr_Format(PyExc_ValueError,
3971 "socket descriptor string has wrong size, "
3972 "should be %zu bytes.", sizeof(info));
3973 return -1;
3974 }
3975 memcpy(&info, PyBytes_AS_STRING(fdobj), sizeof(info));
3976 Py_BEGIN_ALLOW_THREADS
3977 fd = WSASocket(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
3978 FROM_PROTOCOL_INFO, &info, 0, WSA_FLAG_OVERLAPPED);
3979 Py_END_ALLOW_THREADS
3980 if (fd == INVALID_SOCKET) {
3981 set_error();
3982 return -1;
3983 }
3984 family = info.iAddressFamily;
3985 type = info.iSocketType;
3986 proto = info.iProtocol;
3987 }
3988 else
3989#endif
3990 {
3991 fd = PyLong_AsSocket_t(fdobj);
3992 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
3993 return -1;
3994 if (fd == INVALID_SOCKET) {
3995 PyErr_SetString(PyExc_ValueError,
3996 "can't use invalid socket value");
3997 return -1;
3998 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003999 }
4000 }
4001 else {
4002 Py_BEGIN_ALLOW_THREADS
4003 fd = socket(family, type, proto);
4004 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00004005
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004006 if (fd == INVALID_SOCKET) {
4007 set_error();
4008 return -1;
4009 }
4010 }
4011 init_sockobject(s, fd, family, type, proto);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004012
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004013 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004014
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004015}
4016
4017
Guido van Rossumb6775db1994-08-01 11:34:53 +00004018/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00004019
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004020static PyTypeObject sock_type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004021 PyVarObject_HEAD_INIT(0, 0) /* Must fill in type value later */
4022 "_socket.socket", /* tp_name */
4023 sizeof(PySocketSockObject), /* tp_basicsize */
4024 0, /* tp_itemsize */
4025 (destructor)sock_dealloc, /* tp_dealloc */
4026 0, /* tp_print */
4027 0, /* tp_getattr */
4028 0, /* tp_setattr */
4029 0, /* tp_reserved */
4030 (reprfunc)sock_repr, /* tp_repr */
4031 0, /* tp_as_number */
4032 0, /* tp_as_sequence */
4033 0, /* tp_as_mapping */
4034 0, /* tp_hash */
4035 0, /* tp_call */
4036 0, /* tp_str */
4037 PyObject_GenericGetAttr, /* tp_getattro */
4038 0, /* tp_setattro */
4039 0, /* tp_as_buffer */
4040 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
4041 sock_doc, /* tp_doc */
4042 0, /* tp_traverse */
4043 0, /* tp_clear */
4044 0, /* tp_richcompare */
4045 0, /* tp_weaklistoffset */
4046 0, /* tp_iter */
4047 0, /* tp_iternext */
4048 sock_methods, /* tp_methods */
4049 sock_memberlist, /* tp_members */
4050 0, /* tp_getset */
4051 0, /* tp_base */
4052 0, /* tp_dict */
4053 0, /* tp_descr_get */
4054 0, /* tp_descr_set */
4055 0, /* tp_dictoffset */
4056 sock_initobj, /* tp_init */
4057 PyType_GenericAlloc, /* tp_alloc */
4058 sock_new, /* tp_new */
4059 PyObject_Del, /* tp_free */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004060};
4061
Guido van Rossum30a685f1991-06-27 15:51:29 +00004062
Guido van Rossum81194471991-07-27 21:42:02 +00004063/* Python interface to gethostname(). */
4064
4065/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004066static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00004067socket_gethostname(PyObject *self, PyObject *unused)
Guido van Rossum81194471991-07-27 21:42:02 +00004068{
Martin v. Löwis72f48422010-10-29 18:20:08 +00004069#ifdef MS_WINDOWS
4070 /* Don't use winsock's gethostname, as this returns the ANSI
4071 version of the hostname, whereas we need a Unicode string.
4072 Otherwise, gethostname apparently also returns the DNS name. */
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00004073 wchar_t buf[MAX_COMPUTERNAME_LENGTH + 1];
Victor Stinner63941882011-09-29 00:42:28 +02004074 DWORD size = Py_ARRAY_LENGTH(buf);
Victor Stinner74168972011-11-17 01:11:36 +01004075 wchar_t *name;
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00004076 PyObject *result;
Victor Stinner74168972011-11-17 01:11:36 +01004077
4078 if (GetComputerNameExW(ComputerNamePhysicalDnsHostname, buf, &size))
Victor Stinner9d3b93b2011-11-22 02:27:30 +01004079 return PyUnicode_FromWideChar(buf, size);
Victor Stinner74168972011-11-17 01:11:36 +01004080
4081 if (GetLastError() != ERROR_MORE_DATA)
4082 return PyErr_SetFromWindowsErr(0);
4083
4084 if (size == 0)
4085 return PyUnicode_New(0, 0);
4086
4087 /* MSDN says ERROR_MORE_DATA may occur because DNS allows longer
4088 names */
4089 name = PyMem_Malloc(size * sizeof(wchar_t));
4090 if (!name)
4091 return NULL;
4092 if (!GetComputerNameExW(ComputerNamePhysicalDnsHostname,
4093 name,
4094 &size))
4095 {
4096 PyMem_Free(name);
4097 return PyErr_SetFromWindowsErr(0);
Martin v. Löwis72f48422010-10-29 18:20:08 +00004098 }
Victor Stinner74168972011-11-17 01:11:36 +01004099
4100 result = PyUnicode_FromWideChar(name, size);
4101 PyMem_Free(name);
4102 return result;
Martin v. Löwis72f48422010-10-29 18:20:08 +00004103#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004104 char buf[1024];
4105 int res;
4106 Py_BEGIN_ALLOW_THREADS
4107 res = gethostname(buf, (int) sizeof buf - 1);
4108 Py_END_ALLOW_THREADS
4109 if (res < 0)
4110 return set_error();
4111 buf[sizeof buf - 1] = '\0';
4112 return PyUnicode_FromString(buf);
Martin v. Löwis72f48422010-10-29 18:20:08 +00004113#endif
Guido van Rossum81194471991-07-27 21:42:02 +00004114}
Guido van Rossumff4949e1992-08-05 19:58:53 +00004115
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004116PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004117"gethostname() -> string\n\
4118\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004119Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004120
Antoine Pitrou061cfb52011-02-28 22:25:22 +00004121#ifdef HAVE_SETHOSTNAME
4122PyDoc_STRVAR(sethostname_doc,
4123"sethostname(name)\n\n\
4124Sets the hostname to name.");
4125
4126static PyObject *
4127socket_sethostname(PyObject *self, PyObject *args)
4128{
4129 PyObject *hnobj;
4130 Py_buffer buf;
4131 int res, flag = 0;
4132
4133 if (!PyArg_ParseTuple(args, "S:sethostname", &hnobj)) {
4134 PyErr_Clear();
4135 if (!PyArg_ParseTuple(args, "O&:sethostname",
4136 PyUnicode_FSConverter, &hnobj))
4137 return NULL;
4138 flag = 1;
4139 }
4140 res = PyObject_GetBuffer(hnobj, &buf, PyBUF_SIMPLE);
4141 if (!res) {
4142 res = sethostname(buf.buf, buf.len);
4143 PyBuffer_Release(&buf);
4144 }
4145 if (flag)
4146 Py_DECREF(hnobj);
4147 if (res)
4148 return set_error();
4149 Py_RETURN_NONE;
4150}
4151#endif
Guido van Rossumff4949e1992-08-05 19:58:53 +00004152
Guido van Rossum30a685f1991-06-27 15:51:29 +00004153/* Python interface to gethostbyname(name). */
4154
4155/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004156static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004157socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00004158{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004159 char *name;
4160 sock_addr_t addrbuf;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004161 PyObject *ret = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004162
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004163 if (!PyArg_ParseTuple(args, "et:gethostbyname", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004164 return NULL;
4165 if (setipaddr(name, SAS2SA(&addrbuf), sizeof(addrbuf), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004166 goto finally;
4167 ret = makeipaddr(SAS2SA(&addrbuf), sizeof(struct sockaddr_in));
4168finally:
4169 PyMem_Free(name);
4170 return ret;
Guido van Rossum30a685f1991-06-27 15:51:29 +00004171}
4172
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004173PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004174"gethostbyname(host) -> address\n\
4175\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004176Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004177
4178
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004179/* Convenience function common to gethostbyname_ex and gethostbyaddr */
4180
4181static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004182gethost_common(struct hostent *h, struct sockaddr *addr, int alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004183{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004184 char **pch;
4185 PyObject *rtn_tuple = (PyObject *)NULL;
4186 PyObject *name_list = (PyObject *)NULL;
4187 PyObject *addr_list = (PyObject *)NULL;
4188 PyObject *tmp;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004189
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004190 if (h == NULL) {
4191 /* Let's get real error message to return */
4192 set_herror(h_errno);
4193 return NULL;
4194 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004195
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004196 if (h->h_addrtype != af) {
4197 /* Let's get real error message to return */
Victor Stinner1f33f2b2011-12-17 04:45:09 +01004198 errno = EAFNOSUPPORT;
4199 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004200 return NULL;
4201 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004202
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004203 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00004204
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004205 case AF_INET:
4206 if (alen < sizeof(struct sockaddr_in))
4207 return NULL;
4208 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004209
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004210#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004211 case AF_INET6:
4212 if (alen < sizeof(struct sockaddr_in6))
4213 return NULL;
4214 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004215#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00004216
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004217 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004218
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004219 if ((name_list = PyList_New(0)) == NULL)
4220 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004221
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004222 if ((addr_list = PyList_New(0)) == NULL)
4223 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004224
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004225 /* SF #1511317: h_aliases can be NULL */
4226 if (h->h_aliases) {
4227 for (pch = h->h_aliases; *pch != NULL; pch++) {
4228 int status;
4229 tmp = PyUnicode_FromString(*pch);
4230 if (tmp == NULL)
4231 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004232
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004233 status = PyList_Append(name_list, tmp);
4234 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004235
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004236 if (status)
4237 goto err;
4238 }
4239 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004240
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004241 for (pch = h->h_addr_list; *pch != NULL; pch++) {
4242 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004243
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004244 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00004245
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004246 case AF_INET:
4247 {
4248 struct sockaddr_in sin;
4249 memset(&sin, 0, sizeof(sin));
4250 sin.sin_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004251#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004252 sin.sin_len = sizeof(sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004253#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004254 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
4255 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
Guido van Rossum67f7a382002-06-06 21:08:16 +00004256
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004257 if (pch == h->h_addr_list && alen >= sizeof(sin))
4258 memcpy((char *) addr, &sin, sizeof(sin));
4259 break;
4260 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004261
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004262#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004263 case AF_INET6:
4264 {
4265 struct sockaddr_in6 sin6;
4266 memset(&sin6, 0, sizeof(sin6));
4267 sin6.sin6_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004268#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004269 sin6.sin6_len = sizeof(sin6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004270#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004271 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
4272 tmp = makeipaddr((struct sockaddr *)&sin6,
4273 sizeof(sin6));
Guido van Rossum67f7a382002-06-06 21:08:16 +00004274
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004275 if (pch == h->h_addr_list && alen >= sizeof(sin6))
4276 memcpy((char *) addr, &sin6, sizeof(sin6));
4277 break;
4278 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004279#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00004280
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004281 default: /* can't happen */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004282 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004283 "unsupported address family");
4284 return NULL;
4285 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004286
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004287 if (tmp == NULL)
4288 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004289
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004290 status = PyList_Append(addr_list, tmp);
4291 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004292
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004293 if (status)
4294 goto err;
4295 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004296
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004297 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004298
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004299 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004300 Py_XDECREF(name_list);
4301 Py_XDECREF(addr_list);
4302 return rtn_tuple;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004303}
4304
4305
4306/* Python interface to gethostbyname_ex(name). */
4307
4308/*ARGSUSED*/
4309static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004310socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004311{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004312 char *name;
4313 struct hostent *h;
Charles-François Natali8b759652011-12-23 16:44:51 +01004314 sock_addr_t addr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004315 struct sockaddr *sa;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004316 PyObject *ret = NULL;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004317#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004318 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004319#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004320 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004321#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004322 char buf[16384];
4323 int buf_len = (sizeof buf) - 1;
4324 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004325#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02004326#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004327 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004328#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004329#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004330
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004331 if (!PyArg_ParseTuple(args, "et:gethostbyname_ex", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004332 return NULL;
Charles-François Natali8b759652011-12-23 16:44:51 +01004333 if (setipaddr(name, SAS2SA(&addr), sizeof(addr), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004334 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004335 Py_BEGIN_ALLOW_THREADS
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004336#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004337#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02004338 gethostbyname_r(name, &hp_allocated, buf, buf_len,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004339 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004340#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004341 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004342#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004343 memset((void *) &data, '\0', sizeof(data));
4344 result = gethostbyname_r(name, &hp_allocated, &data);
4345 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004346#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004347#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00004348#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004349 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004350#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004351 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004352#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004353 Py_END_ALLOW_THREADS
4354 /* Some C libraries would require addr.__ss_family instead of
4355 addr.ss_family.
4356 Therefore, we cast the sockaddr_storage into sockaddr to
4357 access sa_family. */
Charles-François Natali8b759652011-12-23 16:44:51 +01004358 sa = SAS2SA(&addr);
4359 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004360 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00004361#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004362 PyThread_release_lock(netdb_lock);
Guido van Rossum955becc1999-03-22 20:14:53 +00004363#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004364finally:
4365 PyMem_Free(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004366 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004367}
4368
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004369PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004370"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
4371\n\
4372Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004373for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004374
4375
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004376/* Python interface to gethostbyaddr(IP). */
4377
4378/*ARGSUSED*/
4379static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004380socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004381{
Charles-François Natali8b759652011-12-23 16:44:51 +01004382 sock_addr_t addr;
4383 struct sockaddr *sa = SAS2SA(&addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004384 char *ip_num;
4385 struct hostent *h;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004386 PyObject *ret = NULL;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004387#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004388 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004389#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004390 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004391#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004392 /* glibcs up to 2.10 assume that the buf argument to
4393 gethostbyaddr_r is 8-byte aligned, which at least llvm-gcc
4394 does not ensure. The attribute below instructs the compiler
4395 to maintain this alignment. */
4396 char buf[16384] Py_ALIGNED(8);
4397 int buf_len = (sizeof buf) - 1;
4398 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004399#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02004400#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004401 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004402#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004403#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004404 char *ap;
4405 int al;
4406 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004407
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004408 if (!PyArg_ParseTuple(args, "et:gethostbyaddr", "idna", &ip_num))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004409 return NULL;
4410 af = AF_UNSPEC;
4411 if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004412 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004413 af = sa->sa_family;
4414 ap = NULL;
Brett Cannonb94767f2011-02-22 20:15:44 +00004415 /* al = 0; */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004416 switch (af) {
4417 case AF_INET:
4418 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
4419 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
4420 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004421#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004422 case AF_INET6:
4423 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
4424 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
4425 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004426#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004427 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004428 PyErr_SetString(PyExc_OSError, "unsupported address family");
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004429 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004430 }
4431 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004432#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004433#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02004434 gethostbyaddr_r(ap, al, af,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004435 &hp_allocated, buf, buf_len,
4436 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004437#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004438 h = gethostbyaddr_r(ap, al, af,
4439 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004440#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004441 memset((void *) &data, '\0', sizeof(data));
4442 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
4443 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004444#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004445#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00004446#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004447 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004448#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004449 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004450#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004451 Py_END_ALLOW_THREADS
Charles-François Natali8b759652011-12-23 16:44:51 +01004452 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00004453#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004454 PyThread_release_lock(netdb_lock);
Guido van Rossum3baaa131999-03-22 21:44:51 +00004455#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004456finally:
4457 PyMem_Free(ip_num);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004458 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004459}
4460
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004461PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004462"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
4463\n\
4464Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004465for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004466
Guido van Rossum30a685f1991-06-27 15:51:29 +00004467
4468/* Python interface to getservbyname(name).
4469 This only returns the port number, since the other info is already
4470 known or not useful (like the list of aliases). */
4471
4472/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004473static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004474socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00004475{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004476 char *name, *proto=NULL;
4477 struct servent *sp;
4478 if (!PyArg_ParseTuple(args, "s|s:getservbyname", &name, &proto))
4479 return NULL;
4480 Py_BEGIN_ALLOW_THREADS
4481 sp = getservbyname(name, proto);
4482 Py_END_ALLOW_THREADS
4483 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004484 PyErr_SetString(PyExc_OSError, "service/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004485 return NULL;
4486 }
4487 return PyLong_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00004488}
4489
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004490PyDoc_STRVAR(getservbyname_doc,
Barry Warsaw11b91a02004-06-28 00:50:43 +00004491"getservbyname(servicename[, protocolname]) -> integer\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00004492\n\
4493Return a port number from a service name and protocol name.\n\
Barry Warsaw11b91a02004-06-28 00:50:43 +00004494The optional protocol name, if given, should be 'tcp' or 'udp',\n\
4495otherwise any protocol will match.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004496
Guido van Rossum30a685f1991-06-27 15:51:29 +00004497
Barry Warsaw11b91a02004-06-28 00:50:43 +00004498/* Python interface to getservbyport(port).
4499 This only returns the service name, since the other info is already
4500 known or not useful (like the list of aliases). */
4501
4502/*ARGSUSED*/
4503static PyObject *
4504socket_getservbyport(PyObject *self, PyObject *args)
4505{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004506 int port;
4507 char *proto=NULL;
4508 struct servent *sp;
4509 if (!PyArg_ParseTuple(args, "i|s:getservbyport", &port, &proto))
4510 return NULL;
4511 if (port < 0 || port > 0xffff) {
4512 PyErr_SetString(
4513 PyExc_OverflowError,
4514 "getservbyport: port must be 0-65535.");
4515 return NULL;
4516 }
4517 Py_BEGIN_ALLOW_THREADS
4518 sp = getservbyport(htons((short)port), proto);
4519 Py_END_ALLOW_THREADS
4520 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004521 PyErr_SetString(PyExc_OSError, "port/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004522 return NULL;
4523 }
4524 return PyUnicode_FromString(sp->s_name);
Barry Warsaw11b91a02004-06-28 00:50:43 +00004525}
4526
4527PyDoc_STRVAR(getservbyport_doc,
4528"getservbyport(port[, protocolname]) -> string\n\
4529\n\
4530Return the service name from a port number and protocol name.\n\
4531The optional protocol name, if given, should be 'tcp' or 'udp',\n\
4532otherwise any protocol will match.");
4533
Guido van Rossum3901d851996-12-19 16:35:04 +00004534/* Python interface to getprotobyname(name).
4535 This only returns the protocol number, since the other info is
4536 already known or not useful (like the list of aliases). */
4537
4538/*ARGSUSED*/
4539static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004540socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00004541{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004542 char *name;
4543 struct protoent *sp;
4544 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
4545 return NULL;
4546 Py_BEGIN_ALLOW_THREADS
4547 sp = getprotobyname(name);
4548 Py_END_ALLOW_THREADS
4549 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004550 PyErr_SetString(PyExc_OSError, "protocol not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004551 return NULL;
4552 }
4553 return PyLong_FromLong((long) sp->p_proto);
Guido van Rossum3901d851996-12-19 16:35:04 +00004554}
4555
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004556PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004557"getprotobyname(name) -> integer\n\
4558\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004559Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004560
Guido van Rossum3901d851996-12-19 16:35:04 +00004561
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004562#ifndef NO_DUP
4563/* dup() function for socket fds */
4564
4565static PyObject *
4566socket_dup(PyObject *self, PyObject *fdobj)
4567{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004568 SOCKET_T fd, newfd;
4569 PyObject *newfdobj;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004570
4571
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004572 fd = PyLong_AsSocket_t(fdobj);
4573 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
4574 return NULL;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004575
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004576 newfd = dup_socket(fd);
4577 if (newfd == INVALID_SOCKET)
4578 return set_error();
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004579
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004580 newfdobj = PyLong_FromSocket_t(newfd);
4581 if (newfdobj == NULL)
4582 SOCKETCLOSE(newfd);
4583 return newfdobj;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004584}
4585
4586PyDoc_STRVAR(dup_doc,
4587"dup(integer) -> integer\n\
4588\n\
4589Duplicate an integer socket file descriptor. This is like os.dup(), but for\n\
4590sockets; on some platforms os.dup() won't work for socket file descriptors.");
4591#endif
4592
4593
Dave Cole331708b2004-08-09 04:51:41 +00004594#ifdef HAVE_SOCKETPAIR
4595/* Create a pair of sockets using the socketpair() function.
Dave Cole07fda7e2004-08-23 05:16:23 +00004596 Arguments as for socket() except the default family is AF_UNIX if
Dave Colee8bbfe42004-08-26 00:51:16 +00004597 defined on the platform; otherwise, the default is AF_INET. */
Dave Cole331708b2004-08-09 04:51:41 +00004598
4599/*ARGSUSED*/
4600static PyObject *
4601socket_socketpair(PyObject *self, PyObject *args)
4602{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004603 PySocketSockObject *s0 = NULL, *s1 = NULL;
4604 SOCKET_T sv[2];
4605 int family, type = SOCK_STREAM, proto = 0;
4606 PyObject *res = NULL;
Dave Cole331708b2004-08-09 04:51:41 +00004607
4608#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004609 family = AF_UNIX;
Dave Cole331708b2004-08-09 04:51:41 +00004610#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004611 family = AF_INET;
Dave Cole331708b2004-08-09 04:51:41 +00004612#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004613 if (!PyArg_ParseTuple(args, "|iii:socketpair",
4614 &family, &type, &proto))
4615 return NULL;
4616 /* Create a pair of socket fds */
4617 if (socketpair(family, type, proto, sv) < 0)
4618 return set_error();
4619 s0 = new_sockobject(sv[0], family, type, proto);
4620 if (s0 == NULL)
4621 goto finally;
4622 s1 = new_sockobject(sv[1], family, type, proto);
4623 if (s1 == NULL)
4624 goto finally;
4625 res = PyTuple_Pack(2, s0, s1);
Dave Cole331708b2004-08-09 04:51:41 +00004626
4627finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004628 if (res == NULL) {
4629 if (s0 == NULL)
4630 SOCKETCLOSE(sv[0]);
4631 if (s1 == NULL)
4632 SOCKETCLOSE(sv[1]);
4633 }
4634 Py_XDECREF(s0);
4635 Py_XDECREF(s1);
4636 return res;
Dave Cole331708b2004-08-09 04:51:41 +00004637}
4638
4639PyDoc_STRVAR(socketpair_doc,
4640"socketpair([family[, type[, proto]]]) -> (socket object, socket object)\n\
4641\n\
4642Create a pair of socket objects from the sockets returned by the platform\n\
4643socketpair() function.\n\
Dave Cole07fda7e2004-08-23 05:16:23 +00004644The arguments are the same as for socket() except the default family is\n\
Dave Colee8bbfe42004-08-26 00:51:16 +00004645AF_UNIX if defined on the platform; otherwise, the default is AF_INET.");
Dave Cole331708b2004-08-09 04:51:41 +00004646
4647#endif /* HAVE_SOCKETPAIR */
4648
4649
Guido van Rossum006bf911996-06-12 04:04:55 +00004650static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004651socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00004652{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004653 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00004654
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004655 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
4656 return NULL;
4657 }
4658 if (x1 < 0) {
4659 PyErr_SetString(PyExc_OverflowError,
4660 "can't convert negative number to unsigned long");
4661 return NULL;
4662 }
4663 x2 = (unsigned int)ntohs((unsigned short)x1);
4664 return PyLong_FromLong(x2);
Guido van Rossum006bf911996-06-12 04:04:55 +00004665}
4666
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004667PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004668"ntohs(integer) -> integer\n\
4669\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004670Convert a 16-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004671
4672
Guido van Rossum006bf911996-06-12 04:04:55 +00004673static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004674socket_ntohl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00004675{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004676 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00004677
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004678 if (PyLong_Check(arg)) {
4679 x = PyLong_AsUnsignedLong(arg);
4680 if (x == (unsigned long) -1 && PyErr_Occurred())
4681 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004682#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004683 {
4684 unsigned long y;
4685 /* only want the trailing 32 bits */
4686 y = x & 0xFFFFFFFFUL;
4687 if (y ^ x)
4688 return PyErr_Format(PyExc_OverflowError,
4689 "long int larger than 32 bits");
4690 x = y;
4691 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004692#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004693 }
4694 else
4695 return PyErr_Format(PyExc_TypeError,
4696 "expected int/long, %s found",
4697 Py_TYPE(arg)->tp_name);
4698 if (x == (unsigned long) -1 && PyErr_Occurred())
4699 return NULL;
4700 return PyLong_FromUnsignedLong(ntohl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00004701}
4702
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004703PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004704"ntohl(integer) -> integer\n\
4705\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004706Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004707
4708
Guido van Rossum006bf911996-06-12 04:04:55 +00004709static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004710socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00004711{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004712 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00004713
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004714 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
4715 return NULL;
4716 }
4717 if (x1 < 0) {
4718 PyErr_SetString(PyExc_OverflowError,
4719 "can't convert negative number to unsigned long");
4720 return NULL;
4721 }
4722 x2 = (unsigned int)htons((unsigned short)x1);
4723 return PyLong_FromLong(x2);
Guido van Rossum006bf911996-06-12 04:04:55 +00004724}
4725
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004726PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004727"htons(integer) -> integer\n\
4728\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004729Convert a 16-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004730
4731
Guido van Rossum006bf911996-06-12 04:04:55 +00004732static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004733socket_htonl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00004734{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004735 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00004736
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004737 if (PyLong_Check(arg)) {
4738 x = PyLong_AsUnsignedLong(arg);
4739 if (x == (unsigned long) -1 && PyErr_Occurred())
4740 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004741#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004742 {
4743 unsigned long y;
4744 /* only want the trailing 32 bits */
4745 y = x & 0xFFFFFFFFUL;
4746 if (y ^ x)
4747 return PyErr_Format(PyExc_OverflowError,
4748 "long int larger than 32 bits");
4749 x = y;
4750 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004751#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004752 }
4753 else
4754 return PyErr_Format(PyExc_TypeError,
4755 "expected int/long, %s found",
4756 Py_TYPE(arg)->tp_name);
4757 return PyLong_FromUnsignedLong(htonl((unsigned long)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00004758}
4759
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004760PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004761"htonl(integer) -> integer\n\
4762\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004763Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004764
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004765/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004766
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004767PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004768"inet_aton(string) -> bytes giving packed 32-bit IP representation\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004769\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00004770Convert 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 +00004771binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004772
4773static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004774socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004775{
Guido van Rossuma2e48551999-09-09 15:42:59 +00004776#ifndef INADDR_NONE
4777#define INADDR_NONE (-1)
4778#endif
Neal Norwitz88f115b2003-02-13 02:15:42 +00004779#ifdef HAVE_INET_ATON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004780 struct in_addr buf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00004781#endif
4782
4783#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
Benjamin Petersonf91df042009-02-13 02:50:59 +00004784#if (SIZEOF_INT != 4)
4785#error "Not sure if in_addr_t exists and int is not 32-bits."
4786#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004787 /* Have to use inet_addr() instead */
4788 unsigned int packed_addr;
Tim Peters1df9fdd2003-02-13 03:13:40 +00004789#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004790 char *ip_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00004791
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004792 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))
4793 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00004794
Tim Peters1df9fdd2003-02-13 03:13:40 +00004795
4796#ifdef HAVE_INET_ATON
Thomas Wouters477c8d52006-05-27 19:21:47 +00004797
4798#ifdef USE_INET_ATON_WEAKLINK
4799 if (inet_aton != NULL) {
4800#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004801 if (inet_aton(ip_addr, &buf))
4802 return PyBytes_FromStringAndSize((char *)(&buf),
4803 sizeof(buf));
Guido van Rossumad05cdf2003-02-12 23:08:22 +00004804
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004805 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004806 "illegal IP address string passed to inet_aton");
4807 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00004808
Thomas Wouters477c8d52006-05-27 19:21:47 +00004809#ifdef USE_INET_ATON_WEAKLINK
4810 } else {
4811#endif
4812
4813#endif
4814
4815#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
4816
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004817 /* special-case this address as inet_addr might return INADDR_NONE
4818 * for this */
4819 if (strcmp(ip_addr, "255.255.255.255") == 0) {
4820 packed_addr = 0xFFFFFFFF;
4821 } else {
Thomas Wouters477c8d52006-05-27 19:21:47 +00004822
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004823 packed_addr = inet_addr(ip_addr);
Guido van Rossumc6a164b1999-08-20 19:11:27 +00004824
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004825 if (packed_addr == INADDR_NONE) { /* invalid address */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004826 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004827 "illegal IP address string passed to inet_aton");
4828 return NULL;
4829 }
4830 }
4831 return PyBytes_FromStringAndSize((char *) &packed_addr,
4832 sizeof(packed_addr));
Thomas Wouters477c8d52006-05-27 19:21:47 +00004833
4834#ifdef USE_INET_ATON_WEAKLINK
4835 }
4836#endif
4837
Guido van Rossumad05cdf2003-02-12 23:08:22 +00004838#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004839}
4840
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004841PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00004842"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004843\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004844Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004845
4846static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004847socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004848{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004849 char *packed_str;
4850 int addr_len;
4851 struct in_addr packed_addr;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004852
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004853 if (!PyArg_ParseTuple(args, "y#:inet_ntoa", &packed_str, &addr_len)) {
4854 return NULL;
4855 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00004856
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004857 if (addr_len != sizeof(packed_addr)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004858 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004859 "packed IP wrong length for inet_ntoa");
4860 return NULL;
4861 }
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004862
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004863 memcpy(&packed_addr, packed_str, addr_len);
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004864
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004865 return PyUnicode_FromString(inet_ntoa(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004866}
Guido van Rossum82a5c661998-07-07 20:45:43 +00004867
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004868#ifdef HAVE_INET_PTON
4869
4870PyDoc_STRVAR(inet_pton_doc,
4871"inet_pton(af, ip) -> packed IP address string\n\
4872\n\
4873Convert an IP address from string format to a packed string suitable\n\
4874for use with low-level network functions.");
4875
4876static PyObject *
4877socket_inet_pton(PyObject *self, PyObject *args)
4878{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004879 int af;
4880 char* ip;
4881 int retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004882#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004883 char packed[MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004884#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004885 char packed[sizeof(struct in_addr)];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004886#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004887 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
4888 return NULL;
4889 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004890
Martin v. Löwis04697e82004-06-02 12:35:29 +00004891#if !defined(ENABLE_IPV6) && defined(AF_INET6)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004892 if(af == AF_INET6) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004893 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004894 "can't use AF_INET6, IPv6 is disabled");
4895 return NULL;
4896 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00004897#endif
Martin v. Löwis10649092003-08-05 06:25:06 +00004898
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004899 retval = inet_pton(af, ip, packed);
4900 if (retval < 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004901 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004902 return NULL;
4903 } else if (retval == 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004904 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004905 "illegal IP address string passed to inet_pton");
4906 return NULL;
4907 } else if (af == AF_INET) {
4908 return PyBytes_FromStringAndSize(packed,
4909 sizeof(struct in_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004910#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004911 } else if (af == AF_INET6) {
4912 return PyBytes_FromStringAndSize(packed,
4913 sizeof(struct in6_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004914#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004915 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004916 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004917 return NULL;
4918 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004919}
Thomas Wouters477c8d52006-05-27 19:21:47 +00004920
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004921PyDoc_STRVAR(inet_ntop_doc,
4922"inet_ntop(af, packed_ip) -> string formatted IP address\n\
4923\n\
4924Convert a packed IP address of the given family to string format.");
4925
4926static PyObject *
4927socket_inet_ntop(PyObject *self, PyObject *args)
4928{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004929 int af;
4930 char* packed;
4931 int len;
4932 const char* retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004933#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004934 char ip[MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004935#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004936 char ip[INET_ADDRSTRLEN + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004937#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00004938
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004939 /* Guarantee NUL-termination for PyUnicode_FromString() below */
4940 memset((void *) &ip[0], '\0', sizeof(ip));
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004941
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004942 if (!PyArg_ParseTuple(args, "iy#:inet_ntop", &af, &packed, &len)) {
4943 return NULL;
4944 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004945
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004946 if (af == AF_INET) {
4947 if (len != sizeof(struct in_addr)) {
4948 PyErr_SetString(PyExc_ValueError,
4949 "invalid length of packed IP address string");
4950 return NULL;
4951 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004952#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004953 } else if (af == AF_INET6) {
4954 if (len != sizeof(struct in6_addr)) {
4955 PyErr_SetString(PyExc_ValueError,
4956 "invalid length of packed IP address string");
4957 return NULL;
4958 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004959#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004960 } else {
4961 PyErr_Format(PyExc_ValueError,
4962 "unknown address family %d", af);
4963 return NULL;
4964 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004965
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004966 retval = inet_ntop(af, packed, ip, sizeof(ip));
4967 if (!retval) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004968 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004969 return NULL;
4970 } else {
4971 return PyUnicode_FromString(retval);
4972 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004973
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004974 /* NOTREACHED */
4975 PyErr_SetString(PyExc_RuntimeError, "invalid handling of inet_ntop");
4976 return NULL;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004977}
4978
4979#endif /* HAVE_INET_PTON */
4980
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004981/* Python interface to getaddrinfo(host, port). */
4982
4983/*ARGSUSED*/
4984static PyObject *
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00004985socket_getaddrinfo(PyObject *self, PyObject *args, PyObject* kwargs)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004986{
Victor Stinner77af1722011-05-26 14:05:59 +02004987 static char* kwnames[] = {"host", "port", "family", "type", "proto",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00004988 "flags", 0};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004989 struct addrinfo hints, *res;
4990 struct addrinfo *res0 = NULL;
4991 PyObject *hobj = NULL;
4992 PyObject *pobj = (PyObject *)NULL;
4993 char pbuf[30];
4994 char *hptr, *pptr;
4995 int family, socktype, protocol, flags;
4996 int error;
4997 PyObject *all = (PyObject *)NULL;
4998 PyObject *idna = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004999
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005000 family = socktype = protocol = flags = 0;
5001 family = AF_UNSPEC;
Victor Stinner77af1722011-05-26 14:05:59 +02005002 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OO|iiii:getaddrinfo",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005003 kwnames, &hobj, &pobj, &family, &socktype,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005004 &protocol, &flags)) {
5005 return NULL;
5006 }
5007 if (hobj == Py_None) {
5008 hptr = NULL;
5009 } else if (PyUnicode_Check(hobj)) {
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02005010 _Py_IDENTIFIER(encode);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02005011
5012 idna = _PyObject_CallMethodId(hobj, &PyId_encode, "s", "idna");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005013 if (!idna)
5014 return NULL;
5015 assert(PyBytes_Check(idna));
5016 hptr = PyBytes_AS_STRING(idna);
5017 } else if (PyBytes_Check(hobj)) {
5018 hptr = PyBytes_AsString(hobj);
5019 } else {
5020 PyErr_SetString(PyExc_TypeError,
5021 "getaddrinfo() argument 1 must be string or None");
5022 return NULL;
5023 }
5024 if (PyLong_CheckExact(pobj)) {
5025 long value = PyLong_AsLong(pobj);
5026 if (value == -1 && PyErr_Occurred())
5027 goto err;
5028 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", value);
5029 pptr = pbuf;
5030 } else if (PyUnicode_Check(pobj)) {
5031 pptr = _PyUnicode_AsString(pobj);
Alexander Belopolskye239d232010-12-08 23:31:48 +00005032 if (pptr == NULL)
5033 goto err;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005034 } else if (PyBytes_Check(pobj)) {
Alexander Belopolskye239d232010-12-08 23:31:48 +00005035 pptr = PyBytes_AS_STRING(pobj);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005036 } else if (pobj == Py_None) {
5037 pptr = (char *)NULL;
5038 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005039 PyErr_SetString(PyExc_OSError, "Int or String expected");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005040 goto err;
5041 }
5042 memset(&hints, 0, sizeof(hints));
5043 hints.ai_family = family;
5044 hints.ai_socktype = socktype;
5045 hints.ai_protocol = protocol;
5046 hints.ai_flags = flags;
5047 Py_BEGIN_ALLOW_THREADS
5048 ACQUIRE_GETADDRINFO_LOCK
5049 error = getaddrinfo(hptr, pptr, &hints, &res0);
5050 Py_END_ALLOW_THREADS
5051 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
5052 if (error) {
5053 set_gaierror(error);
5054 goto err;
5055 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005056
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005057 if ((all = PyList_New(0)) == NULL)
5058 goto err;
5059 for (res = res0; res; res = res->ai_next) {
5060 PyObject *single;
5061 PyObject *addr =
5062 makesockaddr(-1, res->ai_addr, res->ai_addrlen, protocol);
5063 if (addr == NULL)
5064 goto err;
5065 single = Py_BuildValue("iiisO", res->ai_family,
5066 res->ai_socktype, res->ai_protocol,
5067 res->ai_canonname ? res->ai_canonname : "",
5068 addr);
5069 Py_DECREF(addr);
5070 if (single == NULL)
5071 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005072
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005073 if (PyList_Append(all, single))
5074 goto err;
5075 Py_XDECREF(single);
5076 }
5077 Py_XDECREF(idna);
5078 if (res0)
5079 freeaddrinfo(res0);
5080 return all;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005081 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005082 Py_XDECREF(all);
5083 Py_XDECREF(idna);
5084 if (res0)
5085 freeaddrinfo(res0);
5086 return (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005087}
5088
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005089PyDoc_STRVAR(getaddrinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005090"getaddrinfo(host, port [, family, socktype, proto, flags])\n\
5091 -> list of (family, socktype, proto, canonname, sockaddr)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005092\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005093Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005094
5095/* Python interface to getnameinfo(sa, flags). */
5096
5097/*ARGSUSED*/
5098static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005099socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005100{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005101 PyObject *sa = (PyObject *)NULL;
5102 int flags;
5103 char *hostp;
Charles-François Natali366999a2012-01-02 15:47:29 +01005104 int port;
5105 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005106 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
5107 struct addrinfo hints, *res = NULL;
5108 int error;
5109 PyObject *ret = (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005110
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005111 flags = flowinfo = scope_id = 0;
5112 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
5113 return NULL;
5114 if (!PyTuple_Check(sa)) {
5115 PyErr_SetString(PyExc_TypeError,
5116 "getnameinfo() argument 1 must be a tuple");
5117 return NULL;
5118 }
Charles-François Natali366999a2012-01-02 15:47:29 +01005119 if (!PyArg_ParseTuple(sa, "si|II",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005120 &hostp, &port, &flowinfo, &scope_id))
5121 return NULL;
Charles-François Natali366999a2012-01-02 15:47:29 +01005122 if (flowinfo < 0 || flowinfo > 0xfffff) {
5123 PyErr_SetString(PyExc_OverflowError,
5124 "getsockaddrarg: flowinfo must be 0-1048575.");
5125 return NULL;
5126 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005127 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
5128 memset(&hints, 0, sizeof(hints));
5129 hints.ai_family = AF_UNSPEC;
5130 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Martin v. Löwis112c0f32010-08-25 07:38:15 +00005131 hints.ai_flags = AI_NUMERICHOST; /* don't do any name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005132 Py_BEGIN_ALLOW_THREADS
5133 ACQUIRE_GETADDRINFO_LOCK
5134 error = getaddrinfo(hostp, pbuf, &hints, &res);
5135 Py_END_ALLOW_THREADS
5136 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
5137 if (error) {
5138 set_gaierror(error);
5139 goto fail;
5140 }
5141 if (res->ai_next) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005142 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005143 "sockaddr resolved to multiple addresses");
5144 goto fail;
5145 }
5146 switch (res->ai_family) {
5147 case AF_INET:
5148 {
5149 if (PyTuple_GET_SIZE(sa) != 2) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005150 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005151 "IPv4 sockaddr must be 2 tuple");
5152 goto fail;
5153 }
5154 break;
5155 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005156#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005157 case AF_INET6:
5158 {
5159 struct sockaddr_in6 *sin6;
5160 sin6 = (struct sockaddr_in6 *)res->ai_addr;
Charles-François Natali366999a2012-01-02 15:47:29 +01005161 sin6->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005162 sin6->sin6_scope_id = scope_id;
5163 break;
5164 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005165#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005166 }
Antoine Pitrou19467d22010-08-17 19:33:30 +00005167 error = getnameinfo(res->ai_addr, (socklen_t) res->ai_addrlen,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005168 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
5169 if (error) {
5170 set_gaierror(error);
5171 goto fail;
5172 }
5173 ret = Py_BuildValue("ss", hbuf, pbuf);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005174
5175fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005176 if (res)
5177 freeaddrinfo(res);
5178 return ret;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005179}
5180
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005181PyDoc_STRVAR(getnameinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005182"getnameinfo(sockaddr, flags) --> (host, port)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005183\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005184Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005185
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005186
5187/* Python API to getting and setting the default timeout value. */
5188
5189static PyObject *
5190socket_getdefaulttimeout(PyObject *self)
5191{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005192 if (defaulttimeout < 0.0) {
5193 Py_INCREF(Py_None);
5194 return Py_None;
5195 }
5196 else
5197 return PyFloat_FromDouble(defaulttimeout);
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005198}
5199
5200PyDoc_STRVAR(getdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005201"getdefaulttimeout() -> timeout\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005202\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03005203Returns the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005204A value of None indicates that new socket objects have no timeout.\n\
5205When the socket module is first imported, the default is None.");
5206
5207static PyObject *
5208socket_setdefaulttimeout(PyObject *self, PyObject *arg)
5209{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005210 double timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005211
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005212 if (arg == Py_None)
5213 timeout = -1.0;
5214 else {
5215 timeout = PyFloat_AsDouble(arg);
5216 if (timeout < 0.0) {
5217 if (!PyErr_Occurred())
5218 PyErr_SetString(PyExc_ValueError,
5219 "Timeout value out of range");
5220 return NULL;
5221 }
5222 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005223
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005224 defaulttimeout = timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005225
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005226 Py_INCREF(Py_None);
5227 return Py_None;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005228}
5229
5230PyDoc_STRVAR(setdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005231"setdefaulttimeout(timeout)\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005232\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03005233Set the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005234A value of None indicates that new socket objects have no timeout.\n\
5235When the socket module is first imported, the default is None.");
5236
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005237#ifdef HAVE_IF_NAMEINDEX
5238/* Python API for getting interface indices and names */
5239
5240static PyObject *
5241socket_if_nameindex(PyObject *self, PyObject *arg)
5242{
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005243 PyObject *list;
Charles-François Natali60713592011-05-20 16:55:06 +02005244 int i;
5245 struct if_nameindex *ni;
Victor Stinner77af1722011-05-26 14:05:59 +02005246
Charles-François Natali60713592011-05-20 16:55:06 +02005247 ni = if_nameindex();
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005248 if (ni == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005249 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005250 return NULL;
5251 }
5252
5253 list = PyList_New(0);
5254 if (list == NULL) {
5255 if_freenameindex(ni);
5256 return NULL;
5257 }
5258
Charles-François Natali60713592011-05-20 16:55:06 +02005259 for (i = 0; ni[i].if_index != 0 && i < INT_MAX; i++) {
5260 PyObject *ni_tuple = Py_BuildValue("IO&",
5261 ni[i].if_index, PyUnicode_DecodeFSDefault, ni[i].if_name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005262
5263 if (ni_tuple == NULL || PyList_Append(list, ni_tuple) == -1) {
5264 Py_XDECREF(ni_tuple);
Charles-François Natali60713592011-05-20 16:55:06 +02005265 Py_DECREF(list);
5266 if_freenameindex(ni);
5267 return NULL;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005268 }
5269 Py_DECREF(ni_tuple);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005270 }
5271
5272 if_freenameindex(ni);
5273 return list;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005274}
5275
5276PyDoc_STRVAR(if_nameindex_doc,
5277"if_nameindex()\n\
5278\n\
5279Returns a list of network interface information (index, name) tuples.");
5280
Charles-François Natali60713592011-05-20 16:55:06 +02005281static PyObject *
5282socket_if_nametoindex(PyObject *self, PyObject *args)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005283{
Charles-François Natali60713592011-05-20 16:55:06 +02005284 PyObject *oname;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005285 unsigned long index;
5286
Charles-François Natali60713592011-05-20 16:55:06 +02005287 if (!PyArg_ParseTuple(args, "O&:if_nametoindex",
5288 PyUnicode_FSConverter, &oname))
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005289 return NULL;
5290
Charles-François Natali60713592011-05-20 16:55:06 +02005291 index = if_nametoindex(PyBytes_AS_STRING(oname));
5292 Py_DECREF(oname);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005293 if (index == 0) {
Charles-François Natali60713592011-05-20 16:55:06 +02005294 /* if_nametoindex() doesn't set errno */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005295 PyErr_SetString(PyExc_OSError, "no interface with this name");
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005296 return NULL;
5297 }
5298
5299 return PyLong_FromUnsignedLong(index);
5300}
5301
5302PyDoc_STRVAR(if_nametoindex_doc,
5303"if_nametoindex(if_name)\n\
5304\n\
5305Returns the interface index corresponding to the interface name if_name.");
5306
Charles-François Natali60713592011-05-20 16:55:06 +02005307static PyObject *
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005308socket_if_indextoname(PyObject *self, PyObject *arg)
5309{
Charles-François Natali60713592011-05-20 16:55:06 +02005310 unsigned long index;
5311 char name[IF_NAMESIZE + 1];
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005312
Charles-François Natali60713592011-05-20 16:55:06 +02005313 index = PyLong_AsUnsignedLong(arg);
5314 if (index == (unsigned long) -1)
5315 return NULL;
5316
5317 if (if_indextoname(index, name) == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005318 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005319 return NULL;
5320 }
5321
Charles-François Natali60713592011-05-20 16:55:06 +02005322 return PyUnicode_DecodeFSDefault(name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005323}
5324
5325PyDoc_STRVAR(if_indextoname_doc,
5326"if_indextoname(if_index)\n\
5327\n\
5328Returns the interface name corresponding to the interface index if_index.");
5329
5330#endif /* HAVE_IF_NAMEINDEX */
5331
5332
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005333#ifdef CMSG_LEN
5334/* Python interface to CMSG_LEN(length). */
5335
5336static PyObject *
5337socket_CMSG_LEN(PyObject *self, PyObject *args)
5338{
5339 Py_ssize_t length;
5340 size_t result;
5341
5342 if (!PyArg_ParseTuple(args, "n:CMSG_LEN", &length))
5343 return NULL;
5344 if (length < 0 || !get_CMSG_LEN(length, &result)) {
5345 PyErr_Format(PyExc_OverflowError, "CMSG_LEN() argument out of range");
5346 return NULL;
5347 }
5348 return PyLong_FromSize_t(result);
5349}
5350
5351PyDoc_STRVAR(CMSG_LEN_doc,
5352"CMSG_LEN(length) -> control message length\n\
5353\n\
5354Return the total length, without trailing padding, of an ancillary\n\
5355data item with associated data of the given length. This value can\n\
5356often be used as the buffer size for recvmsg() to receive a single\n\
5357item of ancillary data, but RFC 3542 requires portable applications to\n\
5358use CMSG_SPACE() and thus include space for padding, even when the\n\
5359item will be the last in the buffer. Raises OverflowError if length\n\
5360is outside the permissible range of values.");
5361
5362
5363#ifdef CMSG_SPACE
5364/* Python interface to CMSG_SPACE(length). */
5365
5366static PyObject *
5367socket_CMSG_SPACE(PyObject *self, PyObject *args)
5368{
5369 Py_ssize_t length;
5370 size_t result;
5371
5372 if (!PyArg_ParseTuple(args, "n:CMSG_SPACE", &length))
5373 return NULL;
5374 if (length < 0 || !get_CMSG_SPACE(length, &result)) {
5375 PyErr_SetString(PyExc_OverflowError,
5376 "CMSG_SPACE() argument out of range");
5377 return NULL;
5378 }
5379 return PyLong_FromSize_t(result);
5380}
5381
5382PyDoc_STRVAR(CMSG_SPACE_doc,
5383"CMSG_SPACE(length) -> buffer size\n\
5384\n\
5385Return the buffer size needed for recvmsg() to receive an ancillary\n\
5386data item with associated data of the given length, along with any\n\
5387trailing padding. The buffer space needed to receive multiple items\n\
5388is the sum of the CMSG_SPACE() values for their associated data\n\
5389lengths. Raises OverflowError if length is outside the permissible\n\
5390range of values.");
5391#endif /* CMSG_SPACE */
5392#endif /* CMSG_LEN */
5393
5394
Guido van Rossum30a685f1991-06-27 15:51:29 +00005395/* List of functions exported by this module. */
5396
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005397static PyMethodDef socket_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005398 {"gethostbyname", socket_gethostbyname,
5399 METH_VARARGS, gethostbyname_doc},
5400 {"gethostbyname_ex", socket_gethostbyname_ex,
5401 METH_VARARGS, ghbn_ex_doc},
5402 {"gethostbyaddr", socket_gethostbyaddr,
5403 METH_VARARGS, gethostbyaddr_doc},
5404 {"gethostname", socket_gethostname,
5405 METH_NOARGS, gethostname_doc},
Antoine Pitrou061cfb52011-02-28 22:25:22 +00005406#ifdef HAVE_SETHOSTNAME
5407 {"sethostname", socket_sethostname,
5408 METH_VARARGS, sethostname_doc},
5409#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005410 {"getservbyname", socket_getservbyname,
5411 METH_VARARGS, getservbyname_doc},
5412 {"getservbyport", socket_getservbyport,
5413 METH_VARARGS, getservbyport_doc},
5414 {"getprotobyname", socket_getprotobyname,
5415 METH_VARARGS, getprotobyname_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005416#ifndef NO_DUP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005417 {"dup", socket_dup,
5418 METH_O, dup_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005419#endif
Dave Cole331708b2004-08-09 04:51:41 +00005420#ifdef HAVE_SOCKETPAIR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005421 {"socketpair", socket_socketpair,
5422 METH_VARARGS, socketpair_doc},
Dave Cole331708b2004-08-09 04:51:41 +00005423#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005424 {"ntohs", socket_ntohs,
5425 METH_VARARGS, ntohs_doc},
5426 {"ntohl", socket_ntohl,
5427 METH_O, ntohl_doc},
5428 {"htons", socket_htons,
5429 METH_VARARGS, htons_doc},
5430 {"htonl", socket_htonl,
5431 METH_O, htonl_doc},
5432 {"inet_aton", socket_inet_aton,
5433 METH_VARARGS, inet_aton_doc},
5434 {"inet_ntoa", socket_inet_ntoa,
5435 METH_VARARGS, inet_ntoa_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005436#ifdef HAVE_INET_PTON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005437 {"inet_pton", socket_inet_pton,
5438 METH_VARARGS, inet_pton_doc},
5439 {"inet_ntop", socket_inet_ntop,
5440 METH_VARARGS, inet_ntop_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005441#endif
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005442 {"getaddrinfo", (PyCFunction)socket_getaddrinfo,
5443 METH_VARARGS | METH_KEYWORDS, getaddrinfo_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005444 {"getnameinfo", socket_getnameinfo,
5445 METH_VARARGS, getnameinfo_doc},
5446 {"getdefaulttimeout", (PyCFunction)socket_getdefaulttimeout,
5447 METH_NOARGS, getdefaulttimeout_doc},
5448 {"setdefaulttimeout", socket_setdefaulttimeout,
5449 METH_O, setdefaulttimeout_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005450#ifdef HAVE_IF_NAMEINDEX
5451 {"if_nameindex", socket_if_nameindex,
5452 METH_NOARGS, if_nameindex_doc},
5453 {"if_nametoindex", socket_if_nametoindex,
Charles-François Natali60713592011-05-20 16:55:06 +02005454 METH_VARARGS, if_nametoindex_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005455 {"if_indextoname", socket_if_indextoname,
5456 METH_O, if_indextoname_doc},
5457#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005458#ifdef CMSG_LEN
5459 {"CMSG_LEN", socket_CMSG_LEN,
5460 METH_VARARGS, CMSG_LEN_doc},
5461#ifdef CMSG_SPACE
5462 {"CMSG_SPACE", socket_CMSG_SPACE,
5463 METH_VARARGS, CMSG_SPACE_doc},
5464#endif
5465#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005466 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005467};
5468
Guido van Rossum30a685f1991-06-27 15:51:29 +00005469
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005470#ifdef MS_WINDOWS
5471#define OS_INIT_DEFINED
5472
5473/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00005474
5475static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005476os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00005477{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005478 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00005479}
5480
5481static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005482os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00005483{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005484 WSADATA WSAData;
5485 int ret;
5486 ret = WSAStartup(0x0101, &WSAData);
5487 switch (ret) {
5488 case 0: /* No error */
5489 Py_AtExit(os_cleanup);
5490 return 1; /* Success */
5491 case WSASYSNOTREADY:
5492 PyErr_SetString(PyExc_ImportError,
5493 "WSAStartup failed: network not ready");
5494 break;
5495 case WSAVERNOTSUPPORTED:
5496 case WSAEINVAL:
5497 PyErr_SetString(
5498 PyExc_ImportError,
5499 "WSAStartup failed: requested version not supported");
5500 break;
5501 default:
5502 PyErr_Format(PyExc_ImportError, "WSAStartup failed: error code %d", ret);
5503 break;
5504 }
5505 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00005506}
5507
Guido van Rossum8d665e61996-06-26 18:22:49 +00005508#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00005509
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005510
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005511#ifdef PYOS_OS2
5512#define OS_INIT_DEFINED
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005513
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005514/* Additional initialization for OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005515
5516static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005517os_init(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005518{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005519#ifndef PYCC_GCC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005520 int rc = sock_init();
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005521
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005522 if (rc == 0) {
5523 return 1; /* Success */
5524 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005525
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005526 PyErr_Format(PyExc_ImportError, "OS/2 TCP/IP Error# %d", sock_errno());
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005527
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005528 return 0; /* Failure */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00005529#else
Ezio Melotti13925002011-03-16 11:05:33 +02005530 /* No need to initialize sockets with GCC/EMX */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005531 return 1; /* Success */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00005532#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005533}
5534
5535#endif /* PYOS_OS2 */
5536
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005537
5538#ifndef OS_INIT_DEFINED
5539static int
5540os_init(void)
5541{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005542 return 1; /* Success */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005543}
5544#endif
5545
5546
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005547/* C API table - always add new things to the end for binary
5548 compatibility. */
5549static
5550PySocketModule_APIObject PySocketModuleAPI =
5551{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005552 &sock_type,
Antoine Pitrouc4df7842010-12-03 19:59:41 +00005553 NULL,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005554 NULL
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005555};
5556
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005557
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005558/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005559
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005560 This module is actually called "_socket", and there's a wrapper
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005561 "socket.py" which implements some additional functionality.
5562 The import of "_socket" may fail with an ImportError exception if
5563 os-specific initialization fails. On Windows, this does WINSOCK
Ezio Melotti13925002011-03-16 11:05:33 +02005564 initialization. When WINSOCK is initialized successfully, a call to
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005565 WSACleanup() is scheduled to be made at exit time.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005566*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005567
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005568PyDoc_STRVAR(socket_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005569"Implementation module for socket operations.\n\
5570\n\
5571See the socket module for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005572
Martin v. Löwis1a214512008-06-11 05:26:20 +00005573static struct PyModuleDef socketmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005574 PyModuleDef_HEAD_INIT,
5575 PySocket_MODULE_NAME,
5576 socket_doc,
5577 -1,
5578 socket_methods,
5579 NULL,
5580 NULL,
5581 NULL,
5582 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00005583};
5584
Mark Hammondfe51c6d2002-08-02 02:27:13 +00005585PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00005586PyInit__socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005587{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005588 PyObject *m, *has_ipv6;
Fred Drake4baedc12002-04-01 14:53:37 +00005589
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005590 if (!os_init())
5591 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005592
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005593 Py_TYPE(&sock_type) = &PyType_Type;
5594 m = PyModule_Create(&socketmodule);
5595 if (m == NULL)
5596 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005597
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005598 Py_INCREF(PyExc_OSError);
5599 PySocketModuleAPI.error = PyExc_OSError;
5600 Py_INCREF(PyExc_OSError);
5601 PyModule_AddObject(m, "error", PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005602 socket_herror = PyErr_NewException("socket.herror",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005603 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005604 if (socket_herror == NULL)
5605 return NULL;
5606 Py_INCREF(socket_herror);
5607 PyModule_AddObject(m, "herror", socket_herror);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005608 socket_gaierror = PyErr_NewException("socket.gaierror", PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005609 NULL);
5610 if (socket_gaierror == NULL)
5611 return NULL;
5612 Py_INCREF(socket_gaierror);
5613 PyModule_AddObject(m, "gaierror", socket_gaierror);
5614 socket_timeout = PyErr_NewException("socket.timeout",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005615 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005616 if (socket_timeout == NULL)
5617 return NULL;
Antoine Pitrouc4df7842010-12-03 19:59:41 +00005618 PySocketModuleAPI.timeout_error = socket_timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005619 Py_INCREF(socket_timeout);
5620 PyModule_AddObject(m, "timeout", socket_timeout);
5621 Py_INCREF((PyObject *)&sock_type);
5622 if (PyModule_AddObject(m, "SocketType",
5623 (PyObject *)&sock_type) != 0)
5624 return NULL;
5625 Py_INCREF((PyObject *)&sock_type);
5626 if (PyModule_AddObject(m, "socket",
5627 (PyObject *)&sock_type) != 0)
5628 return NULL;
Guido van Rossum09be4091999-08-09 14:40:40 +00005629
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005630#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005631 has_ipv6 = Py_True;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005632#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005633 has_ipv6 = Py_False;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005634#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005635 Py_INCREF(has_ipv6);
5636 PyModule_AddObject(m, "has_ipv6", has_ipv6);
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005637
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005638 /* Export C API */
5639 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
5640 PyCapsule_New(&PySocketModuleAPI, PySocket_CAPSULE_NAME, NULL)
5641 ) != 0)
5642 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005643
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005644 /* Address families (we only support AF_INET and AF_UNIX) */
Guido van Rossum09be4091999-08-09 14:40:40 +00005645#ifdef AF_UNSPEC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005646 PyModule_AddIntConstant(m, "AF_UNSPEC", AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00005647#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005648 PyModule_AddIntConstant(m, "AF_INET", AF_INET);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005649#ifdef AF_INET6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005650 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005651#endif /* AF_INET6 */
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00005652#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005653 PyModule_AddIntConstant(m, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00005654#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00005655#ifdef AF_AX25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005656 /* Amateur Radio AX.25 */
5657 PyModule_AddIntConstant(m, "AF_AX25", AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00005658#endif
5659#ifdef AF_IPX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005660 PyModule_AddIntConstant(m, "AF_IPX", AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00005661#endif
5662#ifdef AF_APPLETALK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005663 /* Appletalk DDP */
5664 PyModule_AddIntConstant(m, "AF_APPLETALK", AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00005665#endif
5666#ifdef AF_NETROM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005667 /* Amateur radio NetROM */
5668 PyModule_AddIntConstant(m, "AF_NETROM", AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00005669#endif
5670#ifdef AF_BRIDGE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005671 /* Multiprotocol bridge */
5672 PyModule_AddIntConstant(m, "AF_BRIDGE", AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00005673#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005674#ifdef AF_ATMPVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005675 /* ATM PVCs */
5676 PyModule_AddIntConstant(m, "AF_ATMPVC", AF_ATMPVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005677#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00005678#ifdef AF_AAL5
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005679 /* Reserved for Werner's ATM */
5680 PyModule_AddIntConstant(m, "AF_AAL5", AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00005681#endif
5682#ifdef AF_X25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005683 /* Reserved for X.25 project */
5684 PyModule_AddIntConstant(m, "AF_X25", AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00005685#endif
5686#ifdef AF_INET6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005687 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00005688#endif
5689#ifdef AF_ROSE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005690 /* Amateur Radio X.25 PLP */
5691 PyModule_AddIntConstant(m, "AF_ROSE", AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00005692#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005693#ifdef AF_DECnet
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005694 /* Reserved for DECnet project */
5695 PyModule_AddIntConstant(m, "AF_DECnet", AF_DECnet);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005696#endif
5697#ifdef AF_NETBEUI
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005698 /* Reserved for 802.2LLC project */
5699 PyModule_AddIntConstant(m, "AF_NETBEUI", AF_NETBEUI);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005700#endif
5701#ifdef AF_SECURITY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005702 /* Security callback pseudo AF */
5703 PyModule_AddIntConstant(m, "AF_SECURITY", AF_SECURITY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005704#endif
5705#ifdef AF_KEY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005706 /* PF_KEY key management API */
5707 PyModule_AddIntConstant(m, "AF_KEY", AF_KEY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005708#endif
5709#ifdef AF_NETLINK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005710 /* */
5711 PyModule_AddIntConstant(m, "AF_NETLINK", AF_NETLINK);
5712 PyModule_AddIntConstant(m, "NETLINK_ROUTE", NETLINK_ROUTE);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005713#ifdef NETLINK_SKIP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005714 PyModule_AddIntConstant(m, "NETLINK_SKIP", NETLINK_SKIP);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005715#endif
5716#ifdef NETLINK_W1
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005717 PyModule_AddIntConstant(m, "NETLINK_W1", NETLINK_W1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005718#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005719 PyModule_AddIntConstant(m, "NETLINK_USERSOCK", NETLINK_USERSOCK);
5720 PyModule_AddIntConstant(m, "NETLINK_FIREWALL", NETLINK_FIREWALL);
Guido van Rossum668a94a2006-02-21 01:07:27 +00005721#ifdef NETLINK_TCPDIAG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005722 PyModule_AddIntConstant(m, "NETLINK_TCPDIAG", NETLINK_TCPDIAG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00005723#endif
5724#ifdef NETLINK_NFLOG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005725 PyModule_AddIntConstant(m, "NETLINK_NFLOG", NETLINK_NFLOG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00005726#endif
Neal Norwitz65851662006-01-16 04:31:40 +00005727#ifdef NETLINK_XFRM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005728 PyModule_AddIntConstant(m, "NETLINK_XFRM", NETLINK_XFRM);
Neal Norwitz65851662006-01-16 04:31:40 +00005729#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005730#ifdef NETLINK_ARPD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005731 PyModule_AddIntConstant(m, "NETLINK_ARPD", NETLINK_ARPD);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005732#endif
5733#ifdef NETLINK_ROUTE6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005734 PyModule_AddIntConstant(m, "NETLINK_ROUTE6", NETLINK_ROUTE6);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005735#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005736 PyModule_AddIntConstant(m, "NETLINK_IP6_FW", NETLINK_IP6_FW);
Thomas Wouterscf297e42007-02-23 15:07:44 +00005737#ifdef NETLINK_DNRTMSG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005738 PyModule_AddIntConstant(m, "NETLINK_DNRTMSG", NETLINK_DNRTMSG);
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005739#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005740#ifdef NETLINK_TAPBASE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005741 PyModule_AddIntConstant(m, "NETLINK_TAPBASE", NETLINK_TAPBASE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005742#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005743#endif /* AF_NETLINK */
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005744#ifdef AF_ROUTE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005745 /* Alias to emulate 4.4BSD */
5746 PyModule_AddIntConstant(m, "AF_ROUTE", AF_ROUTE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005747#endif
5748#ifdef AF_ASH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005749 /* Ash */
5750 PyModule_AddIntConstant(m, "AF_ASH", AF_ASH);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005751#endif
5752#ifdef AF_ECONET
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005753 /* Acorn Econet */
5754 PyModule_AddIntConstant(m, "AF_ECONET", AF_ECONET);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005755#endif
5756#ifdef AF_ATMSVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005757 /* ATM SVCs */
5758 PyModule_AddIntConstant(m, "AF_ATMSVC", AF_ATMSVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005759#endif
5760#ifdef AF_SNA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005761 /* Linux SNA Project (nutters!) */
5762 PyModule_AddIntConstant(m, "AF_SNA", AF_SNA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005763#endif
5764#ifdef AF_IRDA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005765 /* IRDA sockets */
5766 PyModule_AddIntConstant(m, "AF_IRDA", AF_IRDA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005767#endif
5768#ifdef AF_PPPOX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005769 /* PPPoX sockets */
5770 PyModule_AddIntConstant(m, "AF_PPPOX", AF_PPPOX);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005771#endif
5772#ifdef AF_WANPIPE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005773 /* Wanpipe API Sockets */
5774 PyModule_AddIntConstant(m, "AF_WANPIPE", AF_WANPIPE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005775#endif
5776#ifdef AF_LLC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005777 /* Linux LLC */
5778 PyModule_AddIntConstant(m, "AF_LLC", AF_LLC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005779#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00005780
Hye-Shik Chang81268602004-02-02 06:05:24 +00005781#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005782 PyModule_AddIntConstant(m, "AF_BLUETOOTH", AF_BLUETOOTH);
5783 PyModule_AddIntConstant(m, "BTPROTO_L2CAP", BTPROTO_L2CAP);
5784 PyModule_AddIntConstant(m, "BTPROTO_HCI", BTPROTO_HCI);
5785 PyModule_AddIntConstant(m, "SOL_HCI", SOL_HCI);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00005786#if !defined(__NetBSD__) && !defined(__DragonFly__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005787 PyModule_AddIntConstant(m, "HCI_FILTER", HCI_FILTER);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00005788#endif
Hye-Shik Chang81268602004-02-02 06:05:24 +00005789#if !defined(__FreeBSD__)
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00005790#if !defined(__NetBSD__) && !defined(__DragonFly__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005791 PyModule_AddIntConstant(m, "HCI_TIME_STAMP", HCI_TIME_STAMP);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00005792#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005793 PyModule_AddIntConstant(m, "HCI_DATA_DIR", HCI_DATA_DIR);
5794 PyModule_AddIntConstant(m, "BTPROTO_SCO", BTPROTO_SCO);
Hye-Shik Chang81268602004-02-02 06:05:24 +00005795#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005796 PyModule_AddIntConstant(m, "BTPROTO_RFCOMM", BTPROTO_RFCOMM);
5797 PyModule_AddStringConstant(m, "BDADDR_ANY", "00:00:00:00:00:00");
5798 PyModule_AddStringConstant(m, "BDADDR_LOCAL", "00:00:00:FF:FF:FF");
Martin v. Löwis12af0482004-01-31 12:34:17 +00005799#endif
5800
Charles-François Natali47413c12011-10-06 19:47:44 +02005801#ifdef AF_CAN
5802 /* Controller Area Network */
5803 PyModule_AddIntConstant(m, "AF_CAN", AF_CAN);
5804#endif
5805#ifdef PF_CAN
5806 /* Controller Area Network */
5807 PyModule_AddIntConstant(m, "PF_CAN", PF_CAN);
5808#endif
5809
Charles-François Natali10b8cf42011-11-10 19:21:37 +01005810/* Reliable Datagram Sockets */
5811#ifdef AF_RDS
5812 PyModule_AddIntConstant(m, "AF_RDS", AF_RDS);
5813#endif
5814#ifdef PF_RDS
5815 PyModule_AddIntConstant(m, "PF_RDS", PF_RDS);
5816#endif
5817
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01005818/* Kernel event messages */
5819#ifdef PF_SYSTEM
5820 PyModule_AddIntConstant(m, "PF_SYSTEM", PF_SYSTEM);
5821#endif
5822#ifdef AF_SYSTEM
5823 PyModule_AddIntConstant(m, "AF_SYSTEM", AF_SYSTEM);
5824#endif
5825
Antoine Pitroub156a462010-10-27 20:13:57 +00005826#ifdef AF_PACKET
5827 PyModule_AddIntMacro(m, AF_PACKET);
5828#endif
5829#ifdef PF_PACKET
5830 PyModule_AddIntMacro(m, PF_PACKET);
5831#endif
5832#ifdef PACKET_HOST
5833 PyModule_AddIntMacro(m, PACKET_HOST);
5834#endif
5835#ifdef PACKET_BROADCAST
5836 PyModule_AddIntMacro(m, PACKET_BROADCAST);
5837#endif
5838#ifdef PACKET_MULTICAST
5839 PyModule_AddIntMacro(m, PACKET_MULTICAST);
5840#endif
5841#ifdef PACKET_OTHERHOST
5842 PyModule_AddIntMacro(m, PACKET_OTHERHOST);
5843#endif
5844#ifdef PACKET_OUTGOING
5845 PyModule_AddIntMacro(m, PACKET_OUTGOING);
5846#endif
5847#ifdef PACKET_LOOPBACK
5848 PyModule_AddIntMacro(m, PACKET_LOOPBACK);
5849#endif
5850#ifdef PACKET_FASTROUTE
5851 PyModule_AddIntMacro(m, PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00005852#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00005853
Christian Heimes043d6f62008-01-07 17:19:16 +00005854#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005855 PyModule_AddIntConstant(m, "AF_TIPC", AF_TIPC);
Christian Heimes043d6f62008-01-07 17:19:16 +00005856
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005857 /* for addresses */
5858 PyModule_AddIntConstant(m, "TIPC_ADDR_NAMESEQ", TIPC_ADDR_NAMESEQ);
5859 PyModule_AddIntConstant(m, "TIPC_ADDR_NAME", TIPC_ADDR_NAME);
5860 PyModule_AddIntConstant(m, "TIPC_ADDR_ID", TIPC_ADDR_ID);
Christian Heimes043d6f62008-01-07 17:19:16 +00005861
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005862 PyModule_AddIntConstant(m, "TIPC_ZONE_SCOPE", TIPC_ZONE_SCOPE);
5863 PyModule_AddIntConstant(m, "TIPC_CLUSTER_SCOPE", TIPC_CLUSTER_SCOPE);
5864 PyModule_AddIntConstant(m, "TIPC_NODE_SCOPE", TIPC_NODE_SCOPE);
Christian Heimes043d6f62008-01-07 17:19:16 +00005865
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005866 /* for setsockopt() */
5867 PyModule_AddIntConstant(m, "SOL_TIPC", SOL_TIPC);
5868 PyModule_AddIntConstant(m, "TIPC_IMPORTANCE", TIPC_IMPORTANCE);
5869 PyModule_AddIntConstant(m, "TIPC_SRC_DROPPABLE", TIPC_SRC_DROPPABLE);
5870 PyModule_AddIntConstant(m, "TIPC_DEST_DROPPABLE",
5871 TIPC_DEST_DROPPABLE);
5872 PyModule_AddIntConstant(m, "TIPC_CONN_TIMEOUT", TIPC_CONN_TIMEOUT);
Christian Heimes043d6f62008-01-07 17:19:16 +00005873
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005874 PyModule_AddIntConstant(m, "TIPC_LOW_IMPORTANCE",
5875 TIPC_LOW_IMPORTANCE);
5876 PyModule_AddIntConstant(m, "TIPC_MEDIUM_IMPORTANCE",
5877 TIPC_MEDIUM_IMPORTANCE);
5878 PyModule_AddIntConstant(m, "TIPC_HIGH_IMPORTANCE",
5879 TIPC_HIGH_IMPORTANCE);
5880 PyModule_AddIntConstant(m, "TIPC_CRITICAL_IMPORTANCE",
5881 TIPC_CRITICAL_IMPORTANCE);
Christian Heimes043d6f62008-01-07 17:19:16 +00005882
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005883 /* for subscriptions */
5884 PyModule_AddIntConstant(m, "TIPC_SUB_PORTS", TIPC_SUB_PORTS);
5885 PyModule_AddIntConstant(m, "TIPC_SUB_SERVICE", TIPC_SUB_SERVICE);
Christian Heimes25bb7832008-01-11 16:17:00 +00005886#ifdef TIPC_SUB_CANCEL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005887 /* doesn't seem to be available everywhere */
5888 PyModule_AddIntConstant(m, "TIPC_SUB_CANCEL", TIPC_SUB_CANCEL);
Christian Heimes25bb7832008-01-11 16:17:00 +00005889#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005890 PyModule_AddIntConstant(m, "TIPC_WAIT_FOREVER", TIPC_WAIT_FOREVER);
5891 PyModule_AddIntConstant(m, "TIPC_PUBLISHED", TIPC_PUBLISHED);
5892 PyModule_AddIntConstant(m, "TIPC_WITHDRAWN", TIPC_WITHDRAWN);
5893 PyModule_AddIntConstant(m, "TIPC_SUBSCR_TIMEOUT", TIPC_SUBSCR_TIMEOUT);
5894 PyModule_AddIntConstant(m, "TIPC_CFG_SRV", TIPC_CFG_SRV);
5895 PyModule_AddIntConstant(m, "TIPC_TOP_SRV", TIPC_TOP_SRV);
Christian Heimes043d6f62008-01-07 17:19:16 +00005896#endif
5897
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005898 /* Socket types */
5899 PyModule_AddIntConstant(m, "SOCK_STREAM", SOCK_STREAM);
5900 PyModule_AddIntConstant(m, "SOCK_DGRAM", SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00005901/* We have incomplete socket support. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005902 PyModule_AddIntConstant(m, "SOCK_RAW", SOCK_RAW);
5903 PyModule_AddIntConstant(m, "SOCK_SEQPACKET", SOCK_SEQPACKET);
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00005904#if defined(SOCK_RDM)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005905 PyModule_AddIntConstant(m, "SOCK_RDM", SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00005906#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +00005907#ifdef SOCK_CLOEXEC
5908 PyModule_AddIntConstant(m, "SOCK_CLOEXEC", SOCK_CLOEXEC);
5909#endif
5910#ifdef SOCK_NONBLOCK
5911 PyModule_AddIntConstant(m, "SOCK_NONBLOCK", SOCK_NONBLOCK);
5912#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005913
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005914#ifdef SO_DEBUG
5915 PyModule_AddIntConstant(m, "SO_DEBUG", SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005916#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005917#ifdef SO_ACCEPTCONN
5918 PyModule_AddIntConstant(m, "SO_ACCEPTCONN", SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005919#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005920#ifdef SO_REUSEADDR
5921 PyModule_AddIntConstant(m, "SO_REUSEADDR", SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005922#endif
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00005923#ifdef SO_EXCLUSIVEADDRUSE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005924 PyModule_AddIntConstant(m, "SO_EXCLUSIVEADDRUSE", SO_EXCLUSIVEADDRUSE);
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00005925#endif
5926
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005927#ifdef SO_KEEPALIVE
5928 PyModule_AddIntConstant(m, "SO_KEEPALIVE", SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005929#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005930#ifdef SO_DONTROUTE
5931 PyModule_AddIntConstant(m, "SO_DONTROUTE", SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005932#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005933#ifdef SO_BROADCAST
5934 PyModule_AddIntConstant(m, "SO_BROADCAST", SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005935#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005936#ifdef SO_USELOOPBACK
5937 PyModule_AddIntConstant(m, "SO_USELOOPBACK", SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005938#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005939#ifdef SO_LINGER
5940 PyModule_AddIntConstant(m, "SO_LINGER", SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005941#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005942#ifdef SO_OOBINLINE
5943 PyModule_AddIntConstant(m, "SO_OOBINLINE", SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005944#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005945#ifdef SO_REUSEPORT
5946 PyModule_AddIntConstant(m, "SO_REUSEPORT", SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005947#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005948#ifdef SO_SNDBUF
5949 PyModule_AddIntConstant(m, "SO_SNDBUF", SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005950#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005951#ifdef SO_RCVBUF
5952 PyModule_AddIntConstant(m, "SO_RCVBUF", SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005953#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005954#ifdef SO_SNDLOWAT
5955 PyModule_AddIntConstant(m, "SO_SNDLOWAT", SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005956#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005957#ifdef SO_RCVLOWAT
5958 PyModule_AddIntConstant(m, "SO_RCVLOWAT", SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005959#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005960#ifdef SO_SNDTIMEO
5961 PyModule_AddIntConstant(m, "SO_SNDTIMEO", SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005962#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005963#ifdef SO_RCVTIMEO
5964 PyModule_AddIntConstant(m, "SO_RCVTIMEO", SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005965#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005966#ifdef SO_ERROR
5967 PyModule_AddIntConstant(m, "SO_ERROR", SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005968#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005969#ifdef SO_TYPE
5970 PyModule_AddIntConstant(m, "SO_TYPE", SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005971#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005972#ifdef SO_SETFIB
5973 PyModule_AddIntConstant(m, "SO_SETFIB", SO_SETFIB);
Larry Hastingsf0f37952010-04-02 11:47:10 +00005974#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005975#ifdef SO_PASSCRED
5976 PyModule_AddIntConstant(m, "SO_PASSCRED", SO_PASSCRED);
5977#endif
5978#ifdef SO_PEERCRED
5979 PyModule_AddIntConstant(m, "SO_PEERCRED", SO_PEERCRED);
5980#endif
5981#ifdef LOCAL_PEERCRED
5982 PyModule_AddIntConstant(m, "LOCAL_PEERCRED", LOCAL_PEERCRED);
5983#endif
Victor Stinnercb98bed2011-10-25 13:45:48 +02005984#ifdef SO_BINDTODEVICE
5985 PyModule_AddIntMacro(m, SO_BINDTODEVICE);
5986#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005987
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005988 /* Maximum number of connections for "listen" */
5989#ifdef SOMAXCONN
5990 PyModule_AddIntConstant(m, "SOMAXCONN", SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005991#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005992 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005993#endif
5994
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005995 /* Ancilliary message types */
5996#ifdef SCM_RIGHTS
5997 PyModule_AddIntConstant(m, "SCM_RIGHTS", SCM_RIGHTS);
5998#endif
5999#ifdef SCM_CREDENTIALS
6000 PyModule_AddIntConstant(m, "SCM_CREDENTIALS", SCM_CREDENTIALS);
6001#endif
6002#ifdef SCM_CREDS
6003 PyModule_AddIntConstant(m, "SCM_CREDS", SCM_CREDS);
6004#endif
6005
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006006 /* Flags for send, recv */
6007#ifdef MSG_OOB
6008 PyModule_AddIntConstant(m, "MSG_OOB", MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006009#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006010#ifdef MSG_PEEK
6011 PyModule_AddIntConstant(m, "MSG_PEEK", MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006012#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006013#ifdef MSG_DONTROUTE
6014 PyModule_AddIntConstant(m, "MSG_DONTROUTE", MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006015#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006016#ifdef MSG_DONTWAIT
6017 PyModule_AddIntConstant(m, "MSG_DONTWAIT", MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00006018#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006019#ifdef MSG_EOR
6020 PyModule_AddIntConstant(m, "MSG_EOR", MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006021#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006022#ifdef MSG_TRUNC
6023 PyModule_AddIntConstant(m, "MSG_TRUNC", MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006024#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006025#ifdef MSG_CTRUNC
6026 PyModule_AddIntConstant(m, "MSG_CTRUNC", MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006027#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006028#ifdef MSG_WAITALL
6029 PyModule_AddIntConstant(m, "MSG_WAITALL", MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006030#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006031#ifdef MSG_BTAG
6032 PyModule_AddIntConstant(m, "MSG_BTAG", MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006033#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006034#ifdef MSG_ETAG
6035 PyModule_AddIntConstant(m, "MSG_ETAG", MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006036#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006037#ifdef MSG_NOSIGNAL
6038 PyModule_AddIntConstant(m, "MSG_NOSIGNAL", MSG_NOSIGNAL);
6039#endif
6040#ifdef MSG_NOTIFICATION
6041 PyModule_AddIntConstant(m, "MSG_NOTIFICATION", MSG_NOTIFICATION);
6042#endif
6043#ifdef MSG_CMSG_CLOEXEC
6044 PyModule_AddIntConstant(m, "MSG_CMSG_CLOEXEC", MSG_CMSG_CLOEXEC);
6045#endif
6046#ifdef MSG_ERRQUEUE
6047 PyModule_AddIntConstant(m, "MSG_ERRQUEUE", MSG_ERRQUEUE);
6048#endif
6049#ifdef MSG_CONFIRM
6050 PyModule_AddIntConstant(m, "MSG_CONFIRM", MSG_CONFIRM);
6051#endif
6052#ifdef MSG_MORE
6053 PyModule_AddIntConstant(m, "MSG_MORE", MSG_MORE);
6054#endif
6055#ifdef MSG_EOF
6056 PyModule_AddIntConstant(m, "MSG_EOF", MSG_EOF);
6057#endif
6058#ifdef MSG_BCAST
6059 PyModule_AddIntConstant(m, "MSG_BCAST", MSG_BCAST);
6060#endif
6061#ifdef MSG_MCAST
6062 PyModule_AddIntConstant(m, "MSG_MCAST", MSG_MCAST);
6063#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006064
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006065 /* Protocol level and numbers, usable for [gs]etsockopt */
6066#ifdef SOL_SOCKET
6067 PyModule_AddIntConstant(m, "SOL_SOCKET", SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006068#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006069#ifdef SOL_IP
6070 PyModule_AddIntConstant(m, "SOL_IP", SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006071#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006072 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00006073#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006074#ifdef SOL_IPX
6075 PyModule_AddIntConstant(m, "SOL_IPX", SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00006076#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006077#ifdef SOL_AX25
6078 PyModule_AddIntConstant(m, "SOL_AX25", SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00006079#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006080#ifdef SOL_ATALK
6081 PyModule_AddIntConstant(m, "SOL_ATALK", SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00006082#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006083#ifdef SOL_NETROM
6084 PyModule_AddIntConstant(m, "SOL_NETROM", SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00006085#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006086#ifdef SOL_ROSE
6087 PyModule_AddIntConstant(m, "SOL_ROSE", SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006088#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006089#ifdef SOL_TCP
6090 PyModule_AddIntConstant(m, "SOL_TCP", SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006091#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006092 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00006093#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006094#ifdef SOL_UDP
6095 PyModule_AddIntConstant(m, "SOL_UDP", SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006096#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006097 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00006098#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02006099#ifdef SOL_CAN_BASE
6100 PyModule_AddIntConstant(m, "SOL_CAN_BASE", SOL_CAN_BASE);
6101#endif
6102#ifdef SOL_CAN_RAW
6103 PyModule_AddIntConstant(m, "SOL_CAN_RAW", SOL_CAN_RAW);
6104 PyModule_AddIntConstant(m, "CAN_RAW", CAN_RAW);
6105#endif
6106#ifdef HAVE_LINUX_CAN_H
6107 PyModule_AddIntConstant(m, "CAN_EFF_FLAG", CAN_EFF_FLAG);
6108 PyModule_AddIntConstant(m, "CAN_RTR_FLAG", CAN_RTR_FLAG);
6109 PyModule_AddIntConstant(m, "CAN_ERR_FLAG", CAN_ERR_FLAG);
6110
6111 PyModule_AddIntConstant(m, "CAN_SFF_MASK", CAN_SFF_MASK);
6112 PyModule_AddIntConstant(m, "CAN_EFF_MASK", CAN_EFF_MASK);
6113 PyModule_AddIntConstant(m, "CAN_ERR_MASK", CAN_ERR_MASK);
6114#endif
6115#ifdef HAVE_LINUX_CAN_RAW_H
6116 PyModule_AddIntConstant(m, "CAN_RAW_FILTER", CAN_RAW_FILTER);
6117 PyModule_AddIntConstant(m, "CAN_RAW_ERR_FILTER", CAN_RAW_ERR_FILTER);
6118 PyModule_AddIntConstant(m, "CAN_RAW_LOOPBACK", CAN_RAW_LOOPBACK);
6119 PyModule_AddIntConstant(m, "CAN_RAW_RECV_OWN_MSGS", CAN_RAW_RECV_OWN_MSGS);
6120#endif
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006121#ifdef SOL_RDS
6122 PyModule_AddIntConstant(m, "SOL_RDS", SOL_RDS);
6123#endif
6124#ifdef RDS_CANCEL_SENT_TO
6125 PyModule_AddIntConstant(m, "RDS_CANCEL_SENT_TO", RDS_CANCEL_SENT_TO);
6126#endif
6127#ifdef RDS_GET_MR
6128 PyModule_AddIntConstant(m, "RDS_GET_MR", RDS_GET_MR);
6129#endif
6130#ifdef RDS_FREE_MR
6131 PyModule_AddIntConstant(m, "RDS_FREE_MR", RDS_FREE_MR);
6132#endif
6133#ifdef RDS_RECVERR
6134 PyModule_AddIntConstant(m, "RDS_RECVERR", RDS_RECVERR);
6135#endif
6136#ifdef RDS_CONG_MONITOR
6137 PyModule_AddIntConstant(m, "RDS_CONG_MONITOR", RDS_CONG_MONITOR);
6138#endif
6139#ifdef RDS_GET_MR_FOR_DEST
6140 PyModule_AddIntConstant(m, "RDS_GET_MR_FOR_DEST", RDS_GET_MR_FOR_DEST);
6141#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006142#ifdef IPPROTO_IP
6143 PyModule_AddIntConstant(m, "IPPROTO_IP", IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00006144#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006145 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006146#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006147#ifdef IPPROTO_HOPOPTS
6148 PyModule_AddIntConstant(m, "IPPROTO_HOPOPTS", IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006149#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006150#ifdef IPPROTO_ICMP
6151 PyModule_AddIntConstant(m, "IPPROTO_ICMP", IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00006152#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006153 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006154#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006155#ifdef IPPROTO_IGMP
6156 PyModule_AddIntConstant(m, "IPPROTO_IGMP", IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006157#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006158#ifdef IPPROTO_GGP
6159 PyModule_AddIntConstant(m, "IPPROTO_GGP", IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006160#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006161#ifdef IPPROTO_IPV4
6162 PyModule_AddIntConstant(m, "IPPROTO_IPV4", IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006163#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006164#ifdef IPPROTO_IPV6
6165 PyModule_AddIntConstant(m, "IPPROTO_IPV6", IPPROTO_IPV6);
Martin v. Löwisa0f17342003-10-03 13:56:20 +00006166#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006167#ifdef IPPROTO_IPIP
6168 PyModule_AddIntConstant(m, "IPPROTO_IPIP", IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006169#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006170#ifdef IPPROTO_TCP
6171 PyModule_AddIntConstant(m, "IPPROTO_TCP", IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00006172#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006173 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006174#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006175#ifdef IPPROTO_EGP
6176 PyModule_AddIntConstant(m, "IPPROTO_EGP", IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006177#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006178#ifdef IPPROTO_PUP
6179 PyModule_AddIntConstant(m, "IPPROTO_PUP", IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006180#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006181#ifdef IPPROTO_UDP
6182 PyModule_AddIntConstant(m, "IPPROTO_UDP", IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00006183#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006184 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006185#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006186#ifdef IPPROTO_IDP
6187 PyModule_AddIntConstant(m, "IPPROTO_IDP", IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006188#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006189#ifdef IPPROTO_HELLO
6190 PyModule_AddIntConstant(m, "IPPROTO_HELLO", IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006191#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006192#ifdef IPPROTO_ND
6193 PyModule_AddIntConstant(m, "IPPROTO_ND", IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006194#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006195#ifdef IPPROTO_TP
6196 PyModule_AddIntConstant(m, "IPPROTO_TP", IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006197#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006198#ifdef IPPROTO_IPV6
6199 PyModule_AddIntConstant(m, "IPPROTO_IPV6", IPPROTO_IPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006200#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006201#ifdef IPPROTO_ROUTING
6202 PyModule_AddIntConstant(m, "IPPROTO_ROUTING", IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006203#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006204#ifdef IPPROTO_FRAGMENT
6205 PyModule_AddIntConstant(m, "IPPROTO_FRAGMENT", IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006206#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006207#ifdef IPPROTO_RSVP
6208 PyModule_AddIntConstant(m, "IPPROTO_RSVP", IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006209#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006210#ifdef IPPROTO_GRE
6211 PyModule_AddIntConstant(m, "IPPROTO_GRE", IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006212#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006213#ifdef IPPROTO_ESP
6214 PyModule_AddIntConstant(m, "IPPROTO_ESP", IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006215#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006216#ifdef IPPROTO_AH
6217 PyModule_AddIntConstant(m, "IPPROTO_AH", IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006218#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006219#ifdef IPPROTO_MOBILE
6220 PyModule_AddIntConstant(m, "IPPROTO_MOBILE", IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006221#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006222#ifdef IPPROTO_ICMPV6
6223 PyModule_AddIntConstant(m, "IPPROTO_ICMPV6", IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006224#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006225#ifdef IPPROTO_NONE
6226 PyModule_AddIntConstant(m, "IPPROTO_NONE", IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006227#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006228#ifdef IPPROTO_DSTOPTS
6229 PyModule_AddIntConstant(m, "IPPROTO_DSTOPTS", IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006230#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006231#ifdef IPPROTO_XTP
6232 PyModule_AddIntConstant(m, "IPPROTO_XTP", IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006233#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006234#ifdef IPPROTO_EON
6235 PyModule_AddIntConstant(m, "IPPROTO_EON", IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006236#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006237#ifdef IPPROTO_PIM
6238 PyModule_AddIntConstant(m, "IPPROTO_PIM", IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006239#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006240#ifdef IPPROTO_IPCOMP
6241 PyModule_AddIntConstant(m, "IPPROTO_IPCOMP", IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006242#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006243#ifdef IPPROTO_VRRP
6244 PyModule_AddIntConstant(m, "IPPROTO_VRRP", IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006245#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006246#ifdef IPPROTO_SCTP
6247 PyModule_AddIntConstant(m, "IPPROTO_SCTP", IPPROTO_SCTP);
6248#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006249#ifdef IPPROTO_BIP
6250 PyModule_AddIntConstant(m, "IPPROTO_BIP", IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006251#endif
6252/**/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006253#ifdef IPPROTO_RAW
6254 PyModule_AddIntConstant(m, "IPPROTO_RAW", IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00006255#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006256 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006257#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006258#ifdef IPPROTO_MAX
6259 PyModule_AddIntConstant(m, "IPPROTO_MAX", IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006260#endif
6261
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006262#ifdef SYSPROTO_CONTROL
6263 PyModule_AddIntConstant(m, "SYSPROTO_CONTROL", SYSPROTO_CONTROL);
6264#endif
6265
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006266 /* Some port configuration */
6267#ifdef IPPORT_RESERVED
6268 PyModule_AddIntConstant(m, "IPPORT_RESERVED", IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006269#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006270 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006271#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006272#ifdef IPPORT_USERRESERVED
6273 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006274#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006275 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006276#endif
6277
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006278 /* Some reserved IP v.4 addresses */
6279#ifdef INADDR_ANY
6280 PyModule_AddIntConstant(m, "INADDR_ANY", INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006281#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006282 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006283#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006284#ifdef INADDR_BROADCAST
6285 PyModule_AddIntConstant(m, "INADDR_BROADCAST", INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006286#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006287 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006288#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006289#ifdef INADDR_LOOPBACK
6290 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006291#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006292 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006293#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006294#ifdef INADDR_UNSPEC_GROUP
6295 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006296#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006297 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006298#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006299#ifdef INADDR_ALLHOSTS_GROUP
6300 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
6301 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006302#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006303 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006304#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006305#ifdef INADDR_MAX_LOCAL_GROUP
6306 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP",
6307 INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006308#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006309 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006310#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006311#ifdef INADDR_NONE
6312 PyModule_AddIntConstant(m, "INADDR_NONE", INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006313#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006314 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006315#endif
6316
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006317 /* IPv4 [gs]etsockopt options */
6318#ifdef IP_OPTIONS
6319 PyModule_AddIntConstant(m, "IP_OPTIONS", IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006320#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006321#ifdef IP_HDRINCL
6322 PyModule_AddIntConstant(m, "IP_HDRINCL", IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006323#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006324#ifdef IP_TOS
6325 PyModule_AddIntConstant(m, "IP_TOS", IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006326#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006327#ifdef IP_TTL
6328 PyModule_AddIntConstant(m, "IP_TTL", IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006329#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006330#ifdef IP_RECVOPTS
6331 PyModule_AddIntConstant(m, "IP_RECVOPTS", IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006332#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006333#ifdef IP_RECVRETOPTS
6334 PyModule_AddIntConstant(m, "IP_RECVRETOPTS", IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006335#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006336#ifdef IP_RECVDSTADDR
6337 PyModule_AddIntConstant(m, "IP_RECVDSTADDR", IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006338#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006339#ifdef IP_RETOPTS
6340 PyModule_AddIntConstant(m, "IP_RETOPTS", IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006341#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006342#ifdef IP_MULTICAST_IF
6343 PyModule_AddIntConstant(m, "IP_MULTICAST_IF", IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006344#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006345#ifdef IP_MULTICAST_TTL
6346 PyModule_AddIntConstant(m, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006347#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006348#ifdef IP_MULTICAST_LOOP
6349 PyModule_AddIntConstant(m, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006350#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006351#ifdef IP_ADD_MEMBERSHIP
6352 PyModule_AddIntConstant(m, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006353#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006354#ifdef IP_DROP_MEMBERSHIP
6355 PyModule_AddIntConstant(m, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006356#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006357#ifdef IP_DEFAULT_MULTICAST_TTL
6358 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_TTL",
6359 IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00006360#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006361#ifdef IP_DEFAULT_MULTICAST_LOOP
6362 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_LOOP",
6363 IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006364#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006365#ifdef IP_MAX_MEMBERSHIPS
6366 PyModule_AddIntConstant(m, "IP_MAX_MEMBERSHIPS", IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00006367#endif
Charles-François Natali564a42c2011-12-17 14:59:56 +01006368#ifdef IP_TRANSPARENT
6369 PyModule_AddIntConstant(m, "IP_TRANSPARENT", IP_TRANSPARENT);
6370#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006371
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006372 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
6373#ifdef IPV6_JOIN_GROUP
6374 PyModule_AddIntConstant(m, "IPV6_JOIN_GROUP", IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006375#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006376#ifdef IPV6_LEAVE_GROUP
6377 PyModule_AddIntConstant(m, "IPV6_LEAVE_GROUP", IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006378#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006379#ifdef IPV6_MULTICAST_HOPS
6380 PyModule_AddIntConstant(m, "IPV6_MULTICAST_HOPS", IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006381#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006382#ifdef IPV6_MULTICAST_IF
6383 PyModule_AddIntConstant(m, "IPV6_MULTICAST_IF", IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006384#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006385#ifdef IPV6_MULTICAST_LOOP
6386 PyModule_AddIntConstant(m, "IPV6_MULTICAST_LOOP", IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006387#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006388#ifdef IPV6_UNICAST_HOPS
6389 PyModule_AddIntConstant(m, "IPV6_UNICAST_HOPS", IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006390#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006391 /* Additional IPV6 socket options, defined in RFC 3493 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00006392#ifdef IPV6_V6ONLY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006393 PyModule_AddIntConstant(m, "IPV6_V6ONLY", IPV6_V6ONLY);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006394#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006395 /* Advanced IPV6 socket options, from RFC 3542 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00006396#ifdef IPV6_CHECKSUM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006397 PyModule_AddIntConstant(m, "IPV6_CHECKSUM", IPV6_CHECKSUM);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006398#endif
6399#ifdef IPV6_DONTFRAG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006400 PyModule_AddIntConstant(m, "IPV6_DONTFRAG", IPV6_DONTFRAG);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006401#endif
6402#ifdef IPV6_DSTOPTS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006403 PyModule_AddIntConstant(m, "IPV6_DSTOPTS", IPV6_DSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006404#endif
6405#ifdef IPV6_HOPLIMIT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006406 PyModule_AddIntConstant(m, "IPV6_HOPLIMIT", IPV6_HOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006407#endif
6408#ifdef IPV6_HOPOPTS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006409 PyModule_AddIntConstant(m, "IPV6_HOPOPTS", IPV6_HOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006410#endif
6411#ifdef IPV6_NEXTHOP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006412 PyModule_AddIntConstant(m, "IPV6_NEXTHOP", IPV6_NEXTHOP);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006413#endif
6414#ifdef IPV6_PATHMTU
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006415 PyModule_AddIntConstant(m, "IPV6_PATHMTU", IPV6_PATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006416#endif
6417#ifdef IPV6_PKTINFO
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006418 PyModule_AddIntConstant(m, "IPV6_PKTINFO", IPV6_PKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006419#endif
6420#ifdef IPV6_RECVDSTOPTS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006421 PyModule_AddIntConstant(m, "IPV6_RECVDSTOPTS", IPV6_RECVDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006422#endif
6423#ifdef IPV6_RECVHOPLIMIT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006424 PyModule_AddIntConstant(m, "IPV6_RECVHOPLIMIT", IPV6_RECVHOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006425#endif
6426#ifdef IPV6_RECVHOPOPTS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006427 PyModule_AddIntConstant(m, "IPV6_RECVHOPOPTS", IPV6_RECVHOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006428#endif
6429#ifdef IPV6_RECVPKTINFO
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006430 PyModule_AddIntConstant(m, "IPV6_RECVPKTINFO", IPV6_RECVPKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006431#endif
6432#ifdef IPV6_RECVRTHDR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006433 PyModule_AddIntConstant(m, "IPV6_RECVRTHDR", IPV6_RECVRTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006434#endif
6435#ifdef IPV6_RECVTCLASS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006436 PyModule_AddIntConstant(m, "IPV6_RECVTCLASS", IPV6_RECVTCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006437#endif
6438#ifdef IPV6_RTHDR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006439 PyModule_AddIntConstant(m, "IPV6_RTHDR", IPV6_RTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006440#endif
6441#ifdef IPV6_RTHDRDSTOPTS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006442 PyModule_AddIntConstant(m, "IPV6_RTHDRDSTOPTS", IPV6_RTHDRDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006443#endif
6444#ifdef IPV6_RTHDR_TYPE_0
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006445 PyModule_AddIntConstant(m, "IPV6_RTHDR_TYPE_0", IPV6_RTHDR_TYPE_0);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006446#endif
6447#ifdef IPV6_RECVPATHMTU
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006448 PyModule_AddIntConstant(m, "IPV6_RECVPATHMTU", IPV6_RECVPATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006449#endif
6450#ifdef IPV6_TCLASS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006451 PyModule_AddIntConstant(m, "IPV6_TCLASS", IPV6_TCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006452#endif
6453#ifdef IPV6_USE_MIN_MTU
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006454 PyModule_AddIntConstant(m, "IPV6_USE_MIN_MTU", IPV6_USE_MIN_MTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006455#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006456
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006457 /* TCP options */
6458#ifdef TCP_NODELAY
6459 PyModule_AddIntConstant(m, "TCP_NODELAY", TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00006460#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006461#ifdef TCP_MAXSEG
6462 PyModule_AddIntConstant(m, "TCP_MAXSEG", TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00006463#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006464#ifdef TCP_CORK
6465 PyModule_AddIntConstant(m, "TCP_CORK", TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006466#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006467#ifdef TCP_KEEPIDLE
6468 PyModule_AddIntConstant(m, "TCP_KEEPIDLE", TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006469#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006470#ifdef TCP_KEEPINTVL
6471 PyModule_AddIntConstant(m, "TCP_KEEPINTVL", TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006472#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006473#ifdef TCP_KEEPCNT
6474 PyModule_AddIntConstant(m, "TCP_KEEPCNT", TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006475#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006476#ifdef TCP_SYNCNT
6477 PyModule_AddIntConstant(m, "TCP_SYNCNT", TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006478#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006479#ifdef TCP_LINGER2
6480 PyModule_AddIntConstant(m, "TCP_LINGER2", TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006481#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006482#ifdef TCP_DEFER_ACCEPT
6483 PyModule_AddIntConstant(m, "TCP_DEFER_ACCEPT", TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006484#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006485#ifdef TCP_WINDOW_CLAMP
6486 PyModule_AddIntConstant(m, "TCP_WINDOW_CLAMP", TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006487#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006488#ifdef TCP_INFO
6489 PyModule_AddIntConstant(m, "TCP_INFO", TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006490#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006491#ifdef TCP_QUICKACK
6492 PyModule_AddIntConstant(m, "TCP_QUICKACK", TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006493#endif
6494
Guido van Rossum09be4091999-08-09 14:40:40 +00006495
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006496 /* IPX options */
6497#ifdef IPX_TYPE
6498 PyModule_AddIntConstant(m, "IPX_TYPE", IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006499#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00006500
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006501/* Reliable Datagram Sockets */
6502#ifdef RDS_CMSG_RDMA_ARGS
6503 PyModule_AddIntConstant(m, "RDS_CMSG_RDMA_ARGS", RDS_CMSG_RDMA_ARGS);
6504#endif
6505#ifdef RDS_CMSG_RDMA_DEST
6506 PyModule_AddIntConstant(m, "RDS_CMSG_RDMA_DEST", RDS_CMSG_RDMA_DEST);
6507#endif
6508#ifdef RDS_CMSG_RDMA_MAP
6509 PyModule_AddIntConstant(m, "RDS_CMSG_RDMA_MAP", RDS_CMSG_RDMA_MAP);
6510#endif
6511#ifdef RDS_CMSG_RDMA_STATUS
6512 PyModule_AddIntConstant(m, "RDS_CMSG_RDMA_STATUS", RDS_CMSG_RDMA_STATUS);
6513#endif
6514#ifdef RDS_CMSG_RDMA_UPDATE
6515 PyModule_AddIntConstant(m, "RDS_CMSG_RDMA_UPDATE", RDS_CMSG_RDMA_UPDATE);
6516#endif
6517#ifdef RDS_RDMA_READWRITE
6518 PyModule_AddIntConstant(m, "RDS_RDMA_READWRITE", RDS_RDMA_READWRITE);
6519#endif
6520#ifdef RDS_RDMA_FENCE
6521 PyModule_AddIntConstant(m, "RDS_RDMA_FENCE", RDS_RDMA_FENCE);
6522#endif
6523#ifdef RDS_RDMA_INVALIDATE
6524 PyModule_AddIntConstant(m, "RDS_RDMA_INVALIDATE", RDS_RDMA_INVALIDATE);
6525#endif
6526#ifdef RDS_RDMA_USE_ONCE
6527 PyModule_AddIntConstant(m, "RDS_RDMA_USE_ONCE", RDS_RDMA_USE_ONCE);
6528#endif
6529#ifdef RDS_RDMA_DONTWAIT
6530 PyModule_AddIntConstant(m, "RDS_RDMA_DONTWAIT", RDS_RDMA_DONTWAIT);
6531#endif
6532#ifdef RDS_RDMA_NOTIFY_ME
6533 PyModule_AddIntConstant(m, "RDS_RDMA_NOTIFY_ME", RDS_RDMA_NOTIFY_ME);
6534#endif
6535#ifdef RDS_RDMA_SILENT
6536 PyModule_AddIntConstant(m, "RDS_RDMA_SILENT", RDS_RDMA_SILENT);
6537#endif
6538
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006539 /* get{addr,name}info parameters */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006540#ifdef EAI_ADDRFAMILY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006541 PyModule_AddIntConstant(m, "EAI_ADDRFAMILY", EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006542#endif
6543#ifdef EAI_AGAIN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006544 PyModule_AddIntConstant(m, "EAI_AGAIN", EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006545#endif
6546#ifdef EAI_BADFLAGS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006547 PyModule_AddIntConstant(m, "EAI_BADFLAGS", EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006548#endif
6549#ifdef EAI_FAIL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006550 PyModule_AddIntConstant(m, "EAI_FAIL", EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006551#endif
6552#ifdef EAI_FAMILY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006553 PyModule_AddIntConstant(m, "EAI_FAMILY", EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006554#endif
6555#ifdef EAI_MEMORY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006556 PyModule_AddIntConstant(m, "EAI_MEMORY", EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006557#endif
6558#ifdef EAI_NODATA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006559 PyModule_AddIntConstant(m, "EAI_NODATA", EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006560#endif
6561#ifdef EAI_NONAME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006562 PyModule_AddIntConstant(m, "EAI_NONAME", EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006563#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00006564#ifdef EAI_OVERFLOW
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006565 PyModule_AddIntConstant(m, "EAI_OVERFLOW", EAI_OVERFLOW);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006566#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006567#ifdef EAI_SERVICE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006568 PyModule_AddIntConstant(m, "EAI_SERVICE", EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006569#endif
6570#ifdef EAI_SOCKTYPE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006571 PyModule_AddIntConstant(m, "EAI_SOCKTYPE", EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006572#endif
6573#ifdef EAI_SYSTEM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006574 PyModule_AddIntConstant(m, "EAI_SYSTEM", EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006575#endif
6576#ifdef EAI_BADHINTS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006577 PyModule_AddIntConstant(m, "EAI_BADHINTS", EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006578#endif
6579#ifdef EAI_PROTOCOL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006580 PyModule_AddIntConstant(m, "EAI_PROTOCOL", EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006581#endif
6582#ifdef EAI_MAX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006583 PyModule_AddIntConstant(m, "EAI_MAX", EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006584#endif
6585#ifdef AI_PASSIVE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006586 PyModule_AddIntConstant(m, "AI_PASSIVE", AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006587#endif
6588#ifdef AI_CANONNAME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006589 PyModule_AddIntConstant(m, "AI_CANONNAME", AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006590#endif
6591#ifdef AI_NUMERICHOST
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006592 PyModule_AddIntConstant(m, "AI_NUMERICHOST", AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006593#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00006594#ifdef AI_NUMERICSERV
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006595 PyModule_AddIntConstant(m, "AI_NUMERICSERV", AI_NUMERICSERV);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006596#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006597#ifdef AI_MASK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006598 PyModule_AddIntConstant(m, "AI_MASK", AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006599#endif
6600#ifdef AI_ALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006601 PyModule_AddIntConstant(m, "AI_ALL", AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006602#endif
6603#ifdef AI_V4MAPPED_CFG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006604 PyModule_AddIntConstant(m, "AI_V4MAPPED_CFG", AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006605#endif
6606#ifdef AI_ADDRCONFIG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006607 PyModule_AddIntConstant(m, "AI_ADDRCONFIG", AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006608#endif
6609#ifdef AI_V4MAPPED
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006610 PyModule_AddIntConstant(m, "AI_V4MAPPED", AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006611#endif
6612#ifdef AI_DEFAULT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006613 PyModule_AddIntConstant(m, "AI_DEFAULT", AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006614#endif
6615#ifdef NI_MAXHOST
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006616 PyModule_AddIntConstant(m, "NI_MAXHOST", NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006617#endif
6618#ifdef NI_MAXSERV
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006619 PyModule_AddIntConstant(m, "NI_MAXSERV", NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006620#endif
6621#ifdef NI_NOFQDN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006622 PyModule_AddIntConstant(m, "NI_NOFQDN", NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006623#endif
6624#ifdef NI_NUMERICHOST
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006625 PyModule_AddIntConstant(m, "NI_NUMERICHOST", NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006626#endif
6627#ifdef NI_NAMEREQD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006628 PyModule_AddIntConstant(m, "NI_NAMEREQD", NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006629#endif
6630#ifdef NI_NUMERICSERV
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006631 PyModule_AddIntConstant(m, "NI_NUMERICSERV", NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006632#endif
6633#ifdef NI_DGRAM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006634 PyModule_AddIntConstant(m, "NI_DGRAM", NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006635#endif
6636
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006637 /* shutdown() parameters */
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006638#ifdef SHUT_RD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006639 PyModule_AddIntConstant(m, "SHUT_RD", SHUT_RD);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006640#elif defined(SD_RECEIVE)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006641 PyModule_AddIntConstant(m, "SHUT_RD", SD_RECEIVE);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006642#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006643 PyModule_AddIntConstant(m, "SHUT_RD", 0);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006644#endif
6645#ifdef SHUT_WR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006646 PyModule_AddIntConstant(m, "SHUT_WR", SHUT_WR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006647#elif defined(SD_SEND)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006648 PyModule_AddIntConstant(m, "SHUT_WR", SD_SEND);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006649#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006650 PyModule_AddIntConstant(m, "SHUT_WR", 1);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006651#endif
6652#ifdef SHUT_RDWR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006653 PyModule_AddIntConstant(m, "SHUT_RDWR", SHUT_RDWR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006654#elif defined(SD_BOTH)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006655 PyModule_AddIntConstant(m, "SHUT_RDWR", SD_BOTH);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006656#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006657 PyModule_AddIntConstant(m, "SHUT_RDWR", 2);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006658#endif
6659
Christian Heimesfaf2f632008-01-06 16:59:19 +00006660#ifdef SIO_RCVALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006661 {
6662 DWORD codes[] = {SIO_RCVALL, SIO_KEEPALIVE_VALS};
6663 const char *names[] = {"SIO_RCVALL", "SIO_KEEPALIVE_VALS"};
6664 int i;
Victor Stinner63941882011-09-29 00:42:28 +02006665 for(i = 0; i<Py_ARRAY_LENGTH(codes); ++i) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006666 PyObject *tmp;
6667 tmp = PyLong_FromUnsignedLong(codes[i]);
6668 if (tmp == NULL)
6669 return NULL;
6670 PyModule_AddObject(m, names[i], tmp);
6671 }
6672 }
6673 PyModule_AddIntConstant(m, "RCVALL_OFF", RCVALL_OFF);
6674 PyModule_AddIntConstant(m, "RCVALL_ON", RCVALL_ON);
6675 PyModule_AddIntConstant(m, "RCVALL_SOCKETLEVELONLY", RCVALL_SOCKETLEVELONLY);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00006676#ifdef RCVALL_IPLEVEL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006677 PyModule_AddIntConstant(m, "RCVALL_IPLEVEL", RCVALL_IPLEVEL);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00006678#endif
6679#ifdef RCVALL_MAX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006680 PyModule_AddIntConstant(m, "RCVALL_MAX", RCVALL_MAX);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00006681#endif
Christian Heimesfaf2f632008-01-06 16:59:19 +00006682#endif /* _MSTCPIP_ */
6683
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006684 /* Initialize gethostbyname lock */
Just van Rossum1040d2c2003-05-09 07:53:18 +00006685#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006686 netdb_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00006687#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006688 return m;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00006689}
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006690
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006691
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006692#ifndef HAVE_INET_PTON
Christian Heimes96e7b3d2007-11-20 06:51:17 +00006693#if !defined(NTDDI_VERSION) || (NTDDI_VERSION < NTDDI_LONGHORN)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006694
6695/* Simplistic emulation code for inet_pton that only works for IPv4 */
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006696/* These are not exposed because they do not set errno properly */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006697
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006698int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006699inet_pton(int af, const char *src, void *dst)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006700{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006701 if (af == AF_INET) {
Benjamin Petersonf91df042009-02-13 02:50:59 +00006702#if (SIZEOF_INT != 4)
6703#error "Not sure if in_addr_t exists and int is not 32-bits."
6704#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006705 unsigned int packed_addr;
6706 packed_addr = inet_addr(src);
6707 if (packed_addr == INADDR_NONE)
6708 return 0;
6709 memcpy(dst, &packed_addr, 4);
6710 return 1;
6711 }
6712 /* Should set errno to EAFNOSUPPORT */
6713 return -1;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006714}
6715
Martin v. Löwisc925b1532001-07-21 09:42:15 +00006716const char *
6717inet_ntop(int af, const void *src, char *dst, socklen_t size)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006718{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006719 if (af == AF_INET) {
6720 struct in_addr packed_addr;
6721 if (size < 16)
6722 /* Should set errno to ENOSPC. */
6723 return NULL;
6724 memcpy(&packed_addr, src, sizeof(packed_addr));
6725 return strncpy(dst, inet_ntoa(packed_addr), size);
6726 }
6727 /* Should set errno to EAFNOSUPPORT */
6728 return NULL;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006729}
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006730
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006731#endif
Christian Heimesb6150692007-11-15 23:37:07 +00006732#endif