blob: d0b89c64844d51b9714132d78326cb27ce850fb0 [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,
384 FROM_PROTOCOL_INFO, &info, 0, 0);
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
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000393#define EAFNOSUPPORT WSAEAFNOSUPPORT
394#define snprintf _snprintf
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000395#endif
Fred Drakea04eaad2000-06-30 02:46:07 +0000396
Andrew MacIntyreba43e872002-03-03 03:03:52 +0000397#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000398#define SOCKETCLOSE soclose
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000399#define NO_DUP /* Sockets are Not Actual File Handles under OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000400#endif
401
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000402#ifndef SOCKETCLOSE
403#define SOCKETCLOSE close
404#endif
405
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000406#if (defined(HAVE_BLUETOOTH_H) || defined(HAVE_BLUETOOTH_BLUETOOTH_H)) && !defined(__NetBSD__) && !defined(__DragonFly__)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000407#define USE_BLUETOOTH 1
408#if defined(__FreeBSD__)
409#define BTPROTO_L2CAP BLUETOOTH_PROTO_L2CAP
410#define BTPROTO_RFCOMM BLUETOOTH_PROTO_RFCOMM
Thomas Wouterscf297e42007-02-23 15:07:44 +0000411#define BTPROTO_HCI BLUETOOTH_PROTO_HCI
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000412#define SOL_HCI SOL_HCI_RAW
413#define HCI_FILTER SO_HCI_RAW_FILTER
Hye-Shik Chang81268602004-02-02 06:05:24 +0000414#define sockaddr_l2 sockaddr_l2cap
415#define sockaddr_rc sockaddr_rfcomm
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000416#define hci_dev hci_node
Hye-Shik Chang81268602004-02-02 06:05:24 +0000417#define _BT_L2_MEMB(sa, memb) ((sa)->l2cap_##memb)
418#define _BT_RC_MEMB(sa, memb) ((sa)->rfcomm_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000419#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000420#elif defined(__NetBSD__) || defined(__DragonFly__)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000421#define sockaddr_l2 sockaddr_bt
422#define sockaddr_rc sockaddr_bt
Thomas Wouterscf297e42007-02-23 15:07:44 +0000423#define sockaddr_hci sockaddr_bt
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000424#define sockaddr_sco sockaddr_bt
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000425#define SOL_HCI BTPROTO_HCI
426#define HCI_DATA_DIR SO_HCI_DIRECTION
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000427#define _BT_L2_MEMB(sa, memb) ((sa)->bt_##memb)
428#define _BT_RC_MEMB(sa, memb) ((sa)->bt_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000429#define _BT_HCI_MEMB(sa, memb) ((sa)->bt_##memb)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000430#define _BT_SCO_MEMB(sa, memb) ((sa)->bt_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000431#else
Hye-Shik Chang81268602004-02-02 06:05:24 +0000432#define _BT_L2_MEMB(sa, memb) ((sa)->l2_##memb)
433#define _BT_RC_MEMB(sa, memb) ((sa)->rc_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000434#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000435#define _BT_SCO_MEMB(sa, memb) ((sa)->sco_##memb)
436#endif
437#endif
438
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000439#ifdef __VMS
440/* TCP/IP Services for VMS uses a maximum send/recv buffer length */
441#define SEGMENT_SIZE (32 * 1024 -1)
442#endif
443
Charles-François Natali8b759652011-12-23 16:44:51 +0100444/* Convert "sock_addr_t *" to "struct sockaddr *". */
445#define SAS2SA(x) (&((x)->sa))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000446
Martin v. Löwise9416172003-05-03 10:12:45 +0000447/*
448 * Constants for getnameinfo()
449 */
450#if !defined(NI_MAXHOST)
451#define NI_MAXHOST 1025
452#endif
453#if !defined(NI_MAXSERV)
454#define NI_MAXSERV 32
455#endif
456
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000457#ifndef INVALID_SOCKET /* MS defines this */
458#define INVALID_SOCKET (-1)
459#endif
460
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000461/* XXX There's a problem here: *static* functions are not supposed to have
462 a Py prefix (or use CapitalizedWords). Later... */
463
Guido van Rossum30a685f1991-06-27 15:51:29 +0000464/* Global variable holding the exception type for errors detected
465 by this module (but not argument type or memory errors, etc.). */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000466static PyObject *socket_herror;
467static PyObject *socket_gaierror;
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000468static PyObject *socket_timeout;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000469
Tim Peters643a7fc2002-02-17 04:13:21 +0000470/* A forward reference to the socket type object.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000471 The sock_type variable contains pointers to various functions,
472 some of which call new_sockobject(), which uses sock_type, so
Tim Peters643a7fc2002-02-17 04:13:21 +0000473 there has to be a circular reference. */
Jeremy Hylton938ace62002-07-17 16:30:39 +0000474static PyTypeObject sock_type;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000475
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000476#if defined(HAVE_POLL_H)
477#include <poll.h>
478#elif defined(HAVE_SYS_POLL_H)
479#include <sys/poll.h>
480#endif
481
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000482/* Largest value to try to store in a socklen_t (used when handling
483 ancillary data). POSIX requires socklen_t to hold at least
484 (2**31)-1 and recommends against storing larger values, but
485 socklen_t was originally int in the BSD interface, so to be on the
486 safe side we use the smaller of (2**31)-1 and INT_MAX. */
487#if INT_MAX > 0x7fffffff
488#define SOCKLEN_T_LIMIT 0x7fffffff
489#else
490#define SOCKLEN_T_LIMIT INT_MAX
491#endif
492
Charles-François Nataliaa26b272011-08-28 17:51:43 +0200493#ifdef HAVE_POLL
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000494/* Instead of select(), we'll use poll() since poll() works on any fd. */
495#define IS_SELECTABLE(s) 1
496/* Can we call select() with this socket without a buffer overrun? */
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000497#else
Charles-François Nataliaa26b272011-08-28 17:51:43 +0200498/* If there's no timeout left, we don't have to call select, so it's a safe,
499 * little white lie. */
500#define IS_SELECTABLE(s) (_PyIsSelectable_fd((s)->sock_fd) || (s)->sock_timeout <= 0.0)
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000501#endif
Neal Norwitz082b2df2006-02-07 07:04:46 +0000502
503static PyObject*
504select_error(void)
505{
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200506 PyErr_SetString(PyExc_OSError, "unable to select on socket");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000507 return NULL;
Neal Norwitz082b2df2006-02-07 07:04:46 +0000508}
509
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000510#ifdef MS_WINDOWS
Antoine Pitrouc8f01962010-09-28 22:03:27 +0000511#ifndef WSAEAGAIN
512#define WSAEAGAIN WSAEWOULDBLOCK
513#endif
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000514#define CHECK_ERRNO(expected) \
515 (WSAGetLastError() == WSA ## expected)
516#else
517#define CHECK_ERRNO(expected) \
518 (errno == expected)
519#endif
520
Guido van Rossum30a685f1991-06-27 15:51:29 +0000521/* Convenience function to raise an error according to errno
522 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000523
Guido van Rossum73624e91994-10-10 17:59:00 +0000524static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000525set_error(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000526{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000527#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000528 int err_no = WSAGetLastError();
529 /* PyErr_SetExcFromWindowsErr() invokes FormatMessage() which
530 recognizes the error codes used by both GetLastError() and
531 WSAGetLastError */
532 if (err_no)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200533 return PyErr_SetExcFromWindowsErr(PyExc_OSError, err_no);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000534#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000535
Andrew MacIntyreba43e872002-03-03 03:03:52 +0000536#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000537 if (sock_errno() != NO_ERROR) {
538 APIRET rc;
539 ULONG msglen;
540 char outbuf[100];
541 int myerrorcode = sock_errno();
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000542
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000543 /* Retrieve socket-related error message from MPTN.MSG file */
544 rc = DosGetMessage(NULL, 0, outbuf, sizeof(outbuf),
545 myerrorcode - SOCBASEERR + 26,
546 "mptn.msg",
547 &msglen);
548 if (rc == NO_ERROR) {
549 PyObject *v;
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000550
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000551 /* OS/2 doesn't guarantee a terminator */
552 outbuf[msglen] = '\0';
553 if (strlen(outbuf) > 0) {
554 /* If non-empty msg, trim CRLF */
555 char *lastc = &outbuf[ strlen(outbuf)-1 ];
556 while (lastc > outbuf &&
557 isspace(Py_CHARMASK(*lastc))) {
558 /* Trim trailing whitespace (CRLF) */
559 *lastc-- = '\0';
560 }
561 }
562 v = Py_BuildValue("(is)", myerrorcode, outbuf);
563 if (v != NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200564 PyErr_SetObject(PyExc_OSError, v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000565 Py_DECREF(v);
566 }
567 return NULL;
568 }
569 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000570#endif
571
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200572 return PyErr_SetFromErrno(PyExc_OSError);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000573}
574
Guido van Rossum30a685f1991-06-27 15:51:29 +0000575
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000576static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000577set_herror(int h_error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000578{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000579 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000580
581#ifdef HAVE_HSTRERROR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000582 v = Py_BuildValue("(is)", h_error, (char *)hstrerror(h_error));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000583#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000584 v = Py_BuildValue("(is)", h_error, "host not found");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000585#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000586 if (v != NULL) {
587 PyErr_SetObject(socket_herror, v);
588 Py_DECREF(v);
589 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000590
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000591 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000592}
593
594
595static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000596set_gaierror(int error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000597{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000598 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000599
Martin v. Löwis272cb402002-03-01 08:31:07 +0000600#ifdef EAI_SYSTEM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000601 /* EAI_SYSTEM is not available on Windows XP. */
602 if (error == EAI_SYSTEM)
603 return set_error();
Martin v. Löwis272cb402002-03-01 08:31:07 +0000604#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000605
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000606#ifdef HAVE_GAI_STRERROR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000607 v = Py_BuildValue("(is)", error, gai_strerror(error));
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000608#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000609 v = Py_BuildValue("(is)", error, "getaddrinfo failed");
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000610#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000611 if (v != NULL) {
612 PyErr_SetObject(socket_gaierror, v);
613 Py_DECREF(v);
614 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000615
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000616 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000617}
618
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000619#ifdef __VMS
620/* Function to send in segments */
621static int
622sendsegmented(int sock_fd, char *buf, int len, int flags)
623{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000624 int n = 0;
625 int remaining = len;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000626
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000627 while (remaining > 0) {
628 unsigned int segment;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000629
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000630 segment = (remaining >= SEGMENT_SIZE ? SEGMENT_SIZE : remaining);
631 n = send(sock_fd, buf, segment, flags);
632 if (n < 0) {
633 return n;
634 }
635 remaining -= segment;
636 buf += segment;
637 } /* end while */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000638
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000639 return len;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000640}
641#endif
642
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000643/* Function to perform the setting of socket blocking mode
644 internally. block = (1 | 0). */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000645static int
646internal_setblocking(PySocketSockObject *s, int block)
647{
Guido van Rossum67f7a382002-06-06 21:08:16 +0000648#ifndef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000649 int delay_flag;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000650#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +0000651#ifdef SOCK_NONBLOCK
652 if (block)
653 s->sock_type &= (~SOCK_NONBLOCK);
654 else
655 s->sock_type |= SOCK_NONBLOCK;
656#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +0000657
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000658 Py_BEGIN_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000659#ifndef MS_WINDOWS
660#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000661 block = !block;
662 ioctl(s->sock_fd, FIONBIO, (caddr_t)&block, sizeof(block));
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000663#elif defined(__VMS)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000664 block = !block;
665 ioctl(s->sock_fd, FIONBIO, (unsigned int *)&block);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000666#else /* !PYOS_OS2 && !__VMS */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000667 delay_flag = fcntl(s->sock_fd, F_GETFL, 0);
668 if (block)
669 delay_flag &= (~O_NONBLOCK);
670 else
671 delay_flag |= O_NONBLOCK;
672 fcntl(s->sock_fd, F_SETFL, delay_flag);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000673#endif /* !PYOS_OS2 */
674#else /* MS_WINDOWS */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000675 block = !block;
676 ioctlsocket(s->sock_fd, FIONBIO, (u_long*)&block);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000677#endif /* MS_WINDOWS */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000678 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000679
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000680 /* Since these don't return anything */
681 return 1;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000682}
683
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000684/* Do a select()/poll() on the socket, if necessary (sock_timeout > 0).
Guido van Rossum11ba0942002-06-13 15:07:44 +0000685 The argument writing indicates the direction.
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000686 This does not raise an exception; we'll let our caller do that
687 after they've reacquired the interpreter lock.
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000688 Returns 1 on timeout, -1 on error, 0 otherwise. */
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000689static int
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000690internal_select_ex(PySocketSockObject *s, int writing, double interval)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000691{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000692 int n;
Guido van Rossum11ba0942002-06-13 15:07:44 +0000693
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000694 /* Nothing to do unless we're in timeout mode (not non-blocking) */
695 if (s->sock_timeout <= 0.0)
696 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000697
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000698 /* Guard against closed socket */
699 if (s->sock_fd < 0)
700 return 0;
Guido van Rossumad654902002-07-19 12:44:59 +0000701
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000702 /* Handling this condition here simplifies the select loops */
703 if (interval < 0.0)
704 return 1;
705
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000706 /* Prefer poll, if available, since you can poll() any fd
707 * which can't be done with select(). */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000708#ifdef HAVE_POLL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000709 {
710 struct pollfd pollfd;
711 int timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000712
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000713 pollfd.fd = s->sock_fd;
714 pollfd.events = writing ? POLLOUT : POLLIN;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000715
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000716 /* s->sock_timeout is in seconds, timeout in ms */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000717 timeout = (int)(interval * 1000 + 0.5);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000718 n = poll(&pollfd, 1, timeout);
719 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000720#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000721 {
722 /* Construct the arguments to select */
723 fd_set fds;
724 struct timeval tv;
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000725 tv.tv_sec = (int)interval;
726 tv.tv_usec = (int)((interval - tv.tv_sec) * 1e6);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000727 FD_ZERO(&fds);
728 FD_SET(s->sock_fd, &fds);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000729
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000730 /* See if the socket is ready */
731 if (writing)
Antoine Pitrou19467d22010-08-17 19:33:30 +0000732 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
733 NULL, &fds, NULL, &tv);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000734 else
Antoine Pitrou19467d22010-08-17 19:33:30 +0000735 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
736 &fds, NULL, NULL, &tv);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000737 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000738#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000739
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000740 if (n < 0)
741 return -1;
742 if (n == 0)
743 return 1;
744 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000745}
746
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000747static int
748internal_select(PySocketSockObject *s, int writing)
749{
750 return internal_select_ex(s, writing, s->sock_timeout);
751}
752
753/*
754 Two macros for automatic retry of select() in case of false positives
755 (for example, select() could indicate a socket is ready for reading
756 but the data then discarded by the OS because of a wrong checksum).
757 Here is an example of use:
758
759 BEGIN_SELECT_LOOP(s)
760 Py_BEGIN_ALLOW_THREADS
761 timeout = internal_select_ex(s, 0, interval);
762 if (!timeout)
763 outlen = recv(s->sock_fd, cbuf, len, flags);
764 Py_END_ALLOW_THREADS
765 if (timeout == 1) {
766 PyErr_SetString(socket_timeout, "timed out");
767 return -1;
768 }
769 END_SELECT_LOOP(s)
770*/
771
772#define BEGIN_SELECT_LOOP(s) \
773 { \
774 _PyTime_timeval now, deadline = {0, 0}; \
775 double interval = s->sock_timeout; \
776 int has_timeout = s->sock_timeout > 0.0; \
777 if (has_timeout) { \
778 _PyTime_gettimeofday(&now); \
779 deadline = now; \
780 _PyTime_ADD_SECONDS(deadline, s->sock_timeout); \
781 } \
782 while (1) { \
783 errno = 0; \
784
785#define END_SELECT_LOOP(s) \
786 if (!has_timeout || \
787 (!CHECK_ERRNO(EWOULDBLOCK) && !CHECK_ERRNO(EAGAIN))) \
788 break; \
789 _PyTime_gettimeofday(&now); \
790 interval = _PyTime_INTERVAL(now, deadline); \
791 } \
792 } \
793
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000794/* Initialize a new socket object. */
795
Tim Petersa12b4cf2002-07-18 22:38:44 +0000796static double defaulttimeout = -1.0; /* Default timeout for new sockets */
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000797
Martin v. Löwis1a214512008-06-11 05:26:20 +0000798static void
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000799init_sockobject(PySocketSockObject *s,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000800 SOCKET_T fd, int family, int type, int proto)
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000801{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000802 s->sock_fd = fd;
803 s->sock_family = family;
804 s->sock_type = type;
805 s->sock_proto = proto;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000806
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000807 s->errorhandler = &set_error;
Antoine Pitroub1c54962010-10-14 15:05:38 +0000808#ifdef SOCK_NONBLOCK
809 if (type & SOCK_NONBLOCK)
810 s->sock_timeout = 0.0;
811 else
812#endif
813 {
814 s->sock_timeout = defaulttimeout;
815 if (defaulttimeout >= 0.0)
816 internal_setblocking(s, 0);
817 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000818
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000819}
820
821
Guido van Rossum30a685f1991-06-27 15:51:29 +0000822/* Create a new socket object.
823 This just creates the object and initializes it.
824 If the creation fails, return NULL and set an exception (implicit
825 in NEWOBJ()). */
826
Guido van Rossum73624e91994-10-10 17:59:00 +0000827static PySocketSockObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000828new_sockobject(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000829{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000830 PySocketSockObject *s;
831 s = (PySocketSockObject *)
832 PyType_GenericNew(&sock_type, NULL, NULL);
833 if (s != NULL)
834 init_sockobject(s, fd, family, type, proto);
835 return s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000836}
837
Guido van Rossum30a685f1991-06-27 15:51:29 +0000838
Guido van Rossum48a680c2001-03-02 06:34:14 +0000839/* Lock to allow python interpreter to continue, but only allow one
Just van Rossum1040d2c2003-05-09 07:53:18 +0000840 thread to be in gethostbyname or getaddrinfo */
841#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
842PyThread_type_lock netdb_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000843#endif
844
845
Guido van Rossum30a685f1991-06-27 15:51:29 +0000846/* Convert a string specifying a host name or one of a few symbolic
847 names to a numeric IP address. This usually calls gethostbyname()
848 to do the work; the names "" and "<broadcast>" are special.
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000849 Return the length (IPv4 should be 4 bytes), or negative if
Guido van Rossum30a685f1991-06-27 15:51:29 +0000850 an error occurred; then an exception is raised. */
851
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000852static int
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000853setipaddr(char *name, struct sockaddr *addr_ret, size_t addr_ret_size, int af)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000854{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000855 struct addrinfo hints, *res;
856 int error;
857 int d1, d2, d3, d4;
858 char ch;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000859
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000860 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
861 if (name[0] == '\0') {
862 int siz;
863 memset(&hints, 0, sizeof(hints));
864 hints.ai_family = af;
865 hints.ai_socktype = SOCK_DGRAM; /*dummy*/
866 hints.ai_flags = AI_PASSIVE;
867 Py_BEGIN_ALLOW_THREADS
868 ACQUIRE_GETADDRINFO_LOCK
869 error = getaddrinfo(NULL, "0", &hints, &res);
870 Py_END_ALLOW_THREADS
871 /* We assume that those thread-unsafe getaddrinfo() versions
872 *are* safe regarding their return value, ie. that a
873 subsequent call to getaddrinfo() does not destroy the
874 outcome of the first call. */
875 RELEASE_GETADDRINFO_LOCK
876 if (error) {
877 set_gaierror(error);
878 return -1;
879 }
880 switch (res->ai_family) {
881 case AF_INET:
882 siz = 4;
883 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000884#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000885 case AF_INET6:
886 siz = 16;
887 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000888#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000889 default:
890 freeaddrinfo(res);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200891 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000892 "unsupported address family");
893 return -1;
894 }
895 if (res->ai_next) {
896 freeaddrinfo(res);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200897 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000898 "wildcard resolved to multiple address");
899 return -1;
900 }
901 if (res->ai_addrlen < addr_ret_size)
902 addr_ret_size = res->ai_addrlen;
903 memcpy(addr_ret, res->ai_addr, addr_ret_size);
904 freeaddrinfo(res);
905 return siz;
906 }
907 if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
908 struct sockaddr_in *sin;
909 if (af != AF_INET && af != AF_UNSPEC) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200910 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000911 "address family mismatched");
912 return -1;
913 }
914 sin = (struct sockaddr_in *)addr_ret;
915 memset((void *) sin, '\0', sizeof(*sin));
916 sin->sin_family = AF_INET;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000917#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000918 sin->sin_len = sizeof(*sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000919#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000920 sin->sin_addr.s_addr = INADDR_BROADCAST;
921 return sizeof(sin->sin_addr);
922 }
923 if (sscanf(name, "%d.%d.%d.%d%c", &d1, &d2, &d3, &d4, &ch) == 4 &&
924 0 <= d1 && d1 <= 255 && 0 <= d2 && d2 <= 255 &&
925 0 <= d3 && d3 <= 255 && 0 <= d4 && d4 <= 255) {
926 struct sockaddr_in *sin;
927 sin = (struct sockaddr_in *)addr_ret;
928 sin->sin_addr.s_addr = htonl(
929 ((long) d1 << 24) | ((long) d2 << 16) |
930 ((long) d3 << 8) | ((long) d4 << 0));
931 sin->sin_family = AF_INET;
Anthony Baxter0e85f9d2003-05-02 15:40:46 +0000932#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000933 sin->sin_len = sizeof(*sin);
Anthony Baxter0e85f9d2003-05-02 15:40:46 +0000934#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000935 return 4;
936 }
937 memset(&hints, 0, sizeof(hints));
938 hints.ai_family = af;
939 Py_BEGIN_ALLOW_THREADS
940 ACQUIRE_GETADDRINFO_LOCK
941 error = getaddrinfo(name, NULL, &hints, &res);
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000942#if defined(__digital__) && defined(__unix__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000943 if (error == EAI_NONAME && af == AF_UNSPEC) {
944 /* On Tru64 V5.1, numeric-to-addr conversion fails
945 if no address family is given. Assume IPv4 for now.*/
946 hints.ai_family = AF_INET;
947 error = getaddrinfo(name, NULL, &hints, &res);
948 }
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000949#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000950 Py_END_ALLOW_THREADS
951 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
952 if (error) {
953 set_gaierror(error);
954 return -1;
955 }
956 if (res->ai_addrlen < addr_ret_size)
957 addr_ret_size = res->ai_addrlen;
958 memcpy((char *) addr_ret, res->ai_addr, addr_ret_size);
959 freeaddrinfo(res);
960 switch (addr_ret->sa_family) {
961 case AF_INET:
962 return 4;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000963#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000964 case AF_INET6:
965 return 16;
Guido van Rossum955becc1999-03-22 20:14:53 +0000966#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000967 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200968 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000969 return -1;
970 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000971}
972
Guido van Rossum30a685f1991-06-27 15:51:29 +0000973
Guido van Rossum30a685f1991-06-27 15:51:29 +0000974/* Create a string object representing an IP address.
975 This is always a string of the form 'dd.dd.dd.dd' (with variable
976 size numbers). */
977
Guido van Rossum73624e91994-10-10 17:59:00 +0000978static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000979makeipaddr(struct sockaddr *addr, int addrlen)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000980{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000981 char buf[NI_MAXHOST];
982 int error;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000983
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000984 error = getnameinfo(addr, addrlen, buf, sizeof(buf), NULL, 0,
985 NI_NUMERICHOST);
986 if (error) {
987 set_gaierror(error);
988 return NULL;
989 }
990 return PyUnicode_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000991}
992
993
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000994#ifdef USE_BLUETOOTH
995/* Convert a string representation of a Bluetooth address into a numeric
996 address. Returns the length (6), or raises an exception and returns -1 if
997 an error occurred. */
998
999static int
1000setbdaddr(char *name, bdaddr_t *bdaddr)
1001{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001002 unsigned int b0, b1, b2, b3, b4, b5;
1003 char ch;
1004 int n;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001005
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001006 n = sscanf(name, "%X:%X:%X:%X:%X:%X%c",
1007 &b5, &b4, &b3, &b2, &b1, &b0, &ch);
1008 if (n == 6 && (b0 | b1 | b2 | b3 | b4 | b5) < 256) {
1009 bdaddr->b[0] = b0;
1010 bdaddr->b[1] = b1;
1011 bdaddr->b[2] = b2;
1012 bdaddr->b[3] = b3;
1013 bdaddr->b[4] = b4;
1014 bdaddr->b[5] = b5;
1015 return 6;
1016 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001017 PyErr_SetString(PyExc_OSError, "bad bluetooth address");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001018 return -1;
1019 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001020}
1021
1022/* Create a string representation of the Bluetooth address. This is always a
1023 string of the form 'XX:XX:XX:XX:XX:XX' where XX is a two digit hexadecimal
1024 value (zero padded if necessary). */
1025
1026static PyObject *
1027makebdaddr(bdaddr_t *bdaddr)
1028{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001029 char buf[(6 * 2) + 5 + 1];
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001030
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001031 sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X",
1032 bdaddr->b[5], bdaddr->b[4], bdaddr->b[3],
1033 bdaddr->b[2], bdaddr->b[1], bdaddr->b[0]);
1034 return PyUnicode_FromString(buf);
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001035}
1036#endif
1037
1038
Guido van Rossum30a685f1991-06-27 15:51:29 +00001039/* Create an object representing the given socket address,
1040 suitable for passing it back to bind(), connect() etc.
1041 The family field of the sockaddr structure is inspected
1042 to determine what kind of address it really is. */
1043
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001044/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001045static PyObject *
Antoine Pitrou19467d22010-08-17 19:33:30 +00001046makesockaddr(SOCKET_T sockfd, struct sockaddr *addr, size_t addrlen, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001047{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001048 if (addrlen == 0) {
1049 /* No address -- may be recvfrom() from known socket */
1050 Py_INCREF(Py_None);
1051 return Py_None;
1052 }
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001053
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001054 switch (addr->sa_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001055
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001056 case AF_INET:
1057 {
1058 struct sockaddr_in *a;
1059 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
1060 PyObject *ret = NULL;
1061 if (addrobj) {
1062 a = (struct sockaddr_in *)addr;
1063 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
1064 Py_DECREF(addrobj);
1065 }
1066 return ret;
1067 }
Guido van Rossum30a685f1991-06-27 15:51:29 +00001068
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001069#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001070 case AF_UNIX:
1071 {
1072 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001073#ifdef linux
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001074 if (a->sun_path[0] == 0) { /* Linux abstract namespace */
1075 addrlen -= offsetof(struct sockaddr_un, sun_path);
1076 return PyBytes_FromStringAndSize(a->sun_path, addrlen);
1077 }
1078 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001079#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001080 {
1081 /* regular NULL-terminated string */
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001082 return PyUnicode_DecodeFSDefault(a->sun_path);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001083 }
1084 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001085#endif /* AF_UNIX */
1086
Martin v. Löwis11017b12006-01-14 18:12:57 +00001087#if defined(AF_NETLINK)
1088 case AF_NETLINK:
1089 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001090 struct sockaddr_nl *a = (struct sockaddr_nl *) addr;
1091 return Py_BuildValue("II", a->nl_pid, a->nl_groups);
Martin v. Löwis11017b12006-01-14 18:12:57 +00001092 }
1093#endif /* AF_NETLINK */
1094
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001095#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001096 case AF_INET6:
1097 {
1098 struct sockaddr_in6 *a;
1099 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
1100 PyObject *ret = NULL;
1101 if (addrobj) {
1102 a = (struct sockaddr_in6 *)addr;
Charles-François Natali366999a2012-01-02 15:47:29 +01001103 ret = Py_BuildValue("OiII",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001104 addrobj,
1105 ntohs(a->sin6_port),
Charles-François Natali366999a2012-01-02 15:47:29 +01001106 ntohl(a->sin6_flowinfo),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001107 a->sin6_scope_id);
1108 Py_DECREF(addrobj);
1109 }
1110 return ret;
1111 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001112#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001113
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001114#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001115 case AF_BLUETOOTH:
1116 switch (proto) {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001117
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001118 case BTPROTO_L2CAP:
1119 {
1120 struct sockaddr_l2 *a = (struct sockaddr_l2 *) addr;
1121 PyObject *addrobj = makebdaddr(&_BT_L2_MEMB(a, bdaddr));
1122 PyObject *ret = NULL;
1123 if (addrobj) {
1124 ret = Py_BuildValue("Oi",
1125 addrobj,
1126 _BT_L2_MEMB(a, psm));
1127 Py_DECREF(addrobj);
1128 }
1129 return ret;
1130 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001131
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001132 case BTPROTO_RFCOMM:
1133 {
1134 struct sockaddr_rc *a = (struct sockaddr_rc *) addr;
1135 PyObject *addrobj = makebdaddr(&_BT_RC_MEMB(a, bdaddr));
1136 PyObject *ret = NULL;
1137 if (addrobj) {
1138 ret = Py_BuildValue("Oi",
1139 addrobj,
1140 _BT_RC_MEMB(a, channel));
1141 Py_DECREF(addrobj);
1142 }
1143 return ret;
1144 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001145
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001146 case BTPROTO_HCI:
1147 {
1148 struct sockaddr_hci *a = (struct sockaddr_hci *) addr;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001149#if defined(__NetBSD__) || defined(__DragonFly__)
1150 return makebdaddr(&_BT_HCI_MEMB(a, bdaddr));
1151#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001152 PyObject *ret = NULL;
1153 ret = Py_BuildValue("i", _BT_HCI_MEMB(a, dev));
1154 return ret;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001155#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001156 }
Thomas Wouterscf297e42007-02-23 15:07:44 +00001157
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001158#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001159 case BTPROTO_SCO:
1160 {
1161 struct sockaddr_sco *a = (struct sockaddr_sco *) addr;
1162 return makebdaddr(&_BT_SCO_MEMB(a, bdaddr));
1163 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001164#endif
1165
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001166 default:
1167 PyErr_SetString(PyExc_ValueError,
1168 "Unknown Bluetooth protocol");
1169 return NULL;
1170 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001171#endif
1172
Antoine Pitroub156a462010-10-27 20:13:57 +00001173#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFNAME)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001174 case AF_PACKET:
1175 {
1176 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
1177 char *ifname = "";
1178 struct ifreq ifr;
1179 /* need to look up interface name give index */
1180 if (a->sll_ifindex) {
1181 ifr.ifr_ifindex = a->sll_ifindex;
1182 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1183 ifname = ifr.ifr_name;
1184 }
1185 return Py_BuildValue("shbhy#",
1186 ifname,
1187 ntohs(a->sll_protocol),
1188 a->sll_pkttype,
1189 a->sll_hatype,
1190 a->sll_addr,
1191 a->sll_halen);
1192 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001193#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001194
Christian Heimes043d6f62008-01-07 17:19:16 +00001195#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001196 case AF_TIPC:
1197 {
1198 struct sockaddr_tipc *a = (struct sockaddr_tipc *) addr;
1199 if (a->addrtype == TIPC_ADDR_NAMESEQ) {
1200 return Py_BuildValue("IIIII",
1201 a->addrtype,
1202 a->addr.nameseq.type,
1203 a->addr.nameseq.lower,
1204 a->addr.nameseq.upper,
1205 a->scope);
1206 } else if (a->addrtype == TIPC_ADDR_NAME) {
1207 return Py_BuildValue("IIIII",
1208 a->addrtype,
1209 a->addr.name.name.type,
1210 a->addr.name.name.instance,
1211 a->addr.name.name.instance,
1212 a->scope);
1213 } else if (a->addrtype == TIPC_ADDR_ID) {
1214 return Py_BuildValue("IIIII",
1215 a->addrtype,
1216 a->addr.id.node,
1217 a->addr.id.ref,
1218 0,
1219 a->scope);
1220 } else {
1221 PyErr_SetString(PyExc_ValueError,
1222 "Invalid address type");
1223 return NULL;
1224 }
1225 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001226#endif
1227
Charles-François Natali30589c92011-10-07 22:47:08 +02001228#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02001229 case AF_CAN:
1230 {
1231 struct sockaddr_can *a = (struct sockaddr_can *)addr;
1232 char *ifname = "";
1233 struct ifreq ifr;
1234 /* need to look up interface name given index */
1235 if (a->can_ifindex) {
1236 ifr.ifr_ifindex = a->can_ifindex;
1237 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1238 ifname = ifr.ifr_name;
1239 }
1240
1241 return Py_BuildValue("O&h", PyUnicode_DecodeFSDefault,
1242 ifname,
1243 a->can_family);
1244 }
1245#endif
1246
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001247#ifdef PF_SYSTEM
1248 case PF_SYSTEM:
1249 switch(proto) {
1250#ifdef SYSPROTO_CONTROL
1251 case SYSPROTO_CONTROL:
1252 {
1253 struct sockaddr_ctl *a = (struct sockaddr_ctl *)addr;
1254 return Py_BuildValue("(II)", a->sc_id, a->sc_unit);
1255 }
1256#endif
1257 default:
1258 PyErr_SetString(PyExc_ValueError,
1259 "Invalid address type");
1260 return 0;
1261 }
1262#endif
1263
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001264 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001265
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001266 default:
1267 /* If we don't know the address family, don't raise an
1268 exception -- return it as an (int, bytes) tuple. */
1269 return Py_BuildValue("iy#",
1270 addr->sa_family,
1271 addr->sa_data,
1272 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001273
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001274 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001275}
1276
Guido van Rossum30a685f1991-06-27 15:51:29 +00001277
1278/* Parse a socket address argument according to the socket object's
1279 address family. Return 1 if the address was in the proper format,
1280 0 of not. The address is returned through addr_ret, its length
1281 through len_ret. */
1282
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001283static int
Guido van Rossum48a680c2001-03-02 06:34:14 +00001284getsockaddrarg(PySocketSockObject *s, PyObject *args,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001285 struct sockaddr *addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001286{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001287 switch (s->sock_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001288
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001289#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001290 case AF_UNIX:
1291 {
1292 struct sockaddr_un* addr;
1293 char *path;
1294 int len;
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001295 int retval = 0;
1296
1297 /* PEP 383. Not using PyUnicode_FSConverter since we need to
1298 allow embedded nulls on Linux. */
1299 if (PyUnicode_Check(args)) {
1300 if ((args = PyUnicode_EncodeFSDefault(args)) == NULL)
1301 return 0;
1302 }
1303 else
1304 Py_INCREF(args);
1305 if (!PyArg_Parse(args, "y#", &path, &len))
1306 goto unix_out;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001307
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001308 addr = (struct sockaddr_un*)addr_ret;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001309#ifdef linux
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001310 if (len > 0 && path[0] == 0) {
1311 /* Linux abstract namespace extension */
1312 if (len > sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001313 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001314 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001315 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001316 }
1317 }
1318 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001319#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001320 {
1321 /* regular NULL-terminated string */
1322 if (len >= sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001323 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001324 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001325 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001326 }
1327 addr->sun_path[len] = 0;
1328 }
1329 addr->sun_family = s->sock_family;
1330 memcpy(addr->sun_path, path, len);
Andrew MacIntyredaedf212004-04-11 12:03:57 +00001331#if defined(PYOS_OS2)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001332 *len_ret = sizeof(*addr);
Andrew MacIntyredaedf212004-04-11 12:03:57 +00001333#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001334 *len_ret = len + offsetof(struct sockaddr_un, sun_path);
Andrew MacIntyredaedf212004-04-11 12:03:57 +00001335#endif
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001336 retval = 1;
1337 unix_out:
1338 Py_DECREF(args);
1339 return retval;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001340 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001341#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001342
Martin v. Löwis11017b12006-01-14 18:12:57 +00001343#if defined(AF_NETLINK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001344 case AF_NETLINK:
1345 {
1346 struct sockaddr_nl* addr;
1347 int pid, groups;
1348 addr = (struct sockaddr_nl *)addr_ret;
1349 if (!PyTuple_Check(args)) {
1350 PyErr_Format(
1351 PyExc_TypeError,
1352 "getsockaddrarg: "
1353 "AF_NETLINK address must be tuple, not %.500s",
1354 Py_TYPE(args)->tp_name);
1355 return 0;
1356 }
1357 if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &pid, &groups))
1358 return 0;
1359 addr->nl_family = AF_NETLINK;
1360 addr->nl_pid = pid;
1361 addr->nl_groups = groups;
1362 *len_ret = sizeof(*addr);
1363 return 1;
1364 }
Martin v. Löwis11017b12006-01-14 18:12:57 +00001365#endif
1366
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001367#ifdef AF_RDS
1368 case AF_RDS:
1369 /* RDS sockets use sockaddr_in: fall-through */
1370#endif
1371
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001372 case AF_INET:
1373 {
1374 struct sockaddr_in* addr;
1375 char *host;
1376 int port, result;
1377 if (!PyTuple_Check(args)) {
1378 PyErr_Format(
1379 PyExc_TypeError,
1380 "getsockaddrarg: "
1381 "AF_INET address must be tuple, not %.500s",
1382 Py_TYPE(args)->tp_name);
1383 return 0;
1384 }
1385 if (!PyArg_ParseTuple(args, "eti:getsockaddrarg",
1386 "idna", &host, &port))
1387 return 0;
1388 addr=(struct sockaddr_in*)addr_ret;
1389 result = setipaddr(host, (struct sockaddr *)addr,
1390 sizeof(*addr), AF_INET);
1391 PyMem_Free(host);
1392 if (result < 0)
1393 return 0;
1394 if (port < 0 || port > 0xffff) {
1395 PyErr_SetString(
1396 PyExc_OverflowError,
1397 "getsockaddrarg: port must be 0-65535.");
1398 return 0;
1399 }
1400 addr->sin_family = AF_INET;
1401 addr->sin_port = htons((short)port);
1402 *len_ret = sizeof *addr;
1403 return 1;
1404 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001405
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001406#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001407 case AF_INET6:
1408 {
1409 struct sockaddr_in6* addr;
1410 char *host;
Charles-François Natali366999a2012-01-02 15:47:29 +01001411 int port, result;
1412 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001413 flowinfo = scope_id = 0;
1414 if (!PyTuple_Check(args)) {
1415 PyErr_Format(
1416 PyExc_TypeError,
1417 "getsockaddrarg: "
1418 "AF_INET6 address must be tuple, not %.500s",
1419 Py_TYPE(args)->tp_name);
1420 return 0;
1421 }
Charles-François Natali366999a2012-01-02 15:47:29 +01001422 if (!PyArg_ParseTuple(args, "eti|II",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001423 "idna", &host, &port, &flowinfo,
1424 &scope_id)) {
1425 return 0;
1426 }
1427 addr = (struct sockaddr_in6*)addr_ret;
1428 result = setipaddr(host, (struct sockaddr *)addr,
1429 sizeof(*addr), AF_INET6);
1430 PyMem_Free(host);
1431 if (result < 0)
1432 return 0;
1433 if (port < 0 || port > 0xffff) {
1434 PyErr_SetString(
1435 PyExc_OverflowError,
1436 "getsockaddrarg: port must be 0-65535.");
1437 return 0;
1438 }
Charles-François Natali366999a2012-01-02 15:47:29 +01001439 if (flowinfo < 0 || flowinfo > 0xfffff) {
1440 PyErr_SetString(
1441 PyExc_OverflowError,
1442 "getsockaddrarg: flowinfo must be 0-1048575.");
1443 return 0;
1444 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001445 addr->sin6_family = s->sock_family;
1446 addr->sin6_port = htons((short)port);
Charles-François Natali366999a2012-01-02 15:47:29 +01001447 addr->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001448 addr->sin6_scope_id = scope_id;
1449 *len_ret = sizeof *addr;
1450 return 1;
1451 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001452#endif
1453
Hye-Shik Chang81268602004-02-02 06:05:24 +00001454#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001455 case AF_BLUETOOTH:
1456 {
1457 switch (s->sock_proto) {
1458 case BTPROTO_L2CAP:
1459 {
1460 struct sockaddr_l2 *addr;
1461 char *straddr;
Martin v. Löwis12af0482004-01-31 12:34:17 +00001462
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001463 addr = (struct sockaddr_l2 *)addr_ret;
1464 memset(addr, 0, sizeof(struct sockaddr_l2));
1465 _BT_L2_MEMB(addr, family) = AF_BLUETOOTH;
1466 if (!PyArg_ParseTuple(args, "si", &straddr,
1467 &_BT_L2_MEMB(addr, psm))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001468 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001469 "wrong format");
1470 return 0;
1471 }
1472 if (setbdaddr(straddr, &_BT_L2_MEMB(addr, bdaddr)) < 0)
1473 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001474
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001475 *len_ret = sizeof *addr;
1476 return 1;
1477 }
1478 case BTPROTO_RFCOMM:
1479 {
1480 struct sockaddr_rc *addr;
1481 char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001482
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001483 addr = (struct sockaddr_rc *)addr_ret;
1484 _BT_RC_MEMB(addr, family) = AF_BLUETOOTH;
1485 if (!PyArg_ParseTuple(args, "si", &straddr,
1486 &_BT_RC_MEMB(addr, channel))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001487 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001488 "wrong format");
1489 return 0;
1490 }
1491 if (setbdaddr(straddr, &_BT_RC_MEMB(addr, bdaddr)) < 0)
1492 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001493
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001494 *len_ret = sizeof *addr;
1495 return 1;
1496 }
1497 case BTPROTO_HCI:
1498 {
1499 struct sockaddr_hci *addr = (struct sockaddr_hci *)addr_ret;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001500#if defined(__NetBSD__) || defined(__DragonFly__)
Alexander Belopolskye239d232010-12-08 23:31:48 +00001501 char *straddr = PyBytes_AS_STRING(args);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001502
Alexander Belopolskye239d232010-12-08 23:31:48 +00001503 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001504 if (straddr == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001505 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001506 "wrong format");
1507 return 0;
1508 }
1509 if (setbdaddr(straddr, &_BT_HCI_MEMB(addr, bdaddr)) < 0)
1510 return 0;
1511#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001512 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
1513 if (!PyArg_ParseTuple(args, "i", &_BT_HCI_MEMB(addr, dev))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001514 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001515 "wrong format");
1516 return 0;
1517 }
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001518#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001519 *len_ret = sizeof *addr;
1520 return 1;
1521 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001522#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001523 case BTPROTO_SCO:
1524 {
1525 struct sockaddr_sco *addr;
1526 char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001527
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001528 addr = (struct sockaddr_sco *)addr_ret;
1529 _BT_SCO_MEMB(addr, family) = AF_BLUETOOTH;
1530 if (!PyBytes_Check(args)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001531 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001532 "wrong format");
1533 return 0;
1534 }
1535 straddr = PyBytes_AS_STRING(args);
1536 if (setbdaddr(straddr, &_BT_SCO_MEMB(addr, bdaddr)) < 0)
1537 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001538
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001539 *len_ret = sizeof *addr;
1540 return 1;
1541 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001542#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001543 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001544 PyErr_SetString(PyExc_OSError, "getsockaddrarg: unknown Bluetooth protocol");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001545 return 0;
1546 }
1547 }
Martin v. Löwis12af0482004-01-31 12:34:17 +00001548#endif
1549
Antoine Pitroub156a462010-10-27 20:13:57 +00001550#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFINDEX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001551 case AF_PACKET:
1552 {
1553 struct sockaddr_ll* addr;
1554 struct ifreq ifr;
1555 char *interfaceName;
1556 int protoNumber;
1557 int hatype = 0;
1558 int pkttype = 0;
1559 char *haddr = NULL;
1560 unsigned int halen = 0;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001561
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001562 if (!PyTuple_Check(args)) {
1563 PyErr_Format(
1564 PyExc_TypeError,
1565 "getsockaddrarg: "
1566 "AF_PACKET address must be tuple, not %.500s",
1567 Py_TYPE(args)->tp_name);
1568 return 0;
1569 }
1570 if (!PyArg_ParseTuple(args, "si|iiy#", &interfaceName,
1571 &protoNumber, &pkttype, &hatype,
1572 &haddr, &halen))
1573 return 0;
1574 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
1575 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
1576 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1577 s->errorhandler();
1578 return 0;
1579 }
1580 if (halen > 8) {
1581 PyErr_SetString(PyExc_ValueError,
1582 "Hardware address must be 8 bytes or less");
1583 return 0;
1584 }
1585 if (protoNumber < 0 || protoNumber > 0xffff) {
1586 PyErr_SetString(
1587 PyExc_OverflowError,
1588 "getsockaddrarg: protoNumber must be 0-65535.");
1589 return 0;
1590 }
1591 addr = (struct sockaddr_ll*)addr_ret;
1592 addr->sll_family = AF_PACKET;
1593 addr->sll_protocol = htons((short)protoNumber);
1594 addr->sll_ifindex = ifr.ifr_ifindex;
1595 addr->sll_pkttype = pkttype;
1596 addr->sll_hatype = hatype;
1597 if (halen != 0) {
1598 memcpy(&addr->sll_addr, haddr, halen);
1599 }
1600 addr->sll_halen = halen;
1601 *len_ret = sizeof *addr;
1602 return 1;
1603 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00001604#endif
1605
Christian Heimes043d6f62008-01-07 17:19:16 +00001606#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001607 case AF_TIPC:
1608 {
1609 unsigned int atype, v1, v2, v3;
1610 unsigned int scope = TIPC_CLUSTER_SCOPE;
1611 struct sockaddr_tipc *addr;
Christian Heimes043d6f62008-01-07 17:19:16 +00001612
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001613 if (!PyTuple_Check(args)) {
1614 PyErr_Format(
1615 PyExc_TypeError,
1616 "getsockaddrarg: "
1617 "AF_TIPC address must be tuple, not %.500s",
1618 Py_TYPE(args)->tp_name);
1619 return 0;
1620 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001621
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001622 if (!PyArg_ParseTuple(args,
1623 "IIII|I;Invalid TIPC address format",
1624 &atype, &v1, &v2, &v3, &scope))
1625 return 0;
Christian Heimes043d6f62008-01-07 17:19:16 +00001626
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001627 addr = (struct sockaddr_tipc *) addr_ret;
1628 memset(addr, 0, sizeof(struct sockaddr_tipc));
Christian Heimes043d6f62008-01-07 17:19:16 +00001629
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001630 addr->family = AF_TIPC;
1631 addr->scope = scope;
1632 addr->addrtype = atype;
Christian Heimes043d6f62008-01-07 17:19:16 +00001633
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001634 if (atype == TIPC_ADDR_NAMESEQ) {
1635 addr->addr.nameseq.type = v1;
1636 addr->addr.nameseq.lower = v2;
1637 addr->addr.nameseq.upper = v3;
1638 } else if (atype == TIPC_ADDR_NAME) {
1639 addr->addr.name.name.type = v1;
1640 addr->addr.name.name.instance = v2;
1641 } else if (atype == TIPC_ADDR_ID) {
1642 addr->addr.id.node = v1;
1643 addr->addr.id.ref = v2;
1644 } else {
1645 /* Shouldn't happen */
1646 PyErr_SetString(PyExc_TypeError, "Invalid address type");
1647 return 0;
1648 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001649
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001650 *len_ret = sizeof(*addr);
Christian Heimes043d6f62008-01-07 17:19:16 +00001651
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001652 return 1;
1653 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001654#endif
1655
Charles-François Natali30589c92011-10-07 22:47:08 +02001656#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02001657 case AF_CAN:
1658 switch (s->sock_proto) {
1659 case CAN_RAW:
1660 {
1661 struct sockaddr_can *addr;
1662 PyObject *interfaceName;
1663 struct ifreq ifr;
1664 addr = (struct sockaddr_can *)addr_ret;
1665 Py_ssize_t len;
1666
1667 if (!PyArg_ParseTuple(args, "O&", PyUnicode_FSConverter,
1668 &interfaceName))
1669 return 0;
1670
1671 len = PyBytes_GET_SIZE(interfaceName);
1672
1673 if (len == 0) {
1674 ifr.ifr_ifindex = 0;
1675 } else if (len < sizeof(ifr.ifr_name)) {
1676 strcpy(ifr.ifr_name, PyBytes_AS_STRING(interfaceName));
1677 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1678 s->errorhandler();
1679 Py_DECREF(interfaceName);
1680 return 0;
1681 }
1682 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001683 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02001684 "AF_CAN interface name too long");
1685 Py_DECREF(interfaceName);
1686 return 0;
1687 }
1688
1689 addr->can_family = AF_CAN;
1690 addr->can_ifindex = ifr.ifr_ifindex;
1691
1692 *len_ret = sizeof(*addr);
1693 Py_DECREF(interfaceName);
1694 return 1;
1695 }
1696 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001697 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02001698 "getsockaddrarg: unsupported CAN protocol");
1699 return 0;
1700 }
1701#endif
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001702
1703#ifdef PF_SYSTEM
1704 case PF_SYSTEM:
1705 switch (s->sock_proto) {
1706#ifdef SYSPROTO_CONTROL
1707 case SYSPROTO_CONTROL:
1708 {
1709 struct sockaddr_ctl *addr;
1710
1711 addr = (struct sockaddr_ctl *)addr_ret;
1712 addr->sc_family = AF_SYSTEM;
1713 addr->ss_sysaddr = AF_SYS_CONTROL;
1714
1715 if (PyUnicode_Check(args)) {
1716 struct ctl_info info;
1717 PyObject *ctl_name;
1718
1719 if (!PyArg_Parse(args, "O&",
1720 PyUnicode_FSConverter, &ctl_name)) {
1721 return 0;
1722 }
1723
1724 if (PyBytes_GET_SIZE(ctl_name) > sizeof(info.ctl_name)) {
1725 PyErr_SetString(PyExc_ValueError,
1726 "provided string is too long");
1727 Py_DECREF(ctl_name);
1728 return 0;
1729 }
1730 strncpy(info.ctl_name, PyBytes_AS_STRING(ctl_name),
1731 sizeof(info.ctl_name));
1732 Py_DECREF(ctl_name);
1733
1734 if (ioctl(s->sock_fd, CTLIOCGINFO, &info)) {
1735 PyErr_SetString(PyExc_OSError,
1736 "cannot find kernel control with provided name");
1737 return 0;
1738 }
1739
1740 addr->sc_id = info.ctl_id;
1741 addr->sc_unit = 0;
1742 } else if (!PyArg_ParseTuple(args, "II",
1743 &(addr->sc_id), &(addr->sc_unit))) {
1744 PyErr_SetString(PyExc_TypeError, "getsockaddrarg: "
1745 "expected str or tuple of two ints");
1746
1747 return 0;
1748 }
1749
1750 *len_ret = sizeof(*addr);
1751 return 1;
1752 }
1753#endif
1754 default:
1755 PyErr_SetString(PyExc_OSError,
1756 "getsockaddrarg: unsupported PF_SYSTEM protocol");
1757 return 0;
1758 }
1759#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02001760
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001761 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001762
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001763 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001764 PyErr_SetString(PyExc_OSError, "getsockaddrarg: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001765 return 0;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001766
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001767 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001768}
1769
Guido van Rossum30a685f1991-06-27 15:51:29 +00001770
Guido van Rossum48a680c2001-03-02 06:34:14 +00001771/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +00001772 Return 1 if the family is known, 0 otherwise. The length is returned
1773 through len_ret. */
1774
1775static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +00001776getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +00001777{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001778 switch (s->sock_family) {
Guido van Rossum710e1df1992-06-12 10:39:36 +00001779
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001780#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001781 case AF_UNIX:
1782 {
1783 *len_ret = sizeof (struct sockaddr_un);
1784 return 1;
1785 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001786#endif /* AF_UNIX */
Martin v. Löwis11017b12006-01-14 18:12:57 +00001787#if defined(AF_NETLINK)
1788 case AF_NETLINK:
1789 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001790 *len_ret = sizeof (struct sockaddr_nl);
1791 return 1;
Martin v. Löwis11017b12006-01-14 18:12:57 +00001792 }
1793#endif
Guido van Rossum710e1df1992-06-12 10:39:36 +00001794
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001795#ifdef AF_RDS
1796 case AF_RDS:
1797 /* RDS sockets use sockaddr_in: fall-through */
1798#endif
1799
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001800 case AF_INET:
1801 {
1802 *len_ret = sizeof (struct sockaddr_in);
1803 return 1;
1804 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00001805
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001806#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001807 case AF_INET6:
1808 {
1809 *len_ret = sizeof (struct sockaddr_in6);
1810 return 1;
1811 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001812#endif
1813
Hye-Shik Chang81268602004-02-02 06:05:24 +00001814#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001815 case AF_BLUETOOTH:
1816 {
1817 switch(s->sock_proto)
1818 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001819
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001820 case BTPROTO_L2CAP:
1821 *len_ret = sizeof (struct sockaddr_l2);
1822 return 1;
1823 case BTPROTO_RFCOMM:
1824 *len_ret = sizeof (struct sockaddr_rc);
1825 return 1;
1826 case BTPROTO_HCI:
1827 *len_ret = sizeof (struct sockaddr_hci);
1828 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00001829#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001830 case BTPROTO_SCO:
1831 *len_ret = sizeof (struct sockaddr_sco);
1832 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00001833#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001834 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001835 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001836 "unknown BT protocol");
1837 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001838
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001839 }
1840 }
Martin v. Löwis12af0482004-01-31 12:34:17 +00001841#endif
1842
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00001843#ifdef HAVE_NETPACKET_PACKET_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001844 case AF_PACKET:
1845 {
1846 *len_ret = sizeof (struct sockaddr_ll);
1847 return 1;
1848 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001849#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001850
Christian Heimes043d6f62008-01-07 17:19:16 +00001851#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001852 case AF_TIPC:
1853 {
1854 *len_ret = sizeof (struct sockaddr_tipc);
1855 return 1;
1856 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001857#endif
1858
Charles-François Natali30589c92011-10-07 22:47:08 +02001859#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02001860 case AF_CAN:
1861 {
1862 *len_ret = sizeof (struct sockaddr_can);
1863 return 1;
1864 }
1865#endif
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001866
1867#ifdef PF_SYSTEM
1868 case PF_SYSTEM:
1869 switch(s->sock_proto) {
1870#ifdef SYSPROTO_CONTROL
1871 case SYSPROTO_CONTROL:
1872 *len_ret = sizeof (struct sockaddr_ctl);
1873 return 1;
1874#endif
1875 default:
1876 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
1877 "unknown PF_SYSTEM protocol");
1878 return 0;
1879 }
1880#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02001881
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001882 /* More cases here... */
Guido van Rossum710e1df1992-06-12 10:39:36 +00001883
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001884 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001885 PyErr_SetString(PyExc_OSError, "getsockaddrlen: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001886 return 0;
Guido van Rossum710e1df1992-06-12 10:39:36 +00001887
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001888 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00001889}
1890
1891
Nick Coghlan96fe56a2011-08-22 11:55:57 +10001892/* Support functions for the sendmsg() and recvmsg[_into]() methods.
1893 Currently, these methods are only compiled if the RFC 2292/3542
1894 CMSG_LEN() macro is available. Older systems seem to have used
1895 sizeof(struct cmsghdr) + (length) where CMSG_LEN() is used now, so
1896 it may be possible to define CMSG_LEN() that way if it's not
1897 provided. Some architectures might need extra padding after the
1898 cmsghdr, however, and CMSG_LEN() would have to take account of
1899 this. */
1900#ifdef CMSG_LEN
1901/* If length is in range, set *result to CMSG_LEN(length) and return
1902 true; otherwise, return false. */
1903static int
1904get_CMSG_LEN(size_t length, size_t *result)
1905{
1906 size_t tmp;
1907
1908 if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0)))
1909 return 0;
1910 tmp = CMSG_LEN(length);
1911 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
1912 return 0;
1913 *result = tmp;
1914 return 1;
1915}
1916
1917#ifdef CMSG_SPACE
1918/* If length is in range, set *result to CMSG_SPACE(length) and return
1919 true; otherwise, return false. */
1920static int
1921get_CMSG_SPACE(size_t length, size_t *result)
1922{
1923 size_t tmp;
1924
1925 /* Use CMSG_SPACE(1) here in order to take account of the padding
1926 necessary before *and* after the data. */
1927 if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1)))
1928 return 0;
1929 tmp = CMSG_SPACE(length);
1930 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
1931 return 0;
1932 *result = tmp;
1933 return 1;
1934}
1935#endif
1936
1937/* Return true iff msg->msg_controllen is valid, cmsgh is a valid
1938 pointer in msg->msg_control with at least "space" bytes after it,
1939 and its cmsg_len member inside the buffer. */
1940static int
1941cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space)
1942{
1943 size_t cmsg_offset;
1944 static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) +
1945 sizeof(cmsgh->cmsg_len));
1946
Charles-François Natali466517d2011-08-28 18:23:43 +02001947 /* Note that POSIX allows msg_controllen to be of signed type. */
1948 if (cmsgh == NULL || msg->msg_control == NULL || msg->msg_controllen < 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10001949 return 0;
1950 if (space < cmsg_len_end)
1951 space = cmsg_len_end;
1952 cmsg_offset = (char *)cmsgh - (char *)msg->msg_control;
1953 return (cmsg_offset <= (size_t)-1 - space &&
1954 cmsg_offset + space <= msg->msg_controllen);
1955}
1956
1957/* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set
1958 *space to number of bytes following it in the buffer and return
1959 true; otherwise, return false. Assumes cmsgh, msg->msg_control and
1960 msg->msg_controllen are valid. */
1961static int
1962get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space)
1963{
1964 size_t data_offset;
1965 char *data_ptr;
1966
1967 if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL)
1968 return 0;
1969 data_offset = data_ptr - (char *)msg->msg_control;
1970 if (data_offset > msg->msg_controllen)
1971 return 0;
1972 *space = msg->msg_controllen - data_offset;
1973 return 1;
1974}
1975
1976/* If cmsgh is invalid or not contained in the buffer pointed to by
1977 msg->msg_control, return -1. If cmsgh is valid and its associated
1978 data is entirely contained in the buffer, set *data_len to the
1979 length of the associated data and return 0. If only part of the
1980 associated data is contained in the buffer but cmsgh is otherwise
1981 valid, set *data_len to the length contained in the buffer and
1982 return 1. */
1983static int
1984get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len)
1985{
1986 size_t space, cmsg_data_len;
1987
1988 if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) ||
1989 cmsgh->cmsg_len < CMSG_LEN(0))
1990 return -1;
1991 cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0);
1992 if (!get_cmsg_data_space(msg, cmsgh, &space))
1993 return -1;
1994 if (space >= cmsg_data_len) {
1995 *data_len = cmsg_data_len;
1996 return 0;
1997 }
1998 *data_len = space;
1999 return 1;
2000}
2001#endif /* CMSG_LEN */
2002
2003
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002004/* s._accept() -> (fd, address) */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002005
Guido van Rossum73624e91994-10-10 17:59:00 +00002006static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002007sock_accept(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002008{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002009 sock_addr_t addrbuf;
2010 SOCKET_T newfd = INVALID_SOCKET;
2011 socklen_t addrlen;
2012 PyObject *sock = NULL;
2013 PyObject *addr = NULL;
2014 PyObject *res = NULL;
2015 int timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002016 if (!getsockaddrlen(s, &addrlen))
2017 return NULL;
2018 memset(&addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002019
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002020 if (!IS_SELECTABLE(s))
2021 return select_error();
Neal Norwitz082b2df2006-02-07 07:04:46 +00002022
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002023 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002024 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002025 timeout = internal_select_ex(s, 0, interval);
Antoine Pitroub1c54962010-10-14 15:05:38 +00002026 if (!timeout) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002027 newfd = accept(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
Antoine Pitroub1c54962010-10-14 15:05:38 +00002028 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002029 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002030
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002031 if (timeout == 1) {
2032 PyErr_SetString(socket_timeout, "timed out");
2033 return NULL;
2034 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002035 END_SELECT_LOOP(s)
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002036
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002037 if (newfd == INVALID_SOCKET)
2038 return s->errorhandler();
Barry Warsaw752300b1997-01-03 17:18:10 +00002039
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002040 sock = PyLong_FromSocket_t(newfd);
2041 if (sock == NULL) {
2042 SOCKETCLOSE(newfd);
2043 goto finally;
2044 }
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002045
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002046 addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
2047 addrlen, s->sock_proto);
2048 if (addr == NULL)
2049 goto finally;
Barry Warsaw752300b1997-01-03 17:18:10 +00002050
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002051 res = PyTuple_Pack(2, sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00002052
Guido van Rossum67f7a382002-06-06 21:08:16 +00002053finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002054 Py_XDECREF(sock);
2055 Py_XDECREF(addr);
2056 return res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002057}
2058
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002059PyDoc_STRVAR(accept_doc,
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002060"_accept() -> (integer, address info)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002061\n\
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002062Wait for an incoming connection. Return a new socket file descriptor\n\
2063representing the connection, and the address of the client.\n\
2064For IP sockets, the address info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002065
Guido van Rossum11ba0942002-06-13 15:07:44 +00002066/* s.setblocking(flag) method. Argument:
2067 False -- non-blocking mode; same as settimeout(0)
2068 True -- blocking mode; same as settimeout(None)
2069*/
Guido van Rossume4485b01994-09-07 14:32:49 +00002070
Guido van Rossum73624e91994-10-10 17:59:00 +00002071static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002072sock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00002073{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002074 int block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002075
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002076 block = PyLong_AsLong(arg);
2077 if (block == -1 && PyErr_Occurred())
2078 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002079
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002080 s->sock_timeout = block ? -1.0 : 0.0;
2081 internal_setblocking(s, block);
Guido van Rossume4485b01994-09-07 14:32:49 +00002082
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002083 Py_INCREF(Py_None);
2084 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +00002085}
Guido van Rossume4485b01994-09-07 14:32:49 +00002086
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002087PyDoc_STRVAR(setblocking_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002088"setblocking(flag)\n\
2089\n\
2090Set the socket to blocking (flag is true) or non-blocking (false).\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002091setblocking(True) is equivalent to settimeout(None);\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002092setblocking(False) is equivalent to settimeout(0.0).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002093
Guido van Rossum11ba0942002-06-13 15:07:44 +00002094/* s.settimeout(timeout) method. Argument:
2095 None -- no timeout, blocking mode; same as setblocking(True)
2096 0.0 -- non-blocking mode; same as setblocking(False)
2097 > 0 -- timeout mode; operations time out after timeout seconds
2098 < 0 -- illegal; raises an exception
2099*/
Guido van Rossum67f7a382002-06-06 21:08:16 +00002100static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002101sock_settimeout(PySocketSockObject *s, PyObject *arg)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002102{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002103 double timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002104
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002105 if (arg == Py_None)
2106 timeout = -1.0;
2107 else {
2108 timeout = PyFloat_AsDouble(arg);
2109 if (timeout < 0.0) {
2110 if (!PyErr_Occurred())
2111 PyErr_SetString(PyExc_ValueError,
2112 "Timeout value out of range");
2113 return NULL;
2114 }
2115 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002116
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002117 s->sock_timeout = timeout;
2118 internal_setblocking(s, timeout < 0.0);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002119
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002120 Py_INCREF(Py_None);
2121 return Py_None;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002122}
2123
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002124PyDoc_STRVAR(settimeout_doc,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002125"settimeout(timeout)\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002126\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002127Set a timeout on socket operations. 'timeout' can be a float,\n\
2128giving in seconds, or None. Setting a timeout of None disables\n\
2129the timeout feature and is equivalent to setblocking(1).\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002130Setting a timeout of zero is the same as setblocking(0).");
Guido van Rossum67f7a382002-06-06 21:08:16 +00002131
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002132/* s.gettimeout() method.
2133 Returns the timeout associated with a socket. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00002134static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002135sock_gettimeout(PySocketSockObject *s)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002136{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002137 if (s->sock_timeout < 0.0) {
2138 Py_INCREF(Py_None);
2139 return Py_None;
2140 }
2141 else
2142 return PyFloat_FromDouble(s->sock_timeout);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002143}
2144
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002145PyDoc_STRVAR(gettimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002146"gettimeout() -> timeout\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002147\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03002148Returns the timeout in seconds (float) associated with socket \n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002149operations. A timeout of None indicates that timeouts on socket \n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002150operations are disabled.");
Guido van Rossume4485b01994-09-07 14:32:49 +00002151
Guido van Rossumaee08791992-09-08 09:05:33 +00002152/* s.setsockopt() method.
2153 With an integer third argument, sets an integer option.
2154 With a string third argument, sets an option from a buffer;
2155 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002156
Guido van Rossum73624e91994-10-10 17:59:00 +00002157static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002158sock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002159{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002160 int level;
2161 int optname;
2162 int res;
2163 char *buf;
2164 int buflen;
2165 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002166
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002167 if (PyArg_ParseTuple(args, "iii:setsockopt",
2168 &level, &optname, &flag)) {
2169 buf = (char *) &flag;
2170 buflen = sizeof flag;
2171 }
2172 else {
2173 PyErr_Clear();
2174 if (!PyArg_ParseTuple(args, "iiy#:setsockopt",
2175 &level, &optname, &buf, &buflen))
2176 return NULL;
2177 }
2178 res = setsockopt(s->sock_fd, level, optname, (void *)buf, buflen);
2179 if (res < 0)
2180 return s->errorhandler();
2181 Py_INCREF(Py_None);
2182 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002183}
2184
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002185PyDoc_STRVAR(setsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002186"setsockopt(level, option, value)\n\
2187\n\
2188Set a socket option. See the Unix manual for level and option.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002189The value argument can either be an integer or a string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002190
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002191
Guido van Rossumaee08791992-09-08 09:05:33 +00002192/* s.getsockopt() method.
2193 With two arguments, retrieves an integer option.
2194 With a third integer argument, retrieves a string buffer of that size;
2195 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002196
Guido van Rossum73624e91994-10-10 17:59:00 +00002197static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002198sock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002199{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002200 int level;
2201 int optname;
2202 int res;
2203 PyObject *buf;
2204 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002205
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002206 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
2207 &level, &optname, &buflen))
2208 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002209
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002210 if (buflen == 0) {
2211 int flag = 0;
2212 socklen_t flagsize = sizeof flag;
2213 res = getsockopt(s->sock_fd, level, optname,
2214 (void *)&flag, &flagsize);
2215 if (res < 0)
2216 return s->errorhandler();
2217 return PyLong_FromLong(flag);
2218 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002219#ifdef __VMS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002220 /* socklen_t is unsigned so no negative test is needed,
2221 test buflen == 0 is previously done */
2222 if (buflen > 1024) {
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002223#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002224 if (buflen <= 0 || buflen > 1024) {
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002225#endif
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002226 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002227 "getsockopt buflen out of range");
2228 return NULL;
2229 }
2230 buf = PyBytes_FromStringAndSize((char *)NULL, buflen);
2231 if (buf == NULL)
2232 return NULL;
2233 res = getsockopt(s->sock_fd, level, optname,
2234 (void *)PyBytes_AS_STRING(buf), &buflen);
2235 if (res < 0) {
2236 Py_DECREF(buf);
2237 return s->errorhandler();
2238 }
2239 _PyBytes_Resize(&buf, buflen);
2240 return buf;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002241}
2242
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002243PyDoc_STRVAR(getsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002244"getsockopt(level, option[, buffersize]) -> value\n\
2245\n\
2246Get a socket option. See the Unix manual for level and option.\n\
2247If a nonzero buffersize argument is given, the return value is a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002248string of that length; otherwise it is an integer.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002249
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002250
Fred Drake728819a2000-07-01 03:40:12 +00002251/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002252
Guido van Rossum73624e91994-10-10 17:59:00 +00002253static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002254sock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002255{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002256 sock_addr_t addrbuf;
2257 int addrlen;
2258 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002259
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002260 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2261 return NULL;
2262 Py_BEGIN_ALLOW_THREADS
2263 res = bind(s->sock_fd, SAS2SA(&addrbuf), addrlen);
2264 Py_END_ALLOW_THREADS
2265 if (res < 0)
2266 return s->errorhandler();
2267 Py_INCREF(Py_None);
2268 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002269}
2270
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002271PyDoc_STRVAR(bind_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002272"bind(address)\n\
2273\n\
2274Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00002275pair (host, port); the host must refer to the local host. For raw packet\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002276sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002277
Guido van Rossum30a685f1991-06-27 15:51:29 +00002278
2279/* s.close() method.
2280 Set the file descriptor to -1 so operations tried subsequently
2281 will surely fail. */
2282
Guido van Rossum73624e91994-10-10 17:59:00 +00002283static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002284sock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002285{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002286 SOCKET_T fd;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002287
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002288 if ((fd = s->sock_fd) != -1) {
2289 s->sock_fd = -1;
2290 Py_BEGIN_ALLOW_THREADS
2291 (void) SOCKETCLOSE(fd);
2292 Py_END_ALLOW_THREADS
2293 }
2294 Py_INCREF(Py_None);
2295 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002296}
2297
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002298PyDoc_STRVAR(close_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002299"close()\n\
2300\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002301Close the socket. It cannot be used after this call.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002302
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002303static PyObject *
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002304sock_detach(PySocketSockObject *s)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002305{
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002306 SOCKET_T fd = s->sock_fd;
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002307 s->sock_fd = -1;
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002308 return PyLong_FromSocket_t(fd);
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002309}
2310
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002311PyDoc_STRVAR(detach_doc,
2312"detach()\n\
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002313\n\
2314Close the socket object without closing the underlying file descriptor.\
2315The object cannot be used after this call, but the file descriptor\
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002316can be reused for other purposes. The file descriptor is returned.");
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002317
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002318static int
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002319internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002320 int *timeoutp)
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002321{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002322 int res, timeout;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002323
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002324 timeout = 0;
2325 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002326
2327#ifdef MS_WINDOWS
2328
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002329 if (s->sock_timeout > 0.0) {
2330 if (res < 0 && WSAGetLastError() == WSAEWOULDBLOCK &&
2331 IS_SELECTABLE(s)) {
2332 /* This is a mess. Best solution: trust select */
2333 fd_set fds;
2334 fd_set fds_exc;
2335 struct timeval tv;
2336 tv.tv_sec = (int)s->sock_timeout;
2337 tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6);
2338 FD_ZERO(&fds);
2339 FD_SET(s->sock_fd, &fds);
2340 FD_ZERO(&fds_exc);
2341 FD_SET(s->sock_fd, &fds_exc);
Antoine Pitrou19467d22010-08-17 19:33:30 +00002342 res = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
2343 NULL, &fds, &fds_exc, &tv);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002344 if (res == 0) {
2345 res = WSAEWOULDBLOCK;
2346 timeout = 1;
2347 } else if (res > 0) {
2348 if (FD_ISSET(s->sock_fd, &fds))
2349 /* The socket is in the writable set - this
2350 means connected */
2351 res = 0;
2352 else {
2353 /* As per MS docs, we need to call getsockopt()
2354 to get the underlying error */
2355 int res_size = sizeof res;
2356 /* It must be in the exception set */
2357 assert(FD_ISSET(s->sock_fd, &fds_exc));
2358 if (0 == getsockopt(s->sock_fd, SOL_SOCKET, SO_ERROR,
2359 (char *)&res, &res_size))
2360 /* getsockopt also clears WSAGetLastError,
2361 so reset it back. */
2362 WSASetLastError(res);
2363 else
2364 res = WSAGetLastError();
2365 }
2366 }
2367 /* else if (res < 0) an error occurred */
2368 }
2369 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002370
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002371 if (res < 0)
2372 res = WSAGetLastError();
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002373
2374#else
2375
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002376 if (s->sock_timeout > 0.0) {
2377 if (res < 0 && errno == EINPROGRESS && IS_SELECTABLE(s)) {
2378 timeout = internal_select(s, 1);
2379 if (timeout == 0) {
2380 /* Bug #1019808: in case of an EINPROGRESS,
2381 use getsockopt(SO_ERROR) to get the real
2382 error. */
2383 socklen_t res_size = sizeof res;
2384 (void)getsockopt(s->sock_fd, SOL_SOCKET,
2385 SO_ERROR, &res, &res_size);
2386 if (res == EISCONN)
2387 res = 0;
2388 errno = res;
2389 }
2390 else if (timeout == -1) {
2391 res = errno; /* had error */
2392 }
2393 else
2394 res = EWOULDBLOCK; /* timed out */
2395 }
2396 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002397
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002398 if (res < 0)
2399 res = errno;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002400
2401#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002402 *timeoutp = timeout;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002403
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002404 return res;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002405}
Guido van Rossum30a685f1991-06-27 15:51:29 +00002406
Fred Drake728819a2000-07-01 03:40:12 +00002407/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002408
Guido van Rossum73624e91994-10-10 17:59:00 +00002409static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002410sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002411{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002412 sock_addr_t addrbuf;
2413 int addrlen;
2414 int res;
2415 int timeout;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002416
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002417 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2418 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002419
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002420 Py_BEGIN_ALLOW_THREADS
2421 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, &timeout);
2422 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002423
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002424 if (timeout == 1) {
2425 PyErr_SetString(socket_timeout, "timed out");
2426 return NULL;
2427 }
2428 if (res != 0)
2429 return s->errorhandler();
2430 Py_INCREF(Py_None);
2431 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002432}
2433
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002434PyDoc_STRVAR(connect_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002435"connect(address)\n\
2436\n\
2437Connect the socket to a remote address. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002438is a pair (host, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002439
Guido van Rossum30a685f1991-06-27 15:51:29 +00002440
Fred Drake728819a2000-07-01 03:40:12 +00002441/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002442
2443static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002444sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002445{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002446 sock_addr_t addrbuf;
2447 int addrlen;
2448 int res;
2449 int timeout;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002450
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002451 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2452 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002453
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002454 Py_BEGIN_ALLOW_THREADS
2455 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, &timeout);
2456 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002457
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002458 /* Signals are not errors (though they may raise exceptions). Adapted
2459 from PyErr_SetFromErrnoWithFilenameObject(). */
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002460#ifdef EINTR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002461 if (res == EINTR && PyErr_CheckSignals())
2462 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002463#endif
2464
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002465 return PyLong_FromLong((long) res);
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002466}
2467
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002468PyDoc_STRVAR(connect_ex_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002469"connect_ex(address) -> errno\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002470\n\
2471This is like connect(address), but returns an error code (the errno value)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002472instead of raising an exception when an error occurs.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002473
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002474
Guido van Rossumed233a51992-06-23 09:07:03 +00002475/* s.fileno() method */
2476
Guido van Rossum73624e91994-10-10 17:59:00 +00002477static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002478sock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00002479{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002480 return PyLong_FromSocket_t(s->sock_fd);
Guido van Rossumed233a51992-06-23 09:07:03 +00002481}
2482
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002483PyDoc_STRVAR(fileno_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002484"fileno() -> integer\n\
2485\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002486Return the integer file descriptor of the socket.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002487
Guido van Rossumed233a51992-06-23 09:07:03 +00002488
Guido van Rossumc89705d1992-11-26 08:54:07 +00002489/* s.getsockname() method */
2490
Guido van Rossum73624e91994-10-10 17:59:00 +00002491static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002492sock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002493{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002494 sock_addr_t addrbuf;
2495 int res;
2496 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002497
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002498 if (!getsockaddrlen(s, &addrlen))
2499 return NULL;
2500 memset(&addrbuf, 0, addrlen);
2501 Py_BEGIN_ALLOW_THREADS
2502 res = getsockname(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2503 Py_END_ALLOW_THREADS
2504 if (res < 0)
2505 return s->errorhandler();
2506 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2507 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002508}
2509
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002510PyDoc_STRVAR(getsockname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002511"getsockname() -> address info\n\
2512\n\
2513Return the address of the local endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002514info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002515
Guido van Rossumc89705d1992-11-26 08:54:07 +00002516
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002517#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002518/* s.getpeername() method */
2519
Guido van Rossum73624e91994-10-10 17:59:00 +00002520static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002521sock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002522{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002523 sock_addr_t addrbuf;
2524 int res;
2525 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002526
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002527 if (!getsockaddrlen(s, &addrlen))
2528 return NULL;
2529 memset(&addrbuf, 0, addrlen);
2530 Py_BEGIN_ALLOW_THREADS
2531 res = getpeername(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2532 Py_END_ALLOW_THREADS
2533 if (res < 0)
2534 return s->errorhandler();
2535 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2536 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002537}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002538
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002539PyDoc_STRVAR(getpeername_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002540"getpeername() -> address info\n\
2541\n\
2542Return the address of the remote endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002543info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002544
Guido van Rossumb6775db1994-08-01 11:34:53 +00002545#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002546
2547
Guido van Rossum30a685f1991-06-27 15:51:29 +00002548/* s.listen(n) method */
2549
Guido van Rossum73624e91994-10-10 17:59:00 +00002550static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002551sock_listen(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002552{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002553 int backlog;
2554 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002555
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002556 backlog = PyLong_AsLong(arg);
2557 if (backlog == -1 && PyErr_Occurred())
2558 return NULL;
2559 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou1be815a2011-05-10 19:16:29 +02002560 /* To avoid problems on systems that don't allow a negative backlog
2561 * (which doesn't make sense anyway) we force a minimum value of 0. */
2562 if (backlog < 0)
2563 backlog = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002564 res = listen(s->sock_fd, backlog);
2565 Py_END_ALLOW_THREADS
2566 if (res < 0)
2567 return s->errorhandler();
2568 Py_INCREF(Py_None);
2569 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002570}
2571
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002572PyDoc_STRVAR(listen_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002573"listen(backlog)\n\
2574\n\
2575Enable a server to accept connections. The backlog argument must be at\n\
Antoine Pitrou1be815a2011-05-10 19:16:29 +02002576least 0 (if it is lower, it is set to 0); it specifies the number of\n\
2577unaccepted connections that the system will allow before refusing new\n\
2578connections.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002579
2580
Thomas Wouters477c8d52006-05-27 19:21:47 +00002581/*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002582 * This is the guts of the recv() and recv_into() methods, which reads into a
Thomas Wouters902d6eb2007-01-09 23:18:33 +00002583 * char buffer. If you have any inc/dec ref to do to the objects that contain
Thomas Wouters477c8d52006-05-27 19:21:47 +00002584 * the buffer, do it in the caller. This function returns the number of bytes
Ezio Melotti13925002011-03-16 11:05:33 +02002585 * successfully read. If there was an error, it returns -1. Note that it is
Thomas Wouters477c8d52006-05-27 19:21:47 +00002586 * also possible that we return a number of bytes smaller than the request
2587 * bytes.
2588 */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002589
Antoine Pitrou19467d22010-08-17 19:33:30 +00002590static Py_ssize_t
2591sock_recv_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002592{
Antoine Pitrou19467d22010-08-17 19:33:30 +00002593 Py_ssize_t outlen = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002594 int timeout;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002595#ifdef __VMS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002596 int remaining;
2597 char *read_buf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002598#endif
2599
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002600 if (!IS_SELECTABLE(s)) {
2601 select_error();
2602 return -1;
2603 }
2604 if (len == 0) {
2605 /* If 0 bytes were requested, do nothing. */
2606 return 0;
2607 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002608
2609#ifndef __VMS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002610 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002611 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002612 timeout = internal_select_ex(s, 0, interval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002613 if (!timeout)
2614 outlen = recv(s->sock_fd, cbuf, len, flags);
2615 Py_END_ALLOW_THREADS
Thomas Wouters477c8d52006-05-27 19:21:47 +00002616
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002617 if (timeout == 1) {
2618 PyErr_SetString(socket_timeout, "timed out");
2619 return -1;
2620 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002621 END_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002622 if (outlen < 0) {
2623 /* Note: the call to errorhandler() ALWAYS indirectly returned
2624 NULL, so ignore its return value */
2625 s->errorhandler();
2626 return -1;
2627 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002628#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002629 read_buf = cbuf;
2630 remaining = len;
2631 while (remaining != 0) {
2632 unsigned int segment;
2633 int nread = -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002634
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002635 segment = remaining /SEGMENT_SIZE;
2636 if (segment != 0) {
2637 segment = SEGMENT_SIZE;
2638 }
2639 else {
2640 segment = remaining;
2641 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002642
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002643 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002644 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002645 timeout = internal_select_ex(s, 0, interval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002646 if (!timeout)
2647 nread = recv(s->sock_fd, read_buf, segment, flags);
2648 Py_END_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002649 if (timeout == 1) {
2650 PyErr_SetString(socket_timeout, "timed out");
2651 return -1;
2652 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002653 END_SELECT_LOOP(s)
2654
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002655 if (nread < 0) {
2656 s->errorhandler();
2657 return -1;
2658 }
2659 if (nread != remaining) {
2660 read_buf += nread;
2661 break;
2662 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002663
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002664 remaining -= segment;
2665 read_buf += segment;
2666 }
2667 outlen = read_buf - cbuf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002668#endif /* !__VMS */
2669
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002670 return outlen;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002671}
2672
Guido van Rossum48a680c2001-03-02 06:34:14 +00002673
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002674/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002675
Guido van Rossum73624e91994-10-10 17:59:00 +00002676static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002677sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002678{
Antoine Pitrou19467d22010-08-17 19:33:30 +00002679 Py_ssize_t recvlen, outlen;
2680 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002681 PyObject *buf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002682
Antoine Pitrou19467d22010-08-17 19:33:30 +00002683 if (!PyArg_ParseTuple(args, "n|i:recv", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002684 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002685
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002686 if (recvlen < 0) {
2687 PyErr_SetString(PyExc_ValueError,
2688 "negative buffersize in recv");
2689 return NULL;
2690 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002691
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002692 /* Allocate a new string. */
2693 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
2694 if (buf == NULL)
2695 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002696
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002697 /* Call the guts */
2698 outlen = sock_recv_guts(s, PyBytes_AS_STRING(buf), recvlen, flags);
2699 if (outlen < 0) {
2700 /* An error occurred, release the string and return an
2701 error. */
2702 Py_DECREF(buf);
2703 return NULL;
2704 }
2705 if (outlen != recvlen) {
2706 /* We did not read as many bytes as we anticipated, resize the
2707 string if possible and be successful. */
2708 _PyBytes_Resize(&buf, outlen);
2709 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002710
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002711 return buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002712}
2713
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002714PyDoc_STRVAR(recv_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002715"recv(buffersize[, flags]) -> data\n\
2716\n\
2717Receive up to buffersize bytes from the socket. For the optional flags\n\
2718argument, see the Unix manual. When no data is available, block until\n\
2719at least one byte is available or until the remote end is closed. When\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002720the remote end is closed and all data is read, return the empty string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002721
Guido van Rossum30a685f1991-06-27 15:51:29 +00002722
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002723/* s.recv_into(buffer, [nbytes [,flags]]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002724
Thomas Wouters477c8d52006-05-27 19:21:47 +00002725static PyObject*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002726sock_recv_into(PySocketSockObject *s, PyObject *args, PyObject *kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002727{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002728 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00002729
Antoine Pitrou19467d22010-08-17 19:33:30 +00002730 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002731 Py_buffer pbuf;
2732 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002733 Py_ssize_t buflen, readlen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002734
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002735 /* Get the buffer's memory */
Antoine Pitrou19467d22010-08-17 19:33:30 +00002736 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recv_into", kwlist,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002737 &pbuf, &recvlen, &flags))
2738 return NULL;
2739 buf = pbuf.buf;
2740 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002741
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002742 if (recvlen < 0) {
2743 PyBuffer_Release(&pbuf);
2744 PyErr_SetString(PyExc_ValueError,
2745 "negative buffersize in recv_into");
2746 return NULL;
2747 }
2748 if (recvlen == 0) {
2749 /* If nbytes was not specified, use the buffer's length */
2750 recvlen = buflen;
2751 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002752
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002753 /* Check if the buffer is large enough */
2754 if (buflen < recvlen) {
2755 PyBuffer_Release(&pbuf);
2756 PyErr_SetString(PyExc_ValueError,
2757 "buffer too small for requested bytes");
2758 return NULL;
2759 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002760
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002761 /* Call the guts */
2762 readlen = sock_recv_guts(s, buf, recvlen, flags);
2763 if (readlen < 0) {
2764 /* Return an error. */
2765 PyBuffer_Release(&pbuf);
2766 return NULL;
2767 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002768
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002769 PyBuffer_Release(&pbuf);
2770 /* Return the number of bytes read. Note that we do not do anything
2771 special here in the case that readlen < recvlen. */
2772 return PyLong_FromSsize_t(readlen);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002773}
2774
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002775PyDoc_STRVAR(recv_into_doc,
2776"recv_into(buffer, [nbytes[, flags]]) -> nbytes_read\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00002777\n\
2778A version of recv() that stores its data into a buffer rather than creating \n\
2779a new string. Receive up to buffersize bytes from the socket. If buffersize \n\
2780is not specified (or 0), receive up to the size available in the given buffer.\n\
2781\n\
2782See recv() for documentation about the flags.");
2783
2784
2785/*
Christian Heimes99170a52007-12-19 02:07:34 +00002786 * This is the guts of the recvfrom() and recvfrom_into() methods, which reads
2787 * into a char buffer. If you have any inc/def ref to do to the objects that
2788 * contain the buffer, do it in the caller. This function returns the number
Ezio Melotti13925002011-03-16 11:05:33 +02002789 * of bytes successfully read. If there was an error, it returns -1. Note
Christian Heimes99170a52007-12-19 02:07:34 +00002790 * that it is also possible that we return a number of bytes smaller than the
2791 * request bytes.
Thomas Wouters477c8d52006-05-27 19:21:47 +00002792 *
2793 * 'addr' is a return value for the address object. Note that you must decref
2794 * it yourself.
2795 */
Antoine Pitrou19467d22010-08-17 19:33:30 +00002796static Py_ssize_t
2797sock_recvfrom_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002798 PyObject** addr)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002799{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002800 sock_addr_t addrbuf;
2801 int timeout;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002802 Py_ssize_t n = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002803 socklen_t addrlen;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002804
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002805 *addr = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002806
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002807 if (!getsockaddrlen(s, &addrlen))
2808 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002809
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002810 if (!IS_SELECTABLE(s)) {
2811 select_error();
2812 return -1;
2813 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00002814
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002815 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002816 Py_BEGIN_ALLOW_THREADS
2817 memset(&addrbuf, 0, addrlen);
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002818 timeout = internal_select_ex(s, 0, interval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002819 if (!timeout) {
Guido van Rossum8d665e61996-06-26 18:22:49 +00002820#ifndef MS_WINDOWS
Andrew MacIntyreba43e872002-03-03 03:03:52 +00002821#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002822 n = recvfrom(s->sock_fd, cbuf, len, flags,
2823 SAS2SA(&addrbuf), &addrlen);
Guido van Rossum32c575d1997-12-02 20:37:32 +00002824#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002825 n = recvfrom(s->sock_fd, cbuf, len, flags,
2826 (void *) &addrbuf, &addrlen);
Guido van Rossum32c575d1997-12-02 20:37:32 +00002827#endif
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002828#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002829 n = recvfrom(s->sock_fd, cbuf, len, flags,
2830 SAS2SA(&addrbuf), &addrlen);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002831#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002832 }
2833 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002834
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002835 if (timeout == 1) {
2836 PyErr_SetString(socket_timeout, "timed out");
2837 return -1;
2838 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002839 END_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002840 if (n < 0) {
2841 s->errorhandler();
2842 return -1;
2843 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002844
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002845 if (!(*addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
2846 addrlen, s->sock_proto)))
2847 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002848
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002849 return n;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002850}
2851
2852/* s.recvfrom(nbytes [,flags]) method */
2853
2854static PyObject *
2855sock_recvfrom(PySocketSockObject *s, PyObject *args)
2856{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002857 PyObject *buf = NULL;
2858 PyObject *addr = NULL;
2859 PyObject *ret = NULL;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002860 int flags = 0;
2861 Py_ssize_t recvlen, outlen;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002862
Antoine Pitrou19467d22010-08-17 19:33:30 +00002863 if (!PyArg_ParseTuple(args, "n|i:recvfrom", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002864 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002865
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002866 if (recvlen < 0) {
2867 PyErr_SetString(PyExc_ValueError,
2868 "negative buffersize in recvfrom");
2869 return NULL;
2870 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00002871
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002872 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
2873 if (buf == NULL)
2874 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002875
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002876 outlen = sock_recvfrom_guts(s, PyBytes_AS_STRING(buf),
2877 recvlen, flags, &addr);
2878 if (outlen < 0) {
2879 goto finally;
2880 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002881
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002882 if (outlen != recvlen) {
2883 /* We did not read as many bytes as we anticipated, resize the
Ezio Melotti13925002011-03-16 11:05:33 +02002884 string if possible and be successful. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002885 if (_PyBytes_Resize(&buf, outlen) < 0)
Ezio Melotti13925002011-03-16 11:05:33 +02002886 /* Oopsy, not so successful after all. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002887 goto finally;
2888 }
Barry Warsaw752300b1997-01-03 17:18:10 +00002889
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002890 ret = PyTuple_Pack(2, buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002891
2892finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002893 Py_XDECREF(buf);
2894 Py_XDECREF(addr);
2895 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002896}
2897
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002898PyDoc_STRVAR(recvfrom_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002899"recvfrom(buffersize[, flags]) -> (data, address info)\n\
2900\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002901Like recv(buffersize, flags) but also return the sender's address info.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002902
Thomas Wouters477c8d52006-05-27 19:21:47 +00002903
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002904/* s.recvfrom_into(buffer[, nbytes [,flags]]) method */
Thomas Wouters477c8d52006-05-27 19:21:47 +00002905
2906static PyObject *
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002907sock_recvfrom_into(PySocketSockObject *s, PyObject *args, PyObject* kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002908{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002909 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00002910
Antoine Pitrou19467d22010-08-17 19:33:30 +00002911 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002912 Py_buffer pbuf;
2913 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002914 Py_ssize_t readlen, buflen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002915
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002916 PyObject *addr = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002917
Antoine Pitrou19467d22010-08-17 19:33:30 +00002918 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recvfrom_into",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002919 kwlist, &pbuf,
2920 &recvlen, &flags))
2921 return NULL;
2922 buf = pbuf.buf;
2923 buflen = pbuf.len;
2924 assert(buf != 0 && buflen > 0);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002925
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002926 if (recvlen < 0) {
2927 PyBuffer_Release(&pbuf);
2928 PyErr_SetString(PyExc_ValueError,
2929 "negative buffersize in recvfrom_into");
2930 return NULL;
2931 }
2932 if (recvlen == 0) {
2933 /* If nbytes was not specified, use the buffer's length */
2934 recvlen = buflen;
2935 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002936
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002937 readlen = sock_recvfrom_guts(s, buf, recvlen, flags, &addr);
2938 if (readlen < 0) {
2939 PyBuffer_Release(&pbuf);
2940 /* Return an error */
2941 Py_XDECREF(addr);
2942 return NULL;
2943 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002944
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002945 PyBuffer_Release(&pbuf);
2946 /* Return the number of bytes read and the address. Note that we do
2947 not do anything special here in the case that readlen < recvlen. */
Antoine Pitrou19467d22010-08-17 19:33:30 +00002948 return Py_BuildValue("nN", readlen, addr);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002949}
2950
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002951PyDoc_STRVAR(recvfrom_into_doc,
2952"recvfrom_into(buffer[, nbytes[, flags]]) -> (nbytes, address info)\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00002953\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002954Like recv_into(buffer[, nbytes[, flags]]) but also return the sender's address info.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00002955
2956
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002957/* The sendmsg() and recvmsg[_into]() methods require a working
2958 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
2959#ifdef CMSG_LEN
2960/*
2961 * Call recvmsg() with the supplied iovec structures, flags, and
2962 * ancillary data buffer size (controllen). Returns the tuple return
2963 * value for recvmsg() or recvmsg_into(), with the first item provided
2964 * by the supplied makeval() function. makeval() will be called with
2965 * the length read and makeval_data as arguments, and must return a
2966 * new reference (which will be decrefed if there is a subsequent
2967 * error). On error, closes any file descriptors received via
2968 * SCM_RIGHTS.
2969 */
2970static PyObject *
2971sock_recvmsg_guts(PySocketSockObject *s, struct iovec *iov, int iovlen,
2972 int flags, Py_ssize_t controllen,
2973 PyObject *(*makeval)(ssize_t, void *), void *makeval_data)
2974{
2975 ssize_t bytes_received = -1;
2976 int timeout;
2977 sock_addr_t addrbuf;
2978 socklen_t addrbuflen;
Charles-François Natalie9e95ae2011-08-24 21:40:53 +02002979 struct msghdr msg = {0};
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002980 PyObject *cmsg_list = NULL, *retval = NULL;
2981 void *controlbuf = NULL;
2982 struct cmsghdr *cmsgh;
2983 size_t cmsgdatalen = 0;
2984 int cmsg_status;
2985
2986 /* XXX: POSIX says that msg_name and msg_namelen "shall be
2987 ignored" when the socket is connected (Linux fills them in
2988 anyway for AF_UNIX sockets at least). Normally msg_namelen
2989 seems to be set to 0 if there's no address, but try to
2990 initialize msg_name to something that won't be mistaken for a
2991 real address if that doesn't happen. */
2992 if (!getsockaddrlen(s, &addrbuflen))
2993 return NULL;
2994 memset(&addrbuf, 0, addrbuflen);
2995 SAS2SA(&addrbuf)->sa_family = AF_UNSPEC;
2996
2997 if (controllen < 0 || controllen > SOCKLEN_T_LIMIT) {
2998 PyErr_SetString(PyExc_ValueError,
2999 "invalid ancillary data buffer length");
3000 return NULL;
3001 }
3002 if (controllen > 0 && (controlbuf = PyMem_Malloc(controllen)) == NULL)
3003 return PyErr_NoMemory();
3004
3005 /* Make the system call. */
3006 if (!IS_SELECTABLE(s)) {
3007 select_error();
3008 goto finally;
3009 }
3010
3011 BEGIN_SELECT_LOOP(s)
3012 Py_BEGIN_ALLOW_THREADS;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003013 msg.msg_name = SAS2SA(&addrbuf);
3014 msg.msg_namelen = addrbuflen;
3015 msg.msg_iov = iov;
3016 msg.msg_iovlen = iovlen;
3017 msg.msg_control = controlbuf;
3018 msg.msg_controllen = controllen;
3019 timeout = internal_select_ex(s, 0, interval);
3020 if (!timeout)
3021 bytes_received = recvmsg(s->sock_fd, &msg, flags);
3022 Py_END_ALLOW_THREADS;
3023 if (timeout == 1) {
3024 PyErr_SetString(socket_timeout, "timed out");
3025 goto finally;
3026 }
3027 END_SELECT_LOOP(s)
3028
3029 if (bytes_received < 0) {
3030 s->errorhandler();
3031 goto finally;
3032 }
3033
3034 /* Make list of (level, type, data) tuples from control messages. */
3035 if ((cmsg_list = PyList_New(0)) == NULL)
3036 goto err_closefds;
3037 /* Check for empty ancillary data as old CMSG_FIRSTHDR()
3038 implementations didn't do so. */
3039 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3040 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3041 PyObject *bytes, *tuple;
3042 int tmp;
3043
3044 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3045 if (cmsg_status != 0) {
3046 if (PyErr_WarnEx(PyExc_RuntimeWarning,
3047 "received malformed or improperly-truncated "
3048 "ancillary data", 1) == -1)
3049 goto err_closefds;
3050 }
3051 if (cmsg_status < 0)
3052 break;
3053 if (cmsgdatalen > PY_SSIZE_T_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003054 PyErr_SetString(PyExc_OSError, "control message too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003055 goto err_closefds;
3056 }
3057
3058 bytes = PyBytes_FromStringAndSize((char *)CMSG_DATA(cmsgh),
3059 cmsgdatalen);
3060 tuple = Py_BuildValue("iiN", (int)cmsgh->cmsg_level,
3061 (int)cmsgh->cmsg_type, bytes);
3062 if (tuple == NULL)
3063 goto err_closefds;
3064 tmp = PyList_Append(cmsg_list, tuple);
3065 Py_DECREF(tuple);
3066 if (tmp != 0)
3067 goto err_closefds;
3068
3069 if (cmsg_status != 0)
3070 break;
3071 }
3072
3073 retval = Py_BuildValue("NOiN",
3074 (*makeval)(bytes_received, makeval_data),
3075 cmsg_list,
3076 (int)msg.msg_flags,
3077 makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
3078 ((msg.msg_namelen > addrbuflen) ?
3079 addrbuflen : msg.msg_namelen),
3080 s->sock_proto));
3081 if (retval == NULL)
3082 goto err_closefds;
3083
3084finally:
3085 Py_XDECREF(cmsg_list);
3086 PyMem_Free(controlbuf);
3087 return retval;
3088
3089err_closefds:
3090#ifdef SCM_RIGHTS
3091 /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */
3092 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3093 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3094 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3095 if (cmsg_status < 0)
3096 break;
3097 if (cmsgh->cmsg_level == SOL_SOCKET &&
3098 cmsgh->cmsg_type == SCM_RIGHTS) {
3099 size_t numfds;
3100 int *fdp;
3101
3102 numfds = cmsgdatalen / sizeof(int);
3103 fdp = (int *)CMSG_DATA(cmsgh);
3104 while (numfds-- > 0)
3105 close(*fdp++);
3106 }
3107 if (cmsg_status != 0)
3108 break;
3109 }
3110#endif /* SCM_RIGHTS */
3111 goto finally;
3112}
3113
3114
3115static PyObject *
3116makeval_recvmsg(ssize_t received, void *data)
3117{
3118 PyObject **buf = data;
3119
3120 if (received < PyBytes_GET_SIZE(*buf))
3121 _PyBytes_Resize(buf, received);
3122 Py_XINCREF(*buf);
3123 return *buf;
3124}
3125
3126/* s.recvmsg(bufsize[, ancbufsize[, flags]]) method */
3127
3128static PyObject *
3129sock_recvmsg(PySocketSockObject *s, PyObject *args)
3130{
3131 Py_ssize_t bufsize, ancbufsize = 0;
3132 int flags = 0;
3133 struct iovec iov;
3134 PyObject *buf = NULL, *retval = NULL;
3135
3136 if (!PyArg_ParseTuple(args, "n|ni:recvmsg", &bufsize, &ancbufsize, &flags))
3137 return NULL;
3138
3139 if (bufsize < 0) {
3140 PyErr_SetString(PyExc_ValueError, "negative buffer size in recvmsg()");
3141 return NULL;
3142 }
3143 if ((buf = PyBytes_FromStringAndSize(NULL, bufsize)) == NULL)
3144 return NULL;
3145 iov.iov_base = PyBytes_AS_STRING(buf);
3146 iov.iov_len = bufsize;
3147
3148 /* Note that we're passing a pointer to *our pointer* to the bytes
3149 object here (&buf); makeval_recvmsg() may incref the object, or
3150 deallocate it and set our pointer to NULL. */
3151 retval = sock_recvmsg_guts(s, &iov, 1, flags, ancbufsize,
3152 &makeval_recvmsg, &buf);
3153 Py_XDECREF(buf);
3154 return retval;
3155}
3156
3157PyDoc_STRVAR(recvmsg_doc,
3158"recvmsg(bufsize[, ancbufsize[, flags]]) -> (data, ancdata, msg_flags, address)\n\
3159\n\
3160Receive normal data (up to bufsize bytes) and ancillary data from the\n\
3161socket. The ancbufsize argument sets the size in bytes of the\n\
3162internal buffer used to receive the ancillary data; it defaults to 0,\n\
3163meaning that no ancillary data will be received. Appropriate buffer\n\
3164sizes for ancillary data can be calculated using CMSG_SPACE() or\n\
3165CMSG_LEN(), and items which do not fit into the buffer might be\n\
3166truncated or discarded. The flags argument defaults to 0 and has the\n\
3167same meaning as for recv().\n\
3168\n\
3169The return value is a 4-tuple: (data, ancdata, msg_flags, address).\n\
3170The data item is a bytes object holding the non-ancillary data\n\
3171received. The ancdata item is a list of zero or more tuples\n\
3172(cmsg_level, cmsg_type, cmsg_data) representing the ancillary data\n\
3173(control messages) received: cmsg_level and cmsg_type are integers\n\
3174specifying the protocol level and protocol-specific type respectively,\n\
3175and cmsg_data is a bytes object holding the associated data. The\n\
3176msg_flags item is the bitwise OR of various flags indicating\n\
3177conditions on the received message; see your system documentation for\n\
3178details. If the receiving socket is unconnected, address is the\n\
3179address of the sending socket, if available; otherwise, its value is\n\
3180unspecified.\n\
3181\n\
3182If recvmsg() raises an exception after the system call returns, it\n\
3183will first attempt to close any file descriptors received via the\n\
3184SCM_RIGHTS mechanism.");
3185
3186
3187static PyObject *
3188makeval_recvmsg_into(ssize_t received, void *data)
3189{
3190 return PyLong_FromSsize_t(received);
3191}
3192
3193/* s.recvmsg_into(buffers[, ancbufsize[, flags]]) method */
3194
3195static PyObject *
3196sock_recvmsg_into(PySocketSockObject *s, PyObject *args)
3197{
3198 Py_ssize_t ancbufsize = 0;
3199 int flags = 0;
3200 struct iovec *iovs = NULL;
3201 Py_ssize_t i, nitems, nbufs = 0;
3202 Py_buffer *bufs = NULL;
3203 PyObject *buffers_arg, *fast, *retval = NULL;
3204
3205 if (!PyArg_ParseTuple(args, "O|ni:recvmsg_into",
3206 &buffers_arg, &ancbufsize, &flags))
3207 return NULL;
3208
3209 if ((fast = PySequence_Fast(buffers_arg,
3210 "recvmsg_into() argument 1 must be an "
3211 "iterable")) == NULL)
3212 return NULL;
3213 nitems = PySequence_Fast_GET_SIZE(fast);
3214 if (nitems > INT_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003215 PyErr_SetString(PyExc_OSError, "recvmsg_into() argument 1 is too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003216 goto finally;
3217 }
3218
3219 /* Fill in an iovec for each item, and save the Py_buffer
3220 structs to release afterwards. */
3221 if (nitems > 0 && ((iovs = PyMem_New(struct iovec, nitems)) == NULL ||
3222 (bufs = PyMem_New(Py_buffer, nitems)) == NULL)) {
3223 PyErr_NoMemory();
3224 goto finally;
3225 }
3226 for (; nbufs < nitems; nbufs++) {
3227 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(fast, nbufs),
3228 "w*;recvmsg_into() argument 1 must be an iterable "
3229 "of single-segment read-write buffers",
3230 &bufs[nbufs]))
3231 goto finally;
3232 iovs[nbufs].iov_base = bufs[nbufs].buf;
3233 iovs[nbufs].iov_len = bufs[nbufs].len;
3234 }
3235
3236 retval = sock_recvmsg_guts(s, iovs, nitems, flags, ancbufsize,
3237 &makeval_recvmsg_into, NULL);
3238finally:
3239 for (i = 0; i < nbufs; i++)
3240 PyBuffer_Release(&bufs[i]);
3241 PyMem_Free(bufs);
3242 PyMem_Free(iovs);
3243 Py_DECREF(fast);
3244 return retval;
3245}
3246
3247PyDoc_STRVAR(recvmsg_into_doc,
3248"recvmsg_into(buffers[, ancbufsize[, flags]]) -> (nbytes, ancdata, msg_flags, address)\n\
3249\n\
3250Receive normal data and ancillary data from the socket, scattering the\n\
3251non-ancillary data into a series of buffers. The buffers argument\n\
3252must be an iterable of objects that export writable buffers\n\
3253(e.g. bytearray objects); these will be filled with successive chunks\n\
3254of the non-ancillary data until it has all been written or there are\n\
3255no more buffers. The ancbufsize argument sets the size in bytes of\n\
3256the internal buffer used to receive the ancillary data; it defaults to\n\
32570, meaning that no ancillary data will be received. Appropriate\n\
3258buffer sizes for ancillary data can be calculated using CMSG_SPACE()\n\
3259or CMSG_LEN(), and items which do not fit into the buffer might be\n\
3260truncated or discarded. The flags argument defaults to 0 and has the\n\
3261same meaning as for recv().\n\
3262\n\
3263The return value is a 4-tuple: (nbytes, ancdata, msg_flags, address).\n\
3264The nbytes item is the total number of bytes of non-ancillary data\n\
3265written into the buffers. The ancdata item is a list of zero or more\n\
3266tuples (cmsg_level, cmsg_type, cmsg_data) representing the ancillary\n\
3267data (control messages) received: cmsg_level and cmsg_type are\n\
3268integers specifying the protocol level and protocol-specific type\n\
3269respectively, and cmsg_data is a bytes object holding the associated\n\
3270data. The msg_flags item is the bitwise OR of various flags\n\
3271indicating conditions on the received message; see your system\n\
3272documentation for details. If the receiving socket is unconnected,\n\
3273address is the address of the sending socket, if available; otherwise,\n\
3274its value is unspecified.\n\
3275\n\
3276If recvmsg_into() raises an exception after the system call returns,\n\
3277it will first attempt to close any file descriptors received via the\n\
3278SCM_RIGHTS mechanism.");
3279#endif /* CMSG_LEN */
3280
3281
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003282/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003283
Guido van Rossum73624e91994-10-10 17:59:00 +00003284static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003285sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003286{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003287 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003288 Py_ssize_t len, n = -1;
3289 int flags = 0, timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003290 Py_buffer pbuf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003291
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003292 if (!PyArg_ParseTuple(args, "y*|i:send", &pbuf, &flags))
3293 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003294
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003295 if (!IS_SELECTABLE(s)) {
3296 PyBuffer_Release(&pbuf);
3297 return select_error();
3298 }
3299 buf = pbuf.buf;
3300 len = pbuf.len;
Neal Norwitz082b2df2006-02-07 07:04:46 +00003301
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003302 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003303 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003304 timeout = internal_select_ex(s, 1, interval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003305 if (!timeout)
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003306#ifdef __VMS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003307 n = sendsegmented(s->sock_fd, buf, len, flags);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003308#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003309 n = send(s->sock_fd, buf, len, flags);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003310#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003311 Py_END_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003312 if (timeout == 1) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003313 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003314 PyErr_SetString(socket_timeout, "timed out");
3315 return NULL;
3316 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003317 END_SELECT_LOOP(s)
3318
3319 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003320 if (n < 0)
3321 return s->errorhandler();
Antoine Pitrou19467d22010-08-17 19:33:30 +00003322 return PyLong_FromSsize_t(n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00003323}
3324
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003325PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003326"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003327\n\
3328Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003329argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003330sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003331
3332
3333/* s.sendall(data [,flags]) method */
3334
3335static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003336sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003337{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003338 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003339 Py_ssize_t len, n = -1;
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003340 int flags = 0, timeout, saved_errno;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003341 Py_buffer pbuf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003342
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003343 if (!PyArg_ParseTuple(args, "y*|i:sendall", &pbuf, &flags))
3344 return NULL;
3345 buf = pbuf.buf;
3346 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003347
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003348 if (!IS_SELECTABLE(s)) {
3349 PyBuffer_Release(&pbuf);
3350 return select_error();
3351 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003352
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003353 do {
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003354 Py_BEGIN_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003355 timeout = internal_select(s, 1);
3356 n = -1;
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003357 if (!timeout) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003358#ifdef __VMS
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003359 n = sendsegmented(s->sock_fd, buf, len, flags);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003360#else
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003361 n = send(s->sock_fd, buf, len, flags);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003362#endif
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003363 }
3364 Py_END_ALLOW_THREADS
3365 if (timeout == 1) {
3366 PyBuffer_Release(&pbuf);
3367 PyErr_SetString(socket_timeout, "timed out");
3368 return NULL;
3369 }
3370 /* PyErr_CheckSignals() might change errno */
3371 saved_errno = errno;
3372 /* We must run our signal handlers before looping again.
3373 send() can return a successful partial write when it is
3374 interrupted, so we can't restrict ourselves to EINTR. */
3375 if (PyErr_CheckSignals()) {
3376 PyBuffer_Release(&pbuf);
3377 return NULL;
3378 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003379 if (n < 0) {
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003380 /* If interrupted, try again */
3381 if (saved_errno == EINTR)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003382 continue;
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003383 else
3384 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003385 }
3386 buf += n;
3387 len -= n;
3388 } while (len > 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003389 PyBuffer_Release(&pbuf);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003390
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003391 if (n < 0)
3392 return s->errorhandler();
Guido van Rossum67f7a382002-06-06 21:08:16 +00003393
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003394 Py_INCREF(Py_None);
3395 return Py_None;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003396}
3397
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003398PyDoc_STRVAR(sendall_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003399"sendall(data[, flags])\n\
3400\n\
3401Send a data string to the socket. For the optional flags\n\
3402argument, see the Unix manual. This calls send() repeatedly\n\
3403until all data is sent. If an error occurs, it's impossible\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003404to tell how much data has been sent.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003405
Guido van Rossum30a685f1991-06-27 15:51:29 +00003406
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003407/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003408
Guido van Rossum73624e91994-10-10 17:59:00 +00003409static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003410sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003411{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003412 Py_buffer pbuf;
3413 PyObject *addro;
3414 char *buf;
Antoine Pitrou5e981412011-03-17 22:38:37 +01003415 Py_ssize_t len, arglen;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003416 sock_addr_t addrbuf;
3417 int addrlen, n = -1, flags, timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003418
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003419 flags = 0;
Antoine Pitrou5e981412011-03-17 22:38:37 +01003420 arglen = PyTuple_Size(args);
3421 switch (arglen) {
3422 case 2:
3423 PyArg_ParseTuple(args, "y*O:sendto", &pbuf, &addro);
3424 break;
3425 case 3:
3426 PyArg_ParseTuple(args, "y*iO:sendto",
3427 &pbuf, &flags, &addro);
3428 break;
3429 default:
3430 PyErr_Format(PyExc_TypeError,
3431 "sendto() takes 2 or 3 arguments (%d given)",
3432 arglen);
Victor Stinner77af1722011-05-26 14:05:59 +02003433 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003434 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01003435 if (PyErr_Occurred())
3436 return NULL;
3437
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003438 buf = pbuf.buf;
3439 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003440
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003441 if (!IS_SELECTABLE(s)) {
3442 PyBuffer_Release(&pbuf);
3443 return select_error();
3444 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003445
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003446 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen)) {
3447 PyBuffer_Release(&pbuf);
3448 return NULL;
3449 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003450
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003451 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003452 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003453 timeout = internal_select_ex(s, 1, interval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003454 if (!timeout)
3455 n = sendto(s->sock_fd, buf, len, flags, SAS2SA(&addrbuf), addrlen);
3456 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00003457
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003458 if (timeout == 1) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003459 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003460 PyErr_SetString(socket_timeout, "timed out");
3461 return NULL;
3462 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003463 END_SELECT_LOOP(s)
3464 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003465 if (n < 0)
3466 return s->errorhandler();
Antoine Pitrou19467d22010-08-17 19:33:30 +00003467 return PyLong_FromSsize_t(n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003468}
3469
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003470PyDoc_STRVAR(sendto_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003471"sendto(data[, flags], address) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003472\n\
3473Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003474For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003475
Guido van Rossum30a685f1991-06-27 15:51:29 +00003476
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003477/* The sendmsg() and recvmsg[_into]() methods require a working
3478 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
3479#ifdef CMSG_LEN
3480/* s.sendmsg(buffers[, ancdata[, flags[, address]]]) method */
3481
3482static PyObject *
3483sock_sendmsg(PySocketSockObject *s, PyObject *args)
3484{
3485 Py_ssize_t i, ndataparts, ndatabufs = 0, ncmsgs, ncmsgbufs = 0;
3486 Py_buffer *databufs = NULL;
3487 struct iovec *iovs = NULL;
3488 sock_addr_t addrbuf;
Charles-François Natalie9e95ae2011-08-24 21:40:53 +02003489 struct msghdr msg = {0};
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003490 struct cmsginfo {
3491 int level;
3492 int type;
3493 Py_buffer data;
3494 } *cmsgs = NULL;
3495 void *controlbuf = NULL;
3496 size_t controllen, controllen_last;
3497 ssize_t bytes_sent = -1;
3498 int addrlen, timeout, flags = 0;
3499 PyObject *data_arg, *cmsg_arg = NULL, *addr_arg = NULL, *data_fast = NULL,
3500 *cmsg_fast = NULL, *retval = NULL;
3501
3502 if (!PyArg_ParseTuple(args, "O|OiO:sendmsg",
3503 &data_arg, &cmsg_arg, &flags, &addr_arg))
3504 return NULL;
3505
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003506 /* Parse destination address. */
3507 if (addr_arg != NULL && addr_arg != Py_None) {
3508 if (!getsockaddrarg(s, addr_arg, SAS2SA(&addrbuf), &addrlen))
3509 goto finally;
3510 msg.msg_name = &addrbuf;
3511 msg.msg_namelen = addrlen;
3512 }
3513
3514 /* Fill in an iovec for each message part, and save the Py_buffer
3515 structs to release afterwards. */
3516 if ((data_fast = PySequence_Fast(data_arg,
3517 "sendmsg() argument 1 must be an "
3518 "iterable")) == NULL)
3519 goto finally;
3520 ndataparts = PySequence_Fast_GET_SIZE(data_fast);
3521 if (ndataparts > INT_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003522 PyErr_SetString(PyExc_OSError, "sendmsg() argument 1 is too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003523 goto finally;
3524 }
3525 msg.msg_iovlen = ndataparts;
3526 if (ndataparts > 0 &&
3527 ((msg.msg_iov = iovs = PyMem_New(struct iovec, ndataparts)) == NULL ||
3528 (databufs = PyMem_New(Py_buffer, ndataparts)) == NULL)) {
3529 PyErr_NoMemory();
3530 goto finally;
3531 }
3532 for (; ndatabufs < ndataparts; ndatabufs++) {
3533 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(data_fast, ndatabufs),
3534 "y*;sendmsg() argument 1 must be an iterable of "
3535 "buffer-compatible objects",
3536 &databufs[ndatabufs]))
3537 goto finally;
3538 iovs[ndatabufs].iov_base = databufs[ndatabufs].buf;
3539 iovs[ndatabufs].iov_len = databufs[ndatabufs].len;
3540 }
3541
3542 if (cmsg_arg == NULL)
3543 ncmsgs = 0;
3544 else {
3545 if ((cmsg_fast = PySequence_Fast(cmsg_arg,
3546 "sendmsg() argument 2 must be an "
3547 "iterable")) == NULL)
3548 goto finally;
3549 ncmsgs = PySequence_Fast_GET_SIZE(cmsg_fast);
3550 }
3551
3552#ifndef CMSG_SPACE
3553 if (ncmsgs > 1) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003554 PyErr_SetString(PyExc_OSError,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003555 "sending multiple control messages is not supported "
3556 "on this system");
3557 goto finally;
3558 }
3559#endif
3560 /* Save level, type and Py_buffer for each control message,
3561 and calculate total size. */
3562 if (ncmsgs > 0 && (cmsgs = PyMem_New(struct cmsginfo, ncmsgs)) == NULL) {
3563 PyErr_NoMemory();
3564 goto finally;
3565 }
3566 controllen = controllen_last = 0;
3567 while (ncmsgbufs < ncmsgs) {
3568 size_t bufsize, space;
3569
3570 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(cmsg_fast, ncmsgbufs),
3571 "(iiy*):[sendmsg() ancillary data items]",
3572 &cmsgs[ncmsgbufs].level,
3573 &cmsgs[ncmsgbufs].type,
3574 &cmsgs[ncmsgbufs].data))
3575 goto finally;
3576 bufsize = cmsgs[ncmsgbufs++].data.len;
3577
3578#ifdef CMSG_SPACE
3579 if (!get_CMSG_SPACE(bufsize, &space)) {
3580#else
3581 if (!get_CMSG_LEN(bufsize, &space)) {
3582#endif
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003583 PyErr_SetString(PyExc_OSError, "ancillary data item too large");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003584 goto finally;
3585 }
3586 controllen += space;
3587 if (controllen > SOCKLEN_T_LIMIT || controllen < controllen_last) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003588 PyErr_SetString(PyExc_OSError, "too much ancillary data");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003589 goto finally;
3590 }
3591 controllen_last = controllen;
3592 }
3593
3594 /* Construct ancillary data block from control message info. */
3595 if (ncmsgbufs > 0) {
3596 struct cmsghdr *cmsgh = NULL;
3597
3598 if ((msg.msg_control = controlbuf =
3599 PyMem_Malloc(controllen)) == NULL) {
3600 PyErr_NoMemory();
3601 goto finally;
3602 }
3603 msg.msg_controllen = controllen;
3604
3605 /* Need to zero out the buffer as a workaround for glibc's
3606 CMSG_NXTHDR() implementation. After getting the pointer to
3607 the next header, it checks its (uninitialized) cmsg_len
3608 member to see if the "message" fits in the buffer, and
3609 returns NULL if it doesn't. Zero-filling the buffer
3610 ensures that that doesn't happen. */
3611 memset(controlbuf, 0, controllen);
3612
3613 for (i = 0; i < ncmsgbufs; i++) {
3614 size_t msg_len, data_len = cmsgs[i].data.len;
3615 int enough_space = 0;
3616
3617 cmsgh = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsgh);
3618 if (cmsgh == NULL) {
3619 PyErr_Format(PyExc_RuntimeError,
3620 "unexpected NULL result from %s()",
3621 (i == 0) ? "CMSG_FIRSTHDR" : "CMSG_NXTHDR");
3622 goto finally;
3623 }
3624 if (!get_CMSG_LEN(data_len, &msg_len)) {
3625 PyErr_SetString(PyExc_RuntimeError,
3626 "item size out of range for CMSG_LEN()");
3627 goto finally;
3628 }
3629 if (cmsg_min_space(&msg, cmsgh, msg_len)) {
3630 size_t space;
3631
3632 cmsgh->cmsg_len = msg_len;
3633 if (get_cmsg_data_space(&msg, cmsgh, &space))
3634 enough_space = (space >= data_len);
3635 }
3636 if (!enough_space) {
3637 PyErr_SetString(PyExc_RuntimeError,
3638 "ancillary data does not fit in calculated "
3639 "space");
3640 goto finally;
3641 }
3642 cmsgh->cmsg_level = cmsgs[i].level;
3643 cmsgh->cmsg_type = cmsgs[i].type;
3644 memcpy(CMSG_DATA(cmsgh), cmsgs[i].data.buf, data_len);
3645 }
3646 }
3647
3648 /* Make the system call. */
3649 if (!IS_SELECTABLE(s)) {
3650 select_error();
3651 goto finally;
3652 }
3653
3654 BEGIN_SELECT_LOOP(s)
3655 Py_BEGIN_ALLOW_THREADS;
3656 timeout = internal_select_ex(s, 1, interval);
3657 if (!timeout)
3658 bytes_sent = sendmsg(s->sock_fd, &msg, flags);
3659 Py_END_ALLOW_THREADS;
3660 if (timeout == 1) {
3661 PyErr_SetString(socket_timeout, "timed out");
3662 goto finally;
3663 }
3664 END_SELECT_LOOP(s)
3665
3666 if (bytes_sent < 0) {
3667 s->errorhandler();
3668 goto finally;
3669 }
3670 retval = PyLong_FromSsize_t(bytes_sent);
3671
3672finally:
3673 PyMem_Free(controlbuf);
3674 for (i = 0; i < ncmsgbufs; i++)
3675 PyBuffer_Release(&cmsgs[i].data);
3676 PyMem_Free(cmsgs);
3677 Py_XDECREF(cmsg_fast);
3678 for (i = 0; i < ndatabufs; i++)
3679 PyBuffer_Release(&databufs[i]);
3680 PyMem_Free(databufs);
3681 PyMem_Free(iovs);
3682 Py_XDECREF(data_fast);
3683 return retval;
3684}
3685
3686PyDoc_STRVAR(sendmsg_doc,
3687"sendmsg(buffers[, ancdata[, flags[, address]]]) -> count\n\
3688\n\
3689Send normal and ancillary data to the socket, gathering the\n\
3690non-ancillary data from a series of buffers and concatenating it into\n\
3691a single message. The buffers argument specifies the non-ancillary\n\
3692data as an iterable of buffer-compatible objects (e.g. bytes objects).\n\
3693The ancdata argument specifies the ancillary data (control messages)\n\
3694as an iterable of zero or more tuples (cmsg_level, cmsg_type,\n\
3695cmsg_data), where cmsg_level and cmsg_type are integers specifying the\n\
3696protocol level and protocol-specific type respectively, and cmsg_data\n\
3697is a buffer-compatible object holding the associated data. The flags\n\
3698argument defaults to 0 and has the same meaning as for send(). If\n\
3699address is supplied and not None, it sets a destination address for\n\
3700the message. The return value is the number of bytes of non-ancillary\n\
3701data sent.");
3702#endif /* CMSG_LEN */
3703
3704
Guido van Rossum30a685f1991-06-27 15:51:29 +00003705/* s.shutdown(how) method */
3706
Guido van Rossum73624e91994-10-10 17:59:00 +00003707static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003708sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003709{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003710 int how;
3711 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003712
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003713 how = PyLong_AsLong(arg);
3714 if (how == -1 && PyErr_Occurred())
3715 return NULL;
3716 Py_BEGIN_ALLOW_THREADS
3717 res = shutdown(s->sock_fd, how);
3718 Py_END_ALLOW_THREADS
3719 if (res < 0)
3720 return s->errorhandler();
3721 Py_INCREF(Py_None);
3722 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003723}
3724
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003725PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003726"shutdown(flag)\n\
3727\n\
Martin v. Löwis94681fc2003-11-27 19:40:22 +00003728Shut down the reading side of the socket (flag == SHUT_RD), the writing side\n\
3729of the socket (flag == SHUT_WR), or both ends (flag == SHUT_RDWR).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003730
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00003731#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Christian Heimesfaf2f632008-01-06 16:59:19 +00003732static PyObject*
3733sock_ioctl(PySocketSockObject *s, PyObject *arg)
3734{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003735 unsigned long cmd = SIO_RCVALL;
3736 PyObject *argO;
3737 DWORD recv;
Christian Heimesfaf2f632008-01-06 16:59:19 +00003738
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003739 if (!PyArg_ParseTuple(arg, "kO:ioctl", &cmd, &argO))
3740 return NULL;
Christian Heimesfaf2f632008-01-06 16:59:19 +00003741
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003742 switch (cmd) {
3743 case SIO_RCVALL: {
3744 unsigned int option = RCVALL_ON;
3745 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
3746 return NULL;
3747 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
3748 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
3749 return set_error();
3750 }
3751 return PyLong_FromUnsignedLong(recv); }
3752 case SIO_KEEPALIVE_VALS: {
3753 struct tcp_keepalive ka;
3754 if (!PyArg_ParseTuple(arg, "k(kkk):ioctl", &cmd,
3755 &ka.onoff, &ka.keepalivetime, &ka.keepaliveinterval))
3756 return NULL;
3757 if (WSAIoctl(s->sock_fd, cmd, &ka, sizeof(ka),
3758 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
3759 return set_error();
3760 }
3761 return PyLong_FromUnsignedLong(recv); }
3762 default:
3763 PyErr_Format(PyExc_ValueError, "invalid ioctl command %d", cmd);
3764 return NULL;
3765 }
Christian Heimesfaf2f632008-01-06 16:59:19 +00003766}
3767PyDoc_STRVAR(sock_ioctl_doc,
3768"ioctl(cmd, option) -> long\n\
3769\n\
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00003770Control the socket with WSAIoctl syscall. Currently supported 'cmd' values are\n\
3771SIO_RCVALL: 'option' must be one of the socket.RCVALL_* constants.\n\
3772SIO_KEEPALIVE_VALS: 'option' is a tuple of (onoff, timeout, interval).");
Christian Heimesfaf2f632008-01-06 16:59:19 +00003773
3774#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00003775
3776/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003777
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003778static PyMethodDef sock_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003779 {"_accept", (PyCFunction)sock_accept, METH_NOARGS,
3780 accept_doc},
3781 {"bind", (PyCFunction)sock_bind, METH_O,
3782 bind_doc},
3783 {"close", (PyCFunction)sock_close, METH_NOARGS,
3784 close_doc},
3785 {"connect", (PyCFunction)sock_connect, METH_O,
3786 connect_doc},
3787 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
3788 connect_ex_doc},
Antoine Pitrou6e451df2010-08-09 20:39:54 +00003789 {"detach", (PyCFunction)sock_detach, METH_NOARGS,
3790 detach_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003791 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
3792 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00003793#ifdef HAVE_GETPEERNAME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003794 {"getpeername", (PyCFunction)sock_getpeername,
3795 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00003796#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003797 {"getsockname", (PyCFunction)sock_getsockname,
3798 METH_NOARGS, getsockname_doc},
3799 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
3800 getsockopt_doc},
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00003801#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003802 {"ioctl", (PyCFunction)sock_ioctl, METH_VARARGS,
3803 sock_ioctl_doc},
Christian Heimesfaf2f632008-01-06 16:59:19 +00003804#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003805 {"listen", (PyCFunction)sock_listen, METH_O,
3806 listen_doc},
3807 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
3808 recv_doc},
3809 {"recv_into", (PyCFunction)sock_recv_into, METH_VARARGS | METH_KEYWORDS,
3810 recv_into_doc},
3811 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
3812 recvfrom_doc},
3813 {"recvfrom_into", (PyCFunction)sock_recvfrom_into, METH_VARARGS | METH_KEYWORDS,
3814 recvfrom_into_doc},
3815 {"send", (PyCFunction)sock_send, METH_VARARGS,
3816 send_doc},
3817 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
3818 sendall_doc},
3819 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
3820 sendto_doc},
3821 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
3822 setblocking_doc},
3823 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
3824 settimeout_doc},
3825 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
3826 gettimeout_doc},
3827 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
3828 setsockopt_doc},
3829 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
3830 shutdown_doc},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003831#ifdef CMSG_LEN
3832 {"recvmsg", (PyCFunction)sock_recvmsg, METH_VARARGS,
3833 recvmsg_doc},
3834 {"recvmsg_into", (PyCFunction)sock_recvmsg_into, METH_VARARGS,
3835 recvmsg_into_doc,},
3836 {"sendmsg", (PyCFunction)sock_sendmsg, METH_VARARGS,
3837 sendmsg_doc},
3838#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003839 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003840};
3841
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003842/* SockObject members */
3843static PyMemberDef sock_memberlist[] = {
3844 {"family", T_INT, offsetof(PySocketSockObject, sock_family), READONLY, "the socket family"},
3845 {"type", T_INT, offsetof(PySocketSockObject, sock_type), READONLY, "the socket type"},
3846 {"proto", T_INT, offsetof(PySocketSockObject, sock_proto), READONLY, "the socket protocol"},
3847 {"timeout", T_DOUBLE, offsetof(PySocketSockObject, sock_timeout), READONLY, "the socket timeout"},
3848 {0},
3849};
Guido van Rossum30a685f1991-06-27 15:51:29 +00003850
Guido van Rossum73624e91994-10-10 17:59:00 +00003851/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00003852 First close the file description. */
3853
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003854static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003855sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003856{
Antoine Pitroue033e062010-10-29 10:38:18 +00003857 if (s->sock_fd != -1) {
3858 PyObject *exc, *val, *tb;
3859 Py_ssize_t old_refcount = Py_REFCNT(s);
3860 ++Py_REFCNT(s);
3861 PyErr_Fetch(&exc, &val, &tb);
3862 if (PyErr_WarnFormat(PyExc_ResourceWarning, 1,
3863 "unclosed %R", s))
3864 /* Spurious errors can appear at shutdown */
3865 if (PyErr_ExceptionMatches(PyExc_Warning))
3866 PyErr_WriteUnraisable((PyObject *) s);
3867 PyErr_Restore(exc, val, tb);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003868 (void) SOCKETCLOSE(s->sock_fd);
Antoine Pitroue033e062010-10-29 10:38:18 +00003869 Py_REFCNT(s) = old_refcount;
3870 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003871 Py_TYPE(s)->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003872}
3873
Guido van Rossum30a685f1991-06-27 15:51:29 +00003874
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003875static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003876sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003877{
Fred Drakea04eaad2000-06-30 02:46:07 +00003878#if SIZEOF_SOCKET_T > SIZEOF_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003879 if (s->sock_fd > LONG_MAX) {
3880 /* this can occur on Win64, and actually there is a special
3881 ugly printf formatter for decimal pointer length integer
3882 printing, only bother if necessary*/
3883 PyErr_SetString(PyExc_OverflowError,
3884 "no printf formatter to display "
3885 "the socket descriptor in decimal");
3886 return NULL;
3887 }
Fred Drakea04eaad2000-06-30 02:46:07 +00003888#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003889 return PyUnicode_FromFormat(
3890 "<socket object, fd=%ld, family=%d, type=%d, proto=%d>",
3891 (long)s->sock_fd, s->sock_family,
3892 s->sock_type,
3893 s->sock_proto);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003894}
3895
3896
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003897/* Create a new, uninitialized socket object. */
3898
3899static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003900sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003901{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003902 PyObject *new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003903
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003904 new = type->tp_alloc(type, 0);
3905 if (new != NULL) {
3906 ((PySocketSockObject *)new)->sock_fd = -1;
3907 ((PySocketSockObject *)new)->sock_timeout = -1.0;
3908 ((PySocketSockObject *)new)->errorhandler = &set_error;
3909 }
3910 return new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003911}
3912
3913
3914/* Initialize a new socket object. */
3915
3916/*ARGSUSED*/
3917static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00003918sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003919{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003920 PySocketSockObject *s = (PySocketSockObject *)self;
3921 PyObject *fdobj = NULL;
3922 SOCKET_T fd = INVALID_SOCKET;
3923 int family = AF_INET, type = SOCK_STREAM, proto = 0;
3924 static char *keywords[] = {"family", "type", "proto", "fileno", 0};
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003925
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003926 if (!PyArg_ParseTupleAndKeywords(args, kwds,
3927 "|iiiO:socket", keywords,
3928 &family, &type, &proto, &fdobj))
3929 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003930
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003931 if (fdobj != NULL && fdobj != Py_None) {
3932 fd = PyLong_AsSocket_t(fdobj);
3933 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
3934 return -1;
3935 if (fd == INVALID_SOCKET) {
3936 PyErr_SetString(PyExc_ValueError,
3937 "can't use invalid socket value");
3938 return -1;
3939 }
3940 }
3941 else {
3942 Py_BEGIN_ALLOW_THREADS
3943 fd = socket(family, type, proto);
3944 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00003945
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003946 if (fd == INVALID_SOCKET) {
3947 set_error();
3948 return -1;
3949 }
3950 }
3951 init_sockobject(s, fd, family, type, proto);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003952
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003953 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003954
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003955}
3956
3957
Guido van Rossumb6775db1994-08-01 11:34:53 +00003958/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003959
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003960static PyTypeObject sock_type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003961 PyVarObject_HEAD_INIT(0, 0) /* Must fill in type value later */
3962 "_socket.socket", /* tp_name */
3963 sizeof(PySocketSockObject), /* tp_basicsize */
3964 0, /* tp_itemsize */
3965 (destructor)sock_dealloc, /* tp_dealloc */
3966 0, /* tp_print */
3967 0, /* tp_getattr */
3968 0, /* tp_setattr */
3969 0, /* tp_reserved */
3970 (reprfunc)sock_repr, /* tp_repr */
3971 0, /* tp_as_number */
3972 0, /* tp_as_sequence */
3973 0, /* tp_as_mapping */
3974 0, /* tp_hash */
3975 0, /* tp_call */
3976 0, /* tp_str */
3977 PyObject_GenericGetAttr, /* tp_getattro */
3978 0, /* tp_setattro */
3979 0, /* tp_as_buffer */
3980 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
3981 sock_doc, /* tp_doc */
3982 0, /* tp_traverse */
3983 0, /* tp_clear */
3984 0, /* tp_richcompare */
3985 0, /* tp_weaklistoffset */
3986 0, /* tp_iter */
3987 0, /* tp_iternext */
3988 sock_methods, /* tp_methods */
3989 sock_memberlist, /* tp_members */
3990 0, /* tp_getset */
3991 0, /* tp_base */
3992 0, /* tp_dict */
3993 0, /* tp_descr_get */
3994 0, /* tp_descr_set */
3995 0, /* tp_dictoffset */
3996 sock_initobj, /* tp_init */
3997 PyType_GenericAlloc, /* tp_alloc */
3998 sock_new, /* tp_new */
3999 PyObject_Del, /* tp_free */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004000};
4001
Guido van Rossum30a685f1991-06-27 15:51:29 +00004002
Guido van Rossum81194471991-07-27 21:42:02 +00004003/* Python interface to gethostname(). */
4004
4005/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004006static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00004007socket_gethostname(PyObject *self, PyObject *unused)
Guido van Rossum81194471991-07-27 21:42:02 +00004008{
Martin v. Löwis72f48422010-10-29 18:20:08 +00004009#ifdef MS_WINDOWS
4010 /* Don't use winsock's gethostname, as this returns the ANSI
4011 version of the hostname, whereas we need a Unicode string.
4012 Otherwise, gethostname apparently also returns the DNS name. */
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00004013 wchar_t buf[MAX_COMPUTERNAME_LENGTH + 1];
Victor Stinner63941882011-09-29 00:42:28 +02004014 DWORD size = Py_ARRAY_LENGTH(buf);
Victor Stinner74168972011-11-17 01:11:36 +01004015 wchar_t *name;
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00004016 PyObject *result;
Victor Stinner74168972011-11-17 01:11:36 +01004017
4018 if (GetComputerNameExW(ComputerNamePhysicalDnsHostname, buf, &size))
Victor Stinner9d3b93b2011-11-22 02:27:30 +01004019 return PyUnicode_FromWideChar(buf, size);
Victor Stinner74168972011-11-17 01:11:36 +01004020
4021 if (GetLastError() != ERROR_MORE_DATA)
4022 return PyErr_SetFromWindowsErr(0);
4023
4024 if (size == 0)
4025 return PyUnicode_New(0, 0);
4026
4027 /* MSDN says ERROR_MORE_DATA may occur because DNS allows longer
4028 names */
4029 name = PyMem_Malloc(size * sizeof(wchar_t));
4030 if (!name)
4031 return NULL;
4032 if (!GetComputerNameExW(ComputerNamePhysicalDnsHostname,
4033 name,
4034 &size))
4035 {
4036 PyMem_Free(name);
4037 return PyErr_SetFromWindowsErr(0);
Martin v. Löwis72f48422010-10-29 18:20:08 +00004038 }
Victor Stinner74168972011-11-17 01:11:36 +01004039
4040 result = PyUnicode_FromWideChar(name, size);
4041 PyMem_Free(name);
4042 return result;
Martin v. Löwis72f48422010-10-29 18:20:08 +00004043#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004044 char buf[1024];
4045 int res;
4046 Py_BEGIN_ALLOW_THREADS
4047 res = gethostname(buf, (int) sizeof buf - 1);
4048 Py_END_ALLOW_THREADS
4049 if (res < 0)
4050 return set_error();
4051 buf[sizeof buf - 1] = '\0';
4052 return PyUnicode_FromString(buf);
Martin v. Löwis72f48422010-10-29 18:20:08 +00004053#endif
Guido van Rossum81194471991-07-27 21:42:02 +00004054}
Guido van Rossumff4949e1992-08-05 19:58:53 +00004055
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004056PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004057"gethostname() -> string\n\
4058\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004059Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004060
Antoine Pitrou061cfb52011-02-28 22:25:22 +00004061#ifdef HAVE_SETHOSTNAME
4062PyDoc_STRVAR(sethostname_doc,
4063"sethostname(name)\n\n\
4064Sets the hostname to name.");
4065
4066static PyObject *
4067socket_sethostname(PyObject *self, PyObject *args)
4068{
4069 PyObject *hnobj;
4070 Py_buffer buf;
4071 int res, flag = 0;
4072
4073 if (!PyArg_ParseTuple(args, "S:sethostname", &hnobj)) {
4074 PyErr_Clear();
4075 if (!PyArg_ParseTuple(args, "O&:sethostname",
4076 PyUnicode_FSConverter, &hnobj))
4077 return NULL;
4078 flag = 1;
4079 }
4080 res = PyObject_GetBuffer(hnobj, &buf, PyBUF_SIMPLE);
4081 if (!res) {
4082 res = sethostname(buf.buf, buf.len);
4083 PyBuffer_Release(&buf);
4084 }
4085 if (flag)
4086 Py_DECREF(hnobj);
4087 if (res)
4088 return set_error();
4089 Py_RETURN_NONE;
4090}
4091#endif
Guido van Rossumff4949e1992-08-05 19:58:53 +00004092
Guido van Rossum30a685f1991-06-27 15:51:29 +00004093/* Python interface to gethostbyname(name). */
4094
4095/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004096static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004097socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00004098{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004099 char *name;
4100 sock_addr_t addrbuf;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004101 PyObject *ret = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004102
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004103 if (!PyArg_ParseTuple(args, "et:gethostbyname", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004104 return NULL;
4105 if (setipaddr(name, SAS2SA(&addrbuf), sizeof(addrbuf), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004106 goto finally;
4107 ret = makeipaddr(SAS2SA(&addrbuf), sizeof(struct sockaddr_in));
4108finally:
4109 PyMem_Free(name);
4110 return ret;
Guido van Rossum30a685f1991-06-27 15:51:29 +00004111}
4112
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004113PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004114"gethostbyname(host) -> address\n\
4115\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004116Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004117
4118
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004119/* Convenience function common to gethostbyname_ex and gethostbyaddr */
4120
4121static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004122gethost_common(struct hostent *h, struct sockaddr *addr, int alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004123{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004124 char **pch;
4125 PyObject *rtn_tuple = (PyObject *)NULL;
4126 PyObject *name_list = (PyObject *)NULL;
4127 PyObject *addr_list = (PyObject *)NULL;
4128 PyObject *tmp;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004129
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004130 if (h == NULL) {
4131 /* Let's get real error message to return */
4132 set_herror(h_errno);
4133 return NULL;
4134 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004135
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004136 if (h->h_addrtype != af) {
4137 /* Let's get real error message to return */
Victor Stinner1f33f2b2011-12-17 04:45:09 +01004138 errno = EAFNOSUPPORT;
4139 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004140 return NULL;
4141 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004142
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004143 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00004144
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004145 case AF_INET:
4146 if (alen < sizeof(struct sockaddr_in))
4147 return NULL;
4148 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004149
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004150#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004151 case AF_INET6:
4152 if (alen < sizeof(struct sockaddr_in6))
4153 return NULL;
4154 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004155#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00004156
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004157 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004158
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004159 if ((name_list = PyList_New(0)) == NULL)
4160 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004161
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004162 if ((addr_list = PyList_New(0)) == NULL)
4163 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004164
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004165 /* SF #1511317: h_aliases can be NULL */
4166 if (h->h_aliases) {
4167 for (pch = h->h_aliases; *pch != NULL; pch++) {
4168 int status;
4169 tmp = PyUnicode_FromString(*pch);
4170 if (tmp == NULL)
4171 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004172
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004173 status = PyList_Append(name_list, tmp);
4174 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004175
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004176 if (status)
4177 goto err;
4178 }
4179 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004180
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004181 for (pch = h->h_addr_list; *pch != NULL; pch++) {
4182 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004183
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004184 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00004185
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004186 case AF_INET:
4187 {
4188 struct sockaddr_in sin;
4189 memset(&sin, 0, sizeof(sin));
4190 sin.sin_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004191#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004192 sin.sin_len = sizeof(sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004193#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004194 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
4195 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
Guido van Rossum67f7a382002-06-06 21:08:16 +00004196
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004197 if (pch == h->h_addr_list && alen >= sizeof(sin))
4198 memcpy((char *) addr, &sin, sizeof(sin));
4199 break;
4200 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004201
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004202#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004203 case AF_INET6:
4204 {
4205 struct sockaddr_in6 sin6;
4206 memset(&sin6, 0, sizeof(sin6));
4207 sin6.sin6_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004208#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004209 sin6.sin6_len = sizeof(sin6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004210#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004211 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
4212 tmp = makeipaddr((struct sockaddr *)&sin6,
4213 sizeof(sin6));
Guido van Rossum67f7a382002-06-06 21:08:16 +00004214
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004215 if (pch == h->h_addr_list && alen >= sizeof(sin6))
4216 memcpy((char *) addr, &sin6, sizeof(sin6));
4217 break;
4218 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004219#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00004220
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004221 default: /* can't happen */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004222 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004223 "unsupported address family");
4224 return NULL;
4225 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004226
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004227 if (tmp == NULL)
4228 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004229
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004230 status = PyList_Append(addr_list, tmp);
4231 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004232
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004233 if (status)
4234 goto err;
4235 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004236
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004237 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004238
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004239 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004240 Py_XDECREF(name_list);
4241 Py_XDECREF(addr_list);
4242 return rtn_tuple;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004243}
4244
4245
4246/* Python interface to gethostbyname_ex(name). */
4247
4248/*ARGSUSED*/
4249static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004250socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004251{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004252 char *name;
4253 struct hostent *h;
Charles-François Natali8b759652011-12-23 16:44:51 +01004254 sock_addr_t addr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004255 struct sockaddr *sa;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004256 PyObject *ret = NULL;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004257#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004258 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004259#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004260 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004261#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004262 char buf[16384];
4263 int buf_len = (sizeof buf) - 1;
4264 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004265#endif
4266#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004267 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004268#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004269#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004270
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004271 if (!PyArg_ParseTuple(args, "et:gethostbyname_ex", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004272 return NULL;
Charles-François Natali8b759652011-12-23 16:44:51 +01004273 if (setipaddr(name, SAS2SA(&addr), sizeof(addr), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004274 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004275 Py_BEGIN_ALLOW_THREADS
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004276#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004277#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004278 result = gethostbyname_r(name, &hp_allocated, buf, buf_len,
4279 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004280#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004281 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004282#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004283 memset((void *) &data, '\0', sizeof(data));
4284 result = gethostbyname_r(name, &hp_allocated, &data);
4285 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004286#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004287#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00004288#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004289 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004290#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004291 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004292#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004293 Py_END_ALLOW_THREADS
4294 /* Some C libraries would require addr.__ss_family instead of
4295 addr.ss_family.
4296 Therefore, we cast the sockaddr_storage into sockaddr to
4297 access sa_family. */
Charles-François Natali8b759652011-12-23 16:44:51 +01004298 sa = SAS2SA(&addr);
4299 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004300 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00004301#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004302 PyThread_release_lock(netdb_lock);
Guido van Rossum955becc1999-03-22 20:14:53 +00004303#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004304finally:
4305 PyMem_Free(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004306 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004307}
4308
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004309PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004310"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
4311\n\
4312Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004313for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004314
4315
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004316/* Python interface to gethostbyaddr(IP). */
4317
4318/*ARGSUSED*/
4319static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004320socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004321{
Charles-François Natali8b759652011-12-23 16:44:51 +01004322 sock_addr_t addr;
4323 struct sockaddr *sa = SAS2SA(&addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004324 char *ip_num;
4325 struct hostent *h;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004326 PyObject *ret = NULL;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004327#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004328 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004329#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004330 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004331#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004332 /* glibcs up to 2.10 assume that the buf argument to
4333 gethostbyaddr_r is 8-byte aligned, which at least llvm-gcc
4334 does not ensure. The attribute below instructs the compiler
4335 to maintain this alignment. */
4336 char buf[16384] Py_ALIGNED(8);
4337 int buf_len = (sizeof buf) - 1;
4338 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004339#endif
4340#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004341 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004342#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004343#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004344 char *ap;
4345 int al;
4346 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004347
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004348 if (!PyArg_ParseTuple(args, "et:gethostbyaddr", "idna", &ip_num))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004349 return NULL;
4350 af = AF_UNSPEC;
4351 if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004352 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004353 af = sa->sa_family;
4354 ap = NULL;
Brett Cannonb94767f2011-02-22 20:15:44 +00004355 /* al = 0; */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004356 switch (af) {
4357 case AF_INET:
4358 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
4359 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
4360 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004361#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004362 case AF_INET6:
4363 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
4364 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
4365 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004366#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004367 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004368 PyErr_SetString(PyExc_OSError, "unsupported address family");
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004369 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004370 }
4371 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004372#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004373#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004374 result = gethostbyaddr_r(ap, al, af,
4375 &hp_allocated, buf, buf_len,
4376 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004377#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004378 h = gethostbyaddr_r(ap, al, af,
4379 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004380#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004381 memset((void *) &data, '\0', sizeof(data));
4382 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
4383 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004384#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004385#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00004386#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004387 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004388#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004389 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004390#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004391 Py_END_ALLOW_THREADS
Charles-François Natali8b759652011-12-23 16:44:51 +01004392 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00004393#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004394 PyThread_release_lock(netdb_lock);
Guido van Rossum3baaa131999-03-22 21:44:51 +00004395#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004396finally:
4397 PyMem_Free(ip_num);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004398 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004399}
4400
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004401PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004402"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
4403\n\
4404Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004405for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004406
Guido van Rossum30a685f1991-06-27 15:51:29 +00004407
4408/* Python interface to getservbyname(name).
4409 This only returns the port number, since the other info is already
4410 known or not useful (like the list of aliases). */
4411
4412/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004413static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004414socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00004415{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004416 char *name, *proto=NULL;
4417 struct servent *sp;
4418 if (!PyArg_ParseTuple(args, "s|s:getservbyname", &name, &proto))
4419 return NULL;
4420 Py_BEGIN_ALLOW_THREADS
4421 sp = getservbyname(name, proto);
4422 Py_END_ALLOW_THREADS
4423 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004424 PyErr_SetString(PyExc_OSError, "service/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004425 return NULL;
4426 }
4427 return PyLong_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00004428}
4429
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004430PyDoc_STRVAR(getservbyname_doc,
Barry Warsaw11b91a02004-06-28 00:50:43 +00004431"getservbyname(servicename[, protocolname]) -> integer\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00004432\n\
4433Return a port number from a service name and protocol name.\n\
Barry Warsaw11b91a02004-06-28 00:50:43 +00004434The optional protocol name, if given, should be 'tcp' or 'udp',\n\
4435otherwise any protocol will match.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004436
Guido van Rossum30a685f1991-06-27 15:51:29 +00004437
Barry Warsaw11b91a02004-06-28 00:50:43 +00004438/* Python interface to getservbyport(port).
4439 This only returns the service name, since the other info is already
4440 known or not useful (like the list of aliases). */
4441
4442/*ARGSUSED*/
4443static PyObject *
4444socket_getservbyport(PyObject *self, PyObject *args)
4445{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004446 int port;
4447 char *proto=NULL;
4448 struct servent *sp;
4449 if (!PyArg_ParseTuple(args, "i|s:getservbyport", &port, &proto))
4450 return NULL;
4451 if (port < 0 || port > 0xffff) {
4452 PyErr_SetString(
4453 PyExc_OverflowError,
4454 "getservbyport: port must be 0-65535.");
4455 return NULL;
4456 }
4457 Py_BEGIN_ALLOW_THREADS
4458 sp = getservbyport(htons((short)port), proto);
4459 Py_END_ALLOW_THREADS
4460 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004461 PyErr_SetString(PyExc_OSError, "port/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004462 return NULL;
4463 }
4464 return PyUnicode_FromString(sp->s_name);
Barry Warsaw11b91a02004-06-28 00:50:43 +00004465}
4466
4467PyDoc_STRVAR(getservbyport_doc,
4468"getservbyport(port[, protocolname]) -> string\n\
4469\n\
4470Return the service name from a port number and protocol name.\n\
4471The optional protocol name, if given, should be 'tcp' or 'udp',\n\
4472otherwise any protocol will match.");
4473
Guido van Rossum3901d851996-12-19 16:35:04 +00004474/* Python interface to getprotobyname(name).
4475 This only returns the protocol number, since the other info is
4476 already known or not useful (like the list of aliases). */
4477
4478/*ARGSUSED*/
4479static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004480socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00004481{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004482 char *name;
4483 struct protoent *sp;
4484 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
4485 return NULL;
4486 Py_BEGIN_ALLOW_THREADS
4487 sp = getprotobyname(name);
4488 Py_END_ALLOW_THREADS
4489 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004490 PyErr_SetString(PyExc_OSError, "protocol not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004491 return NULL;
4492 }
4493 return PyLong_FromLong((long) sp->p_proto);
Guido van Rossum3901d851996-12-19 16:35:04 +00004494}
4495
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004496PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004497"getprotobyname(name) -> integer\n\
4498\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004499Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004500
Guido van Rossum3901d851996-12-19 16:35:04 +00004501
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004502#ifndef NO_DUP
4503/* dup() function for socket fds */
4504
4505static PyObject *
4506socket_dup(PyObject *self, PyObject *fdobj)
4507{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004508 SOCKET_T fd, newfd;
4509 PyObject *newfdobj;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004510
4511
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004512 fd = PyLong_AsSocket_t(fdobj);
4513 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
4514 return NULL;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004515
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004516 newfd = dup_socket(fd);
4517 if (newfd == INVALID_SOCKET)
4518 return set_error();
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004519
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004520 newfdobj = PyLong_FromSocket_t(newfd);
4521 if (newfdobj == NULL)
4522 SOCKETCLOSE(newfd);
4523 return newfdobj;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004524}
4525
4526PyDoc_STRVAR(dup_doc,
4527"dup(integer) -> integer\n\
4528\n\
4529Duplicate an integer socket file descriptor. This is like os.dup(), but for\n\
4530sockets; on some platforms os.dup() won't work for socket file descriptors.");
4531#endif
4532
4533
Dave Cole331708b2004-08-09 04:51:41 +00004534#ifdef HAVE_SOCKETPAIR
4535/* Create a pair of sockets using the socketpair() function.
Dave Cole07fda7e2004-08-23 05:16:23 +00004536 Arguments as for socket() except the default family is AF_UNIX if
Dave Colee8bbfe42004-08-26 00:51:16 +00004537 defined on the platform; otherwise, the default is AF_INET. */
Dave Cole331708b2004-08-09 04:51:41 +00004538
4539/*ARGSUSED*/
4540static PyObject *
4541socket_socketpair(PyObject *self, PyObject *args)
4542{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004543 PySocketSockObject *s0 = NULL, *s1 = NULL;
4544 SOCKET_T sv[2];
4545 int family, type = SOCK_STREAM, proto = 0;
4546 PyObject *res = NULL;
Dave Cole331708b2004-08-09 04:51:41 +00004547
4548#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004549 family = AF_UNIX;
Dave Cole331708b2004-08-09 04:51:41 +00004550#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004551 family = AF_INET;
Dave Cole331708b2004-08-09 04:51:41 +00004552#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004553 if (!PyArg_ParseTuple(args, "|iii:socketpair",
4554 &family, &type, &proto))
4555 return NULL;
4556 /* Create a pair of socket fds */
4557 if (socketpair(family, type, proto, sv) < 0)
4558 return set_error();
4559 s0 = new_sockobject(sv[0], family, type, proto);
4560 if (s0 == NULL)
4561 goto finally;
4562 s1 = new_sockobject(sv[1], family, type, proto);
4563 if (s1 == NULL)
4564 goto finally;
4565 res = PyTuple_Pack(2, s0, s1);
Dave Cole331708b2004-08-09 04:51:41 +00004566
4567finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004568 if (res == NULL) {
4569 if (s0 == NULL)
4570 SOCKETCLOSE(sv[0]);
4571 if (s1 == NULL)
4572 SOCKETCLOSE(sv[1]);
4573 }
4574 Py_XDECREF(s0);
4575 Py_XDECREF(s1);
4576 return res;
Dave Cole331708b2004-08-09 04:51:41 +00004577}
4578
4579PyDoc_STRVAR(socketpair_doc,
4580"socketpair([family[, type[, proto]]]) -> (socket object, socket object)\n\
4581\n\
4582Create a pair of socket objects from the sockets returned by the platform\n\
4583socketpair() function.\n\
Dave Cole07fda7e2004-08-23 05:16:23 +00004584The arguments are the same as for socket() except the default family is\n\
Dave Colee8bbfe42004-08-26 00:51:16 +00004585AF_UNIX if defined on the platform; otherwise, the default is AF_INET.");
Dave Cole331708b2004-08-09 04:51:41 +00004586
4587#endif /* HAVE_SOCKETPAIR */
4588
4589
Guido van Rossum006bf911996-06-12 04:04:55 +00004590static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004591socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00004592{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004593 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00004594
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004595 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
4596 return NULL;
4597 }
4598 if (x1 < 0) {
4599 PyErr_SetString(PyExc_OverflowError,
4600 "can't convert negative number to unsigned long");
4601 return NULL;
4602 }
4603 x2 = (unsigned int)ntohs((unsigned short)x1);
4604 return PyLong_FromLong(x2);
Guido van Rossum006bf911996-06-12 04:04:55 +00004605}
4606
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004607PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004608"ntohs(integer) -> integer\n\
4609\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004610Convert a 16-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004611
4612
Guido van Rossum006bf911996-06-12 04:04:55 +00004613static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004614socket_ntohl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00004615{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004616 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00004617
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004618 if (PyLong_Check(arg)) {
4619 x = PyLong_AsUnsignedLong(arg);
4620 if (x == (unsigned long) -1 && PyErr_Occurred())
4621 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004622#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004623 {
4624 unsigned long y;
4625 /* only want the trailing 32 bits */
4626 y = x & 0xFFFFFFFFUL;
4627 if (y ^ x)
4628 return PyErr_Format(PyExc_OverflowError,
4629 "long int larger than 32 bits");
4630 x = y;
4631 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004632#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004633 }
4634 else
4635 return PyErr_Format(PyExc_TypeError,
4636 "expected int/long, %s found",
4637 Py_TYPE(arg)->tp_name);
4638 if (x == (unsigned long) -1 && PyErr_Occurred())
4639 return NULL;
4640 return PyLong_FromUnsignedLong(ntohl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00004641}
4642
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004643PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004644"ntohl(integer) -> integer\n\
4645\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004646Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004647
4648
Guido van Rossum006bf911996-06-12 04:04:55 +00004649static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004650socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00004651{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004652 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00004653
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004654 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
4655 return NULL;
4656 }
4657 if (x1 < 0) {
4658 PyErr_SetString(PyExc_OverflowError,
4659 "can't convert negative number to unsigned long");
4660 return NULL;
4661 }
4662 x2 = (unsigned int)htons((unsigned short)x1);
4663 return PyLong_FromLong(x2);
Guido van Rossum006bf911996-06-12 04:04:55 +00004664}
4665
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004666PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004667"htons(integer) -> integer\n\
4668\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004669Convert a 16-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004670
4671
Guido van Rossum006bf911996-06-12 04:04:55 +00004672static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004673socket_htonl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00004674{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004675 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00004676
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004677 if (PyLong_Check(arg)) {
4678 x = PyLong_AsUnsignedLong(arg);
4679 if (x == (unsigned long) -1 && PyErr_Occurred())
4680 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004681#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004682 {
4683 unsigned long y;
4684 /* only want the trailing 32 bits */
4685 y = x & 0xFFFFFFFFUL;
4686 if (y ^ x)
4687 return PyErr_Format(PyExc_OverflowError,
4688 "long int larger than 32 bits");
4689 x = y;
4690 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004691#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004692 }
4693 else
4694 return PyErr_Format(PyExc_TypeError,
4695 "expected int/long, %s found",
4696 Py_TYPE(arg)->tp_name);
4697 return PyLong_FromUnsignedLong(htonl((unsigned long)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00004698}
4699
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004700PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004701"htonl(integer) -> integer\n\
4702\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004703Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004704
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004705/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004706
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004707PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004708"inet_aton(string) -> bytes giving packed 32-bit IP representation\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004709\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00004710Convert 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 +00004711binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004712
4713static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004714socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004715{
Guido van Rossuma2e48551999-09-09 15:42:59 +00004716#ifndef INADDR_NONE
4717#define INADDR_NONE (-1)
4718#endif
Neal Norwitz88f115b2003-02-13 02:15:42 +00004719#ifdef HAVE_INET_ATON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004720 struct in_addr buf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00004721#endif
4722
4723#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
Benjamin Petersonf91df042009-02-13 02:50:59 +00004724#if (SIZEOF_INT != 4)
4725#error "Not sure if in_addr_t exists and int is not 32-bits."
4726#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004727 /* Have to use inet_addr() instead */
4728 unsigned int packed_addr;
Tim Peters1df9fdd2003-02-13 03:13:40 +00004729#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004730 char *ip_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00004731
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004732 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))
4733 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00004734
Tim Peters1df9fdd2003-02-13 03:13:40 +00004735
4736#ifdef HAVE_INET_ATON
Thomas Wouters477c8d52006-05-27 19:21:47 +00004737
4738#ifdef USE_INET_ATON_WEAKLINK
4739 if (inet_aton != NULL) {
4740#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004741 if (inet_aton(ip_addr, &buf))
4742 return PyBytes_FromStringAndSize((char *)(&buf),
4743 sizeof(buf));
Guido van Rossumad05cdf2003-02-12 23:08:22 +00004744
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004745 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004746 "illegal IP address string passed to inet_aton");
4747 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00004748
Thomas Wouters477c8d52006-05-27 19:21:47 +00004749#ifdef USE_INET_ATON_WEAKLINK
4750 } else {
4751#endif
4752
4753#endif
4754
4755#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
4756
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004757 /* special-case this address as inet_addr might return INADDR_NONE
4758 * for this */
4759 if (strcmp(ip_addr, "255.255.255.255") == 0) {
4760 packed_addr = 0xFFFFFFFF;
4761 } else {
Thomas Wouters477c8d52006-05-27 19:21:47 +00004762
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004763 packed_addr = inet_addr(ip_addr);
Guido van Rossumc6a164b1999-08-20 19:11:27 +00004764
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004765 if (packed_addr == INADDR_NONE) { /* invalid address */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004766 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004767 "illegal IP address string passed to inet_aton");
4768 return NULL;
4769 }
4770 }
4771 return PyBytes_FromStringAndSize((char *) &packed_addr,
4772 sizeof(packed_addr));
Thomas Wouters477c8d52006-05-27 19:21:47 +00004773
4774#ifdef USE_INET_ATON_WEAKLINK
4775 }
4776#endif
4777
Guido van Rossumad05cdf2003-02-12 23:08:22 +00004778#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004779}
4780
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004781PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00004782"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004783\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004784Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004785
4786static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004787socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004788{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004789 char *packed_str;
4790 int addr_len;
4791 struct in_addr packed_addr;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004792
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004793 if (!PyArg_ParseTuple(args, "y#:inet_ntoa", &packed_str, &addr_len)) {
4794 return NULL;
4795 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00004796
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004797 if (addr_len != sizeof(packed_addr)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004798 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004799 "packed IP wrong length for inet_ntoa");
4800 return NULL;
4801 }
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004802
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004803 memcpy(&packed_addr, packed_str, addr_len);
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004804
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004805 return PyUnicode_FromString(inet_ntoa(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004806}
Guido van Rossum82a5c661998-07-07 20:45:43 +00004807
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004808#ifdef HAVE_INET_PTON
4809
4810PyDoc_STRVAR(inet_pton_doc,
4811"inet_pton(af, ip) -> packed IP address string\n\
4812\n\
4813Convert an IP address from string format to a packed string suitable\n\
4814for use with low-level network functions.");
4815
4816static PyObject *
4817socket_inet_pton(PyObject *self, PyObject *args)
4818{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004819 int af;
4820 char* ip;
4821 int retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004822#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004823 char packed[MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004824#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004825 char packed[sizeof(struct in_addr)];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004826#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004827 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
4828 return NULL;
4829 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004830
Martin v. Löwis04697e82004-06-02 12:35:29 +00004831#if !defined(ENABLE_IPV6) && defined(AF_INET6)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004832 if(af == AF_INET6) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004833 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004834 "can't use AF_INET6, IPv6 is disabled");
4835 return NULL;
4836 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00004837#endif
Martin v. Löwis10649092003-08-05 06:25:06 +00004838
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004839 retval = inet_pton(af, ip, packed);
4840 if (retval < 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004841 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004842 return NULL;
4843 } else if (retval == 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004844 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004845 "illegal IP address string passed to inet_pton");
4846 return NULL;
4847 } else if (af == AF_INET) {
4848 return PyBytes_FromStringAndSize(packed,
4849 sizeof(struct in_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004850#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004851 } else if (af == AF_INET6) {
4852 return PyBytes_FromStringAndSize(packed,
4853 sizeof(struct in6_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004854#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004855 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004856 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004857 return NULL;
4858 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004859}
Thomas Wouters477c8d52006-05-27 19:21:47 +00004860
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004861PyDoc_STRVAR(inet_ntop_doc,
4862"inet_ntop(af, packed_ip) -> string formatted IP address\n\
4863\n\
4864Convert a packed IP address of the given family to string format.");
4865
4866static PyObject *
4867socket_inet_ntop(PyObject *self, PyObject *args)
4868{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004869 int af;
4870 char* packed;
4871 int len;
4872 const char* retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004873#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004874 char ip[MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004875#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004876 char ip[INET_ADDRSTRLEN + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004877#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00004878
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004879 /* Guarantee NUL-termination for PyUnicode_FromString() below */
4880 memset((void *) &ip[0], '\0', sizeof(ip));
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004881
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004882 if (!PyArg_ParseTuple(args, "iy#:inet_ntop", &af, &packed, &len)) {
4883 return NULL;
4884 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004885
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004886 if (af == AF_INET) {
4887 if (len != sizeof(struct in_addr)) {
4888 PyErr_SetString(PyExc_ValueError,
4889 "invalid length of packed IP address string");
4890 return NULL;
4891 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004892#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004893 } else if (af == AF_INET6) {
4894 if (len != sizeof(struct in6_addr)) {
4895 PyErr_SetString(PyExc_ValueError,
4896 "invalid length of packed IP address string");
4897 return NULL;
4898 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004899#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004900 } else {
4901 PyErr_Format(PyExc_ValueError,
4902 "unknown address family %d", af);
4903 return NULL;
4904 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004905
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004906 retval = inet_ntop(af, packed, ip, sizeof(ip));
4907 if (!retval) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004908 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004909 return NULL;
4910 } else {
4911 return PyUnicode_FromString(retval);
4912 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004913
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004914 /* NOTREACHED */
4915 PyErr_SetString(PyExc_RuntimeError, "invalid handling of inet_ntop");
4916 return NULL;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004917}
4918
4919#endif /* HAVE_INET_PTON */
4920
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004921/* Python interface to getaddrinfo(host, port). */
4922
4923/*ARGSUSED*/
4924static PyObject *
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00004925socket_getaddrinfo(PyObject *self, PyObject *args, PyObject* kwargs)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004926{
Victor Stinner77af1722011-05-26 14:05:59 +02004927 static char* kwnames[] = {"host", "port", "family", "type", "proto",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00004928 "flags", 0};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004929 struct addrinfo hints, *res;
4930 struct addrinfo *res0 = NULL;
4931 PyObject *hobj = NULL;
4932 PyObject *pobj = (PyObject *)NULL;
4933 char pbuf[30];
4934 char *hptr, *pptr;
4935 int family, socktype, protocol, flags;
4936 int error;
4937 PyObject *all = (PyObject *)NULL;
4938 PyObject *idna = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004939
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004940 family = socktype = protocol = flags = 0;
4941 family = AF_UNSPEC;
Victor Stinner77af1722011-05-26 14:05:59 +02004942 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OO|iiii:getaddrinfo",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00004943 kwnames, &hobj, &pobj, &family, &socktype,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004944 &protocol, &flags)) {
4945 return NULL;
4946 }
4947 if (hobj == Py_None) {
4948 hptr = NULL;
4949 } else if (PyUnicode_Check(hobj)) {
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02004950 _Py_IDENTIFIER(encode);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02004951
4952 idna = _PyObject_CallMethodId(hobj, &PyId_encode, "s", "idna");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004953 if (!idna)
4954 return NULL;
4955 assert(PyBytes_Check(idna));
4956 hptr = PyBytes_AS_STRING(idna);
4957 } else if (PyBytes_Check(hobj)) {
4958 hptr = PyBytes_AsString(hobj);
4959 } else {
4960 PyErr_SetString(PyExc_TypeError,
4961 "getaddrinfo() argument 1 must be string or None");
4962 return NULL;
4963 }
4964 if (PyLong_CheckExact(pobj)) {
4965 long value = PyLong_AsLong(pobj);
4966 if (value == -1 && PyErr_Occurred())
4967 goto err;
4968 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", value);
4969 pptr = pbuf;
4970 } else if (PyUnicode_Check(pobj)) {
4971 pptr = _PyUnicode_AsString(pobj);
Alexander Belopolskye239d232010-12-08 23:31:48 +00004972 if (pptr == NULL)
4973 goto err;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004974 } else if (PyBytes_Check(pobj)) {
Alexander Belopolskye239d232010-12-08 23:31:48 +00004975 pptr = PyBytes_AS_STRING(pobj);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004976 } else if (pobj == Py_None) {
4977 pptr = (char *)NULL;
4978 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004979 PyErr_SetString(PyExc_OSError, "Int or String expected");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004980 goto err;
4981 }
4982 memset(&hints, 0, sizeof(hints));
4983 hints.ai_family = family;
4984 hints.ai_socktype = socktype;
4985 hints.ai_protocol = protocol;
4986 hints.ai_flags = flags;
4987 Py_BEGIN_ALLOW_THREADS
4988 ACQUIRE_GETADDRINFO_LOCK
4989 error = getaddrinfo(hptr, pptr, &hints, &res0);
4990 Py_END_ALLOW_THREADS
4991 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
4992 if (error) {
4993 set_gaierror(error);
4994 goto err;
4995 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004996
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004997 if ((all = PyList_New(0)) == NULL)
4998 goto err;
4999 for (res = res0; res; res = res->ai_next) {
5000 PyObject *single;
5001 PyObject *addr =
5002 makesockaddr(-1, res->ai_addr, res->ai_addrlen, protocol);
5003 if (addr == NULL)
5004 goto err;
5005 single = Py_BuildValue("iiisO", res->ai_family,
5006 res->ai_socktype, res->ai_protocol,
5007 res->ai_canonname ? res->ai_canonname : "",
5008 addr);
5009 Py_DECREF(addr);
5010 if (single == NULL)
5011 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005012
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005013 if (PyList_Append(all, single))
5014 goto err;
5015 Py_XDECREF(single);
5016 }
5017 Py_XDECREF(idna);
5018 if (res0)
5019 freeaddrinfo(res0);
5020 return all;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005021 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005022 Py_XDECREF(all);
5023 Py_XDECREF(idna);
5024 if (res0)
5025 freeaddrinfo(res0);
5026 return (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005027}
5028
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005029PyDoc_STRVAR(getaddrinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005030"getaddrinfo(host, port [, family, socktype, proto, flags])\n\
5031 -> list of (family, socktype, proto, canonname, sockaddr)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005032\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005033Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005034
5035/* Python interface to getnameinfo(sa, flags). */
5036
5037/*ARGSUSED*/
5038static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005039socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005040{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005041 PyObject *sa = (PyObject *)NULL;
5042 int flags;
5043 char *hostp;
Charles-François Natali366999a2012-01-02 15:47:29 +01005044 int port;
5045 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005046 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
5047 struct addrinfo hints, *res = NULL;
5048 int error;
5049 PyObject *ret = (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005050
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005051 flags = flowinfo = scope_id = 0;
5052 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
5053 return NULL;
5054 if (!PyTuple_Check(sa)) {
5055 PyErr_SetString(PyExc_TypeError,
5056 "getnameinfo() argument 1 must be a tuple");
5057 return NULL;
5058 }
Charles-François Natali366999a2012-01-02 15:47:29 +01005059 if (!PyArg_ParseTuple(sa, "si|II",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005060 &hostp, &port, &flowinfo, &scope_id))
5061 return NULL;
Charles-François Natali366999a2012-01-02 15:47:29 +01005062 if (flowinfo < 0 || flowinfo > 0xfffff) {
5063 PyErr_SetString(PyExc_OverflowError,
5064 "getsockaddrarg: flowinfo must be 0-1048575.");
5065 return NULL;
5066 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005067 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
5068 memset(&hints, 0, sizeof(hints));
5069 hints.ai_family = AF_UNSPEC;
5070 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Martin v. Löwis112c0f32010-08-25 07:38:15 +00005071 hints.ai_flags = AI_NUMERICHOST; /* don't do any name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005072 Py_BEGIN_ALLOW_THREADS
5073 ACQUIRE_GETADDRINFO_LOCK
5074 error = getaddrinfo(hostp, pbuf, &hints, &res);
5075 Py_END_ALLOW_THREADS
5076 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
5077 if (error) {
5078 set_gaierror(error);
5079 goto fail;
5080 }
5081 if (res->ai_next) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005082 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005083 "sockaddr resolved to multiple addresses");
5084 goto fail;
5085 }
5086 switch (res->ai_family) {
5087 case AF_INET:
5088 {
5089 if (PyTuple_GET_SIZE(sa) != 2) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005090 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005091 "IPv4 sockaddr must be 2 tuple");
5092 goto fail;
5093 }
5094 break;
5095 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005096#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005097 case AF_INET6:
5098 {
5099 struct sockaddr_in6 *sin6;
5100 sin6 = (struct sockaddr_in6 *)res->ai_addr;
Charles-François Natali366999a2012-01-02 15:47:29 +01005101 sin6->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005102 sin6->sin6_scope_id = scope_id;
5103 break;
5104 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005105#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005106 }
Antoine Pitrou19467d22010-08-17 19:33:30 +00005107 error = getnameinfo(res->ai_addr, (socklen_t) res->ai_addrlen,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005108 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
5109 if (error) {
5110 set_gaierror(error);
5111 goto fail;
5112 }
5113 ret = Py_BuildValue("ss", hbuf, pbuf);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005114
5115fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005116 if (res)
5117 freeaddrinfo(res);
5118 return ret;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005119}
5120
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005121PyDoc_STRVAR(getnameinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005122"getnameinfo(sockaddr, flags) --> (host, port)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005123\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005124Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005125
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005126
5127/* Python API to getting and setting the default timeout value. */
5128
5129static PyObject *
5130socket_getdefaulttimeout(PyObject *self)
5131{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005132 if (defaulttimeout < 0.0) {
5133 Py_INCREF(Py_None);
5134 return Py_None;
5135 }
5136 else
5137 return PyFloat_FromDouble(defaulttimeout);
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005138}
5139
5140PyDoc_STRVAR(getdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005141"getdefaulttimeout() -> timeout\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005142\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03005143Returns the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005144A value of None indicates that new socket objects have no timeout.\n\
5145When the socket module is first imported, the default is None.");
5146
5147static PyObject *
5148socket_setdefaulttimeout(PyObject *self, PyObject *arg)
5149{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005150 double timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005151
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005152 if (arg == Py_None)
5153 timeout = -1.0;
5154 else {
5155 timeout = PyFloat_AsDouble(arg);
5156 if (timeout < 0.0) {
5157 if (!PyErr_Occurred())
5158 PyErr_SetString(PyExc_ValueError,
5159 "Timeout value out of range");
5160 return NULL;
5161 }
5162 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005163
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005164 defaulttimeout = timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005165
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005166 Py_INCREF(Py_None);
5167 return Py_None;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005168}
5169
5170PyDoc_STRVAR(setdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005171"setdefaulttimeout(timeout)\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005172\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03005173Set the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005174A value of None indicates that new socket objects have no timeout.\n\
5175When the socket module is first imported, the default is None.");
5176
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005177#ifdef HAVE_IF_NAMEINDEX
5178/* Python API for getting interface indices and names */
5179
5180static PyObject *
5181socket_if_nameindex(PyObject *self, PyObject *arg)
5182{
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005183 PyObject *list;
Charles-François Natali60713592011-05-20 16:55:06 +02005184 int i;
5185 struct if_nameindex *ni;
Victor Stinner77af1722011-05-26 14:05:59 +02005186
Charles-François Natali60713592011-05-20 16:55:06 +02005187 ni = if_nameindex();
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005188 if (ni == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005189 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005190 return NULL;
5191 }
5192
5193 list = PyList_New(0);
5194 if (list == NULL) {
5195 if_freenameindex(ni);
5196 return NULL;
5197 }
5198
Charles-François Natali60713592011-05-20 16:55:06 +02005199 for (i = 0; ni[i].if_index != 0 && i < INT_MAX; i++) {
5200 PyObject *ni_tuple = Py_BuildValue("IO&",
5201 ni[i].if_index, PyUnicode_DecodeFSDefault, ni[i].if_name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005202
5203 if (ni_tuple == NULL || PyList_Append(list, ni_tuple) == -1) {
5204 Py_XDECREF(ni_tuple);
Charles-François Natali60713592011-05-20 16:55:06 +02005205 Py_DECREF(list);
5206 if_freenameindex(ni);
5207 return NULL;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005208 }
5209 Py_DECREF(ni_tuple);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005210 }
5211
5212 if_freenameindex(ni);
5213 return list;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005214}
5215
5216PyDoc_STRVAR(if_nameindex_doc,
5217"if_nameindex()\n\
5218\n\
5219Returns a list of network interface information (index, name) tuples.");
5220
Charles-François Natali60713592011-05-20 16:55:06 +02005221static PyObject *
5222socket_if_nametoindex(PyObject *self, PyObject *args)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005223{
Charles-François Natali60713592011-05-20 16:55:06 +02005224 PyObject *oname;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005225 unsigned long index;
5226
Charles-François Natali60713592011-05-20 16:55:06 +02005227 if (!PyArg_ParseTuple(args, "O&:if_nametoindex",
5228 PyUnicode_FSConverter, &oname))
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005229 return NULL;
5230
Charles-François Natali60713592011-05-20 16:55:06 +02005231 index = if_nametoindex(PyBytes_AS_STRING(oname));
5232 Py_DECREF(oname);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005233 if (index == 0) {
Charles-François Natali60713592011-05-20 16:55:06 +02005234 /* if_nametoindex() doesn't set errno */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005235 PyErr_SetString(PyExc_OSError, "no interface with this name");
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005236 return NULL;
5237 }
5238
5239 return PyLong_FromUnsignedLong(index);
5240}
5241
5242PyDoc_STRVAR(if_nametoindex_doc,
5243"if_nametoindex(if_name)\n\
5244\n\
5245Returns the interface index corresponding to the interface name if_name.");
5246
Charles-François Natali60713592011-05-20 16:55:06 +02005247static PyObject *
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005248socket_if_indextoname(PyObject *self, PyObject *arg)
5249{
Charles-François Natali60713592011-05-20 16:55:06 +02005250 unsigned long index;
5251 char name[IF_NAMESIZE + 1];
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005252
Charles-François Natali60713592011-05-20 16:55:06 +02005253 index = PyLong_AsUnsignedLong(arg);
5254 if (index == (unsigned long) -1)
5255 return NULL;
5256
5257 if (if_indextoname(index, name) == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005258 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005259 return NULL;
5260 }
5261
Charles-François Natali60713592011-05-20 16:55:06 +02005262 return PyUnicode_DecodeFSDefault(name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005263}
5264
5265PyDoc_STRVAR(if_indextoname_doc,
5266"if_indextoname(if_index)\n\
5267\n\
5268Returns the interface name corresponding to the interface index if_index.");
5269
5270#endif /* HAVE_IF_NAMEINDEX */
5271
5272
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005273#ifdef CMSG_LEN
5274/* Python interface to CMSG_LEN(length). */
5275
5276static PyObject *
5277socket_CMSG_LEN(PyObject *self, PyObject *args)
5278{
5279 Py_ssize_t length;
5280 size_t result;
5281
5282 if (!PyArg_ParseTuple(args, "n:CMSG_LEN", &length))
5283 return NULL;
5284 if (length < 0 || !get_CMSG_LEN(length, &result)) {
5285 PyErr_Format(PyExc_OverflowError, "CMSG_LEN() argument out of range");
5286 return NULL;
5287 }
5288 return PyLong_FromSize_t(result);
5289}
5290
5291PyDoc_STRVAR(CMSG_LEN_doc,
5292"CMSG_LEN(length) -> control message length\n\
5293\n\
5294Return the total length, without trailing padding, of an ancillary\n\
5295data item with associated data of the given length. This value can\n\
5296often be used as the buffer size for recvmsg() to receive a single\n\
5297item of ancillary data, but RFC 3542 requires portable applications to\n\
5298use CMSG_SPACE() and thus include space for padding, even when the\n\
5299item will be the last in the buffer. Raises OverflowError if length\n\
5300is outside the permissible range of values.");
5301
5302
5303#ifdef CMSG_SPACE
5304/* Python interface to CMSG_SPACE(length). */
5305
5306static PyObject *
5307socket_CMSG_SPACE(PyObject *self, PyObject *args)
5308{
5309 Py_ssize_t length;
5310 size_t result;
5311
5312 if (!PyArg_ParseTuple(args, "n:CMSG_SPACE", &length))
5313 return NULL;
5314 if (length < 0 || !get_CMSG_SPACE(length, &result)) {
5315 PyErr_SetString(PyExc_OverflowError,
5316 "CMSG_SPACE() argument out of range");
5317 return NULL;
5318 }
5319 return PyLong_FromSize_t(result);
5320}
5321
5322PyDoc_STRVAR(CMSG_SPACE_doc,
5323"CMSG_SPACE(length) -> buffer size\n\
5324\n\
5325Return the buffer size needed for recvmsg() to receive an ancillary\n\
5326data item with associated data of the given length, along with any\n\
5327trailing padding. The buffer space needed to receive multiple items\n\
5328is the sum of the CMSG_SPACE() values for their associated data\n\
5329lengths. Raises OverflowError if length is outside the permissible\n\
5330range of values.");
5331#endif /* CMSG_SPACE */
5332#endif /* CMSG_LEN */
5333
5334
Guido van Rossum30a685f1991-06-27 15:51:29 +00005335/* List of functions exported by this module. */
5336
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005337static PyMethodDef socket_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005338 {"gethostbyname", socket_gethostbyname,
5339 METH_VARARGS, gethostbyname_doc},
5340 {"gethostbyname_ex", socket_gethostbyname_ex,
5341 METH_VARARGS, ghbn_ex_doc},
5342 {"gethostbyaddr", socket_gethostbyaddr,
5343 METH_VARARGS, gethostbyaddr_doc},
5344 {"gethostname", socket_gethostname,
5345 METH_NOARGS, gethostname_doc},
Antoine Pitrou061cfb52011-02-28 22:25:22 +00005346#ifdef HAVE_SETHOSTNAME
5347 {"sethostname", socket_sethostname,
5348 METH_VARARGS, sethostname_doc},
5349#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005350 {"getservbyname", socket_getservbyname,
5351 METH_VARARGS, getservbyname_doc},
5352 {"getservbyport", socket_getservbyport,
5353 METH_VARARGS, getservbyport_doc},
5354 {"getprotobyname", socket_getprotobyname,
5355 METH_VARARGS, getprotobyname_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005356#ifndef NO_DUP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005357 {"dup", socket_dup,
5358 METH_O, dup_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005359#endif
Dave Cole331708b2004-08-09 04:51:41 +00005360#ifdef HAVE_SOCKETPAIR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005361 {"socketpair", socket_socketpair,
5362 METH_VARARGS, socketpair_doc},
Dave Cole331708b2004-08-09 04:51:41 +00005363#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005364 {"ntohs", socket_ntohs,
5365 METH_VARARGS, ntohs_doc},
5366 {"ntohl", socket_ntohl,
5367 METH_O, ntohl_doc},
5368 {"htons", socket_htons,
5369 METH_VARARGS, htons_doc},
5370 {"htonl", socket_htonl,
5371 METH_O, htonl_doc},
5372 {"inet_aton", socket_inet_aton,
5373 METH_VARARGS, inet_aton_doc},
5374 {"inet_ntoa", socket_inet_ntoa,
5375 METH_VARARGS, inet_ntoa_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005376#ifdef HAVE_INET_PTON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005377 {"inet_pton", socket_inet_pton,
5378 METH_VARARGS, inet_pton_doc},
5379 {"inet_ntop", socket_inet_ntop,
5380 METH_VARARGS, inet_ntop_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005381#endif
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005382 {"getaddrinfo", (PyCFunction)socket_getaddrinfo,
5383 METH_VARARGS | METH_KEYWORDS, getaddrinfo_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005384 {"getnameinfo", socket_getnameinfo,
5385 METH_VARARGS, getnameinfo_doc},
5386 {"getdefaulttimeout", (PyCFunction)socket_getdefaulttimeout,
5387 METH_NOARGS, getdefaulttimeout_doc},
5388 {"setdefaulttimeout", socket_setdefaulttimeout,
5389 METH_O, setdefaulttimeout_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005390#ifdef HAVE_IF_NAMEINDEX
5391 {"if_nameindex", socket_if_nameindex,
5392 METH_NOARGS, if_nameindex_doc},
5393 {"if_nametoindex", socket_if_nametoindex,
Charles-François Natali60713592011-05-20 16:55:06 +02005394 METH_VARARGS, if_nametoindex_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005395 {"if_indextoname", socket_if_indextoname,
5396 METH_O, if_indextoname_doc},
5397#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005398#ifdef CMSG_LEN
5399 {"CMSG_LEN", socket_CMSG_LEN,
5400 METH_VARARGS, CMSG_LEN_doc},
5401#ifdef CMSG_SPACE
5402 {"CMSG_SPACE", socket_CMSG_SPACE,
5403 METH_VARARGS, CMSG_SPACE_doc},
5404#endif
5405#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005406 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005407};
5408
Guido van Rossum30a685f1991-06-27 15:51:29 +00005409
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005410#ifdef MS_WINDOWS
5411#define OS_INIT_DEFINED
5412
5413/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00005414
5415static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005416os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00005417{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005418 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00005419}
5420
5421static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005422os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00005423{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005424 WSADATA WSAData;
5425 int ret;
5426 ret = WSAStartup(0x0101, &WSAData);
5427 switch (ret) {
5428 case 0: /* No error */
5429 Py_AtExit(os_cleanup);
5430 return 1; /* Success */
5431 case WSASYSNOTREADY:
5432 PyErr_SetString(PyExc_ImportError,
5433 "WSAStartup failed: network not ready");
5434 break;
5435 case WSAVERNOTSUPPORTED:
5436 case WSAEINVAL:
5437 PyErr_SetString(
5438 PyExc_ImportError,
5439 "WSAStartup failed: requested version not supported");
5440 break;
5441 default:
5442 PyErr_Format(PyExc_ImportError, "WSAStartup failed: error code %d", ret);
5443 break;
5444 }
5445 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00005446}
5447
Guido van Rossum8d665e61996-06-26 18:22:49 +00005448#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00005449
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005450
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005451#ifdef PYOS_OS2
5452#define OS_INIT_DEFINED
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005453
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005454/* Additional initialization for OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005455
5456static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005457os_init(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005458{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005459#ifndef PYCC_GCC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005460 int rc = sock_init();
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005461
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005462 if (rc == 0) {
5463 return 1; /* Success */
5464 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005465
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005466 PyErr_Format(PyExc_ImportError, "OS/2 TCP/IP Error# %d", sock_errno());
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005467
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005468 return 0; /* Failure */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00005469#else
Ezio Melotti13925002011-03-16 11:05:33 +02005470 /* No need to initialize sockets with GCC/EMX */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005471 return 1; /* Success */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00005472#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005473}
5474
5475#endif /* PYOS_OS2 */
5476
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005477
5478#ifndef OS_INIT_DEFINED
5479static int
5480os_init(void)
5481{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005482 return 1; /* Success */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005483}
5484#endif
5485
5486
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005487/* C API table - always add new things to the end for binary
5488 compatibility. */
5489static
5490PySocketModule_APIObject PySocketModuleAPI =
5491{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005492 &sock_type,
Antoine Pitrouc4df7842010-12-03 19:59:41 +00005493 NULL,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005494 NULL
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005495};
5496
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005497
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005498/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005499
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005500 This module is actually called "_socket", and there's a wrapper
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005501 "socket.py" which implements some additional functionality.
5502 The import of "_socket" may fail with an ImportError exception if
5503 os-specific initialization fails. On Windows, this does WINSOCK
Ezio Melotti13925002011-03-16 11:05:33 +02005504 initialization. When WINSOCK is initialized successfully, a call to
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005505 WSACleanup() is scheduled to be made at exit time.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005506*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005507
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005508PyDoc_STRVAR(socket_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005509"Implementation module for socket operations.\n\
5510\n\
5511See the socket module for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005512
Martin v. Löwis1a214512008-06-11 05:26:20 +00005513static struct PyModuleDef socketmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005514 PyModuleDef_HEAD_INIT,
5515 PySocket_MODULE_NAME,
5516 socket_doc,
5517 -1,
5518 socket_methods,
5519 NULL,
5520 NULL,
5521 NULL,
5522 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00005523};
5524
Mark Hammondfe51c6d2002-08-02 02:27:13 +00005525PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00005526PyInit__socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005527{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005528 PyObject *m, *has_ipv6;
Fred Drake4baedc12002-04-01 14:53:37 +00005529
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005530 if (!os_init())
5531 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005532
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005533 Py_TYPE(&sock_type) = &PyType_Type;
5534 m = PyModule_Create(&socketmodule);
5535 if (m == NULL)
5536 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005537
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005538 Py_INCREF(PyExc_OSError);
5539 PySocketModuleAPI.error = PyExc_OSError;
5540 Py_INCREF(PyExc_OSError);
5541 PyModule_AddObject(m, "error", PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005542 socket_herror = PyErr_NewException("socket.herror",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005543 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005544 if (socket_herror == NULL)
5545 return NULL;
5546 Py_INCREF(socket_herror);
5547 PyModule_AddObject(m, "herror", socket_herror);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005548 socket_gaierror = PyErr_NewException("socket.gaierror", PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005549 NULL);
5550 if (socket_gaierror == NULL)
5551 return NULL;
5552 Py_INCREF(socket_gaierror);
5553 PyModule_AddObject(m, "gaierror", socket_gaierror);
5554 socket_timeout = PyErr_NewException("socket.timeout",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005555 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005556 if (socket_timeout == NULL)
5557 return NULL;
Antoine Pitrouc4df7842010-12-03 19:59:41 +00005558 PySocketModuleAPI.timeout_error = socket_timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005559 Py_INCREF(socket_timeout);
5560 PyModule_AddObject(m, "timeout", socket_timeout);
5561 Py_INCREF((PyObject *)&sock_type);
5562 if (PyModule_AddObject(m, "SocketType",
5563 (PyObject *)&sock_type) != 0)
5564 return NULL;
5565 Py_INCREF((PyObject *)&sock_type);
5566 if (PyModule_AddObject(m, "socket",
5567 (PyObject *)&sock_type) != 0)
5568 return NULL;
Guido van Rossum09be4091999-08-09 14:40:40 +00005569
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005570#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005571 has_ipv6 = Py_True;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005572#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005573 has_ipv6 = Py_False;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005574#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005575 Py_INCREF(has_ipv6);
5576 PyModule_AddObject(m, "has_ipv6", has_ipv6);
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005577
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005578 /* Export C API */
5579 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
5580 PyCapsule_New(&PySocketModuleAPI, PySocket_CAPSULE_NAME, NULL)
5581 ) != 0)
5582 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005583
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005584 /* Address families (we only support AF_INET and AF_UNIX) */
Guido van Rossum09be4091999-08-09 14:40:40 +00005585#ifdef AF_UNSPEC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005586 PyModule_AddIntConstant(m, "AF_UNSPEC", AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00005587#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005588 PyModule_AddIntConstant(m, "AF_INET", AF_INET);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005589#ifdef AF_INET6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005590 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005591#endif /* AF_INET6 */
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00005592#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005593 PyModule_AddIntConstant(m, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00005594#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00005595#ifdef AF_AX25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005596 /* Amateur Radio AX.25 */
5597 PyModule_AddIntConstant(m, "AF_AX25", AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00005598#endif
5599#ifdef AF_IPX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005600 PyModule_AddIntConstant(m, "AF_IPX", AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00005601#endif
5602#ifdef AF_APPLETALK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005603 /* Appletalk DDP */
5604 PyModule_AddIntConstant(m, "AF_APPLETALK", AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00005605#endif
5606#ifdef AF_NETROM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005607 /* Amateur radio NetROM */
5608 PyModule_AddIntConstant(m, "AF_NETROM", AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00005609#endif
5610#ifdef AF_BRIDGE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005611 /* Multiprotocol bridge */
5612 PyModule_AddIntConstant(m, "AF_BRIDGE", AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00005613#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005614#ifdef AF_ATMPVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005615 /* ATM PVCs */
5616 PyModule_AddIntConstant(m, "AF_ATMPVC", AF_ATMPVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005617#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00005618#ifdef AF_AAL5
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005619 /* Reserved for Werner's ATM */
5620 PyModule_AddIntConstant(m, "AF_AAL5", AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00005621#endif
5622#ifdef AF_X25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005623 /* Reserved for X.25 project */
5624 PyModule_AddIntConstant(m, "AF_X25", AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00005625#endif
5626#ifdef AF_INET6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005627 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00005628#endif
5629#ifdef AF_ROSE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005630 /* Amateur Radio X.25 PLP */
5631 PyModule_AddIntConstant(m, "AF_ROSE", AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00005632#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005633#ifdef AF_DECnet
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005634 /* Reserved for DECnet project */
5635 PyModule_AddIntConstant(m, "AF_DECnet", AF_DECnet);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005636#endif
5637#ifdef AF_NETBEUI
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005638 /* Reserved for 802.2LLC project */
5639 PyModule_AddIntConstant(m, "AF_NETBEUI", AF_NETBEUI);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005640#endif
5641#ifdef AF_SECURITY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005642 /* Security callback pseudo AF */
5643 PyModule_AddIntConstant(m, "AF_SECURITY", AF_SECURITY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005644#endif
5645#ifdef AF_KEY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005646 /* PF_KEY key management API */
5647 PyModule_AddIntConstant(m, "AF_KEY", AF_KEY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005648#endif
5649#ifdef AF_NETLINK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005650 /* */
5651 PyModule_AddIntConstant(m, "AF_NETLINK", AF_NETLINK);
5652 PyModule_AddIntConstant(m, "NETLINK_ROUTE", NETLINK_ROUTE);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005653#ifdef NETLINK_SKIP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005654 PyModule_AddIntConstant(m, "NETLINK_SKIP", NETLINK_SKIP);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005655#endif
5656#ifdef NETLINK_W1
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005657 PyModule_AddIntConstant(m, "NETLINK_W1", NETLINK_W1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005658#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005659 PyModule_AddIntConstant(m, "NETLINK_USERSOCK", NETLINK_USERSOCK);
5660 PyModule_AddIntConstant(m, "NETLINK_FIREWALL", NETLINK_FIREWALL);
Guido van Rossum668a94a2006-02-21 01:07:27 +00005661#ifdef NETLINK_TCPDIAG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005662 PyModule_AddIntConstant(m, "NETLINK_TCPDIAG", NETLINK_TCPDIAG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00005663#endif
5664#ifdef NETLINK_NFLOG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005665 PyModule_AddIntConstant(m, "NETLINK_NFLOG", NETLINK_NFLOG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00005666#endif
Neal Norwitz65851662006-01-16 04:31:40 +00005667#ifdef NETLINK_XFRM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005668 PyModule_AddIntConstant(m, "NETLINK_XFRM", NETLINK_XFRM);
Neal Norwitz65851662006-01-16 04:31:40 +00005669#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005670#ifdef NETLINK_ARPD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005671 PyModule_AddIntConstant(m, "NETLINK_ARPD", NETLINK_ARPD);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005672#endif
5673#ifdef NETLINK_ROUTE6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005674 PyModule_AddIntConstant(m, "NETLINK_ROUTE6", NETLINK_ROUTE6);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005675#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005676 PyModule_AddIntConstant(m, "NETLINK_IP6_FW", NETLINK_IP6_FW);
Thomas Wouterscf297e42007-02-23 15:07:44 +00005677#ifdef NETLINK_DNRTMSG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005678 PyModule_AddIntConstant(m, "NETLINK_DNRTMSG", NETLINK_DNRTMSG);
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005679#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005680#ifdef NETLINK_TAPBASE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005681 PyModule_AddIntConstant(m, "NETLINK_TAPBASE", NETLINK_TAPBASE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005682#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005683#endif /* AF_NETLINK */
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005684#ifdef AF_ROUTE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005685 /* Alias to emulate 4.4BSD */
5686 PyModule_AddIntConstant(m, "AF_ROUTE", AF_ROUTE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005687#endif
5688#ifdef AF_ASH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005689 /* Ash */
5690 PyModule_AddIntConstant(m, "AF_ASH", AF_ASH);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005691#endif
5692#ifdef AF_ECONET
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005693 /* Acorn Econet */
5694 PyModule_AddIntConstant(m, "AF_ECONET", AF_ECONET);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005695#endif
5696#ifdef AF_ATMSVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005697 /* ATM SVCs */
5698 PyModule_AddIntConstant(m, "AF_ATMSVC", AF_ATMSVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005699#endif
5700#ifdef AF_SNA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005701 /* Linux SNA Project (nutters!) */
5702 PyModule_AddIntConstant(m, "AF_SNA", AF_SNA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005703#endif
5704#ifdef AF_IRDA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005705 /* IRDA sockets */
5706 PyModule_AddIntConstant(m, "AF_IRDA", AF_IRDA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005707#endif
5708#ifdef AF_PPPOX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005709 /* PPPoX sockets */
5710 PyModule_AddIntConstant(m, "AF_PPPOX", AF_PPPOX);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005711#endif
5712#ifdef AF_WANPIPE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005713 /* Wanpipe API Sockets */
5714 PyModule_AddIntConstant(m, "AF_WANPIPE", AF_WANPIPE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005715#endif
5716#ifdef AF_LLC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005717 /* Linux LLC */
5718 PyModule_AddIntConstant(m, "AF_LLC", AF_LLC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005719#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00005720
Hye-Shik Chang81268602004-02-02 06:05:24 +00005721#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005722 PyModule_AddIntConstant(m, "AF_BLUETOOTH", AF_BLUETOOTH);
5723 PyModule_AddIntConstant(m, "BTPROTO_L2CAP", BTPROTO_L2CAP);
5724 PyModule_AddIntConstant(m, "BTPROTO_HCI", BTPROTO_HCI);
5725 PyModule_AddIntConstant(m, "SOL_HCI", SOL_HCI);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00005726#if !defined(__NetBSD__) && !defined(__DragonFly__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005727 PyModule_AddIntConstant(m, "HCI_FILTER", HCI_FILTER);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00005728#endif
Hye-Shik Chang81268602004-02-02 06:05:24 +00005729#if !defined(__FreeBSD__)
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00005730#if !defined(__NetBSD__) && !defined(__DragonFly__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005731 PyModule_AddIntConstant(m, "HCI_TIME_STAMP", HCI_TIME_STAMP);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00005732#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005733 PyModule_AddIntConstant(m, "HCI_DATA_DIR", HCI_DATA_DIR);
5734 PyModule_AddIntConstant(m, "BTPROTO_SCO", BTPROTO_SCO);
Hye-Shik Chang81268602004-02-02 06:05:24 +00005735#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005736 PyModule_AddIntConstant(m, "BTPROTO_RFCOMM", BTPROTO_RFCOMM);
5737 PyModule_AddStringConstant(m, "BDADDR_ANY", "00:00:00:00:00:00");
5738 PyModule_AddStringConstant(m, "BDADDR_LOCAL", "00:00:00:FF:FF:FF");
Martin v. Löwis12af0482004-01-31 12:34:17 +00005739#endif
5740
Charles-François Natali47413c12011-10-06 19:47:44 +02005741#ifdef AF_CAN
5742 /* Controller Area Network */
5743 PyModule_AddIntConstant(m, "AF_CAN", AF_CAN);
5744#endif
5745#ifdef PF_CAN
5746 /* Controller Area Network */
5747 PyModule_AddIntConstant(m, "PF_CAN", PF_CAN);
5748#endif
5749
Charles-François Natali10b8cf42011-11-10 19:21:37 +01005750/* Reliable Datagram Sockets */
5751#ifdef AF_RDS
5752 PyModule_AddIntConstant(m, "AF_RDS", AF_RDS);
5753#endif
5754#ifdef PF_RDS
5755 PyModule_AddIntConstant(m, "PF_RDS", PF_RDS);
5756#endif
5757
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01005758/* Kernel event messages */
5759#ifdef PF_SYSTEM
5760 PyModule_AddIntConstant(m, "PF_SYSTEM", PF_SYSTEM);
5761#endif
5762#ifdef AF_SYSTEM
5763 PyModule_AddIntConstant(m, "AF_SYSTEM", AF_SYSTEM);
5764#endif
5765
Antoine Pitroub156a462010-10-27 20:13:57 +00005766#ifdef AF_PACKET
5767 PyModule_AddIntMacro(m, AF_PACKET);
5768#endif
5769#ifdef PF_PACKET
5770 PyModule_AddIntMacro(m, PF_PACKET);
5771#endif
5772#ifdef PACKET_HOST
5773 PyModule_AddIntMacro(m, PACKET_HOST);
5774#endif
5775#ifdef PACKET_BROADCAST
5776 PyModule_AddIntMacro(m, PACKET_BROADCAST);
5777#endif
5778#ifdef PACKET_MULTICAST
5779 PyModule_AddIntMacro(m, PACKET_MULTICAST);
5780#endif
5781#ifdef PACKET_OTHERHOST
5782 PyModule_AddIntMacro(m, PACKET_OTHERHOST);
5783#endif
5784#ifdef PACKET_OUTGOING
5785 PyModule_AddIntMacro(m, PACKET_OUTGOING);
5786#endif
5787#ifdef PACKET_LOOPBACK
5788 PyModule_AddIntMacro(m, PACKET_LOOPBACK);
5789#endif
5790#ifdef PACKET_FASTROUTE
5791 PyModule_AddIntMacro(m, PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00005792#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00005793
Christian Heimes043d6f62008-01-07 17:19:16 +00005794#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005795 PyModule_AddIntConstant(m, "AF_TIPC", AF_TIPC);
Christian Heimes043d6f62008-01-07 17:19:16 +00005796
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005797 /* for addresses */
5798 PyModule_AddIntConstant(m, "TIPC_ADDR_NAMESEQ", TIPC_ADDR_NAMESEQ);
5799 PyModule_AddIntConstant(m, "TIPC_ADDR_NAME", TIPC_ADDR_NAME);
5800 PyModule_AddIntConstant(m, "TIPC_ADDR_ID", TIPC_ADDR_ID);
Christian Heimes043d6f62008-01-07 17:19:16 +00005801
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005802 PyModule_AddIntConstant(m, "TIPC_ZONE_SCOPE", TIPC_ZONE_SCOPE);
5803 PyModule_AddIntConstant(m, "TIPC_CLUSTER_SCOPE", TIPC_CLUSTER_SCOPE);
5804 PyModule_AddIntConstant(m, "TIPC_NODE_SCOPE", TIPC_NODE_SCOPE);
Christian Heimes043d6f62008-01-07 17:19:16 +00005805
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005806 /* for setsockopt() */
5807 PyModule_AddIntConstant(m, "SOL_TIPC", SOL_TIPC);
5808 PyModule_AddIntConstant(m, "TIPC_IMPORTANCE", TIPC_IMPORTANCE);
5809 PyModule_AddIntConstant(m, "TIPC_SRC_DROPPABLE", TIPC_SRC_DROPPABLE);
5810 PyModule_AddIntConstant(m, "TIPC_DEST_DROPPABLE",
5811 TIPC_DEST_DROPPABLE);
5812 PyModule_AddIntConstant(m, "TIPC_CONN_TIMEOUT", TIPC_CONN_TIMEOUT);
Christian Heimes043d6f62008-01-07 17:19:16 +00005813
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005814 PyModule_AddIntConstant(m, "TIPC_LOW_IMPORTANCE",
5815 TIPC_LOW_IMPORTANCE);
5816 PyModule_AddIntConstant(m, "TIPC_MEDIUM_IMPORTANCE",
5817 TIPC_MEDIUM_IMPORTANCE);
5818 PyModule_AddIntConstant(m, "TIPC_HIGH_IMPORTANCE",
5819 TIPC_HIGH_IMPORTANCE);
5820 PyModule_AddIntConstant(m, "TIPC_CRITICAL_IMPORTANCE",
5821 TIPC_CRITICAL_IMPORTANCE);
Christian Heimes043d6f62008-01-07 17:19:16 +00005822
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005823 /* for subscriptions */
5824 PyModule_AddIntConstant(m, "TIPC_SUB_PORTS", TIPC_SUB_PORTS);
5825 PyModule_AddIntConstant(m, "TIPC_SUB_SERVICE", TIPC_SUB_SERVICE);
Christian Heimes25bb7832008-01-11 16:17:00 +00005826#ifdef TIPC_SUB_CANCEL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005827 /* doesn't seem to be available everywhere */
5828 PyModule_AddIntConstant(m, "TIPC_SUB_CANCEL", TIPC_SUB_CANCEL);
Christian Heimes25bb7832008-01-11 16:17:00 +00005829#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005830 PyModule_AddIntConstant(m, "TIPC_WAIT_FOREVER", TIPC_WAIT_FOREVER);
5831 PyModule_AddIntConstant(m, "TIPC_PUBLISHED", TIPC_PUBLISHED);
5832 PyModule_AddIntConstant(m, "TIPC_WITHDRAWN", TIPC_WITHDRAWN);
5833 PyModule_AddIntConstant(m, "TIPC_SUBSCR_TIMEOUT", TIPC_SUBSCR_TIMEOUT);
5834 PyModule_AddIntConstant(m, "TIPC_CFG_SRV", TIPC_CFG_SRV);
5835 PyModule_AddIntConstant(m, "TIPC_TOP_SRV", TIPC_TOP_SRV);
Christian Heimes043d6f62008-01-07 17:19:16 +00005836#endif
5837
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005838 /* Socket types */
5839 PyModule_AddIntConstant(m, "SOCK_STREAM", SOCK_STREAM);
5840 PyModule_AddIntConstant(m, "SOCK_DGRAM", SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00005841/* We have incomplete socket support. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005842 PyModule_AddIntConstant(m, "SOCK_RAW", SOCK_RAW);
5843 PyModule_AddIntConstant(m, "SOCK_SEQPACKET", SOCK_SEQPACKET);
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00005844#if defined(SOCK_RDM)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005845 PyModule_AddIntConstant(m, "SOCK_RDM", SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00005846#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +00005847#ifdef SOCK_CLOEXEC
5848 PyModule_AddIntConstant(m, "SOCK_CLOEXEC", SOCK_CLOEXEC);
5849#endif
5850#ifdef SOCK_NONBLOCK
5851 PyModule_AddIntConstant(m, "SOCK_NONBLOCK", SOCK_NONBLOCK);
5852#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005853
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005854#ifdef SO_DEBUG
5855 PyModule_AddIntConstant(m, "SO_DEBUG", SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005856#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005857#ifdef SO_ACCEPTCONN
5858 PyModule_AddIntConstant(m, "SO_ACCEPTCONN", SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005859#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005860#ifdef SO_REUSEADDR
5861 PyModule_AddIntConstant(m, "SO_REUSEADDR", SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005862#endif
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00005863#ifdef SO_EXCLUSIVEADDRUSE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005864 PyModule_AddIntConstant(m, "SO_EXCLUSIVEADDRUSE", SO_EXCLUSIVEADDRUSE);
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00005865#endif
5866
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005867#ifdef SO_KEEPALIVE
5868 PyModule_AddIntConstant(m, "SO_KEEPALIVE", SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005869#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005870#ifdef SO_DONTROUTE
5871 PyModule_AddIntConstant(m, "SO_DONTROUTE", SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005872#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005873#ifdef SO_BROADCAST
5874 PyModule_AddIntConstant(m, "SO_BROADCAST", SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005875#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005876#ifdef SO_USELOOPBACK
5877 PyModule_AddIntConstant(m, "SO_USELOOPBACK", SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005878#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005879#ifdef SO_LINGER
5880 PyModule_AddIntConstant(m, "SO_LINGER", SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005881#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005882#ifdef SO_OOBINLINE
5883 PyModule_AddIntConstant(m, "SO_OOBINLINE", SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005884#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005885#ifdef SO_REUSEPORT
5886 PyModule_AddIntConstant(m, "SO_REUSEPORT", SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005887#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005888#ifdef SO_SNDBUF
5889 PyModule_AddIntConstant(m, "SO_SNDBUF", SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005890#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005891#ifdef SO_RCVBUF
5892 PyModule_AddIntConstant(m, "SO_RCVBUF", SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005893#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005894#ifdef SO_SNDLOWAT
5895 PyModule_AddIntConstant(m, "SO_SNDLOWAT", SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005896#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005897#ifdef SO_RCVLOWAT
5898 PyModule_AddIntConstant(m, "SO_RCVLOWAT", SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005899#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005900#ifdef SO_SNDTIMEO
5901 PyModule_AddIntConstant(m, "SO_SNDTIMEO", SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005902#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005903#ifdef SO_RCVTIMEO
5904 PyModule_AddIntConstant(m, "SO_RCVTIMEO", SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005905#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005906#ifdef SO_ERROR
5907 PyModule_AddIntConstant(m, "SO_ERROR", SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005908#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005909#ifdef SO_TYPE
5910 PyModule_AddIntConstant(m, "SO_TYPE", SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005911#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005912#ifdef SO_SETFIB
5913 PyModule_AddIntConstant(m, "SO_SETFIB", SO_SETFIB);
Larry Hastingsf0f37952010-04-02 11:47:10 +00005914#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005915#ifdef SO_PASSCRED
5916 PyModule_AddIntConstant(m, "SO_PASSCRED", SO_PASSCRED);
5917#endif
5918#ifdef SO_PEERCRED
5919 PyModule_AddIntConstant(m, "SO_PEERCRED", SO_PEERCRED);
5920#endif
5921#ifdef LOCAL_PEERCRED
5922 PyModule_AddIntConstant(m, "LOCAL_PEERCRED", LOCAL_PEERCRED);
5923#endif
Victor Stinnercb98bed2011-10-25 13:45:48 +02005924#ifdef SO_BINDTODEVICE
5925 PyModule_AddIntMacro(m, SO_BINDTODEVICE);
5926#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005927
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005928 /* Maximum number of connections for "listen" */
5929#ifdef SOMAXCONN
5930 PyModule_AddIntConstant(m, "SOMAXCONN", SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005931#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005932 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005933#endif
5934
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005935 /* Ancilliary message types */
5936#ifdef SCM_RIGHTS
5937 PyModule_AddIntConstant(m, "SCM_RIGHTS", SCM_RIGHTS);
5938#endif
5939#ifdef SCM_CREDENTIALS
5940 PyModule_AddIntConstant(m, "SCM_CREDENTIALS", SCM_CREDENTIALS);
5941#endif
5942#ifdef SCM_CREDS
5943 PyModule_AddIntConstant(m, "SCM_CREDS", SCM_CREDS);
5944#endif
5945
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005946 /* Flags for send, recv */
5947#ifdef MSG_OOB
5948 PyModule_AddIntConstant(m, "MSG_OOB", MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005949#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005950#ifdef MSG_PEEK
5951 PyModule_AddIntConstant(m, "MSG_PEEK", MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005952#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005953#ifdef MSG_DONTROUTE
5954 PyModule_AddIntConstant(m, "MSG_DONTROUTE", MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005955#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005956#ifdef MSG_DONTWAIT
5957 PyModule_AddIntConstant(m, "MSG_DONTWAIT", MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00005958#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005959#ifdef MSG_EOR
5960 PyModule_AddIntConstant(m, "MSG_EOR", MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005961#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005962#ifdef MSG_TRUNC
5963 PyModule_AddIntConstant(m, "MSG_TRUNC", MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005964#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005965#ifdef MSG_CTRUNC
5966 PyModule_AddIntConstant(m, "MSG_CTRUNC", MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005967#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005968#ifdef MSG_WAITALL
5969 PyModule_AddIntConstant(m, "MSG_WAITALL", MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005970#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005971#ifdef MSG_BTAG
5972 PyModule_AddIntConstant(m, "MSG_BTAG", MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005973#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005974#ifdef MSG_ETAG
5975 PyModule_AddIntConstant(m, "MSG_ETAG", MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005976#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005977#ifdef MSG_NOSIGNAL
5978 PyModule_AddIntConstant(m, "MSG_NOSIGNAL", MSG_NOSIGNAL);
5979#endif
5980#ifdef MSG_NOTIFICATION
5981 PyModule_AddIntConstant(m, "MSG_NOTIFICATION", MSG_NOTIFICATION);
5982#endif
5983#ifdef MSG_CMSG_CLOEXEC
5984 PyModule_AddIntConstant(m, "MSG_CMSG_CLOEXEC", MSG_CMSG_CLOEXEC);
5985#endif
5986#ifdef MSG_ERRQUEUE
5987 PyModule_AddIntConstant(m, "MSG_ERRQUEUE", MSG_ERRQUEUE);
5988#endif
5989#ifdef MSG_CONFIRM
5990 PyModule_AddIntConstant(m, "MSG_CONFIRM", MSG_CONFIRM);
5991#endif
5992#ifdef MSG_MORE
5993 PyModule_AddIntConstant(m, "MSG_MORE", MSG_MORE);
5994#endif
5995#ifdef MSG_EOF
5996 PyModule_AddIntConstant(m, "MSG_EOF", MSG_EOF);
5997#endif
5998#ifdef MSG_BCAST
5999 PyModule_AddIntConstant(m, "MSG_BCAST", MSG_BCAST);
6000#endif
6001#ifdef MSG_MCAST
6002 PyModule_AddIntConstant(m, "MSG_MCAST", MSG_MCAST);
6003#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006004
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006005 /* Protocol level and numbers, usable for [gs]etsockopt */
6006#ifdef SOL_SOCKET
6007 PyModule_AddIntConstant(m, "SOL_SOCKET", SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006008#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006009#ifdef SOL_IP
6010 PyModule_AddIntConstant(m, "SOL_IP", SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006011#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006012 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00006013#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006014#ifdef SOL_IPX
6015 PyModule_AddIntConstant(m, "SOL_IPX", SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00006016#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006017#ifdef SOL_AX25
6018 PyModule_AddIntConstant(m, "SOL_AX25", SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00006019#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006020#ifdef SOL_ATALK
6021 PyModule_AddIntConstant(m, "SOL_ATALK", SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00006022#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006023#ifdef SOL_NETROM
6024 PyModule_AddIntConstant(m, "SOL_NETROM", SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00006025#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006026#ifdef SOL_ROSE
6027 PyModule_AddIntConstant(m, "SOL_ROSE", SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006028#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006029#ifdef SOL_TCP
6030 PyModule_AddIntConstant(m, "SOL_TCP", SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006031#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006032 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00006033#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006034#ifdef SOL_UDP
6035 PyModule_AddIntConstant(m, "SOL_UDP", SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006036#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006037 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00006038#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02006039#ifdef SOL_CAN_BASE
6040 PyModule_AddIntConstant(m, "SOL_CAN_BASE", SOL_CAN_BASE);
6041#endif
6042#ifdef SOL_CAN_RAW
6043 PyModule_AddIntConstant(m, "SOL_CAN_RAW", SOL_CAN_RAW);
6044 PyModule_AddIntConstant(m, "CAN_RAW", CAN_RAW);
6045#endif
6046#ifdef HAVE_LINUX_CAN_H
6047 PyModule_AddIntConstant(m, "CAN_EFF_FLAG", CAN_EFF_FLAG);
6048 PyModule_AddIntConstant(m, "CAN_RTR_FLAG", CAN_RTR_FLAG);
6049 PyModule_AddIntConstant(m, "CAN_ERR_FLAG", CAN_ERR_FLAG);
6050
6051 PyModule_AddIntConstant(m, "CAN_SFF_MASK", CAN_SFF_MASK);
6052 PyModule_AddIntConstant(m, "CAN_EFF_MASK", CAN_EFF_MASK);
6053 PyModule_AddIntConstant(m, "CAN_ERR_MASK", CAN_ERR_MASK);
6054#endif
6055#ifdef HAVE_LINUX_CAN_RAW_H
6056 PyModule_AddIntConstant(m, "CAN_RAW_FILTER", CAN_RAW_FILTER);
6057 PyModule_AddIntConstant(m, "CAN_RAW_ERR_FILTER", CAN_RAW_ERR_FILTER);
6058 PyModule_AddIntConstant(m, "CAN_RAW_LOOPBACK", CAN_RAW_LOOPBACK);
6059 PyModule_AddIntConstant(m, "CAN_RAW_RECV_OWN_MSGS", CAN_RAW_RECV_OWN_MSGS);
6060#endif
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006061#ifdef SOL_RDS
6062 PyModule_AddIntConstant(m, "SOL_RDS", SOL_RDS);
6063#endif
6064#ifdef RDS_CANCEL_SENT_TO
6065 PyModule_AddIntConstant(m, "RDS_CANCEL_SENT_TO", RDS_CANCEL_SENT_TO);
6066#endif
6067#ifdef RDS_GET_MR
6068 PyModule_AddIntConstant(m, "RDS_GET_MR", RDS_GET_MR);
6069#endif
6070#ifdef RDS_FREE_MR
6071 PyModule_AddIntConstant(m, "RDS_FREE_MR", RDS_FREE_MR);
6072#endif
6073#ifdef RDS_RECVERR
6074 PyModule_AddIntConstant(m, "RDS_RECVERR", RDS_RECVERR);
6075#endif
6076#ifdef RDS_CONG_MONITOR
6077 PyModule_AddIntConstant(m, "RDS_CONG_MONITOR", RDS_CONG_MONITOR);
6078#endif
6079#ifdef RDS_GET_MR_FOR_DEST
6080 PyModule_AddIntConstant(m, "RDS_GET_MR_FOR_DEST", RDS_GET_MR_FOR_DEST);
6081#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006082#ifdef IPPROTO_IP
6083 PyModule_AddIntConstant(m, "IPPROTO_IP", IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00006084#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006085 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006086#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006087#ifdef IPPROTO_HOPOPTS
6088 PyModule_AddIntConstant(m, "IPPROTO_HOPOPTS", IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006089#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006090#ifdef IPPROTO_ICMP
6091 PyModule_AddIntConstant(m, "IPPROTO_ICMP", IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00006092#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006093 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006094#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006095#ifdef IPPROTO_IGMP
6096 PyModule_AddIntConstant(m, "IPPROTO_IGMP", IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006097#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006098#ifdef IPPROTO_GGP
6099 PyModule_AddIntConstant(m, "IPPROTO_GGP", IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006100#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006101#ifdef IPPROTO_IPV4
6102 PyModule_AddIntConstant(m, "IPPROTO_IPV4", IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006103#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006104#ifdef IPPROTO_IPV6
6105 PyModule_AddIntConstant(m, "IPPROTO_IPV6", IPPROTO_IPV6);
Martin v. Löwisa0f17342003-10-03 13:56:20 +00006106#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006107#ifdef IPPROTO_IPIP
6108 PyModule_AddIntConstant(m, "IPPROTO_IPIP", IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006109#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006110#ifdef IPPROTO_TCP
6111 PyModule_AddIntConstant(m, "IPPROTO_TCP", IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00006112#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006113 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006114#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006115#ifdef IPPROTO_EGP
6116 PyModule_AddIntConstant(m, "IPPROTO_EGP", IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006117#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006118#ifdef IPPROTO_PUP
6119 PyModule_AddIntConstant(m, "IPPROTO_PUP", IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006120#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006121#ifdef IPPROTO_UDP
6122 PyModule_AddIntConstant(m, "IPPROTO_UDP", IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00006123#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006124 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006125#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006126#ifdef IPPROTO_IDP
6127 PyModule_AddIntConstant(m, "IPPROTO_IDP", IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006128#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006129#ifdef IPPROTO_HELLO
6130 PyModule_AddIntConstant(m, "IPPROTO_HELLO", IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006131#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006132#ifdef IPPROTO_ND
6133 PyModule_AddIntConstant(m, "IPPROTO_ND", IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006134#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006135#ifdef IPPROTO_TP
6136 PyModule_AddIntConstant(m, "IPPROTO_TP", IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006137#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006138#ifdef IPPROTO_IPV6
6139 PyModule_AddIntConstant(m, "IPPROTO_IPV6", IPPROTO_IPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006140#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006141#ifdef IPPROTO_ROUTING
6142 PyModule_AddIntConstant(m, "IPPROTO_ROUTING", IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006143#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006144#ifdef IPPROTO_FRAGMENT
6145 PyModule_AddIntConstant(m, "IPPROTO_FRAGMENT", IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006146#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006147#ifdef IPPROTO_RSVP
6148 PyModule_AddIntConstant(m, "IPPROTO_RSVP", IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006149#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006150#ifdef IPPROTO_GRE
6151 PyModule_AddIntConstant(m, "IPPROTO_GRE", IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006152#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006153#ifdef IPPROTO_ESP
6154 PyModule_AddIntConstant(m, "IPPROTO_ESP", IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006155#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006156#ifdef IPPROTO_AH
6157 PyModule_AddIntConstant(m, "IPPROTO_AH", IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006158#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006159#ifdef IPPROTO_MOBILE
6160 PyModule_AddIntConstant(m, "IPPROTO_MOBILE", IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006161#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006162#ifdef IPPROTO_ICMPV6
6163 PyModule_AddIntConstant(m, "IPPROTO_ICMPV6", IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006164#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006165#ifdef IPPROTO_NONE
6166 PyModule_AddIntConstant(m, "IPPROTO_NONE", IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006167#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006168#ifdef IPPROTO_DSTOPTS
6169 PyModule_AddIntConstant(m, "IPPROTO_DSTOPTS", IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006170#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006171#ifdef IPPROTO_XTP
6172 PyModule_AddIntConstant(m, "IPPROTO_XTP", IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006173#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006174#ifdef IPPROTO_EON
6175 PyModule_AddIntConstant(m, "IPPROTO_EON", IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006176#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006177#ifdef IPPROTO_PIM
6178 PyModule_AddIntConstant(m, "IPPROTO_PIM", IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006179#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006180#ifdef IPPROTO_IPCOMP
6181 PyModule_AddIntConstant(m, "IPPROTO_IPCOMP", IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006182#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006183#ifdef IPPROTO_VRRP
6184 PyModule_AddIntConstant(m, "IPPROTO_VRRP", IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006185#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006186#ifdef IPPROTO_SCTP
6187 PyModule_AddIntConstant(m, "IPPROTO_SCTP", IPPROTO_SCTP);
6188#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006189#ifdef IPPROTO_BIP
6190 PyModule_AddIntConstant(m, "IPPROTO_BIP", IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006191#endif
6192/**/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006193#ifdef IPPROTO_RAW
6194 PyModule_AddIntConstant(m, "IPPROTO_RAW", IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00006195#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006196 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006197#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006198#ifdef IPPROTO_MAX
6199 PyModule_AddIntConstant(m, "IPPROTO_MAX", IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006200#endif
6201
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006202#ifdef SYSPROTO_CONTROL
6203 PyModule_AddIntConstant(m, "SYSPROTO_CONTROL", SYSPROTO_CONTROL);
6204#endif
6205
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006206 /* Some port configuration */
6207#ifdef IPPORT_RESERVED
6208 PyModule_AddIntConstant(m, "IPPORT_RESERVED", IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006209#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006210 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006211#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006212#ifdef IPPORT_USERRESERVED
6213 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006214#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006215 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006216#endif
6217
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006218 /* Some reserved IP v.4 addresses */
6219#ifdef INADDR_ANY
6220 PyModule_AddIntConstant(m, "INADDR_ANY", INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006221#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006222 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006223#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006224#ifdef INADDR_BROADCAST
6225 PyModule_AddIntConstant(m, "INADDR_BROADCAST", INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006226#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006227 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006228#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006229#ifdef INADDR_LOOPBACK
6230 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006231#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006232 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006233#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006234#ifdef INADDR_UNSPEC_GROUP
6235 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006236#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006237 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006238#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006239#ifdef INADDR_ALLHOSTS_GROUP
6240 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
6241 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006242#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006243 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006244#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006245#ifdef INADDR_MAX_LOCAL_GROUP
6246 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP",
6247 INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006248#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006249 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006250#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006251#ifdef INADDR_NONE
6252 PyModule_AddIntConstant(m, "INADDR_NONE", INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006253#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006254 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006255#endif
6256
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006257 /* IPv4 [gs]etsockopt options */
6258#ifdef IP_OPTIONS
6259 PyModule_AddIntConstant(m, "IP_OPTIONS", IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006260#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006261#ifdef IP_HDRINCL
6262 PyModule_AddIntConstant(m, "IP_HDRINCL", IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006263#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006264#ifdef IP_TOS
6265 PyModule_AddIntConstant(m, "IP_TOS", IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006266#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006267#ifdef IP_TTL
6268 PyModule_AddIntConstant(m, "IP_TTL", IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006269#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006270#ifdef IP_RECVOPTS
6271 PyModule_AddIntConstant(m, "IP_RECVOPTS", IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006272#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006273#ifdef IP_RECVRETOPTS
6274 PyModule_AddIntConstant(m, "IP_RECVRETOPTS", IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006275#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006276#ifdef IP_RECVDSTADDR
6277 PyModule_AddIntConstant(m, "IP_RECVDSTADDR", IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006278#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006279#ifdef IP_RETOPTS
6280 PyModule_AddIntConstant(m, "IP_RETOPTS", IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006281#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006282#ifdef IP_MULTICAST_IF
6283 PyModule_AddIntConstant(m, "IP_MULTICAST_IF", IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006284#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006285#ifdef IP_MULTICAST_TTL
6286 PyModule_AddIntConstant(m, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006287#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006288#ifdef IP_MULTICAST_LOOP
6289 PyModule_AddIntConstant(m, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006290#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006291#ifdef IP_ADD_MEMBERSHIP
6292 PyModule_AddIntConstant(m, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006293#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006294#ifdef IP_DROP_MEMBERSHIP
6295 PyModule_AddIntConstant(m, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006296#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006297#ifdef IP_DEFAULT_MULTICAST_TTL
6298 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_TTL",
6299 IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00006300#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006301#ifdef IP_DEFAULT_MULTICAST_LOOP
6302 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_LOOP",
6303 IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006304#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006305#ifdef IP_MAX_MEMBERSHIPS
6306 PyModule_AddIntConstant(m, "IP_MAX_MEMBERSHIPS", IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00006307#endif
Charles-François Natali564a42c2011-12-17 14:59:56 +01006308#ifdef IP_TRANSPARENT
6309 PyModule_AddIntConstant(m, "IP_TRANSPARENT", IP_TRANSPARENT);
6310#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006311
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006312 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
6313#ifdef IPV6_JOIN_GROUP
6314 PyModule_AddIntConstant(m, "IPV6_JOIN_GROUP", IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006315#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006316#ifdef IPV6_LEAVE_GROUP
6317 PyModule_AddIntConstant(m, "IPV6_LEAVE_GROUP", IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006318#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006319#ifdef IPV6_MULTICAST_HOPS
6320 PyModule_AddIntConstant(m, "IPV6_MULTICAST_HOPS", IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006321#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006322#ifdef IPV6_MULTICAST_IF
6323 PyModule_AddIntConstant(m, "IPV6_MULTICAST_IF", IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006324#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006325#ifdef IPV6_MULTICAST_LOOP
6326 PyModule_AddIntConstant(m, "IPV6_MULTICAST_LOOP", IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006327#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006328#ifdef IPV6_UNICAST_HOPS
6329 PyModule_AddIntConstant(m, "IPV6_UNICAST_HOPS", IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006330#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006331 /* Additional IPV6 socket options, defined in RFC 3493 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00006332#ifdef IPV6_V6ONLY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006333 PyModule_AddIntConstant(m, "IPV6_V6ONLY", IPV6_V6ONLY);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006334#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006335 /* Advanced IPV6 socket options, from RFC 3542 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00006336#ifdef IPV6_CHECKSUM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006337 PyModule_AddIntConstant(m, "IPV6_CHECKSUM", IPV6_CHECKSUM);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006338#endif
6339#ifdef IPV6_DONTFRAG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006340 PyModule_AddIntConstant(m, "IPV6_DONTFRAG", IPV6_DONTFRAG);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006341#endif
6342#ifdef IPV6_DSTOPTS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006343 PyModule_AddIntConstant(m, "IPV6_DSTOPTS", IPV6_DSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006344#endif
6345#ifdef IPV6_HOPLIMIT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006346 PyModule_AddIntConstant(m, "IPV6_HOPLIMIT", IPV6_HOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006347#endif
6348#ifdef IPV6_HOPOPTS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006349 PyModule_AddIntConstant(m, "IPV6_HOPOPTS", IPV6_HOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006350#endif
6351#ifdef IPV6_NEXTHOP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006352 PyModule_AddIntConstant(m, "IPV6_NEXTHOP", IPV6_NEXTHOP);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006353#endif
6354#ifdef IPV6_PATHMTU
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006355 PyModule_AddIntConstant(m, "IPV6_PATHMTU", IPV6_PATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006356#endif
6357#ifdef IPV6_PKTINFO
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006358 PyModule_AddIntConstant(m, "IPV6_PKTINFO", IPV6_PKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006359#endif
6360#ifdef IPV6_RECVDSTOPTS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006361 PyModule_AddIntConstant(m, "IPV6_RECVDSTOPTS", IPV6_RECVDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006362#endif
6363#ifdef IPV6_RECVHOPLIMIT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006364 PyModule_AddIntConstant(m, "IPV6_RECVHOPLIMIT", IPV6_RECVHOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006365#endif
6366#ifdef IPV6_RECVHOPOPTS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006367 PyModule_AddIntConstant(m, "IPV6_RECVHOPOPTS", IPV6_RECVHOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006368#endif
6369#ifdef IPV6_RECVPKTINFO
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006370 PyModule_AddIntConstant(m, "IPV6_RECVPKTINFO", IPV6_RECVPKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006371#endif
6372#ifdef IPV6_RECVRTHDR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006373 PyModule_AddIntConstant(m, "IPV6_RECVRTHDR", IPV6_RECVRTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006374#endif
6375#ifdef IPV6_RECVTCLASS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006376 PyModule_AddIntConstant(m, "IPV6_RECVTCLASS", IPV6_RECVTCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006377#endif
6378#ifdef IPV6_RTHDR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006379 PyModule_AddIntConstant(m, "IPV6_RTHDR", IPV6_RTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006380#endif
6381#ifdef IPV6_RTHDRDSTOPTS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006382 PyModule_AddIntConstant(m, "IPV6_RTHDRDSTOPTS", IPV6_RTHDRDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006383#endif
6384#ifdef IPV6_RTHDR_TYPE_0
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006385 PyModule_AddIntConstant(m, "IPV6_RTHDR_TYPE_0", IPV6_RTHDR_TYPE_0);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006386#endif
6387#ifdef IPV6_RECVPATHMTU
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006388 PyModule_AddIntConstant(m, "IPV6_RECVPATHMTU", IPV6_RECVPATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006389#endif
6390#ifdef IPV6_TCLASS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006391 PyModule_AddIntConstant(m, "IPV6_TCLASS", IPV6_TCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006392#endif
6393#ifdef IPV6_USE_MIN_MTU
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006394 PyModule_AddIntConstant(m, "IPV6_USE_MIN_MTU", IPV6_USE_MIN_MTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006395#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006396
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006397 /* TCP options */
6398#ifdef TCP_NODELAY
6399 PyModule_AddIntConstant(m, "TCP_NODELAY", TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00006400#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006401#ifdef TCP_MAXSEG
6402 PyModule_AddIntConstant(m, "TCP_MAXSEG", TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00006403#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006404#ifdef TCP_CORK
6405 PyModule_AddIntConstant(m, "TCP_CORK", TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006406#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006407#ifdef TCP_KEEPIDLE
6408 PyModule_AddIntConstant(m, "TCP_KEEPIDLE", TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006409#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006410#ifdef TCP_KEEPINTVL
6411 PyModule_AddIntConstant(m, "TCP_KEEPINTVL", TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006412#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006413#ifdef TCP_KEEPCNT
6414 PyModule_AddIntConstant(m, "TCP_KEEPCNT", TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006415#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006416#ifdef TCP_SYNCNT
6417 PyModule_AddIntConstant(m, "TCP_SYNCNT", TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006418#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006419#ifdef TCP_LINGER2
6420 PyModule_AddIntConstant(m, "TCP_LINGER2", TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006421#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006422#ifdef TCP_DEFER_ACCEPT
6423 PyModule_AddIntConstant(m, "TCP_DEFER_ACCEPT", TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006424#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006425#ifdef TCP_WINDOW_CLAMP
6426 PyModule_AddIntConstant(m, "TCP_WINDOW_CLAMP", TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006427#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006428#ifdef TCP_INFO
6429 PyModule_AddIntConstant(m, "TCP_INFO", TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006430#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006431#ifdef TCP_QUICKACK
6432 PyModule_AddIntConstant(m, "TCP_QUICKACK", TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006433#endif
6434
Guido van Rossum09be4091999-08-09 14:40:40 +00006435
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006436 /* IPX options */
6437#ifdef IPX_TYPE
6438 PyModule_AddIntConstant(m, "IPX_TYPE", IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006439#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00006440
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006441/* Reliable Datagram Sockets */
6442#ifdef RDS_CMSG_RDMA_ARGS
6443 PyModule_AddIntConstant(m, "RDS_CMSG_RDMA_ARGS", RDS_CMSG_RDMA_ARGS);
6444#endif
6445#ifdef RDS_CMSG_RDMA_DEST
6446 PyModule_AddIntConstant(m, "RDS_CMSG_RDMA_DEST", RDS_CMSG_RDMA_DEST);
6447#endif
6448#ifdef RDS_CMSG_RDMA_MAP
6449 PyModule_AddIntConstant(m, "RDS_CMSG_RDMA_MAP", RDS_CMSG_RDMA_MAP);
6450#endif
6451#ifdef RDS_CMSG_RDMA_STATUS
6452 PyModule_AddIntConstant(m, "RDS_CMSG_RDMA_STATUS", RDS_CMSG_RDMA_STATUS);
6453#endif
6454#ifdef RDS_CMSG_RDMA_UPDATE
6455 PyModule_AddIntConstant(m, "RDS_CMSG_RDMA_UPDATE", RDS_CMSG_RDMA_UPDATE);
6456#endif
6457#ifdef RDS_RDMA_READWRITE
6458 PyModule_AddIntConstant(m, "RDS_RDMA_READWRITE", RDS_RDMA_READWRITE);
6459#endif
6460#ifdef RDS_RDMA_FENCE
6461 PyModule_AddIntConstant(m, "RDS_RDMA_FENCE", RDS_RDMA_FENCE);
6462#endif
6463#ifdef RDS_RDMA_INVALIDATE
6464 PyModule_AddIntConstant(m, "RDS_RDMA_INVALIDATE", RDS_RDMA_INVALIDATE);
6465#endif
6466#ifdef RDS_RDMA_USE_ONCE
6467 PyModule_AddIntConstant(m, "RDS_RDMA_USE_ONCE", RDS_RDMA_USE_ONCE);
6468#endif
6469#ifdef RDS_RDMA_DONTWAIT
6470 PyModule_AddIntConstant(m, "RDS_RDMA_DONTWAIT", RDS_RDMA_DONTWAIT);
6471#endif
6472#ifdef RDS_RDMA_NOTIFY_ME
6473 PyModule_AddIntConstant(m, "RDS_RDMA_NOTIFY_ME", RDS_RDMA_NOTIFY_ME);
6474#endif
6475#ifdef RDS_RDMA_SILENT
6476 PyModule_AddIntConstant(m, "RDS_RDMA_SILENT", RDS_RDMA_SILENT);
6477#endif
6478
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006479 /* get{addr,name}info parameters */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006480#ifdef EAI_ADDRFAMILY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006481 PyModule_AddIntConstant(m, "EAI_ADDRFAMILY", EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006482#endif
6483#ifdef EAI_AGAIN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006484 PyModule_AddIntConstant(m, "EAI_AGAIN", EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006485#endif
6486#ifdef EAI_BADFLAGS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006487 PyModule_AddIntConstant(m, "EAI_BADFLAGS", EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006488#endif
6489#ifdef EAI_FAIL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006490 PyModule_AddIntConstant(m, "EAI_FAIL", EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006491#endif
6492#ifdef EAI_FAMILY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006493 PyModule_AddIntConstant(m, "EAI_FAMILY", EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006494#endif
6495#ifdef EAI_MEMORY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006496 PyModule_AddIntConstant(m, "EAI_MEMORY", EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006497#endif
6498#ifdef EAI_NODATA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006499 PyModule_AddIntConstant(m, "EAI_NODATA", EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006500#endif
6501#ifdef EAI_NONAME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006502 PyModule_AddIntConstant(m, "EAI_NONAME", EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006503#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00006504#ifdef EAI_OVERFLOW
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006505 PyModule_AddIntConstant(m, "EAI_OVERFLOW", EAI_OVERFLOW);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006506#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006507#ifdef EAI_SERVICE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006508 PyModule_AddIntConstant(m, "EAI_SERVICE", EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006509#endif
6510#ifdef EAI_SOCKTYPE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006511 PyModule_AddIntConstant(m, "EAI_SOCKTYPE", EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006512#endif
6513#ifdef EAI_SYSTEM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006514 PyModule_AddIntConstant(m, "EAI_SYSTEM", EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006515#endif
6516#ifdef EAI_BADHINTS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006517 PyModule_AddIntConstant(m, "EAI_BADHINTS", EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006518#endif
6519#ifdef EAI_PROTOCOL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006520 PyModule_AddIntConstant(m, "EAI_PROTOCOL", EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006521#endif
6522#ifdef EAI_MAX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006523 PyModule_AddIntConstant(m, "EAI_MAX", EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006524#endif
6525#ifdef AI_PASSIVE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006526 PyModule_AddIntConstant(m, "AI_PASSIVE", AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006527#endif
6528#ifdef AI_CANONNAME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006529 PyModule_AddIntConstant(m, "AI_CANONNAME", AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006530#endif
6531#ifdef AI_NUMERICHOST
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006532 PyModule_AddIntConstant(m, "AI_NUMERICHOST", AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006533#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00006534#ifdef AI_NUMERICSERV
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006535 PyModule_AddIntConstant(m, "AI_NUMERICSERV", AI_NUMERICSERV);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006536#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006537#ifdef AI_MASK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006538 PyModule_AddIntConstant(m, "AI_MASK", AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006539#endif
6540#ifdef AI_ALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006541 PyModule_AddIntConstant(m, "AI_ALL", AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006542#endif
6543#ifdef AI_V4MAPPED_CFG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006544 PyModule_AddIntConstant(m, "AI_V4MAPPED_CFG", AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006545#endif
6546#ifdef AI_ADDRCONFIG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006547 PyModule_AddIntConstant(m, "AI_ADDRCONFIG", AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006548#endif
6549#ifdef AI_V4MAPPED
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006550 PyModule_AddIntConstant(m, "AI_V4MAPPED", AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006551#endif
6552#ifdef AI_DEFAULT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006553 PyModule_AddIntConstant(m, "AI_DEFAULT", AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006554#endif
6555#ifdef NI_MAXHOST
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006556 PyModule_AddIntConstant(m, "NI_MAXHOST", NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006557#endif
6558#ifdef NI_MAXSERV
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006559 PyModule_AddIntConstant(m, "NI_MAXSERV", NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006560#endif
6561#ifdef NI_NOFQDN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006562 PyModule_AddIntConstant(m, "NI_NOFQDN", NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006563#endif
6564#ifdef NI_NUMERICHOST
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006565 PyModule_AddIntConstant(m, "NI_NUMERICHOST", NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006566#endif
6567#ifdef NI_NAMEREQD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006568 PyModule_AddIntConstant(m, "NI_NAMEREQD", NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006569#endif
6570#ifdef NI_NUMERICSERV
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006571 PyModule_AddIntConstant(m, "NI_NUMERICSERV", NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006572#endif
6573#ifdef NI_DGRAM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006574 PyModule_AddIntConstant(m, "NI_DGRAM", NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006575#endif
6576
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006577 /* shutdown() parameters */
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006578#ifdef SHUT_RD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006579 PyModule_AddIntConstant(m, "SHUT_RD", SHUT_RD);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006580#elif defined(SD_RECEIVE)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006581 PyModule_AddIntConstant(m, "SHUT_RD", SD_RECEIVE);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006582#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006583 PyModule_AddIntConstant(m, "SHUT_RD", 0);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006584#endif
6585#ifdef SHUT_WR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006586 PyModule_AddIntConstant(m, "SHUT_WR", SHUT_WR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006587#elif defined(SD_SEND)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006588 PyModule_AddIntConstant(m, "SHUT_WR", SD_SEND);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006589#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006590 PyModule_AddIntConstant(m, "SHUT_WR", 1);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006591#endif
6592#ifdef SHUT_RDWR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006593 PyModule_AddIntConstant(m, "SHUT_RDWR", SHUT_RDWR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006594#elif defined(SD_BOTH)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006595 PyModule_AddIntConstant(m, "SHUT_RDWR", SD_BOTH);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006596#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006597 PyModule_AddIntConstant(m, "SHUT_RDWR", 2);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006598#endif
6599
Christian Heimesfaf2f632008-01-06 16:59:19 +00006600#ifdef SIO_RCVALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006601 {
6602 DWORD codes[] = {SIO_RCVALL, SIO_KEEPALIVE_VALS};
6603 const char *names[] = {"SIO_RCVALL", "SIO_KEEPALIVE_VALS"};
6604 int i;
Victor Stinner63941882011-09-29 00:42:28 +02006605 for(i = 0; i<Py_ARRAY_LENGTH(codes); ++i) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006606 PyObject *tmp;
6607 tmp = PyLong_FromUnsignedLong(codes[i]);
6608 if (tmp == NULL)
6609 return NULL;
6610 PyModule_AddObject(m, names[i], tmp);
6611 }
6612 }
6613 PyModule_AddIntConstant(m, "RCVALL_OFF", RCVALL_OFF);
6614 PyModule_AddIntConstant(m, "RCVALL_ON", RCVALL_ON);
6615 PyModule_AddIntConstant(m, "RCVALL_SOCKETLEVELONLY", RCVALL_SOCKETLEVELONLY);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00006616#ifdef RCVALL_IPLEVEL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006617 PyModule_AddIntConstant(m, "RCVALL_IPLEVEL", RCVALL_IPLEVEL);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00006618#endif
6619#ifdef RCVALL_MAX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006620 PyModule_AddIntConstant(m, "RCVALL_MAX", RCVALL_MAX);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00006621#endif
Christian Heimesfaf2f632008-01-06 16:59:19 +00006622#endif /* _MSTCPIP_ */
6623
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006624 /* Initialize gethostbyname lock */
Just van Rossum1040d2c2003-05-09 07:53:18 +00006625#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006626 netdb_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00006627#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006628 return m;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00006629}
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006630
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006631
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006632#ifndef HAVE_INET_PTON
Christian Heimes96e7b3d2007-11-20 06:51:17 +00006633#if !defined(NTDDI_VERSION) || (NTDDI_VERSION < NTDDI_LONGHORN)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006634
6635/* Simplistic emulation code for inet_pton that only works for IPv4 */
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006636/* These are not exposed because they do not set errno properly */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006637
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006638int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006639inet_pton(int af, const char *src, void *dst)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006640{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006641 if (af == AF_INET) {
Benjamin Petersonf91df042009-02-13 02:50:59 +00006642#if (SIZEOF_INT != 4)
6643#error "Not sure if in_addr_t exists and int is not 32-bits."
6644#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006645 unsigned int packed_addr;
6646 packed_addr = inet_addr(src);
6647 if (packed_addr == INADDR_NONE)
6648 return 0;
6649 memcpy(dst, &packed_addr, 4);
6650 return 1;
6651 }
6652 /* Should set errno to EAFNOSUPPORT */
6653 return -1;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006654}
6655
Martin v. Löwisc925b1532001-07-21 09:42:15 +00006656const char *
6657inet_ntop(int af, const void *src, char *dst, socklen_t size)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006658{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006659 if (af == AF_INET) {
6660 struct in_addr packed_addr;
6661 if (size < 16)
6662 /* Should set errno to ENOSPC. */
6663 return NULL;
6664 memcpy(&packed_addr, src, sizeof(packed_addr));
6665 return strncpy(dst, inet_ntoa(packed_addr), size);
6666 }
6667 /* Should set errno to EAFNOSUPPORT */
6668 return NULL;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006669}
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006670
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006671#endif
Christian Heimesb6150692007-11-15 23:37:07 +00006672#endif