blob: b2ab5e95417464a31d9db91ae07d0550330776e4 [file] [log] [blame]
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001/* Socket module */
2
3/*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005This module provides an interface to Berkeley socket IPC.
6
7Limitations:
8
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00009- Only AF_INET, AF_INET6 and AF_UNIX address families are supported in a
Christian Heimes043d6f62008-01-07 17:19:16 +000010 portable manner, though AF_PACKET, AF_NETLINK and AF_TIPC are supported
11 under Linux.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000012- No read/write operations (use sendall/recv or makefile instead).
13- Additional restrictions apply on some non-Unix platforms (compensated
14 for by socket.py).
Guido van Rossum6574b3e1991-06-25 21:36:08 +000015
Guido van Rossum27e177d1995-03-16 15:43:47 +000016Module interface:
Guido van Rossum6574b3e1991-06-25 21:36:08 +000017
Guido van Rossum27e177d1995-03-16 15:43:47 +000018- socket.error: exception raised for socket specific errors
Martin v. Löwis2d8d4272001-07-21 18:05:31 +000019- socket.gaierror: exception raised for getaddrinfo/getnameinfo errors,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000020 a subclass of socket.error
Martin v. Löwis2d8d4272001-07-21 18:05:31 +000021- socket.herror: exception raised for gethostby* errors,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000022 a subclass of socket.error
Guido van Rossum30a685f1991-06-27 15:51:29 +000023- socket.gethostbyname(hostname) --> host IP address (string: 'dd.dd.dd.dd')
Guido van Rossum3bbc62e1995-01-02 19:30:30 +000024- socket.gethostbyaddr(IP address) --> (hostname, [alias, ...], [IP addr, ...])
Guido van Rossum27e177d1995-03-16 15:43:47 +000025- socket.gethostname() --> host name (string: 'spam' or 'spam.domain.com')
Guido van Rossum25405c71996-12-19 16:42:52 +000026- socket.getprotobyname(protocolname) --> protocol number
Barry Warsaw11b91a02004-06-28 00:50:43 +000027- socket.getservbyname(servicename[, protocolname]) --> port number
28- socket.getservbyport(portnumber[, protocolname]) --> service name
Guido van Rossum7d0a8262007-05-21 23:13:11 +000029- socket.socket([family[, type [, proto, fileno]]]) --> new socket object
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000030 (fileno specifies a pre-existing socket file descriptor)
Dave Cole331708b2004-08-09 04:51:41 +000031- socket.socketpair([family[, type [, proto]]]) --> (socket, socket)
Guido van Rossum006bf911996-06-12 04:04:55 +000032- socket.ntohs(16 bit value) --> new int object
33- socket.ntohl(32 bit value) --> new int object
34- socket.htons(16 bit value) --> new int object
35- socket.htonl(32 bit value) --> new int object
Martin v. Löwis2d8d4272001-07-21 18:05:31 +000036- socket.getaddrinfo(host, port [, family, socktype, proto, flags])
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000037 --> List of (family, socktype, proto, canonname, sockaddr)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +000038- socket.getnameinfo(sockaddr, flags) --> (host, port)
Guido van Rossum27e177d1995-03-16 15:43:47 +000039- socket.AF_INET, socket.SOCK_STREAM, etc.: constants from <socket.h>
Guido van Rossum47dfa4a2003-04-25 05:48:32 +000040- socket.has_ipv6: boolean value indicating if IPv6 is supported
Guido van Rossum5c9eb211999-08-20 18:21:51 +000041- socket.inet_aton(IP address) -> 32-bit packed IP representation
42- socket.inet_ntoa(packed IP) -> IP address string
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +000043- socket.getdefaulttimeout() -> None | float
44- socket.setdefaulttimeout(None | float)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -070045- socket.if_nameindex() -> list of tuples (if_index, if_name)
46- socket.if_nametoindex(name) -> corresponding interface index
47- socket.if_indextoname(index) -> corresponding interface name
Guido van Rossum6574b3e1991-06-25 21:36:08 +000048- an Internet socket address is a pair (hostname, port)
49 where hostname can be anything recognized by gethostbyname()
50 (including the dd.dd.dd.dd notation) and port is in host byte order
51- where a hostname is returned, the dd.dd.dd.dd notation is used
Guido van Rossum27e177d1995-03-16 15:43:47 +000052- a UNIX domain socket address is a string specifying the pathname
Jeremy Hylton22308652001-02-02 03:23:09 +000053- an AF_PACKET socket address is a tuple containing a string
54 specifying the ethernet interface and an integer specifying
55 the Ethernet protocol number to be received. For example:
Jeremy Hyltondbfb6622001-02-02 19:55:17 +000056 ("eth0",0x1234). Optional 3rd,4th,5th elements in the tuple
Andrew M. Kuchlingb8e17172004-07-10 23:39:35 +000057 specify packet-type and ha-type/addr.
Christian Heimes043d6f62008-01-07 17:19:16 +000058- an AF_TIPC socket address is expressed as
59 (addr_type, v1, v2, v3 [, scope]); where addr_type can be one of:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000060 TIPC_ADDR_NAMESEQ, TIPC_ADDR_NAME, and TIPC_ADDR_ID;
Christian Heimes043d6f62008-01-07 17:19:16 +000061 and scope can be one of:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000062 TIPC_ZONE_SCOPE, TIPC_CLUSTER_SCOPE, and TIPC_NODE_SCOPE.
Christian Heimes043d6f62008-01-07 17:19:16 +000063 The meaning of v1, v2 and v3 depends on the value of addr_type:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000064 if addr_type is TIPC_ADDR_NAME:
65 v1 is the server type
66 v2 is the port identifier
67 v3 is ignored
68 if addr_type is TIPC_ADDR_NAMESEQ:
69 v1 is the server type
70 v2 is the lower port number
71 v3 is the upper port number
72 if addr_type is TIPC_ADDR_ID:
73 v1 is the node
74 v2 is the ref
75 v3 is ignored
Christian Heimes043d6f62008-01-07 17:19:16 +000076
Guido van Rossum6574b3e1991-06-25 21:36:08 +000077
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000078Local naming conventions:
Guido van Rossum6574b3e1991-06-25 21:36:08 +000079
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000080- names starting with sock_ are socket object methods
81- names starting with socket_ are module-level functions
82- names starting with PySocket are exported through socketmodule.h
Guido van Rossum30a685f1991-06-27 15:51:29 +000083
Guido van Rossum6574b3e1991-06-25 21:36:08 +000084*/
85
Thomas Wouters477c8d52006-05-27 19:21:47 +000086#ifdef __APPLE__
87 /*
88 * inet_aton is not available on OSX 10.3, yet we want to use a binary
89 * that was build on 10.4 or later to work on that release, weak linking
90 * comes to the rescue.
91 */
92# pragma weak inet_aton
93#endif
94
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000095#include "Python.h"
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000096#include "structmember.h"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000097
Guido van Rossum47dfa4a2003-04-25 05:48:32 +000098#undef MAX
99#define MAX(x, y) ((x) < (y) ? (y) : (x))
100
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000101/* Socket object documentation */
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000102PyDoc_STRVAR(sock_doc,
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000103"socket([family[, type[, proto]]]) -> socket object\n\
104\n\
105Open a socket of the given type. The family argument specifies the\n\
106address family; it defaults to AF_INET. The type argument specifies\n\
107whether this is a stream (SOCK_STREAM, this is the default)\n\
108or datagram (SOCK_DGRAM) socket. The protocol argument defaults to 0,\n\
109specifying the default protocol. Keyword arguments are accepted.\n\
110\n\
111A socket object represents one endpoint of a network connection.\n\
112\n\
113Methods of socket objects (keyword arguments not allowed):\n\
114\n\
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000115_accept() -- accept connection, returning new socket fd and client address\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000116bind(addr) -- bind the socket to a local address\n\
117close() -- close the socket\n\
118connect(addr) -- connect the socket to a remote address\n\
119connect_ex(addr) -- connect, return an error code instead of an exception\n\
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000120_dup() -- return a new socket fd duplicated from fileno()\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000121fileno() -- return underlying file descriptor\n\
122getpeername() -- return remote address [*]\n\
123getsockname() -- return local address\n\
124getsockopt(level, optname[, buflen]) -- get socket options\n\
125gettimeout() -- return timeout or None\n\
126listen(n) -- start listening for incoming connections\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000127recv(buflen[, flags]) -- receive data\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000128recv_into(buffer[, nbytes[, flags]]) -- receive data (into a buffer)\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +0000129recvfrom(buflen[, flags]) -- receive data and sender\'s address\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000130recvfrom_into(buffer[, nbytes, [, flags])\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +0000131 -- receive data and sender\'s address (into a buffer)\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000132sendall(data[, flags]) -- send all data\n\
133send(data[, flags]) -- send data, may not send all of it\n\
134sendto(data[, flags], addr) -- send data to a given address\n\
135setblocking(0 | 1) -- set or clear the blocking I/O flag\n\
136setsockopt(level, optname, value) -- set socket options\n\
137settimeout(None | float) -- set or clear the timeout\n\
138shutdown(how) -- shut down traffic in one or both directions\n\
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700139if_nameindex() -- return all network interface indices and names\n\
Gregory P. Smithb6471db2011-05-22 22:47:55 -0700140if_nametoindex(name) -- return the corresponding interface index\n\
141if_indextoname(index) -- return the corresponding interface name\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000142\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000143 [*] not available on all platforms!");
Guido van Rossum3baaa131999-03-22 21:44:51 +0000144
Walter Dörwaldf0dfc7a2003-10-20 14:01:56 +0000145/* XXX This is a terrible mess of platform-dependent preprocessor hacks.
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000146 I hope some day someone can clean this up please... */
147
Guido van Rossum9376b741999-09-15 22:01:40 +0000148/* Hacks for gethostbyname_r(). On some non-Linux platforms, the configure
149 script doesn't get this right, so we hardcode some platform checks below.
150 On the other hand, not all Linux versions agree, so there the settings
151 computed by the configure script are needed! */
152
153#ifndef linux
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000154# undef HAVE_GETHOSTBYNAME_R_3_ARG
155# undef HAVE_GETHOSTBYNAME_R_5_ARG
156# undef HAVE_GETHOSTBYNAME_R_6_ARG
Guido van Rossum9376b741999-09-15 22:01:40 +0000157#endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000158
Victor Stinner710d27e2011-08-23 10:57:32 +0200159#if defined(__OpenBSD__)
160# include <sys/uio.h>
161#endif
162
Guido van Rossum7a122991999-04-13 04:07:32 +0000163#ifndef WITH_THREAD
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000164# undef HAVE_GETHOSTBYNAME_R
Guido van Rossum7a122991999-04-13 04:07:32 +0000165#endif
166
Guido van Rossume7de2061999-03-24 17:24:33 +0000167#ifdef HAVE_GETHOSTBYNAME_R
Jesus Cea736e7fc2011-03-14 17:36:54 +0100168# if defined(_AIX)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000169# define HAVE_GETHOSTBYNAME_R_3_ARG
170# elif defined(__sun) || defined(__sgi)
171# define HAVE_GETHOSTBYNAME_R_5_ARG
172# elif defined(linux)
Guido van Rossum9376b741999-09-15 22:01:40 +0000173/* Rely on the configure script */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000174# else
175# undef HAVE_GETHOSTBYNAME_R
176# endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000177#endif
178
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000179#if !defined(HAVE_GETHOSTBYNAME_R) && defined(WITH_THREAD) && \
180 !defined(MS_WINDOWS)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000181# define USE_GETHOSTBYNAME_LOCK
Guido van Rossum3baaa131999-03-22 21:44:51 +0000182#endif
183
Hye-Shik Chang9ceebd52005-09-24 14:58:47 +0000184/* To use __FreeBSD_version */
185#ifdef HAVE_SYS_PARAM_H
186#include <sys/param.h>
187#endif
Just van Rossum1040d2c2003-05-09 07:53:18 +0000188/* On systems on which getaddrinfo() is believed to not be thread-safe,
Just van Rossum09aecd72003-05-09 08:03:44 +0000189 (this includes the getaddrinfo emulation) protect access with a lock. */
Hye-Shik Chang9ceebd52005-09-24 14:58:47 +0000190#if defined(WITH_THREAD) && (defined(__APPLE__) || \
191 (defined(__FreeBSD__) && __FreeBSD_version+0 < 503000) || \
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000192 defined(__OpenBSD__) || defined(__NetBSD__) || \
193 defined(__VMS) || !defined(HAVE_GETADDRINFO))
Just van Rossum1040d2c2003-05-09 07:53:18 +0000194#define USE_GETADDRINFO_LOCK
195#endif
196
197#ifdef USE_GETADDRINFO_LOCK
198#define ACQUIRE_GETADDRINFO_LOCK PyThread_acquire_lock(netdb_lock, 1);
199#define RELEASE_GETADDRINFO_LOCK PyThread_release_lock(netdb_lock);
200#else
201#define ACQUIRE_GETADDRINFO_LOCK
202#define RELEASE_GETADDRINFO_LOCK
203#endif
204
205#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000206# include "pythread.h"
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000207#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000208
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000209#if defined(PYCC_VACPP)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000210# include <types.h>
211# include <io.h>
212# include <sys/ioctl.h>
213# include <utils.h>
214# include <ctype.h>
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000215#endif
216
Martin v. Löwis9e437302002-12-06 12:57:26 +0000217#if defined(__VMS)
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000218# include <ioctl.h>
219#endif
220
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000221#if defined(PYOS_OS2)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000222# define INCL_DOS
223# define INCL_DOSERRORS
224# define INCL_NOPMAPI
225# include <os2.h>
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000226#endif
227
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000228#if defined(__sgi) && _COMPILER_VERSION>700 && !_SGIAPI
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000229/* make sure that the reentrant (gethostbyaddr_r etc)
230 functions are declared correctly if compiling with
231 MIPSPro 7.x in ANSI C mode (default) */
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000232
Thomas Wouters477c8d52006-05-27 19:21:47 +0000233/* XXX Using _SGIAPI is the wrong thing,
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000234 but I don't know what the right thing is. */
Trent Mick8ea5bdf2004-09-13 17:48:41 +0000235#undef _SGIAPI /* to avoid warning */
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000236#define _SGIAPI 1
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000237
Trent Mick8ea5bdf2004-09-13 17:48:41 +0000238#undef _XOPEN_SOURCE
239#include <sys/socket.h>
240#include <sys/types.h>
241#include <netinet/in.h>
242#ifdef _SS_ALIGNSIZE
243#define HAVE_GETADDRINFO 1
244#define HAVE_GETNAMEINFO 1
245#endif
246
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000247#define HAVE_INET_PTON
248#include <netdb.h>
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000249#endif
250
Thomas Wouters477c8d52006-05-27 19:21:47 +0000251/* Irix 6.5 fails to define this variable at all. This is needed
252 for both GCC and SGI's compiler. I'd say that the SGI headers
Georg Brandldbd83392006-02-20 09:42:33 +0000253 are just busted. Same thing for Solaris. */
254#if (defined(__sgi) || defined(sun)) && !defined(INET_ADDRSTRLEN)
Anthony Baxterbab23cf2003-10-04 08:00:49 +0000255#define INET_ADDRSTRLEN 16
256#endif
257
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000258/* Generic includes */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000259#ifdef HAVE_SYS_TYPES_H
Guido van Rossumb6775db1994-08-01 11:34:53 +0000260#include <sys/types.h>
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000261#endif
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000262
Gregory P. Smith3b1f2c32011-05-15 12:18:23 -0700263#ifdef HAVE_SYS_SOCKET_H
264#include <sys/socket.h>
265#endif
266
267#ifdef HAVE_NET_IF_H
268#include <net/if.h>
269#endif
270
Marc-André Lemburg976ade62002-02-16 18:47:07 +0000271/* Generic socket object definitions and includes */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000272#define PySocket_BUILDING_SOCKET
Marc-André Lemburgbb8b78b2002-02-16 18:44:52 +0000273#include "socketmodule.h"
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000274
275/* Addressing includes */
276
Guido van Rossum6f489d91996-06-28 20:15:15 +0000277#ifndef MS_WINDOWS
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000278
279/* Non-MS WINDOWS includes */
280# include <netdb.h>
Nick Coghlan4ecf6cf2011-08-22 15:45:19 +1000281# include <unistd.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000282
Guido van Rossum9376b741999-09-15 22:01:40 +0000283/* Headers needed for inet_ntoa() and inet_addr() */
Skip Montanaroeb33e5a2007-08-17 12:57:41 +0000284# if defined(PYOS_OS2) && defined(PYCC_VACPP)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000285# include <netdb.h>
Tim Peters603c6832001-11-05 02:45:59 +0000286typedef size_t socklen_t;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000287# else
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000288# include <arpa/inet.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000289# endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000290
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000291# include <fcntl.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000292
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000293#else
Guido van Rossum48a680c2001-03-02 06:34:14 +0000294
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000295/* MS_WINDOWS includes */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000296# ifdef HAVE_FCNTL_H
297# include <fcntl.h>
298# endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000299
Jeremy Hylton22308652001-02-02 03:23:09 +0000300#endif
301
Skip Montanaro7befb992004-02-10 16:50:21 +0000302#include <stddef.h>
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000303
304#ifndef offsetof
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000305# define offsetof(type, member) ((size_t)(&((type *)0)->member))
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000306#endif
307
Neal Norwitz39d22e52002-11-02 19:55:21 +0000308#ifndef O_NONBLOCK
309# define O_NONBLOCK O_NDELAY
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000310#endif
311
Trent Micka708d6e2004-09-07 17:48:26 +0000312/* include Python's addrinfo.h unless it causes trouble */
313#if defined(__sgi) && _COMPILER_VERSION>700 && defined(_SS_ALIGNSIZE)
314 /* Do not include addinfo.h on some newer IRIX versions.
315 * _SS_ALIGNSIZE is defined in sys/socket.h by 6.5.21,
316 * for example, but not by 6.5.10.
317 */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000318#elif defined(_MSC_VER) && _MSC_VER>1201
Trent Micka708d6e2004-09-07 17:48:26 +0000319 /* Do not include addrinfo.h for MSVC7 or greater. 'addrinfo' and
320 * EAI_* constants are defined in (the already included) ws2tcpip.h.
321 */
322#else
323# include "addrinfo.h"
324#endif
Jason Tishlerc246cb72004-08-09 13:25:59 +0000325
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000326#ifndef HAVE_INET_PTON
Christian Heimes96e7b3d2007-11-20 06:51:17 +0000327#if !defined(NTDDI_VERSION) || (NTDDI_VERSION < NTDDI_LONGHORN)
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000328int inet_pton(int af, const char *src, void *dst);
Martin v. Löwisc925b1532001-07-21 09:42:15 +0000329const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000330#endif
Christian Heimesb6150692007-11-15 23:37:07 +0000331#endif
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000332
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000333#ifdef __APPLE__
334/* On OS X, getaddrinfo returns no error indication of lookup
335 failure, so we must use the emulation instead of the libinfo
336 implementation. Unfortunately, performing an autoconf test
337 for this bug would require DNS access for the machine performing
338 the configuration, which is not acceptable. Therefore, we
339 determine the bug just by checking for __APPLE__. If this bug
340 gets ever fixed, perhaps checking for sys/version.h would be
341 appropriate, which is 10/0 on the system with the bug. */
Jack Jansen84262fb2002-07-02 14:40:42 +0000342#ifndef HAVE_GETNAMEINFO
343/* This bug seems to be fixed in Jaguar. Ths easiest way I could
344 Find to check for Jaguar is that it has getnameinfo(), which
345 older releases don't have */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000346#undef HAVE_GETADDRINFO
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000347#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +0000348
349#ifdef HAVE_INET_ATON
350#define USE_INET_ATON_WEAKLINK
351#endif
352
Jack Jansen84262fb2002-07-02 14:40:42 +0000353#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000354
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000355/* I know this is a bad practice, but it is the easiest... */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000356#if !defined(HAVE_GETADDRINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000357/* avoid clashes with the C library definition of the symbol. */
358#define getaddrinfo fake_getaddrinfo
359#define gai_strerror fake_gai_strerror
360#define freeaddrinfo fake_freeaddrinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000361#include "getaddrinfo.c"
362#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000363#if !defined(HAVE_GETNAMEINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000364#define getnameinfo fake_getnameinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000365#include "getnameinfo.c"
366#endif
367
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000368#ifdef MS_WINDOWS
369/* On Windows a socket is really a handle not an fd */
370static SOCKET
371dup_socket(SOCKET handle)
372{
Daniel Stutzbach6c765282010-09-03 12:38:33 +0000373 WSAPROTOCOL_INFO info;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000374
Daniel Stutzbach6c765282010-09-03 12:38:33 +0000375 if (WSADuplicateSocket(handle, GetCurrentProcessId(), &info))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000376 return INVALID_SOCKET;
Daniel Stutzbach6c765282010-09-03 12:38:33 +0000377
378 return WSASocket(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
379 FROM_PROTOCOL_INFO, &info, 0, 0);
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000380}
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000381#define SOCKETCLOSE closesocket
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000382#else
383/* On Unix we can use dup to duplicate the file descriptor of a socket*/
384#define dup_socket(fd) dup(fd)
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000385#endif
386
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000387#ifdef MS_WIN32
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000388#define EAFNOSUPPORT WSAEAFNOSUPPORT
389#define snprintf _snprintf
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000390#endif
Fred Drakea04eaad2000-06-30 02:46:07 +0000391
Andrew MacIntyreba43e872002-03-03 03:03:52 +0000392#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000393#define SOCKETCLOSE soclose
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000394#define NO_DUP /* Sockets are Not Actual File Handles under OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000395#endif
396
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000397#ifndef SOCKETCLOSE
398#define SOCKETCLOSE close
399#endif
400
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000401#if (defined(HAVE_BLUETOOTH_H) || defined(HAVE_BLUETOOTH_BLUETOOTH_H)) && !defined(__NetBSD__) && !defined(__DragonFly__)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000402#define USE_BLUETOOTH 1
403#if defined(__FreeBSD__)
404#define BTPROTO_L2CAP BLUETOOTH_PROTO_L2CAP
405#define BTPROTO_RFCOMM BLUETOOTH_PROTO_RFCOMM
Thomas Wouterscf297e42007-02-23 15:07:44 +0000406#define BTPROTO_HCI BLUETOOTH_PROTO_HCI
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000407#define SOL_HCI SOL_HCI_RAW
408#define HCI_FILTER SO_HCI_RAW_FILTER
Hye-Shik Chang81268602004-02-02 06:05:24 +0000409#define sockaddr_l2 sockaddr_l2cap
410#define sockaddr_rc sockaddr_rfcomm
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000411#define hci_dev hci_node
Hye-Shik Chang81268602004-02-02 06:05:24 +0000412#define _BT_L2_MEMB(sa, memb) ((sa)->l2cap_##memb)
413#define _BT_RC_MEMB(sa, memb) ((sa)->rfcomm_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000414#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000415#elif defined(__NetBSD__) || defined(__DragonFly__)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000416#define sockaddr_l2 sockaddr_bt
417#define sockaddr_rc sockaddr_bt
Thomas Wouterscf297e42007-02-23 15:07:44 +0000418#define sockaddr_hci sockaddr_bt
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000419#define sockaddr_sco sockaddr_bt
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000420#define SOL_HCI BTPROTO_HCI
421#define HCI_DATA_DIR SO_HCI_DIRECTION
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000422#define _BT_L2_MEMB(sa, memb) ((sa)->bt_##memb)
423#define _BT_RC_MEMB(sa, memb) ((sa)->bt_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000424#define _BT_HCI_MEMB(sa, memb) ((sa)->bt_##memb)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000425#define _BT_SCO_MEMB(sa, memb) ((sa)->bt_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000426#else
Hye-Shik Chang81268602004-02-02 06:05:24 +0000427#define _BT_L2_MEMB(sa, memb) ((sa)->l2_##memb)
428#define _BT_RC_MEMB(sa, memb) ((sa)->rc_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000429#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000430#define _BT_SCO_MEMB(sa, memb) ((sa)->sco_##memb)
431#endif
432#endif
433
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000434#ifdef __VMS
435/* TCP/IP Services for VMS uses a maximum send/recv buffer length */
436#define SEGMENT_SIZE (32 * 1024 -1)
437#endif
438
Charles-François Natali8b759652011-12-23 16:44:51 +0100439/* Convert "sock_addr_t *" to "struct sockaddr *". */
440#define SAS2SA(x) (&((x)->sa))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000441
Martin v. Löwise9416172003-05-03 10:12:45 +0000442/*
443 * Constants for getnameinfo()
444 */
445#if !defined(NI_MAXHOST)
446#define NI_MAXHOST 1025
447#endif
448#if !defined(NI_MAXSERV)
449#define NI_MAXSERV 32
450#endif
451
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000452#ifndef INVALID_SOCKET /* MS defines this */
453#define INVALID_SOCKET (-1)
454#endif
455
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000456/* XXX There's a problem here: *static* functions are not supposed to have
457 a Py prefix (or use CapitalizedWords). Later... */
458
Guido van Rossum30a685f1991-06-27 15:51:29 +0000459/* Global variable holding the exception type for errors detected
460 by this module (but not argument type or memory errors, etc.). */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000461static PyObject *socket_herror;
462static PyObject *socket_gaierror;
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000463static PyObject *socket_timeout;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000464
Tim Peters643a7fc2002-02-17 04:13:21 +0000465/* A forward reference to the socket type object.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000466 The sock_type variable contains pointers to various functions,
467 some of which call new_sockobject(), which uses sock_type, so
Tim Peters643a7fc2002-02-17 04:13:21 +0000468 there has to be a circular reference. */
Jeremy Hylton938ace62002-07-17 16:30:39 +0000469static PyTypeObject sock_type;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000470
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000471#if defined(HAVE_POLL_H)
472#include <poll.h>
473#elif defined(HAVE_SYS_POLL_H)
474#include <sys/poll.h>
475#endif
476
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000477/* Largest value to try to store in a socklen_t (used when handling
478 ancillary data). POSIX requires socklen_t to hold at least
479 (2**31)-1 and recommends against storing larger values, but
480 socklen_t was originally int in the BSD interface, so to be on the
481 safe side we use the smaller of (2**31)-1 and INT_MAX. */
482#if INT_MAX > 0x7fffffff
483#define SOCKLEN_T_LIMIT 0x7fffffff
484#else
485#define SOCKLEN_T_LIMIT INT_MAX
486#endif
487
Charles-François Nataliaa26b272011-08-28 17:51:43 +0200488#ifdef HAVE_POLL
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000489/* Instead of select(), we'll use poll() since poll() works on any fd. */
490#define IS_SELECTABLE(s) 1
491/* Can we call select() with this socket without a buffer overrun? */
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000492#else
Charles-François Nataliaa26b272011-08-28 17:51:43 +0200493/* If there's no timeout left, we don't have to call select, so it's a safe,
494 * little white lie. */
495#define IS_SELECTABLE(s) (_PyIsSelectable_fd((s)->sock_fd) || (s)->sock_timeout <= 0.0)
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000496#endif
Neal Norwitz082b2df2006-02-07 07:04:46 +0000497
498static PyObject*
499select_error(void)
500{
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200501 PyErr_SetString(PyExc_OSError, "unable to select on socket");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000502 return NULL;
Neal Norwitz082b2df2006-02-07 07:04:46 +0000503}
504
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000505#ifdef MS_WINDOWS
Antoine Pitrouc8f01962010-09-28 22:03:27 +0000506#ifndef WSAEAGAIN
507#define WSAEAGAIN WSAEWOULDBLOCK
508#endif
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000509#define CHECK_ERRNO(expected) \
510 (WSAGetLastError() == WSA ## expected)
511#else
512#define CHECK_ERRNO(expected) \
513 (errno == expected)
514#endif
515
Guido van Rossum30a685f1991-06-27 15:51:29 +0000516/* Convenience function to raise an error according to errno
517 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000518
Guido van Rossum73624e91994-10-10 17:59:00 +0000519static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000520set_error(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000521{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000522#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000523 int err_no = WSAGetLastError();
524 /* PyErr_SetExcFromWindowsErr() invokes FormatMessage() which
525 recognizes the error codes used by both GetLastError() and
526 WSAGetLastError */
527 if (err_no)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200528 return PyErr_SetExcFromWindowsErr(PyExc_OSError, err_no);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000529#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000530
Andrew MacIntyreba43e872002-03-03 03:03:52 +0000531#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000532 if (sock_errno() != NO_ERROR) {
533 APIRET rc;
534 ULONG msglen;
535 char outbuf[100];
536 int myerrorcode = sock_errno();
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000537
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000538 /* Retrieve socket-related error message from MPTN.MSG file */
539 rc = DosGetMessage(NULL, 0, outbuf, sizeof(outbuf),
540 myerrorcode - SOCBASEERR + 26,
541 "mptn.msg",
542 &msglen);
543 if (rc == NO_ERROR) {
544 PyObject *v;
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000545
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000546 /* OS/2 doesn't guarantee a terminator */
547 outbuf[msglen] = '\0';
548 if (strlen(outbuf) > 0) {
549 /* If non-empty msg, trim CRLF */
550 char *lastc = &outbuf[ strlen(outbuf)-1 ];
551 while (lastc > outbuf &&
552 isspace(Py_CHARMASK(*lastc))) {
553 /* Trim trailing whitespace (CRLF) */
554 *lastc-- = '\0';
555 }
556 }
557 v = Py_BuildValue("(is)", myerrorcode, outbuf);
558 if (v != NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200559 PyErr_SetObject(PyExc_OSError, v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000560 Py_DECREF(v);
561 }
562 return NULL;
563 }
564 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000565#endif
566
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200567 return PyErr_SetFromErrno(PyExc_OSError);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000568}
569
Guido van Rossum30a685f1991-06-27 15:51:29 +0000570
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000571static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000572set_herror(int h_error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000573{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000574 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000575
576#ifdef HAVE_HSTRERROR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000577 v = Py_BuildValue("(is)", h_error, (char *)hstrerror(h_error));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000578#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000579 v = Py_BuildValue("(is)", h_error, "host not found");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000580#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000581 if (v != NULL) {
582 PyErr_SetObject(socket_herror, v);
583 Py_DECREF(v);
584 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000585
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000586 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000587}
588
589
590static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000591set_gaierror(int error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000592{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000593 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000594
Martin v. Löwis272cb402002-03-01 08:31:07 +0000595#ifdef EAI_SYSTEM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000596 /* EAI_SYSTEM is not available on Windows XP. */
597 if (error == EAI_SYSTEM)
598 return set_error();
Martin v. Löwis272cb402002-03-01 08:31:07 +0000599#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000600
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000601#ifdef HAVE_GAI_STRERROR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000602 v = Py_BuildValue("(is)", error, gai_strerror(error));
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000603#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000604 v = Py_BuildValue("(is)", error, "getaddrinfo failed");
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000605#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000606 if (v != NULL) {
607 PyErr_SetObject(socket_gaierror, v);
608 Py_DECREF(v);
609 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000610
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000611 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000612}
613
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000614#ifdef __VMS
615/* Function to send in segments */
616static int
617sendsegmented(int sock_fd, char *buf, int len, int flags)
618{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000619 int n = 0;
620 int remaining = len;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000621
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000622 while (remaining > 0) {
623 unsigned int segment;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000624
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000625 segment = (remaining >= SEGMENT_SIZE ? SEGMENT_SIZE : remaining);
626 n = send(sock_fd, buf, segment, flags);
627 if (n < 0) {
628 return n;
629 }
630 remaining -= segment;
631 buf += segment;
632 } /* end while */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000633
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000634 return len;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000635}
636#endif
637
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000638/* Function to perform the setting of socket blocking mode
639 internally. block = (1 | 0). */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000640static int
641internal_setblocking(PySocketSockObject *s, int block)
642{
Guido van Rossum67f7a382002-06-06 21:08:16 +0000643#ifndef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000644 int delay_flag;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000645#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +0000646#ifdef SOCK_NONBLOCK
647 if (block)
648 s->sock_type &= (~SOCK_NONBLOCK);
649 else
650 s->sock_type |= SOCK_NONBLOCK;
651#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +0000652
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000653 Py_BEGIN_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000654#ifndef MS_WINDOWS
655#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000656 block = !block;
657 ioctl(s->sock_fd, FIONBIO, (caddr_t)&block, sizeof(block));
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000658#elif defined(__VMS)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000659 block = !block;
660 ioctl(s->sock_fd, FIONBIO, (unsigned int *)&block);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000661#else /* !PYOS_OS2 && !__VMS */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000662 delay_flag = fcntl(s->sock_fd, F_GETFL, 0);
663 if (block)
664 delay_flag &= (~O_NONBLOCK);
665 else
666 delay_flag |= O_NONBLOCK;
667 fcntl(s->sock_fd, F_SETFL, delay_flag);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000668#endif /* !PYOS_OS2 */
669#else /* MS_WINDOWS */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000670 block = !block;
671 ioctlsocket(s->sock_fd, FIONBIO, (u_long*)&block);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000672#endif /* MS_WINDOWS */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000673 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000674
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000675 /* Since these don't return anything */
676 return 1;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000677}
678
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000679/* Do a select()/poll() on the socket, if necessary (sock_timeout > 0).
Guido van Rossum11ba0942002-06-13 15:07:44 +0000680 The argument writing indicates the direction.
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000681 This does not raise an exception; we'll let our caller do that
682 after they've reacquired the interpreter lock.
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000683 Returns 1 on timeout, -1 on error, 0 otherwise. */
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000684static int
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000685internal_select_ex(PySocketSockObject *s, int writing, double interval)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000686{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000687 int n;
Guido van Rossum11ba0942002-06-13 15:07:44 +0000688
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000689 /* Nothing to do unless we're in timeout mode (not non-blocking) */
690 if (s->sock_timeout <= 0.0)
691 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000692
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000693 /* Guard against closed socket */
694 if (s->sock_fd < 0)
695 return 0;
Guido van Rossumad654902002-07-19 12:44:59 +0000696
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000697 /* Handling this condition here simplifies the select loops */
698 if (interval < 0.0)
699 return 1;
700
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000701 /* Prefer poll, if available, since you can poll() any fd
702 * which can't be done with select(). */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000703#ifdef HAVE_POLL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000704 {
705 struct pollfd pollfd;
706 int timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000707
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000708 pollfd.fd = s->sock_fd;
709 pollfd.events = writing ? POLLOUT : POLLIN;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000710
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000711 /* s->sock_timeout is in seconds, timeout in ms */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000712 timeout = (int)(interval * 1000 + 0.5);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000713 n = poll(&pollfd, 1, timeout);
714 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000715#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000716 {
717 /* Construct the arguments to select */
718 fd_set fds;
719 struct timeval tv;
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000720 tv.tv_sec = (int)interval;
721 tv.tv_usec = (int)((interval - tv.tv_sec) * 1e6);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000722 FD_ZERO(&fds);
723 FD_SET(s->sock_fd, &fds);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000724
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000725 /* See if the socket is ready */
726 if (writing)
Antoine Pitrou19467d22010-08-17 19:33:30 +0000727 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
728 NULL, &fds, NULL, &tv);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000729 else
Antoine Pitrou19467d22010-08-17 19:33:30 +0000730 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
731 &fds, NULL, NULL, &tv);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000732 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000733#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000734
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000735 if (n < 0)
736 return -1;
737 if (n == 0)
738 return 1;
739 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000740}
741
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000742static int
743internal_select(PySocketSockObject *s, int writing)
744{
745 return internal_select_ex(s, writing, s->sock_timeout);
746}
747
748/*
749 Two macros for automatic retry of select() in case of false positives
750 (for example, select() could indicate a socket is ready for reading
751 but the data then discarded by the OS because of a wrong checksum).
752 Here is an example of use:
753
754 BEGIN_SELECT_LOOP(s)
755 Py_BEGIN_ALLOW_THREADS
756 timeout = internal_select_ex(s, 0, interval);
757 if (!timeout)
758 outlen = recv(s->sock_fd, cbuf, len, flags);
759 Py_END_ALLOW_THREADS
760 if (timeout == 1) {
761 PyErr_SetString(socket_timeout, "timed out");
762 return -1;
763 }
764 END_SELECT_LOOP(s)
765*/
766
767#define BEGIN_SELECT_LOOP(s) \
768 { \
769 _PyTime_timeval now, deadline = {0, 0}; \
770 double interval = s->sock_timeout; \
771 int has_timeout = s->sock_timeout > 0.0; \
772 if (has_timeout) { \
773 _PyTime_gettimeofday(&now); \
774 deadline = now; \
775 _PyTime_ADD_SECONDS(deadline, s->sock_timeout); \
776 } \
777 while (1) { \
778 errno = 0; \
779
780#define END_SELECT_LOOP(s) \
781 if (!has_timeout || \
782 (!CHECK_ERRNO(EWOULDBLOCK) && !CHECK_ERRNO(EAGAIN))) \
783 break; \
784 _PyTime_gettimeofday(&now); \
785 interval = _PyTime_INTERVAL(now, deadline); \
786 } \
787 } \
788
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000789/* Initialize a new socket object. */
790
Tim Petersa12b4cf2002-07-18 22:38:44 +0000791static double defaulttimeout = -1.0; /* Default timeout for new sockets */
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000792
Martin v. Löwis1a214512008-06-11 05:26:20 +0000793static void
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000794init_sockobject(PySocketSockObject *s,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000795 SOCKET_T fd, int family, int type, int proto)
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000796{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000797 s->sock_fd = fd;
798 s->sock_family = family;
799 s->sock_type = type;
800 s->sock_proto = proto;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000801
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000802 s->errorhandler = &set_error;
Antoine Pitroub1c54962010-10-14 15:05:38 +0000803#ifdef SOCK_NONBLOCK
804 if (type & SOCK_NONBLOCK)
805 s->sock_timeout = 0.0;
806 else
807#endif
808 {
809 s->sock_timeout = defaulttimeout;
810 if (defaulttimeout >= 0.0)
811 internal_setblocking(s, 0);
812 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000813
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000814}
815
816
Guido van Rossum30a685f1991-06-27 15:51:29 +0000817/* Create a new socket object.
818 This just creates the object and initializes it.
819 If the creation fails, return NULL and set an exception (implicit
820 in NEWOBJ()). */
821
Guido van Rossum73624e91994-10-10 17:59:00 +0000822static PySocketSockObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000823new_sockobject(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000824{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000825 PySocketSockObject *s;
826 s = (PySocketSockObject *)
827 PyType_GenericNew(&sock_type, NULL, NULL);
828 if (s != NULL)
829 init_sockobject(s, fd, family, type, proto);
830 return s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000831}
832
Guido van Rossum30a685f1991-06-27 15:51:29 +0000833
Guido van Rossum48a680c2001-03-02 06:34:14 +0000834/* Lock to allow python interpreter to continue, but only allow one
Just van Rossum1040d2c2003-05-09 07:53:18 +0000835 thread to be in gethostbyname or getaddrinfo */
836#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
837PyThread_type_lock netdb_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000838#endif
839
840
Guido van Rossum30a685f1991-06-27 15:51:29 +0000841/* Convert a string specifying a host name or one of a few symbolic
842 names to a numeric IP address. This usually calls gethostbyname()
843 to do the work; the names "" and "<broadcast>" are special.
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000844 Return the length (IPv4 should be 4 bytes), or negative if
Guido van Rossum30a685f1991-06-27 15:51:29 +0000845 an error occurred; then an exception is raised. */
846
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000847static int
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000848setipaddr(char *name, struct sockaddr *addr_ret, size_t addr_ret_size, int af)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000849{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000850 struct addrinfo hints, *res;
851 int error;
852 int d1, d2, d3, d4;
853 char ch;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000854
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000855 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
856 if (name[0] == '\0') {
857 int siz;
858 memset(&hints, 0, sizeof(hints));
859 hints.ai_family = af;
860 hints.ai_socktype = SOCK_DGRAM; /*dummy*/
861 hints.ai_flags = AI_PASSIVE;
862 Py_BEGIN_ALLOW_THREADS
863 ACQUIRE_GETADDRINFO_LOCK
864 error = getaddrinfo(NULL, "0", &hints, &res);
865 Py_END_ALLOW_THREADS
866 /* We assume that those thread-unsafe getaddrinfo() versions
867 *are* safe regarding their return value, ie. that a
868 subsequent call to getaddrinfo() does not destroy the
869 outcome of the first call. */
870 RELEASE_GETADDRINFO_LOCK
871 if (error) {
872 set_gaierror(error);
873 return -1;
874 }
875 switch (res->ai_family) {
876 case AF_INET:
877 siz = 4;
878 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000879#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000880 case AF_INET6:
881 siz = 16;
882 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000883#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000884 default:
885 freeaddrinfo(res);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200886 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000887 "unsupported address family");
888 return -1;
889 }
890 if (res->ai_next) {
891 freeaddrinfo(res);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200892 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000893 "wildcard resolved to multiple address");
894 return -1;
895 }
896 if (res->ai_addrlen < addr_ret_size)
897 addr_ret_size = res->ai_addrlen;
898 memcpy(addr_ret, res->ai_addr, addr_ret_size);
899 freeaddrinfo(res);
900 return siz;
901 }
902 if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
903 struct sockaddr_in *sin;
904 if (af != AF_INET && af != AF_UNSPEC) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200905 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000906 "address family mismatched");
907 return -1;
908 }
909 sin = (struct sockaddr_in *)addr_ret;
910 memset((void *) sin, '\0', sizeof(*sin));
911 sin->sin_family = AF_INET;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000912#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000913 sin->sin_len = sizeof(*sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000914#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000915 sin->sin_addr.s_addr = INADDR_BROADCAST;
916 return sizeof(sin->sin_addr);
917 }
918 if (sscanf(name, "%d.%d.%d.%d%c", &d1, &d2, &d3, &d4, &ch) == 4 &&
919 0 <= d1 && d1 <= 255 && 0 <= d2 && d2 <= 255 &&
920 0 <= d3 && d3 <= 255 && 0 <= d4 && d4 <= 255) {
921 struct sockaddr_in *sin;
922 sin = (struct sockaddr_in *)addr_ret;
923 sin->sin_addr.s_addr = htonl(
924 ((long) d1 << 24) | ((long) d2 << 16) |
925 ((long) d3 << 8) | ((long) d4 << 0));
926 sin->sin_family = AF_INET;
Anthony Baxter0e85f9d2003-05-02 15:40:46 +0000927#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000928 sin->sin_len = sizeof(*sin);
Anthony Baxter0e85f9d2003-05-02 15:40:46 +0000929#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000930 return 4;
931 }
932 memset(&hints, 0, sizeof(hints));
933 hints.ai_family = af;
934 Py_BEGIN_ALLOW_THREADS
935 ACQUIRE_GETADDRINFO_LOCK
936 error = getaddrinfo(name, NULL, &hints, &res);
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000937#if defined(__digital__) && defined(__unix__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000938 if (error == EAI_NONAME && af == AF_UNSPEC) {
939 /* On Tru64 V5.1, numeric-to-addr conversion fails
940 if no address family is given. Assume IPv4 for now.*/
941 hints.ai_family = AF_INET;
942 error = getaddrinfo(name, NULL, &hints, &res);
943 }
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000944#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000945 Py_END_ALLOW_THREADS
946 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
947 if (error) {
948 set_gaierror(error);
949 return -1;
950 }
951 if (res->ai_addrlen < addr_ret_size)
952 addr_ret_size = res->ai_addrlen;
953 memcpy((char *) addr_ret, res->ai_addr, addr_ret_size);
954 freeaddrinfo(res);
955 switch (addr_ret->sa_family) {
956 case AF_INET:
957 return 4;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000958#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000959 case AF_INET6:
960 return 16;
Guido van Rossum955becc1999-03-22 20:14:53 +0000961#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000962 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200963 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000964 return -1;
965 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000966}
967
Guido van Rossum30a685f1991-06-27 15:51:29 +0000968
Guido van Rossum30a685f1991-06-27 15:51:29 +0000969/* Create a string object representing an IP address.
970 This is always a string of the form 'dd.dd.dd.dd' (with variable
971 size numbers). */
972
Guido van Rossum73624e91994-10-10 17:59:00 +0000973static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000974makeipaddr(struct sockaddr *addr, int addrlen)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000975{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000976 char buf[NI_MAXHOST];
977 int error;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000978
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000979 error = getnameinfo(addr, addrlen, buf, sizeof(buf), NULL, 0,
980 NI_NUMERICHOST);
981 if (error) {
982 set_gaierror(error);
983 return NULL;
984 }
985 return PyUnicode_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000986}
987
988
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000989#ifdef USE_BLUETOOTH
990/* Convert a string representation of a Bluetooth address into a numeric
991 address. Returns the length (6), or raises an exception and returns -1 if
992 an error occurred. */
993
994static int
995setbdaddr(char *name, bdaddr_t *bdaddr)
996{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000997 unsigned int b0, b1, b2, b3, b4, b5;
998 char ch;
999 int n;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001000
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001001 n = sscanf(name, "%X:%X:%X:%X:%X:%X%c",
1002 &b5, &b4, &b3, &b2, &b1, &b0, &ch);
1003 if (n == 6 && (b0 | b1 | b2 | b3 | b4 | b5) < 256) {
1004 bdaddr->b[0] = b0;
1005 bdaddr->b[1] = b1;
1006 bdaddr->b[2] = b2;
1007 bdaddr->b[3] = b3;
1008 bdaddr->b[4] = b4;
1009 bdaddr->b[5] = b5;
1010 return 6;
1011 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001012 PyErr_SetString(PyExc_OSError, "bad bluetooth address");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001013 return -1;
1014 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001015}
1016
1017/* Create a string representation of the Bluetooth address. This is always a
1018 string of the form 'XX:XX:XX:XX:XX:XX' where XX is a two digit hexadecimal
1019 value (zero padded if necessary). */
1020
1021static PyObject *
1022makebdaddr(bdaddr_t *bdaddr)
1023{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001024 char buf[(6 * 2) + 5 + 1];
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001025
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001026 sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X",
1027 bdaddr->b[5], bdaddr->b[4], bdaddr->b[3],
1028 bdaddr->b[2], bdaddr->b[1], bdaddr->b[0]);
1029 return PyUnicode_FromString(buf);
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001030}
1031#endif
1032
1033
Guido van Rossum30a685f1991-06-27 15:51:29 +00001034/* Create an object representing the given socket address,
1035 suitable for passing it back to bind(), connect() etc.
1036 The family field of the sockaddr structure is inspected
1037 to determine what kind of address it really is. */
1038
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001039/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001040static PyObject *
Antoine Pitrou19467d22010-08-17 19:33:30 +00001041makesockaddr(SOCKET_T sockfd, struct sockaddr *addr, size_t addrlen, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001042{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001043 if (addrlen == 0) {
1044 /* No address -- may be recvfrom() from known socket */
1045 Py_INCREF(Py_None);
1046 return Py_None;
1047 }
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001048
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001049 switch (addr->sa_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001050
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001051 case AF_INET:
1052 {
1053 struct sockaddr_in *a;
1054 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
1055 PyObject *ret = NULL;
1056 if (addrobj) {
1057 a = (struct sockaddr_in *)addr;
1058 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
1059 Py_DECREF(addrobj);
1060 }
1061 return ret;
1062 }
Guido van Rossum30a685f1991-06-27 15:51:29 +00001063
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001064#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001065 case AF_UNIX:
1066 {
1067 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001068#ifdef linux
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001069 if (a->sun_path[0] == 0) { /* Linux abstract namespace */
1070 addrlen -= offsetof(struct sockaddr_un, sun_path);
1071 return PyBytes_FromStringAndSize(a->sun_path, addrlen);
1072 }
1073 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001074#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001075 {
1076 /* regular NULL-terminated string */
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001077 return PyUnicode_DecodeFSDefault(a->sun_path);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001078 }
1079 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001080#endif /* AF_UNIX */
1081
Martin v. Löwis11017b12006-01-14 18:12:57 +00001082#if defined(AF_NETLINK)
1083 case AF_NETLINK:
1084 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001085 struct sockaddr_nl *a = (struct sockaddr_nl *) addr;
1086 return Py_BuildValue("II", a->nl_pid, a->nl_groups);
Martin v. Löwis11017b12006-01-14 18:12:57 +00001087 }
1088#endif /* AF_NETLINK */
1089
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001090#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001091 case AF_INET6:
1092 {
1093 struct sockaddr_in6 *a;
1094 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
1095 PyObject *ret = NULL;
1096 if (addrobj) {
1097 a = (struct sockaddr_in6 *)addr;
Charles-François Natali366999a2012-01-02 15:47:29 +01001098 ret = Py_BuildValue("OiII",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001099 addrobj,
1100 ntohs(a->sin6_port),
Charles-François Natali366999a2012-01-02 15:47:29 +01001101 ntohl(a->sin6_flowinfo),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001102 a->sin6_scope_id);
1103 Py_DECREF(addrobj);
1104 }
1105 return ret;
1106 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001107#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001108
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001109#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001110 case AF_BLUETOOTH:
1111 switch (proto) {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001112
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001113 case BTPROTO_L2CAP:
1114 {
1115 struct sockaddr_l2 *a = (struct sockaddr_l2 *) addr;
1116 PyObject *addrobj = makebdaddr(&_BT_L2_MEMB(a, bdaddr));
1117 PyObject *ret = NULL;
1118 if (addrobj) {
1119 ret = Py_BuildValue("Oi",
1120 addrobj,
1121 _BT_L2_MEMB(a, psm));
1122 Py_DECREF(addrobj);
1123 }
1124 return ret;
1125 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001126
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001127 case BTPROTO_RFCOMM:
1128 {
1129 struct sockaddr_rc *a = (struct sockaddr_rc *) addr;
1130 PyObject *addrobj = makebdaddr(&_BT_RC_MEMB(a, bdaddr));
1131 PyObject *ret = NULL;
1132 if (addrobj) {
1133 ret = Py_BuildValue("Oi",
1134 addrobj,
1135 _BT_RC_MEMB(a, channel));
1136 Py_DECREF(addrobj);
1137 }
1138 return ret;
1139 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001140
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001141 case BTPROTO_HCI:
1142 {
1143 struct sockaddr_hci *a = (struct sockaddr_hci *) addr;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001144#if defined(__NetBSD__) || defined(__DragonFly__)
1145 return makebdaddr(&_BT_HCI_MEMB(a, bdaddr));
1146#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001147 PyObject *ret = NULL;
1148 ret = Py_BuildValue("i", _BT_HCI_MEMB(a, dev));
1149 return ret;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001150#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001151 }
Thomas Wouterscf297e42007-02-23 15:07:44 +00001152
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001153#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001154 case BTPROTO_SCO:
1155 {
1156 struct sockaddr_sco *a = (struct sockaddr_sco *) addr;
1157 return makebdaddr(&_BT_SCO_MEMB(a, bdaddr));
1158 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001159#endif
1160
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001161 default:
1162 PyErr_SetString(PyExc_ValueError,
1163 "Unknown Bluetooth protocol");
1164 return NULL;
1165 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001166#endif
1167
Antoine Pitroub156a462010-10-27 20:13:57 +00001168#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFNAME)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001169 case AF_PACKET:
1170 {
1171 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
1172 char *ifname = "";
1173 struct ifreq ifr;
1174 /* need to look up interface name give index */
1175 if (a->sll_ifindex) {
1176 ifr.ifr_ifindex = a->sll_ifindex;
1177 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1178 ifname = ifr.ifr_name;
1179 }
1180 return Py_BuildValue("shbhy#",
1181 ifname,
1182 ntohs(a->sll_protocol),
1183 a->sll_pkttype,
1184 a->sll_hatype,
1185 a->sll_addr,
1186 a->sll_halen);
1187 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001188#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001189
Christian Heimes043d6f62008-01-07 17:19:16 +00001190#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001191 case AF_TIPC:
1192 {
1193 struct sockaddr_tipc *a = (struct sockaddr_tipc *) addr;
1194 if (a->addrtype == TIPC_ADDR_NAMESEQ) {
1195 return Py_BuildValue("IIIII",
1196 a->addrtype,
1197 a->addr.nameseq.type,
1198 a->addr.nameseq.lower,
1199 a->addr.nameseq.upper,
1200 a->scope);
1201 } else if (a->addrtype == TIPC_ADDR_NAME) {
1202 return Py_BuildValue("IIIII",
1203 a->addrtype,
1204 a->addr.name.name.type,
1205 a->addr.name.name.instance,
1206 a->addr.name.name.instance,
1207 a->scope);
1208 } else if (a->addrtype == TIPC_ADDR_ID) {
1209 return Py_BuildValue("IIIII",
1210 a->addrtype,
1211 a->addr.id.node,
1212 a->addr.id.ref,
1213 0,
1214 a->scope);
1215 } else {
1216 PyErr_SetString(PyExc_ValueError,
1217 "Invalid address type");
1218 return NULL;
1219 }
1220 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001221#endif
1222
Charles-François Natali30589c92011-10-07 22:47:08 +02001223#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02001224 case AF_CAN:
1225 {
1226 struct sockaddr_can *a = (struct sockaddr_can *)addr;
1227 char *ifname = "";
1228 struct ifreq ifr;
1229 /* need to look up interface name given index */
1230 if (a->can_ifindex) {
1231 ifr.ifr_ifindex = a->can_ifindex;
1232 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1233 ifname = ifr.ifr_name;
1234 }
1235
1236 return Py_BuildValue("O&h", PyUnicode_DecodeFSDefault,
1237 ifname,
1238 a->can_family);
1239 }
1240#endif
1241
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001242 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001243
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001244 default:
1245 /* If we don't know the address family, don't raise an
1246 exception -- return it as an (int, bytes) tuple. */
1247 return Py_BuildValue("iy#",
1248 addr->sa_family,
1249 addr->sa_data,
1250 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001251
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001252 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001253}
1254
Guido van Rossum30a685f1991-06-27 15:51:29 +00001255
1256/* Parse a socket address argument according to the socket object's
1257 address family. Return 1 if the address was in the proper format,
1258 0 of not. The address is returned through addr_ret, its length
1259 through len_ret. */
1260
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001261static int
Guido van Rossum48a680c2001-03-02 06:34:14 +00001262getsockaddrarg(PySocketSockObject *s, PyObject *args,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001263 struct sockaddr *addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001264{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001265 switch (s->sock_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001266
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001267#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001268 case AF_UNIX:
1269 {
1270 struct sockaddr_un* addr;
1271 char *path;
1272 int len;
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001273 int retval = 0;
1274
1275 /* PEP 383. Not using PyUnicode_FSConverter since we need to
1276 allow embedded nulls on Linux. */
1277 if (PyUnicode_Check(args)) {
1278 if ((args = PyUnicode_EncodeFSDefault(args)) == NULL)
1279 return 0;
1280 }
1281 else
1282 Py_INCREF(args);
1283 if (!PyArg_Parse(args, "y#", &path, &len))
1284 goto unix_out;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001285
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001286 addr = (struct sockaddr_un*)addr_ret;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001287#ifdef linux
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001288 if (len > 0 && path[0] == 0) {
1289 /* Linux abstract namespace extension */
1290 if (len > sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001291 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001292 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001293 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001294 }
1295 }
1296 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001297#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001298 {
1299 /* regular NULL-terminated string */
1300 if (len >= sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001301 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001302 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001303 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001304 }
1305 addr->sun_path[len] = 0;
1306 }
1307 addr->sun_family = s->sock_family;
1308 memcpy(addr->sun_path, path, len);
Andrew MacIntyredaedf212004-04-11 12:03:57 +00001309#if defined(PYOS_OS2)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001310 *len_ret = sizeof(*addr);
Andrew MacIntyredaedf212004-04-11 12:03:57 +00001311#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001312 *len_ret = len + offsetof(struct sockaddr_un, sun_path);
Andrew MacIntyredaedf212004-04-11 12:03:57 +00001313#endif
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001314 retval = 1;
1315 unix_out:
1316 Py_DECREF(args);
1317 return retval;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001318 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001319#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001320
Martin v. Löwis11017b12006-01-14 18:12:57 +00001321#if defined(AF_NETLINK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001322 case AF_NETLINK:
1323 {
1324 struct sockaddr_nl* addr;
1325 int pid, groups;
1326 addr = (struct sockaddr_nl *)addr_ret;
1327 if (!PyTuple_Check(args)) {
1328 PyErr_Format(
1329 PyExc_TypeError,
1330 "getsockaddrarg: "
1331 "AF_NETLINK address must be tuple, not %.500s",
1332 Py_TYPE(args)->tp_name);
1333 return 0;
1334 }
1335 if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &pid, &groups))
1336 return 0;
1337 addr->nl_family = AF_NETLINK;
1338 addr->nl_pid = pid;
1339 addr->nl_groups = groups;
1340 *len_ret = sizeof(*addr);
1341 return 1;
1342 }
Martin v. Löwis11017b12006-01-14 18:12:57 +00001343#endif
1344
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001345#ifdef AF_RDS
1346 case AF_RDS:
1347 /* RDS sockets use sockaddr_in: fall-through */
1348#endif
1349
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001350 case AF_INET:
1351 {
1352 struct sockaddr_in* addr;
1353 char *host;
1354 int port, result;
1355 if (!PyTuple_Check(args)) {
1356 PyErr_Format(
1357 PyExc_TypeError,
1358 "getsockaddrarg: "
1359 "AF_INET address must be tuple, not %.500s",
1360 Py_TYPE(args)->tp_name);
1361 return 0;
1362 }
1363 if (!PyArg_ParseTuple(args, "eti:getsockaddrarg",
1364 "idna", &host, &port))
1365 return 0;
1366 addr=(struct sockaddr_in*)addr_ret;
1367 result = setipaddr(host, (struct sockaddr *)addr,
1368 sizeof(*addr), AF_INET);
1369 PyMem_Free(host);
1370 if (result < 0)
1371 return 0;
1372 if (port < 0 || port > 0xffff) {
1373 PyErr_SetString(
1374 PyExc_OverflowError,
1375 "getsockaddrarg: port must be 0-65535.");
1376 return 0;
1377 }
1378 addr->sin_family = AF_INET;
1379 addr->sin_port = htons((short)port);
1380 *len_ret = sizeof *addr;
1381 return 1;
1382 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001383
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001384#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001385 case AF_INET6:
1386 {
1387 struct sockaddr_in6* addr;
1388 char *host;
Charles-François Natali366999a2012-01-02 15:47:29 +01001389 int port, result;
1390 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001391 flowinfo = scope_id = 0;
1392 if (!PyTuple_Check(args)) {
1393 PyErr_Format(
1394 PyExc_TypeError,
1395 "getsockaddrarg: "
1396 "AF_INET6 address must be tuple, not %.500s",
1397 Py_TYPE(args)->tp_name);
1398 return 0;
1399 }
Charles-François Natali366999a2012-01-02 15:47:29 +01001400 if (!PyArg_ParseTuple(args, "eti|II",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001401 "idna", &host, &port, &flowinfo,
1402 &scope_id)) {
1403 return 0;
1404 }
1405 addr = (struct sockaddr_in6*)addr_ret;
1406 result = setipaddr(host, (struct sockaddr *)addr,
1407 sizeof(*addr), AF_INET6);
1408 PyMem_Free(host);
1409 if (result < 0)
1410 return 0;
1411 if (port < 0 || port > 0xffff) {
1412 PyErr_SetString(
1413 PyExc_OverflowError,
1414 "getsockaddrarg: port must be 0-65535.");
1415 return 0;
1416 }
Charles-François Natali366999a2012-01-02 15:47:29 +01001417 if (flowinfo < 0 || flowinfo > 0xfffff) {
1418 PyErr_SetString(
1419 PyExc_OverflowError,
1420 "getsockaddrarg: flowinfo must be 0-1048575.");
1421 return 0;
1422 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001423 addr->sin6_family = s->sock_family;
1424 addr->sin6_port = htons((short)port);
Charles-François Natali366999a2012-01-02 15:47:29 +01001425 addr->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001426 addr->sin6_scope_id = scope_id;
1427 *len_ret = sizeof *addr;
1428 return 1;
1429 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001430#endif
1431
Hye-Shik Chang81268602004-02-02 06:05:24 +00001432#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001433 case AF_BLUETOOTH:
1434 {
1435 switch (s->sock_proto) {
1436 case BTPROTO_L2CAP:
1437 {
1438 struct sockaddr_l2 *addr;
1439 char *straddr;
Martin v. Löwis12af0482004-01-31 12:34:17 +00001440
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001441 addr = (struct sockaddr_l2 *)addr_ret;
1442 memset(addr, 0, sizeof(struct sockaddr_l2));
1443 _BT_L2_MEMB(addr, family) = AF_BLUETOOTH;
1444 if (!PyArg_ParseTuple(args, "si", &straddr,
1445 &_BT_L2_MEMB(addr, psm))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001446 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001447 "wrong format");
1448 return 0;
1449 }
1450 if (setbdaddr(straddr, &_BT_L2_MEMB(addr, bdaddr)) < 0)
1451 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001452
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001453 *len_ret = sizeof *addr;
1454 return 1;
1455 }
1456 case BTPROTO_RFCOMM:
1457 {
1458 struct sockaddr_rc *addr;
1459 char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001460
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001461 addr = (struct sockaddr_rc *)addr_ret;
1462 _BT_RC_MEMB(addr, family) = AF_BLUETOOTH;
1463 if (!PyArg_ParseTuple(args, "si", &straddr,
1464 &_BT_RC_MEMB(addr, channel))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001465 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001466 "wrong format");
1467 return 0;
1468 }
1469 if (setbdaddr(straddr, &_BT_RC_MEMB(addr, bdaddr)) < 0)
1470 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001471
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001472 *len_ret = sizeof *addr;
1473 return 1;
1474 }
1475 case BTPROTO_HCI:
1476 {
1477 struct sockaddr_hci *addr = (struct sockaddr_hci *)addr_ret;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001478#if defined(__NetBSD__) || defined(__DragonFly__)
Alexander Belopolskye239d232010-12-08 23:31:48 +00001479 char *straddr = PyBytes_AS_STRING(args);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001480
Alexander Belopolskye239d232010-12-08 23:31:48 +00001481 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001482 if (straddr == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001483 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001484 "wrong format");
1485 return 0;
1486 }
1487 if (setbdaddr(straddr, &_BT_HCI_MEMB(addr, bdaddr)) < 0)
1488 return 0;
1489#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001490 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
1491 if (!PyArg_ParseTuple(args, "i", &_BT_HCI_MEMB(addr, dev))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001492 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001493 "wrong format");
1494 return 0;
1495 }
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001496#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001497 *len_ret = sizeof *addr;
1498 return 1;
1499 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001500#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001501 case BTPROTO_SCO:
1502 {
1503 struct sockaddr_sco *addr;
1504 char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001505
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001506 addr = (struct sockaddr_sco *)addr_ret;
1507 _BT_SCO_MEMB(addr, family) = AF_BLUETOOTH;
1508 if (!PyBytes_Check(args)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001509 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001510 "wrong format");
1511 return 0;
1512 }
1513 straddr = PyBytes_AS_STRING(args);
1514 if (setbdaddr(straddr, &_BT_SCO_MEMB(addr, bdaddr)) < 0)
1515 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001516
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001517 *len_ret = sizeof *addr;
1518 return 1;
1519 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001520#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001521 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001522 PyErr_SetString(PyExc_OSError, "getsockaddrarg: unknown Bluetooth protocol");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001523 return 0;
1524 }
1525 }
Martin v. Löwis12af0482004-01-31 12:34:17 +00001526#endif
1527
Antoine Pitroub156a462010-10-27 20:13:57 +00001528#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFINDEX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001529 case AF_PACKET:
1530 {
1531 struct sockaddr_ll* addr;
1532 struct ifreq ifr;
1533 char *interfaceName;
1534 int protoNumber;
1535 int hatype = 0;
1536 int pkttype = 0;
1537 char *haddr = NULL;
1538 unsigned int halen = 0;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001539
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001540 if (!PyTuple_Check(args)) {
1541 PyErr_Format(
1542 PyExc_TypeError,
1543 "getsockaddrarg: "
1544 "AF_PACKET address must be tuple, not %.500s",
1545 Py_TYPE(args)->tp_name);
1546 return 0;
1547 }
1548 if (!PyArg_ParseTuple(args, "si|iiy#", &interfaceName,
1549 &protoNumber, &pkttype, &hatype,
1550 &haddr, &halen))
1551 return 0;
1552 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
1553 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
1554 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1555 s->errorhandler();
1556 return 0;
1557 }
1558 if (halen > 8) {
1559 PyErr_SetString(PyExc_ValueError,
1560 "Hardware address must be 8 bytes or less");
1561 return 0;
1562 }
1563 if (protoNumber < 0 || protoNumber > 0xffff) {
1564 PyErr_SetString(
1565 PyExc_OverflowError,
1566 "getsockaddrarg: protoNumber must be 0-65535.");
1567 return 0;
1568 }
1569 addr = (struct sockaddr_ll*)addr_ret;
1570 addr->sll_family = AF_PACKET;
1571 addr->sll_protocol = htons((short)protoNumber);
1572 addr->sll_ifindex = ifr.ifr_ifindex;
1573 addr->sll_pkttype = pkttype;
1574 addr->sll_hatype = hatype;
1575 if (halen != 0) {
1576 memcpy(&addr->sll_addr, haddr, halen);
1577 }
1578 addr->sll_halen = halen;
1579 *len_ret = sizeof *addr;
1580 return 1;
1581 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00001582#endif
1583
Christian Heimes043d6f62008-01-07 17:19:16 +00001584#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001585 case AF_TIPC:
1586 {
1587 unsigned int atype, v1, v2, v3;
1588 unsigned int scope = TIPC_CLUSTER_SCOPE;
1589 struct sockaddr_tipc *addr;
Christian Heimes043d6f62008-01-07 17:19:16 +00001590
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001591 if (!PyTuple_Check(args)) {
1592 PyErr_Format(
1593 PyExc_TypeError,
1594 "getsockaddrarg: "
1595 "AF_TIPC address must be tuple, not %.500s",
1596 Py_TYPE(args)->tp_name);
1597 return 0;
1598 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001599
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001600 if (!PyArg_ParseTuple(args,
1601 "IIII|I;Invalid TIPC address format",
1602 &atype, &v1, &v2, &v3, &scope))
1603 return 0;
Christian Heimes043d6f62008-01-07 17:19:16 +00001604
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001605 addr = (struct sockaddr_tipc *) addr_ret;
1606 memset(addr, 0, sizeof(struct sockaddr_tipc));
Christian Heimes043d6f62008-01-07 17:19:16 +00001607
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001608 addr->family = AF_TIPC;
1609 addr->scope = scope;
1610 addr->addrtype = atype;
Christian Heimes043d6f62008-01-07 17:19:16 +00001611
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001612 if (atype == TIPC_ADDR_NAMESEQ) {
1613 addr->addr.nameseq.type = v1;
1614 addr->addr.nameseq.lower = v2;
1615 addr->addr.nameseq.upper = v3;
1616 } else if (atype == TIPC_ADDR_NAME) {
1617 addr->addr.name.name.type = v1;
1618 addr->addr.name.name.instance = v2;
1619 } else if (atype == TIPC_ADDR_ID) {
1620 addr->addr.id.node = v1;
1621 addr->addr.id.ref = v2;
1622 } else {
1623 /* Shouldn't happen */
1624 PyErr_SetString(PyExc_TypeError, "Invalid address type");
1625 return 0;
1626 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001627
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001628 *len_ret = sizeof(*addr);
Christian Heimes043d6f62008-01-07 17:19:16 +00001629
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001630 return 1;
1631 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001632#endif
1633
Charles-François Natali30589c92011-10-07 22:47:08 +02001634#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02001635 case AF_CAN:
1636 switch (s->sock_proto) {
1637 case CAN_RAW:
1638 {
1639 struct sockaddr_can *addr;
1640 PyObject *interfaceName;
1641 struct ifreq ifr;
1642 addr = (struct sockaddr_can *)addr_ret;
1643 Py_ssize_t len;
1644
1645 if (!PyArg_ParseTuple(args, "O&", PyUnicode_FSConverter,
1646 &interfaceName))
1647 return 0;
1648
1649 len = PyBytes_GET_SIZE(interfaceName);
1650
1651 if (len == 0) {
1652 ifr.ifr_ifindex = 0;
1653 } else if (len < sizeof(ifr.ifr_name)) {
1654 strcpy(ifr.ifr_name, PyBytes_AS_STRING(interfaceName));
1655 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1656 s->errorhandler();
1657 Py_DECREF(interfaceName);
1658 return 0;
1659 }
1660 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001661 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02001662 "AF_CAN interface name too long");
1663 Py_DECREF(interfaceName);
1664 return 0;
1665 }
1666
1667 addr->can_family = AF_CAN;
1668 addr->can_ifindex = ifr.ifr_ifindex;
1669
1670 *len_ret = sizeof(*addr);
1671 Py_DECREF(interfaceName);
1672 return 1;
1673 }
1674 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001675 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02001676 "getsockaddrarg: unsupported CAN protocol");
1677 return 0;
1678 }
1679#endif
1680
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001681 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001682
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001683 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001684 PyErr_SetString(PyExc_OSError, "getsockaddrarg: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001685 return 0;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001686
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001687 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001688}
1689
Guido van Rossum30a685f1991-06-27 15:51:29 +00001690
Guido van Rossum48a680c2001-03-02 06:34:14 +00001691/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +00001692 Return 1 if the family is known, 0 otherwise. The length is returned
1693 through len_ret. */
1694
1695static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +00001696getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +00001697{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001698 switch (s->sock_family) {
Guido van Rossum710e1df1992-06-12 10:39:36 +00001699
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001700#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001701 case AF_UNIX:
1702 {
1703 *len_ret = sizeof (struct sockaddr_un);
1704 return 1;
1705 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001706#endif /* AF_UNIX */
Martin v. Löwis11017b12006-01-14 18:12:57 +00001707#if defined(AF_NETLINK)
1708 case AF_NETLINK:
1709 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001710 *len_ret = sizeof (struct sockaddr_nl);
1711 return 1;
Martin v. Löwis11017b12006-01-14 18:12:57 +00001712 }
1713#endif
Guido van Rossum710e1df1992-06-12 10:39:36 +00001714
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001715#ifdef AF_RDS
1716 case AF_RDS:
1717 /* RDS sockets use sockaddr_in: fall-through */
1718#endif
1719
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001720 case AF_INET:
1721 {
1722 *len_ret = sizeof (struct sockaddr_in);
1723 return 1;
1724 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00001725
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001726#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001727 case AF_INET6:
1728 {
1729 *len_ret = sizeof (struct sockaddr_in6);
1730 return 1;
1731 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001732#endif
1733
Hye-Shik Chang81268602004-02-02 06:05:24 +00001734#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001735 case AF_BLUETOOTH:
1736 {
1737 switch(s->sock_proto)
1738 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001739
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001740 case BTPROTO_L2CAP:
1741 *len_ret = sizeof (struct sockaddr_l2);
1742 return 1;
1743 case BTPROTO_RFCOMM:
1744 *len_ret = sizeof (struct sockaddr_rc);
1745 return 1;
1746 case BTPROTO_HCI:
1747 *len_ret = sizeof (struct sockaddr_hci);
1748 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00001749#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001750 case BTPROTO_SCO:
1751 *len_ret = sizeof (struct sockaddr_sco);
1752 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00001753#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001754 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001755 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001756 "unknown BT protocol");
1757 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001758
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001759 }
1760 }
Martin v. Löwis12af0482004-01-31 12:34:17 +00001761#endif
1762
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00001763#ifdef HAVE_NETPACKET_PACKET_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001764 case AF_PACKET:
1765 {
1766 *len_ret = sizeof (struct sockaddr_ll);
1767 return 1;
1768 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001769#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001770
Christian Heimes043d6f62008-01-07 17:19:16 +00001771#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001772 case AF_TIPC:
1773 {
1774 *len_ret = sizeof (struct sockaddr_tipc);
1775 return 1;
1776 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001777#endif
1778
Charles-François Natali30589c92011-10-07 22:47:08 +02001779#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02001780 case AF_CAN:
1781 {
1782 *len_ret = sizeof (struct sockaddr_can);
1783 return 1;
1784 }
1785#endif
1786
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001787 /* More cases here... */
Guido van Rossum710e1df1992-06-12 10:39:36 +00001788
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001789 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001790 PyErr_SetString(PyExc_OSError, "getsockaddrlen: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001791 return 0;
Guido van Rossum710e1df1992-06-12 10:39:36 +00001792
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001793 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00001794}
1795
1796
Nick Coghlan96fe56a2011-08-22 11:55:57 +10001797/* Support functions for the sendmsg() and recvmsg[_into]() methods.
1798 Currently, these methods are only compiled if the RFC 2292/3542
1799 CMSG_LEN() macro is available. Older systems seem to have used
1800 sizeof(struct cmsghdr) + (length) where CMSG_LEN() is used now, so
1801 it may be possible to define CMSG_LEN() that way if it's not
1802 provided. Some architectures might need extra padding after the
1803 cmsghdr, however, and CMSG_LEN() would have to take account of
1804 this. */
1805#ifdef CMSG_LEN
1806/* If length is in range, set *result to CMSG_LEN(length) and return
1807 true; otherwise, return false. */
1808static int
1809get_CMSG_LEN(size_t length, size_t *result)
1810{
1811 size_t tmp;
1812
1813 if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0)))
1814 return 0;
1815 tmp = CMSG_LEN(length);
1816 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
1817 return 0;
1818 *result = tmp;
1819 return 1;
1820}
1821
1822#ifdef CMSG_SPACE
1823/* If length is in range, set *result to CMSG_SPACE(length) and return
1824 true; otherwise, return false. */
1825static int
1826get_CMSG_SPACE(size_t length, size_t *result)
1827{
1828 size_t tmp;
1829
1830 /* Use CMSG_SPACE(1) here in order to take account of the padding
1831 necessary before *and* after the data. */
1832 if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1)))
1833 return 0;
1834 tmp = CMSG_SPACE(length);
1835 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
1836 return 0;
1837 *result = tmp;
1838 return 1;
1839}
1840#endif
1841
1842/* Return true iff msg->msg_controllen is valid, cmsgh is a valid
1843 pointer in msg->msg_control with at least "space" bytes after it,
1844 and its cmsg_len member inside the buffer. */
1845static int
1846cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space)
1847{
1848 size_t cmsg_offset;
1849 static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) +
1850 sizeof(cmsgh->cmsg_len));
1851
Charles-François Natali466517d2011-08-28 18:23:43 +02001852 /* Note that POSIX allows msg_controllen to be of signed type. */
1853 if (cmsgh == NULL || msg->msg_control == NULL || msg->msg_controllen < 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10001854 return 0;
1855 if (space < cmsg_len_end)
1856 space = cmsg_len_end;
1857 cmsg_offset = (char *)cmsgh - (char *)msg->msg_control;
1858 return (cmsg_offset <= (size_t)-1 - space &&
1859 cmsg_offset + space <= msg->msg_controllen);
1860}
1861
1862/* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set
1863 *space to number of bytes following it in the buffer and return
1864 true; otherwise, return false. Assumes cmsgh, msg->msg_control and
1865 msg->msg_controllen are valid. */
1866static int
1867get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space)
1868{
1869 size_t data_offset;
1870 char *data_ptr;
1871
1872 if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL)
1873 return 0;
1874 data_offset = data_ptr - (char *)msg->msg_control;
1875 if (data_offset > msg->msg_controllen)
1876 return 0;
1877 *space = msg->msg_controllen - data_offset;
1878 return 1;
1879}
1880
1881/* If cmsgh is invalid or not contained in the buffer pointed to by
1882 msg->msg_control, return -1. If cmsgh is valid and its associated
1883 data is entirely contained in the buffer, set *data_len to the
1884 length of the associated data and return 0. If only part of the
1885 associated data is contained in the buffer but cmsgh is otherwise
1886 valid, set *data_len to the length contained in the buffer and
1887 return 1. */
1888static int
1889get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len)
1890{
1891 size_t space, cmsg_data_len;
1892
1893 if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) ||
1894 cmsgh->cmsg_len < CMSG_LEN(0))
1895 return -1;
1896 cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0);
1897 if (!get_cmsg_data_space(msg, cmsgh, &space))
1898 return -1;
1899 if (space >= cmsg_data_len) {
1900 *data_len = cmsg_data_len;
1901 return 0;
1902 }
1903 *data_len = space;
1904 return 1;
1905}
1906#endif /* CMSG_LEN */
1907
1908
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001909/* s._accept() -> (fd, address) */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001910
Guido van Rossum73624e91994-10-10 17:59:00 +00001911static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001912sock_accept(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001913{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001914 sock_addr_t addrbuf;
1915 SOCKET_T newfd = INVALID_SOCKET;
1916 socklen_t addrlen;
1917 PyObject *sock = NULL;
1918 PyObject *addr = NULL;
1919 PyObject *res = NULL;
1920 int timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001921 if (!getsockaddrlen(s, &addrlen))
1922 return NULL;
1923 memset(&addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001924
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001925 if (!IS_SELECTABLE(s))
1926 return select_error();
Neal Norwitz082b2df2006-02-07 07:04:46 +00001927
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00001928 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001929 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00001930 timeout = internal_select_ex(s, 0, interval);
Antoine Pitroub1c54962010-10-14 15:05:38 +00001931 if (!timeout) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001932 newfd = accept(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
Antoine Pitroub1c54962010-10-14 15:05:38 +00001933 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001934 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001935
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001936 if (timeout == 1) {
1937 PyErr_SetString(socket_timeout, "timed out");
1938 return NULL;
1939 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00001940 END_SELECT_LOOP(s)
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001941
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001942 if (newfd == INVALID_SOCKET)
1943 return s->errorhandler();
Barry Warsaw752300b1997-01-03 17:18:10 +00001944
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001945 sock = PyLong_FromSocket_t(newfd);
1946 if (sock == NULL) {
1947 SOCKETCLOSE(newfd);
1948 goto finally;
1949 }
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001950
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001951 addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
1952 addrlen, s->sock_proto);
1953 if (addr == NULL)
1954 goto finally;
Barry Warsaw752300b1997-01-03 17:18:10 +00001955
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001956 res = PyTuple_Pack(2, sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00001957
Guido van Rossum67f7a382002-06-06 21:08:16 +00001958finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001959 Py_XDECREF(sock);
1960 Py_XDECREF(addr);
1961 return res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001962}
1963
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001964PyDoc_STRVAR(accept_doc,
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001965"_accept() -> (integer, address info)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00001966\n\
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001967Wait for an incoming connection. Return a new socket file descriptor\n\
1968representing the connection, and the address of the client.\n\
1969For IP sockets, the address info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001970
Guido van Rossum11ba0942002-06-13 15:07:44 +00001971/* s.setblocking(flag) method. Argument:
1972 False -- non-blocking mode; same as settimeout(0)
1973 True -- blocking mode; same as settimeout(None)
1974*/
Guido van Rossume4485b01994-09-07 14:32:49 +00001975
Guido van Rossum73624e91994-10-10 17:59:00 +00001976static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001977sock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00001978{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001979 int block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001980
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001981 block = PyLong_AsLong(arg);
1982 if (block == -1 && PyErr_Occurred())
1983 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001984
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001985 s->sock_timeout = block ? -1.0 : 0.0;
1986 internal_setblocking(s, block);
Guido van Rossume4485b01994-09-07 14:32:49 +00001987
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001988 Py_INCREF(Py_None);
1989 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +00001990}
Guido van Rossume4485b01994-09-07 14:32:49 +00001991
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001992PyDoc_STRVAR(setblocking_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001993"setblocking(flag)\n\
1994\n\
1995Set the socket to blocking (flag is true) or non-blocking (false).\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00001996setblocking(True) is equivalent to settimeout(None);\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001997setblocking(False) is equivalent to settimeout(0.0).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001998
Guido van Rossum11ba0942002-06-13 15:07:44 +00001999/* s.settimeout(timeout) method. Argument:
2000 None -- no timeout, blocking mode; same as setblocking(True)
2001 0.0 -- non-blocking mode; same as setblocking(False)
2002 > 0 -- timeout mode; operations time out after timeout seconds
2003 < 0 -- illegal; raises an exception
2004*/
Guido van Rossum67f7a382002-06-06 21:08:16 +00002005static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002006sock_settimeout(PySocketSockObject *s, PyObject *arg)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002007{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002008 double timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002009
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002010 if (arg == Py_None)
2011 timeout = -1.0;
2012 else {
2013 timeout = PyFloat_AsDouble(arg);
2014 if (timeout < 0.0) {
2015 if (!PyErr_Occurred())
2016 PyErr_SetString(PyExc_ValueError,
2017 "Timeout value out of range");
2018 return NULL;
2019 }
2020 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002021
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002022 s->sock_timeout = timeout;
2023 internal_setblocking(s, timeout < 0.0);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002024
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002025 Py_INCREF(Py_None);
2026 return Py_None;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002027}
2028
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002029PyDoc_STRVAR(settimeout_doc,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002030"settimeout(timeout)\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002031\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002032Set a timeout on socket operations. 'timeout' can be a float,\n\
2033giving in seconds, or None. Setting a timeout of None disables\n\
2034the timeout feature and is equivalent to setblocking(1).\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002035Setting a timeout of zero is the same as setblocking(0).");
Guido van Rossum67f7a382002-06-06 21:08:16 +00002036
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002037/* s.gettimeout() method.
2038 Returns the timeout associated with a socket. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00002039static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002040sock_gettimeout(PySocketSockObject *s)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002041{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002042 if (s->sock_timeout < 0.0) {
2043 Py_INCREF(Py_None);
2044 return Py_None;
2045 }
2046 else
2047 return PyFloat_FromDouble(s->sock_timeout);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002048}
2049
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002050PyDoc_STRVAR(gettimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002051"gettimeout() -> timeout\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002052\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03002053Returns the timeout in seconds (float) associated with socket \n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002054operations. A timeout of None indicates that timeouts on socket \n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002055operations are disabled.");
Guido van Rossume4485b01994-09-07 14:32:49 +00002056
Guido van Rossumaee08791992-09-08 09:05:33 +00002057/* s.setsockopt() method.
2058 With an integer third argument, sets an integer option.
2059 With a string third argument, sets an option from a buffer;
2060 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002061
Guido van Rossum73624e91994-10-10 17:59:00 +00002062static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002063sock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002064{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002065 int level;
2066 int optname;
2067 int res;
2068 char *buf;
2069 int buflen;
2070 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002071
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002072 if (PyArg_ParseTuple(args, "iii:setsockopt",
2073 &level, &optname, &flag)) {
2074 buf = (char *) &flag;
2075 buflen = sizeof flag;
2076 }
2077 else {
2078 PyErr_Clear();
2079 if (!PyArg_ParseTuple(args, "iiy#:setsockopt",
2080 &level, &optname, &buf, &buflen))
2081 return NULL;
2082 }
2083 res = setsockopt(s->sock_fd, level, optname, (void *)buf, buflen);
2084 if (res < 0)
2085 return s->errorhandler();
2086 Py_INCREF(Py_None);
2087 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002088}
2089
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002090PyDoc_STRVAR(setsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002091"setsockopt(level, option, value)\n\
2092\n\
2093Set a socket option. See the Unix manual for level and option.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002094The value argument can either be an integer or a string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002095
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002096
Guido van Rossumaee08791992-09-08 09:05:33 +00002097/* s.getsockopt() method.
2098 With two arguments, retrieves an integer option.
2099 With a third integer argument, retrieves a string buffer of that size;
2100 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002101
Guido van Rossum73624e91994-10-10 17:59:00 +00002102static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002103sock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002104{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002105 int level;
2106 int optname;
2107 int res;
2108 PyObject *buf;
2109 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002110
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002111 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
2112 &level, &optname, &buflen))
2113 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002114
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002115 if (buflen == 0) {
2116 int flag = 0;
2117 socklen_t flagsize = sizeof flag;
2118 res = getsockopt(s->sock_fd, level, optname,
2119 (void *)&flag, &flagsize);
2120 if (res < 0)
2121 return s->errorhandler();
2122 return PyLong_FromLong(flag);
2123 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002124#ifdef __VMS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002125 /* socklen_t is unsigned so no negative test is needed,
2126 test buflen == 0 is previously done */
2127 if (buflen > 1024) {
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002128#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002129 if (buflen <= 0 || buflen > 1024) {
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002130#endif
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002131 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002132 "getsockopt buflen out of range");
2133 return NULL;
2134 }
2135 buf = PyBytes_FromStringAndSize((char *)NULL, buflen);
2136 if (buf == NULL)
2137 return NULL;
2138 res = getsockopt(s->sock_fd, level, optname,
2139 (void *)PyBytes_AS_STRING(buf), &buflen);
2140 if (res < 0) {
2141 Py_DECREF(buf);
2142 return s->errorhandler();
2143 }
2144 _PyBytes_Resize(&buf, buflen);
2145 return buf;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002146}
2147
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002148PyDoc_STRVAR(getsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002149"getsockopt(level, option[, buffersize]) -> value\n\
2150\n\
2151Get a socket option. See the Unix manual for level and option.\n\
2152If a nonzero buffersize argument is given, the return value is a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002153string of that length; otherwise it is an integer.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002154
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002155
Fred Drake728819a2000-07-01 03:40:12 +00002156/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002157
Guido van Rossum73624e91994-10-10 17:59:00 +00002158static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002159sock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002160{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002161 sock_addr_t addrbuf;
2162 int addrlen;
2163 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002164
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002165 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2166 return NULL;
2167 Py_BEGIN_ALLOW_THREADS
2168 res = bind(s->sock_fd, SAS2SA(&addrbuf), addrlen);
2169 Py_END_ALLOW_THREADS
2170 if (res < 0)
2171 return s->errorhandler();
2172 Py_INCREF(Py_None);
2173 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002174}
2175
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002176PyDoc_STRVAR(bind_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002177"bind(address)\n\
2178\n\
2179Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00002180pair (host, port); the host must refer to the local host. For raw packet\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002181sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002182
Guido van Rossum30a685f1991-06-27 15:51:29 +00002183
2184/* s.close() method.
2185 Set the file descriptor to -1 so operations tried subsequently
2186 will surely fail. */
2187
Guido van Rossum73624e91994-10-10 17:59:00 +00002188static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002189sock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002190{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002191 SOCKET_T fd;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002192
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002193 if ((fd = s->sock_fd) != -1) {
2194 s->sock_fd = -1;
2195 Py_BEGIN_ALLOW_THREADS
2196 (void) SOCKETCLOSE(fd);
2197 Py_END_ALLOW_THREADS
2198 }
2199 Py_INCREF(Py_None);
2200 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002201}
2202
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002203PyDoc_STRVAR(close_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002204"close()\n\
2205\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002206Close the socket. It cannot be used after this call.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002207
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002208static PyObject *
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002209sock_detach(PySocketSockObject *s)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002210{
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002211 SOCKET_T fd = s->sock_fd;
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002212 s->sock_fd = -1;
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002213 return PyLong_FromSocket_t(fd);
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002214}
2215
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002216PyDoc_STRVAR(detach_doc,
2217"detach()\n\
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002218\n\
2219Close the socket object without closing the underlying file descriptor.\
2220The object cannot be used after this call, but the file descriptor\
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002221can be reused for other purposes. The file descriptor is returned.");
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002222
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002223static int
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002224internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002225 int *timeoutp)
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002226{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002227 int res, timeout;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002228
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002229 timeout = 0;
2230 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002231
2232#ifdef MS_WINDOWS
2233
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002234 if (s->sock_timeout > 0.0) {
2235 if (res < 0 && WSAGetLastError() == WSAEWOULDBLOCK &&
2236 IS_SELECTABLE(s)) {
2237 /* This is a mess. Best solution: trust select */
2238 fd_set fds;
2239 fd_set fds_exc;
2240 struct timeval tv;
2241 tv.tv_sec = (int)s->sock_timeout;
2242 tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6);
2243 FD_ZERO(&fds);
2244 FD_SET(s->sock_fd, &fds);
2245 FD_ZERO(&fds_exc);
2246 FD_SET(s->sock_fd, &fds_exc);
Antoine Pitrou19467d22010-08-17 19:33:30 +00002247 res = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
2248 NULL, &fds, &fds_exc, &tv);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002249 if (res == 0) {
2250 res = WSAEWOULDBLOCK;
2251 timeout = 1;
2252 } else if (res > 0) {
2253 if (FD_ISSET(s->sock_fd, &fds))
2254 /* The socket is in the writable set - this
2255 means connected */
2256 res = 0;
2257 else {
2258 /* As per MS docs, we need to call getsockopt()
2259 to get the underlying error */
2260 int res_size = sizeof res;
2261 /* It must be in the exception set */
2262 assert(FD_ISSET(s->sock_fd, &fds_exc));
2263 if (0 == getsockopt(s->sock_fd, SOL_SOCKET, SO_ERROR,
2264 (char *)&res, &res_size))
2265 /* getsockopt also clears WSAGetLastError,
2266 so reset it back. */
2267 WSASetLastError(res);
2268 else
2269 res = WSAGetLastError();
2270 }
2271 }
2272 /* else if (res < 0) an error occurred */
2273 }
2274 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002275
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002276 if (res < 0)
2277 res = WSAGetLastError();
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002278
2279#else
2280
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002281 if (s->sock_timeout > 0.0) {
2282 if (res < 0 && errno == EINPROGRESS && IS_SELECTABLE(s)) {
2283 timeout = internal_select(s, 1);
2284 if (timeout == 0) {
2285 /* Bug #1019808: in case of an EINPROGRESS,
2286 use getsockopt(SO_ERROR) to get the real
2287 error. */
2288 socklen_t res_size = sizeof res;
2289 (void)getsockopt(s->sock_fd, SOL_SOCKET,
2290 SO_ERROR, &res, &res_size);
2291 if (res == EISCONN)
2292 res = 0;
2293 errno = res;
2294 }
2295 else if (timeout == -1) {
2296 res = errno; /* had error */
2297 }
2298 else
2299 res = EWOULDBLOCK; /* timed out */
2300 }
2301 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002302
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002303 if (res < 0)
2304 res = errno;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002305
2306#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002307 *timeoutp = timeout;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002308
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002309 return res;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002310}
Guido van Rossum30a685f1991-06-27 15:51:29 +00002311
Fred Drake728819a2000-07-01 03:40:12 +00002312/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002313
Guido van Rossum73624e91994-10-10 17:59:00 +00002314static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002315sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002316{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002317 sock_addr_t addrbuf;
2318 int addrlen;
2319 int res;
2320 int timeout;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002321
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002322 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2323 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002324
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002325 Py_BEGIN_ALLOW_THREADS
2326 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, &timeout);
2327 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002328
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002329 if (timeout == 1) {
2330 PyErr_SetString(socket_timeout, "timed out");
2331 return NULL;
2332 }
2333 if (res != 0)
2334 return s->errorhandler();
2335 Py_INCREF(Py_None);
2336 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002337}
2338
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002339PyDoc_STRVAR(connect_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002340"connect(address)\n\
2341\n\
2342Connect the socket to a remote address. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002343is a pair (host, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002344
Guido van Rossum30a685f1991-06-27 15:51:29 +00002345
Fred Drake728819a2000-07-01 03:40:12 +00002346/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002347
2348static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002349sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002350{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002351 sock_addr_t addrbuf;
2352 int addrlen;
2353 int res;
2354 int timeout;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002355
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002356 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2357 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002358
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002359 Py_BEGIN_ALLOW_THREADS
2360 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, &timeout);
2361 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002362
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002363 /* Signals are not errors (though they may raise exceptions). Adapted
2364 from PyErr_SetFromErrnoWithFilenameObject(). */
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002365#ifdef EINTR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002366 if (res == EINTR && PyErr_CheckSignals())
2367 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002368#endif
2369
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002370 return PyLong_FromLong((long) res);
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002371}
2372
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002373PyDoc_STRVAR(connect_ex_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002374"connect_ex(address) -> errno\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002375\n\
2376This is like connect(address), but returns an error code (the errno value)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002377instead of raising an exception when an error occurs.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002378
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002379
Guido van Rossumed233a51992-06-23 09:07:03 +00002380/* s.fileno() method */
2381
Guido van Rossum73624e91994-10-10 17:59:00 +00002382static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002383sock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00002384{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002385 return PyLong_FromSocket_t(s->sock_fd);
Guido van Rossumed233a51992-06-23 09:07:03 +00002386}
2387
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002388PyDoc_STRVAR(fileno_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002389"fileno() -> integer\n\
2390\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002391Return the integer file descriptor of the socket.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002392
Guido van Rossumed233a51992-06-23 09:07:03 +00002393
Guido van Rossumc89705d1992-11-26 08:54:07 +00002394/* s.getsockname() method */
2395
Guido van Rossum73624e91994-10-10 17:59:00 +00002396static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002397sock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002398{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002399 sock_addr_t addrbuf;
2400 int res;
2401 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002402
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002403 if (!getsockaddrlen(s, &addrlen))
2404 return NULL;
2405 memset(&addrbuf, 0, addrlen);
2406 Py_BEGIN_ALLOW_THREADS
2407 res = getsockname(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2408 Py_END_ALLOW_THREADS
2409 if (res < 0)
2410 return s->errorhandler();
2411 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2412 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002413}
2414
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002415PyDoc_STRVAR(getsockname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002416"getsockname() -> address info\n\
2417\n\
2418Return the address of the local endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002419info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002420
Guido van Rossumc89705d1992-11-26 08:54:07 +00002421
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002422#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002423/* s.getpeername() method */
2424
Guido van Rossum73624e91994-10-10 17:59:00 +00002425static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002426sock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002427{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002428 sock_addr_t addrbuf;
2429 int res;
2430 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002431
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002432 if (!getsockaddrlen(s, &addrlen))
2433 return NULL;
2434 memset(&addrbuf, 0, addrlen);
2435 Py_BEGIN_ALLOW_THREADS
2436 res = getpeername(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2437 Py_END_ALLOW_THREADS
2438 if (res < 0)
2439 return s->errorhandler();
2440 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2441 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002442}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002443
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002444PyDoc_STRVAR(getpeername_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002445"getpeername() -> address info\n\
2446\n\
2447Return the address of the remote endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002448info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002449
Guido van Rossumb6775db1994-08-01 11:34:53 +00002450#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002451
2452
Guido van Rossum30a685f1991-06-27 15:51:29 +00002453/* s.listen(n) method */
2454
Guido van Rossum73624e91994-10-10 17:59:00 +00002455static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002456sock_listen(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002457{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002458 int backlog;
2459 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002460
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002461 backlog = PyLong_AsLong(arg);
2462 if (backlog == -1 && PyErr_Occurred())
2463 return NULL;
2464 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou1be815a2011-05-10 19:16:29 +02002465 /* To avoid problems on systems that don't allow a negative backlog
2466 * (which doesn't make sense anyway) we force a minimum value of 0. */
2467 if (backlog < 0)
2468 backlog = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002469 res = listen(s->sock_fd, backlog);
2470 Py_END_ALLOW_THREADS
2471 if (res < 0)
2472 return s->errorhandler();
2473 Py_INCREF(Py_None);
2474 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002475}
2476
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002477PyDoc_STRVAR(listen_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002478"listen(backlog)\n\
2479\n\
2480Enable a server to accept connections. The backlog argument must be at\n\
Antoine Pitrou1be815a2011-05-10 19:16:29 +02002481least 0 (if it is lower, it is set to 0); it specifies the number of\n\
2482unaccepted connections that the system will allow before refusing new\n\
2483connections.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002484
2485
Thomas Wouters477c8d52006-05-27 19:21:47 +00002486/*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002487 * This is the guts of the recv() and recv_into() methods, which reads into a
Thomas Wouters902d6eb2007-01-09 23:18:33 +00002488 * char buffer. If you have any inc/dec ref to do to the objects that contain
Thomas Wouters477c8d52006-05-27 19:21:47 +00002489 * the buffer, do it in the caller. This function returns the number of bytes
Ezio Melotti13925002011-03-16 11:05:33 +02002490 * successfully read. If there was an error, it returns -1. Note that it is
Thomas Wouters477c8d52006-05-27 19:21:47 +00002491 * also possible that we return a number of bytes smaller than the request
2492 * bytes.
2493 */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002494
Antoine Pitrou19467d22010-08-17 19:33:30 +00002495static Py_ssize_t
2496sock_recv_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002497{
Antoine Pitrou19467d22010-08-17 19:33:30 +00002498 Py_ssize_t outlen = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002499 int timeout;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002500#ifdef __VMS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002501 int remaining;
2502 char *read_buf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002503#endif
2504
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002505 if (!IS_SELECTABLE(s)) {
2506 select_error();
2507 return -1;
2508 }
2509 if (len == 0) {
2510 /* If 0 bytes were requested, do nothing. */
2511 return 0;
2512 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002513
2514#ifndef __VMS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002515 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002516 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002517 timeout = internal_select_ex(s, 0, interval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002518 if (!timeout)
2519 outlen = recv(s->sock_fd, cbuf, len, flags);
2520 Py_END_ALLOW_THREADS
Thomas Wouters477c8d52006-05-27 19:21:47 +00002521
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002522 if (timeout == 1) {
2523 PyErr_SetString(socket_timeout, "timed out");
2524 return -1;
2525 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002526 END_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002527 if (outlen < 0) {
2528 /* Note: the call to errorhandler() ALWAYS indirectly returned
2529 NULL, so ignore its return value */
2530 s->errorhandler();
2531 return -1;
2532 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002533#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002534 read_buf = cbuf;
2535 remaining = len;
2536 while (remaining != 0) {
2537 unsigned int segment;
2538 int nread = -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002539
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002540 segment = remaining /SEGMENT_SIZE;
2541 if (segment != 0) {
2542 segment = SEGMENT_SIZE;
2543 }
2544 else {
2545 segment = remaining;
2546 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002547
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002548 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002549 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002550 timeout = internal_select_ex(s, 0, interval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002551 if (!timeout)
2552 nread = recv(s->sock_fd, read_buf, segment, flags);
2553 Py_END_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002554 if (timeout == 1) {
2555 PyErr_SetString(socket_timeout, "timed out");
2556 return -1;
2557 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002558 END_SELECT_LOOP(s)
2559
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002560 if (nread < 0) {
2561 s->errorhandler();
2562 return -1;
2563 }
2564 if (nread != remaining) {
2565 read_buf += nread;
2566 break;
2567 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002568
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002569 remaining -= segment;
2570 read_buf += segment;
2571 }
2572 outlen = read_buf - cbuf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002573#endif /* !__VMS */
2574
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002575 return outlen;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002576}
2577
Guido van Rossum48a680c2001-03-02 06:34:14 +00002578
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002579/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002580
Guido van Rossum73624e91994-10-10 17:59:00 +00002581static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002582sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002583{
Antoine Pitrou19467d22010-08-17 19:33:30 +00002584 Py_ssize_t recvlen, outlen;
2585 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002586 PyObject *buf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002587
Antoine Pitrou19467d22010-08-17 19:33:30 +00002588 if (!PyArg_ParseTuple(args, "n|i:recv", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002589 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002590
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002591 if (recvlen < 0) {
2592 PyErr_SetString(PyExc_ValueError,
2593 "negative buffersize in recv");
2594 return NULL;
2595 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002596
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002597 /* Allocate a new string. */
2598 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
2599 if (buf == NULL)
2600 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002601
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002602 /* Call the guts */
2603 outlen = sock_recv_guts(s, PyBytes_AS_STRING(buf), recvlen, flags);
2604 if (outlen < 0) {
2605 /* An error occurred, release the string and return an
2606 error. */
2607 Py_DECREF(buf);
2608 return NULL;
2609 }
2610 if (outlen != recvlen) {
2611 /* We did not read as many bytes as we anticipated, resize the
2612 string if possible and be successful. */
2613 _PyBytes_Resize(&buf, outlen);
2614 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002615
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002616 return buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002617}
2618
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002619PyDoc_STRVAR(recv_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002620"recv(buffersize[, flags]) -> data\n\
2621\n\
2622Receive up to buffersize bytes from the socket. For the optional flags\n\
2623argument, see the Unix manual. When no data is available, block until\n\
2624at least one byte is available or until the remote end is closed. When\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002625the remote end is closed and all data is read, return the empty string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002626
Guido van Rossum30a685f1991-06-27 15:51:29 +00002627
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002628/* s.recv_into(buffer, [nbytes [,flags]]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002629
Thomas Wouters477c8d52006-05-27 19:21:47 +00002630static PyObject*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002631sock_recv_into(PySocketSockObject *s, PyObject *args, PyObject *kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002632{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002633 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00002634
Antoine Pitrou19467d22010-08-17 19:33:30 +00002635 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002636 Py_buffer pbuf;
2637 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002638 Py_ssize_t buflen, readlen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002639
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002640 /* Get the buffer's memory */
Antoine Pitrou19467d22010-08-17 19:33:30 +00002641 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recv_into", kwlist,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002642 &pbuf, &recvlen, &flags))
2643 return NULL;
2644 buf = pbuf.buf;
2645 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002646
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002647 if (recvlen < 0) {
2648 PyBuffer_Release(&pbuf);
2649 PyErr_SetString(PyExc_ValueError,
2650 "negative buffersize in recv_into");
2651 return NULL;
2652 }
2653 if (recvlen == 0) {
2654 /* If nbytes was not specified, use the buffer's length */
2655 recvlen = buflen;
2656 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002657
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002658 /* Check if the buffer is large enough */
2659 if (buflen < recvlen) {
2660 PyBuffer_Release(&pbuf);
2661 PyErr_SetString(PyExc_ValueError,
2662 "buffer too small for requested bytes");
2663 return NULL;
2664 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002665
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002666 /* Call the guts */
2667 readlen = sock_recv_guts(s, buf, recvlen, flags);
2668 if (readlen < 0) {
2669 /* Return an error. */
2670 PyBuffer_Release(&pbuf);
2671 return NULL;
2672 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002673
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002674 PyBuffer_Release(&pbuf);
2675 /* Return the number of bytes read. Note that we do not do anything
2676 special here in the case that readlen < recvlen. */
2677 return PyLong_FromSsize_t(readlen);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002678}
2679
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002680PyDoc_STRVAR(recv_into_doc,
2681"recv_into(buffer, [nbytes[, flags]]) -> nbytes_read\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00002682\n\
2683A version of recv() that stores its data into a buffer rather than creating \n\
2684a new string. Receive up to buffersize bytes from the socket. If buffersize \n\
2685is not specified (or 0), receive up to the size available in the given buffer.\n\
2686\n\
2687See recv() for documentation about the flags.");
2688
2689
2690/*
Christian Heimes99170a52007-12-19 02:07:34 +00002691 * This is the guts of the recvfrom() and recvfrom_into() methods, which reads
2692 * into a char buffer. If you have any inc/def ref to do to the objects that
2693 * contain the buffer, do it in the caller. This function returns the number
Ezio Melotti13925002011-03-16 11:05:33 +02002694 * of bytes successfully read. If there was an error, it returns -1. Note
Christian Heimes99170a52007-12-19 02:07:34 +00002695 * that it is also possible that we return a number of bytes smaller than the
2696 * request bytes.
Thomas Wouters477c8d52006-05-27 19:21:47 +00002697 *
2698 * 'addr' is a return value for the address object. Note that you must decref
2699 * it yourself.
2700 */
Antoine Pitrou19467d22010-08-17 19:33:30 +00002701static Py_ssize_t
2702sock_recvfrom_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002703 PyObject** addr)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002704{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002705 sock_addr_t addrbuf;
2706 int timeout;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002707 Py_ssize_t n = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002708 socklen_t addrlen;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002709
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002710 *addr = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002711
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002712 if (!getsockaddrlen(s, &addrlen))
2713 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002714
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002715 if (!IS_SELECTABLE(s)) {
2716 select_error();
2717 return -1;
2718 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00002719
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002720 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002721 Py_BEGIN_ALLOW_THREADS
2722 memset(&addrbuf, 0, addrlen);
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002723 timeout = internal_select_ex(s, 0, interval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002724 if (!timeout) {
Guido van Rossum8d665e61996-06-26 18:22:49 +00002725#ifndef MS_WINDOWS
Andrew MacIntyreba43e872002-03-03 03:03:52 +00002726#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002727 n = recvfrom(s->sock_fd, cbuf, len, flags,
2728 SAS2SA(&addrbuf), &addrlen);
Guido van Rossum32c575d1997-12-02 20:37:32 +00002729#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002730 n = recvfrom(s->sock_fd, cbuf, len, flags,
2731 (void *) &addrbuf, &addrlen);
Guido van Rossum32c575d1997-12-02 20:37:32 +00002732#endif
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002733#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002734 n = recvfrom(s->sock_fd, cbuf, len, flags,
2735 SAS2SA(&addrbuf), &addrlen);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002736#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002737 }
2738 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002739
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002740 if (timeout == 1) {
2741 PyErr_SetString(socket_timeout, "timed out");
2742 return -1;
2743 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002744 END_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002745 if (n < 0) {
2746 s->errorhandler();
2747 return -1;
2748 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002749
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002750 if (!(*addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
2751 addrlen, s->sock_proto)))
2752 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002753
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002754 return n;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002755}
2756
2757/* s.recvfrom(nbytes [,flags]) method */
2758
2759static PyObject *
2760sock_recvfrom(PySocketSockObject *s, PyObject *args)
2761{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002762 PyObject *buf = NULL;
2763 PyObject *addr = NULL;
2764 PyObject *ret = NULL;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002765 int flags = 0;
2766 Py_ssize_t recvlen, outlen;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002767
Antoine Pitrou19467d22010-08-17 19:33:30 +00002768 if (!PyArg_ParseTuple(args, "n|i:recvfrom", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002769 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002770
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002771 if (recvlen < 0) {
2772 PyErr_SetString(PyExc_ValueError,
2773 "negative buffersize in recvfrom");
2774 return NULL;
2775 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00002776
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002777 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
2778 if (buf == NULL)
2779 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002780
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002781 outlen = sock_recvfrom_guts(s, PyBytes_AS_STRING(buf),
2782 recvlen, flags, &addr);
2783 if (outlen < 0) {
2784 goto finally;
2785 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002786
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002787 if (outlen != recvlen) {
2788 /* We did not read as many bytes as we anticipated, resize the
Ezio Melotti13925002011-03-16 11:05:33 +02002789 string if possible and be successful. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002790 if (_PyBytes_Resize(&buf, outlen) < 0)
Ezio Melotti13925002011-03-16 11:05:33 +02002791 /* Oopsy, not so successful after all. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002792 goto finally;
2793 }
Barry Warsaw752300b1997-01-03 17:18:10 +00002794
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002795 ret = PyTuple_Pack(2, buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002796
2797finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002798 Py_XDECREF(buf);
2799 Py_XDECREF(addr);
2800 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002801}
2802
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002803PyDoc_STRVAR(recvfrom_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002804"recvfrom(buffersize[, flags]) -> (data, address info)\n\
2805\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002806Like recv(buffersize, flags) but also return the sender's address info.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002807
Thomas Wouters477c8d52006-05-27 19:21:47 +00002808
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002809/* s.recvfrom_into(buffer[, nbytes [,flags]]) method */
Thomas Wouters477c8d52006-05-27 19:21:47 +00002810
2811static PyObject *
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002812sock_recvfrom_into(PySocketSockObject *s, PyObject *args, PyObject* kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002813{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002814 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00002815
Antoine Pitrou19467d22010-08-17 19:33:30 +00002816 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002817 Py_buffer pbuf;
2818 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002819 Py_ssize_t readlen, buflen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002820
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002821 PyObject *addr = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002822
Antoine Pitrou19467d22010-08-17 19:33:30 +00002823 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recvfrom_into",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002824 kwlist, &pbuf,
2825 &recvlen, &flags))
2826 return NULL;
2827 buf = pbuf.buf;
2828 buflen = pbuf.len;
2829 assert(buf != 0 && buflen > 0);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002830
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002831 if (recvlen < 0) {
2832 PyBuffer_Release(&pbuf);
2833 PyErr_SetString(PyExc_ValueError,
2834 "negative buffersize in recvfrom_into");
2835 return NULL;
2836 }
2837 if (recvlen == 0) {
2838 /* If nbytes was not specified, use the buffer's length */
2839 recvlen = buflen;
2840 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002841
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002842 readlen = sock_recvfrom_guts(s, buf, recvlen, flags, &addr);
2843 if (readlen < 0) {
2844 PyBuffer_Release(&pbuf);
2845 /* Return an error */
2846 Py_XDECREF(addr);
2847 return NULL;
2848 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002849
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002850 PyBuffer_Release(&pbuf);
2851 /* Return the number of bytes read and the address. Note that we do
2852 not do anything special here in the case that readlen < recvlen. */
Antoine Pitrou19467d22010-08-17 19:33:30 +00002853 return Py_BuildValue("nN", readlen, addr);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002854}
2855
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002856PyDoc_STRVAR(recvfrom_into_doc,
2857"recvfrom_into(buffer[, nbytes[, flags]]) -> (nbytes, address info)\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00002858\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002859Like recv_into(buffer[, nbytes[, flags]]) but also return the sender's address info.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00002860
2861
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002862/* The sendmsg() and recvmsg[_into]() methods require a working
2863 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
2864#ifdef CMSG_LEN
2865/*
2866 * Call recvmsg() with the supplied iovec structures, flags, and
2867 * ancillary data buffer size (controllen). Returns the tuple return
2868 * value for recvmsg() or recvmsg_into(), with the first item provided
2869 * by the supplied makeval() function. makeval() will be called with
2870 * the length read and makeval_data as arguments, and must return a
2871 * new reference (which will be decrefed if there is a subsequent
2872 * error). On error, closes any file descriptors received via
2873 * SCM_RIGHTS.
2874 */
2875static PyObject *
2876sock_recvmsg_guts(PySocketSockObject *s, struct iovec *iov, int iovlen,
2877 int flags, Py_ssize_t controllen,
2878 PyObject *(*makeval)(ssize_t, void *), void *makeval_data)
2879{
2880 ssize_t bytes_received = -1;
2881 int timeout;
2882 sock_addr_t addrbuf;
2883 socklen_t addrbuflen;
Charles-François Natalie9e95ae2011-08-24 21:40:53 +02002884 struct msghdr msg = {0};
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002885 PyObject *cmsg_list = NULL, *retval = NULL;
2886 void *controlbuf = NULL;
2887 struct cmsghdr *cmsgh;
2888 size_t cmsgdatalen = 0;
2889 int cmsg_status;
2890
2891 /* XXX: POSIX says that msg_name and msg_namelen "shall be
2892 ignored" when the socket is connected (Linux fills them in
2893 anyway for AF_UNIX sockets at least). Normally msg_namelen
2894 seems to be set to 0 if there's no address, but try to
2895 initialize msg_name to something that won't be mistaken for a
2896 real address if that doesn't happen. */
2897 if (!getsockaddrlen(s, &addrbuflen))
2898 return NULL;
2899 memset(&addrbuf, 0, addrbuflen);
2900 SAS2SA(&addrbuf)->sa_family = AF_UNSPEC;
2901
2902 if (controllen < 0 || controllen > SOCKLEN_T_LIMIT) {
2903 PyErr_SetString(PyExc_ValueError,
2904 "invalid ancillary data buffer length");
2905 return NULL;
2906 }
2907 if (controllen > 0 && (controlbuf = PyMem_Malloc(controllen)) == NULL)
2908 return PyErr_NoMemory();
2909
2910 /* Make the system call. */
2911 if (!IS_SELECTABLE(s)) {
2912 select_error();
2913 goto finally;
2914 }
2915
2916 BEGIN_SELECT_LOOP(s)
2917 Py_BEGIN_ALLOW_THREADS;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002918 msg.msg_name = SAS2SA(&addrbuf);
2919 msg.msg_namelen = addrbuflen;
2920 msg.msg_iov = iov;
2921 msg.msg_iovlen = iovlen;
2922 msg.msg_control = controlbuf;
2923 msg.msg_controllen = controllen;
2924 timeout = internal_select_ex(s, 0, interval);
2925 if (!timeout)
2926 bytes_received = recvmsg(s->sock_fd, &msg, flags);
2927 Py_END_ALLOW_THREADS;
2928 if (timeout == 1) {
2929 PyErr_SetString(socket_timeout, "timed out");
2930 goto finally;
2931 }
2932 END_SELECT_LOOP(s)
2933
2934 if (bytes_received < 0) {
2935 s->errorhandler();
2936 goto finally;
2937 }
2938
2939 /* Make list of (level, type, data) tuples from control messages. */
2940 if ((cmsg_list = PyList_New(0)) == NULL)
2941 goto err_closefds;
2942 /* Check for empty ancillary data as old CMSG_FIRSTHDR()
2943 implementations didn't do so. */
2944 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
2945 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
2946 PyObject *bytes, *tuple;
2947 int tmp;
2948
2949 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
2950 if (cmsg_status != 0) {
2951 if (PyErr_WarnEx(PyExc_RuntimeWarning,
2952 "received malformed or improperly-truncated "
2953 "ancillary data", 1) == -1)
2954 goto err_closefds;
2955 }
2956 if (cmsg_status < 0)
2957 break;
2958 if (cmsgdatalen > PY_SSIZE_T_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002959 PyErr_SetString(PyExc_OSError, "control message too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002960 goto err_closefds;
2961 }
2962
2963 bytes = PyBytes_FromStringAndSize((char *)CMSG_DATA(cmsgh),
2964 cmsgdatalen);
2965 tuple = Py_BuildValue("iiN", (int)cmsgh->cmsg_level,
2966 (int)cmsgh->cmsg_type, bytes);
2967 if (tuple == NULL)
2968 goto err_closefds;
2969 tmp = PyList_Append(cmsg_list, tuple);
2970 Py_DECREF(tuple);
2971 if (tmp != 0)
2972 goto err_closefds;
2973
2974 if (cmsg_status != 0)
2975 break;
2976 }
2977
2978 retval = Py_BuildValue("NOiN",
2979 (*makeval)(bytes_received, makeval_data),
2980 cmsg_list,
2981 (int)msg.msg_flags,
2982 makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
2983 ((msg.msg_namelen > addrbuflen) ?
2984 addrbuflen : msg.msg_namelen),
2985 s->sock_proto));
2986 if (retval == NULL)
2987 goto err_closefds;
2988
2989finally:
2990 Py_XDECREF(cmsg_list);
2991 PyMem_Free(controlbuf);
2992 return retval;
2993
2994err_closefds:
2995#ifdef SCM_RIGHTS
2996 /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */
2997 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
2998 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
2999 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3000 if (cmsg_status < 0)
3001 break;
3002 if (cmsgh->cmsg_level == SOL_SOCKET &&
3003 cmsgh->cmsg_type == SCM_RIGHTS) {
3004 size_t numfds;
3005 int *fdp;
3006
3007 numfds = cmsgdatalen / sizeof(int);
3008 fdp = (int *)CMSG_DATA(cmsgh);
3009 while (numfds-- > 0)
3010 close(*fdp++);
3011 }
3012 if (cmsg_status != 0)
3013 break;
3014 }
3015#endif /* SCM_RIGHTS */
3016 goto finally;
3017}
3018
3019
3020static PyObject *
3021makeval_recvmsg(ssize_t received, void *data)
3022{
3023 PyObject **buf = data;
3024
3025 if (received < PyBytes_GET_SIZE(*buf))
3026 _PyBytes_Resize(buf, received);
3027 Py_XINCREF(*buf);
3028 return *buf;
3029}
3030
3031/* s.recvmsg(bufsize[, ancbufsize[, flags]]) method */
3032
3033static PyObject *
3034sock_recvmsg(PySocketSockObject *s, PyObject *args)
3035{
3036 Py_ssize_t bufsize, ancbufsize = 0;
3037 int flags = 0;
3038 struct iovec iov;
3039 PyObject *buf = NULL, *retval = NULL;
3040
3041 if (!PyArg_ParseTuple(args, "n|ni:recvmsg", &bufsize, &ancbufsize, &flags))
3042 return NULL;
3043
3044 if (bufsize < 0) {
3045 PyErr_SetString(PyExc_ValueError, "negative buffer size in recvmsg()");
3046 return NULL;
3047 }
3048 if ((buf = PyBytes_FromStringAndSize(NULL, bufsize)) == NULL)
3049 return NULL;
3050 iov.iov_base = PyBytes_AS_STRING(buf);
3051 iov.iov_len = bufsize;
3052
3053 /* Note that we're passing a pointer to *our pointer* to the bytes
3054 object here (&buf); makeval_recvmsg() may incref the object, or
3055 deallocate it and set our pointer to NULL. */
3056 retval = sock_recvmsg_guts(s, &iov, 1, flags, ancbufsize,
3057 &makeval_recvmsg, &buf);
3058 Py_XDECREF(buf);
3059 return retval;
3060}
3061
3062PyDoc_STRVAR(recvmsg_doc,
3063"recvmsg(bufsize[, ancbufsize[, flags]]) -> (data, ancdata, msg_flags, address)\n\
3064\n\
3065Receive normal data (up to bufsize bytes) and ancillary data from the\n\
3066socket. The ancbufsize argument sets the size in bytes of the\n\
3067internal buffer used to receive the ancillary data; it defaults to 0,\n\
3068meaning that no ancillary data will be received. Appropriate buffer\n\
3069sizes for ancillary data can be calculated using CMSG_SPACE() or\n\
3070CMSG_LEN(), and items which do not fit into the buffer might be\n\
3071truncated or discarded. The flags argument defaults to 0 and has the\n\
3072same meaning as for recv().\n\
3073\n\
3074The return value is a 4-tuple: (data, ancdata, msg_flags, address).\n\
3075The data item is a bytes object holding the non-ancillary data\n\
3076received. The ancdata item is a list of zero or more tuples\n\
3077(cmsg_level, cmsg_type, cmsg_data) representing the ancillary data\n\
3078(control messages) received: cmsg_level and cmsg_type are integers\n\
3079specifying the protocol level and protocol-specific type respectively,\n\
3080and cmsg_data is a bytes object holding the associated data. The\n\
3081msg_flags item is the bitwise OR of various flags indicating\n\
3082conditions on the received message; see your system documentation for\n\
3083details. If the receiving socket is unconnected, address is the\n\
3084address of the sending socket, if available; otherwise, its value is\n\
3085unspecified.\n\
3086\n\
3087If recvmsg() raises an exception after the system call returns, it\n\
3088will first attempt to close any file descriptors received via the\n\
3089SCM_RIGHTS mechanism.");
3090
3091
3092static PyObject *
3093makeval_recvmsg_into(ssize_t received, void *data)
3094{
3095 return PyLong_FromSsize_t(received);
3096}
3097
3098/* s.recvmsg_into(buffers[, ancbufsize[, flags]]) method */
3099
3100static PyObject *
3101sock_recvmsg_into(PySocketSockObject *s, PyObject *args)
3102{
3103 Py_ssize_t ancbufsize = 0;
3104 int flags = 0;
3105 struct iovec *iovs = NULL;
3106 Py_ssize_t i, nitems, nbufs = 0;
3107 Py_buffer *bufs = NULL;
3108 PyObject *buffers_arg, *fast, *retval = NULL;
3109
3110 if (!PyArg_ParseTuple(args, "O|ni:recvmsg_into",
3111 &buffers_arg, &ancbufsize, &flags))
3112 return NULL;
3113
3114 if ((fast = PySequence_Fast(buffers_arg,
3115 "recvmsg_into() argument 1 must be an "
3116 "iterable")) == NULL)
3117 return NULL;
3118 nitems = PySequence_Fast_GET_SIZE(fast);
3119 if (nitems > INT_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003120 PyErr_SetString(PyExc_OSError, "recvmsg_into() argument 1 is too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003121 goto finally;
3122 }
3123
3124 /* Fill in an iovec for each item, and save the Py_buffer
3125 structs to release afterwards. */
3126 if (nitems > 0 && ((iovs = PyMem_New(struct iovec, nitems)) == NULL ||
3127 (bufs = PyMem_New(Py_buffer, nitems)) == NULL)) {
3128 PyErr_NoMemory();
3129 goto finally;
3130 }
3131 for (; nbufs < nitems; nbufs++) {
3132 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(fast, nbufs),
3133 "w*;recvmsg_into() argument 1 must be an iterable "
3134 "of single-segment read-write buffers",
3135 &bufs[nbufs]))
3136 goto finally;
3137 iovs[nbufs].iov_base = bufs[nbufs].buf;
3138 iovs[nbufs].iov_len = bufs[nbufs].len;
3139 }
3140
3141 retval = sock_recvmsg_guts(s, iovs, nitems, flags, ancbufsize,
3142 &makeval_recvmsg_into, NULL);
3143finally:
3144 for (i = 0; i < nbufs; i++)
3145 PyBuffer_Release(&bufs[i]);
3146 PyMem_Free(bufs);
3147 PyMem_Free(iovs);
3148 Py_DECREF(fast);
3149 return retval;
3150}
3151
3152PyDoc_STRVAR(recvmsg_into_doc,
3153"recvmsg_into(buffers[, ancbufsize[, flags]]) -> (nbytes, ancdata, msg_flags, address)\n\
3154\n\
3155Receive normal data and ancillary data from the socket, scattering the\n\
3156non-ancillary data into a series of buffers. The buffers argument\n\
3157must be an iterable of objects that export writable buffers\n\
3158(e.g. bytearray objects); these will be filled with successive chunks\n\
3159of the non-ancillary data until it has all been written or there are\n\
3160no more buffers. The ancbufsize argument sets the size in bytes of\n\
3161the internal buffer used to receive the ancillary data; it defaults to\n\
31620, meaning that no ancillary data will be received. Appropriate\n\
3163buffer sizes for ancillary data can be calculated using CMSG_SPACE()\n\
3164or CMSG_LEN(), and items which do not fit into the buffer might be\n\
3165truncated or discarded. The flags argument defaults to 0 and has the\n\
3166same meaning as for recv().\n\
3167\n\
3168The return value is a 4-tuple: (nbytes, ancdata, msg_flags, address).\n\
3169The nbytes item is the total number of bytes of non-ancillary data\n\
3170written into the buffers. The ancdata item is a list of zero or more\n\
3171tuples (cmsg_level, cmsg_type, cmsg_data) representing the ancillary\n\
3172data (control messages) received: cmsg_level and cmsg_type are\n\
3173integers specifying the protocol level and protocol-specific type\n\
3174respectively, and cmsg_data is a bytes object holding the associated\n\
3175data. The msg_flags item is the bitwise OR of various flags\n\
3176indicating conditions on the received message; see your system\n\
3177documentation for details. If the receiving socket is unconnected,\n\
3178address is the address of the sending socket, if available; otherwise,\n\
3179its value is unspecified.\n\
3180\n\
3181If recvmsg_into() raises an exception after the system call returns,\n\
3182it will first attempt to close any file descriptors received via the\n\
3183SCM_RIGHTS mechanism.");
3184#endif /* CMSG_LEN */
3185
3186
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003187/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003188
Guido van Rossum73624e91994-10-10 17:59:00 +00003189static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003190sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003191{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003192 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003193 Py_ssize_t len, n = -1;
3194 int flags = 0, timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003195 Py_buffer pbuf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003196
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003197 if (!PyArg_ParseTuple(args, "y*|i:send", &pbuf, &flags))
3198 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003199
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003200 if (!IS_SELECTABLE(s)) {
3201 PyBuffer_Release(&pbuf);
3202 return select_error();
3203 }
3204 buf = pbuf.buf;
3205 len = pbuf.len;
Neal Norwitz082b2df2006-02-07 07:04:46 +00003206
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003207 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003208 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003209 timeout = internal_select_ex(s, 1, interval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003210 if (!timeout)
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003211#ifdef __VMS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003212 n = sendsegmented(s->sock_fd, buf, len, flags);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003213#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003214 n = send(s->sock_fd, buf, len, flags);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003215#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003216 Py_END_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003217 if (timeout == 1) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003218 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003219 PyErr_SetString(socket_timeout, "timed out");
3220 return NULL;
3221 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003222 END_SELECT_LOOP(s)
3223
3224 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003225 if (n < 0)
3226 return s->errorhandler();
Antoine Pitrou19467d22010-08-17 19:33:30 +00003227 return PyLong_FromSsize_t(n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00003228}
3229
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003230PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003231"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003232\n\
3233Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003234argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003235sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003236
3237
3238/* s.sendall(data [,flags]) method */
3239
3240static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003241sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003242{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003243 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003244 Py_ssize_t len, n = -1;
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003245 int flags = 0, timeout, saved_errno;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003246 Py_buffer pbuf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003247
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003248 if (!PyArg_ParseTuple(args, "y*|i:sendall", &pbuf, &flags))
3249 return NULL;
3250 buf = pbuf.buf;
3251 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003252
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003253 if (!IS_SELECTABLE(s)) {
3254 PyBuffer_Release(&pbuf);
3255 return select_error();
3256 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003257
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003258 do {
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003259 Py_BEGIN_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003260 timeout = internal_select(s, 1);
3261 n = -1;
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003262 if (!timeout) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003263#ifdef __VMS
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003264 n = sendsegmented(s->sock_fd, buf, len, flags);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003265#else
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003266 n = send(s->sock_fd, buf, len, flags);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003267#endif
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003268 }
3269 Py_END_ALLOW_THREADS
3270 if (timeout == 1) {
3271 PyBuffer_Release(&pbuf);
3272 PyErr_SetString(socket_timeout, "timed out");
3273 return NULL;
3274 }
3275 /* PyErr_CheckSignals() might change errno */
3276 saved_errno = errno;
3277 /* We must run our signal handlers before looping again.
3278 send() can return a successful partial write when it is
3279 interrupted, so we can't restrict ourselves to EINTR. */
3280 if (PyErr_CheckSignals()) {
3281 PyBuffer_Release(&pbuf);
3282 return NULL;
3283 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003284 if (n < 0) {
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003285 /* If interrupted, try again */
3286 if (saved_errno == EINTR)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003287 continue;
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003288 else
3289 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003290 }
3291 buf += n;
3292 len -= n;
3293 } while (len > 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003294 PyBuffer_Release(&pbuf);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003295
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003296 if (n < 0)
3297 return s->errorhandler();
Guido van Rossum67f7a382002-06-06 21:08:16 +00003298
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003299 Py_INCREF(Py_None);
3300 return Py_None;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003301}
3302
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003303PyDoc_STRVAR(sendall_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003304"sendall(data[, flags])\n\
3305\n\
3306Send a data string to the socket. For the optional flags\n\
3307argument, see the Unix manual. This calls send() repeatedly\n\
3308until all data is sent. If an error occurs, it's impossible\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003309to tell how much data has been sent.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003310
Guido van Rossum30a685f1991-06-27 15:51:29 +00003311
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003312/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003313
Guido van Rossum73624e91994-10-10 17:59:00 +00003314static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003315sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003316{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003317 Py_buffer pbuf;
3318 PyObject *addro;
3319 char *buf;
Antoine Pitrou5e981412011-03-17 22:38:37 +01003320 Py_ssize_t len, arglen;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003321 sock_addr_t addrbuf;
3322 int addrlen, n = -1, flags, timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003323
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003324 flags = 0;
Antoine Pitrou5e981412011-03-17 22:38:37 +01003325 arglen = PyTuple_Size(args);
3326 switch (arglen) {
3327 case 2:
3328 PyArg_ParseTuple(args, "y*O:sendto", &pbuf, &addro);
3329 break;
3330 case 3:
3331 PyArg_ParseTuple(args, "y*iO:sendto",
3332 &pbuf, &flags, &addro);
3333 break;
3334 default:
3335 PyErr_Format(PyExc_TypeError,
3336 "sendto() takes 2 or 3 arguments (%d given)",
3337 arglen);
Victor Stinner77af1722011-05-26 14:05:59 +02003338 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003339 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01003340 if (PyErr_Occurred())
3341 return NULL;
3342
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003343 buf = pbuf.buf;
3344 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003345
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003346 if (!IS_SELECTABLE(s)) {
3347 PyBuffer_Release(&pbuf);
3348 return select_error();
3349 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003350
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003351 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen)) {
3352 PyBuffer_Release(&pbuf);
3353 return NULL;
3354 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003355
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003356 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003357 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003358 timeout = internal_select_ex(s, 1, interval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003359 if (!timeout)
3360 n = sendto(s->sock_fd, buf, len, flags, SAS2SA(&addrbuf), addrlen);
3361 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00003362
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003363 if (timeout == 1) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003364 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003365 PyErr_SetString(socket_timeout, "timed out");
3366 return NULL;
3367 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003368 END_SELECT_LOOP(s)
3369 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003370 if (n < 0)
3371 return s->errorhandler();
Antoine Pitrou19467d22010-08-17 19:33:30 +00003372 return PyLong_FromSsize_t(n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003373}
3374
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003375PyDoc_STRVAR(sendto_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003376"sendto(data[, flags], address) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003377\n\
3378Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003379For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003380
Guido van Rossum30a685f1991-06-27 15:51:29 +00003381
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003382/* The sendmsg() and recvmsg[_into]() methods require a working
3383 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
3384#ifdef CMSG_LEN
3385/* s.sendmsg(buffers[, ancdata[, flags[, address]]]) method */
3386
3387static PyObject *
3388sock_sendmsg(PySocketSockObject *s, PyObject *args)
3389{
3390 Py_ssize_t i, ndataparts, ndatabufs = 0, ncmsgs, ncmsgbufs = 0;
3391 Py_buffer *databufs = NULL;
3392 struct iovec *iovs = NULL;
3393 sock_addr_t addrbuf;
Charles-François Natalie9e95ae2011-08-24 21:40:53 +02003394 struct msghdr msg = {0};
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003395 struct cmsginfo {
3396 int level;
3397 int type;
3398 Py_buffer data;
3399 } *cmsgs = NULL;
3400 void *controlbuf = NULL;
3401 size_t controllen, controllen_last;
3402 ssize_t bytes_sent = -1;
3403 int addrlen, timeout, flags = 0;
3404 PyObject *data_arg, *cmsg_arg = NULL, *addr_arg = NULL, *data_fast = NULL,
3405 *cmsg_fast = NULL, *retval = NULL;
3406
3407 if (!PyArg_ParseTuple(args, "O|OiO:sendmsg",
3408 &data_arg, &cmsg_arg, &flags, &addr_arg))
3409 return NULL;
3410
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003411 /* Parse destination address. */
3412 if (addr_arg != NULL && addr_arg != Py_None) {
3413 if (!getsockaddrarg(s, addr_arg, SAS2SA(&addrbuf), &addrlen))
3414 goto finally;
3415 msg.msg_name = &addrbuf;
3416 msg.msg_namelen = addrlen;
3417 }
3418
3419 /* Fill in an iovec for each message part, and save the Py_buffer
3420 structs to release afterwards. */
3421 if ((data_fast = PySequence_Fast(data_arg,
3422 "sendmsg() argument 1 must be an "
3423 "iterable")) == NULL)
3424 goto finally;
3425 ndataparts = PySequence_Fast_GET_SIZE(data_fast);
3426 if (ndataparts > INT_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003427 PyErr_SetString(PyExc_OSError, "sendmsg() argument 1 is too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003428 goto finally;
3429 }
3430 msg.msg_iovlen = ndataparts;
3431 if (ndataparts > 0 &&
3432 ((msg.msg_iov = iovs = PyMem_New(struct iovec, ndataparts)) == NULL ||
3433 (databufs = PyMem_New(Py_buffer, ndataparts)) == NULL)) {
3434 PyErr_NoMemory();
3435 goto finally;
3436 }
3437 for (; ndatabufs < ndataparts; ndatabufs++) {
3438 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(data_fast, ndatabufs),
3439 "y*;sendmsg() argument 1 must be an iterable of "
3440 "buffer-compatible objects",
3441 &databufs[ndatabufs]))
3442 goto finally;
3443 iovs[ndatabufs].iov_base = databufs[ndatabufs].buf;
3444 iovs[ndatabufs].iov_len = databufs[ndatabufs].len;
3445 }
3446
3447 if (cmsg_arg == NULL)
3448 ncmsgs = 0;
3449 else {
3450 if ((cmsg_fast = PySequence_Fast(cmsg_arg,
3451 "sendmsg() argument 2 must be an "
3452 "iterable")) == NULL)
3453 goto finally;
3454 ncmsgs = PySequence_Fast_GET_SIZE(cmsg_fast);
3455 }
3456
3457#ifndef CMSG_SPACE
3458 if (ncmsgs > 1) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003459 PyErr_SetString(PyExc_OSError,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003460 "sending multiple control messages is not supported "
3461 "on this system");
3462 goto finally;
3463 }
3464#endif
3465 /* Save level, type and Py_buffer for each control message,
3466 and calculate total size. */
3467 if (ncmsgs > 0 && (cmsgs = PyMem_New(struct cmsginfo, ncmsgs)) == NULL) {
3468 PyErr_NoMemory();
3469 goto finally;
3470 }
3471 controllen = controllen_last = 0;
3472 while (ncmsgbufs < ncmsgs) {
3473 size_t bufsize, space;
3474
3475 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(cmsg_fast, ncmsgbufs),
3476 "(iiy*):[sendmsg() ancillary data items]",
3477 &cmsgs[ncmsgbufs].level,
3478 &cmsgs[ncmsgbufs].type,
3479 &cmsgs[ncmsgbufs].data))
3480 goto finally;
3481 bufsize = cmsgs[ncmsgbufs++].data.len;
3482
3483#ifdef CMSG_SPACE
3484 if (!get_CMSG_SPACE(bufsize, &space)) {
3485#else
3486 if (!get_CMSG_LEN(bufsize, &space)) {
3487#endif
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003488 PyErr_SetString(PyExc_OSError, "ancillary data item too large");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003489 goto finally;
3490 }
3491 controllen += space;
3492 if (controllen > SOCKLEN_T_LIMIT || controllen < controllen_last) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003493 PyErr_SetString(PyExc_OSError, "too much ancillary data");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003494 goto finally;
3495 }
3496 controllen_last = controllen;
3497 }
3498
3499 /* Construct ancillary data block from control message info. */
3500 if (ncmsgbufs > 0) {
3501 struct cmsghdr *cmsgh = NULL;
3502
3503 if ((msg.msg_control = controlbuf =
3504 PyMem_Malloc(controllen)) == NULL) {
3505 PyErr_NoMemory();
3506 goto finally;
3507 }
3508 msg.msg_controllen = controllen;
3509
3510 /* Need to zero out the buffer as a workaround for glibc's
3511 CMSG_NXTHDR() implementation. After getting the pointer to
3512 the next header, it checks its (uninitialized) cmsg_len
3513 member to see if the "message" fits in the buffer, and
3514 returns NULL if it doesn't. Zero-filling the buffer
3515 ensures that that doesn't happen. */
3516 memset(controlbuf, 0, controllen);
3517
3518 for (i = 0; i < ncmsgbufs; i++) {
3519 size_t msg_len, data_len = cmsgs[i].data.len;
3520 int enough_space = 0;
3521
3522 cmsgh = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsgh);
3523 if (cmsgh == NULL) {
3524 PyErr_Format(PyExc_RuntimeError,
3525 "unexpected NULL result from %s()",
3526 (i == 0) ? "CMSG_FIRSTHDR" : "CMSG_NXTHDR");
3527 goto finally;
3528 }
3529 if (!get_CMSG_LEN(data_len, &msg_len)) {
3530 PyErr_SetString(PyExc_RuntimeError,
3531 "item size out of range for CMSG_LEN()");
3532 goto finally;
3533 }
3534 if (cmsg_min_space(&msg, cmsgh, msg_len)) {
3535 size_t space;
3536
3537 cmsgh->cmsg_len = msg_len;
3538 if (get_cmsg_data_space(&msg, cmsgh, &space))
3539 enough_space = (space >= data_len);
3540 }
3541 if (!enough_space) {
3542 PyErr_SetString(PyExc_RuntimeError,
3543 "ancillary data does not fit in calculated "
3544 "space");
3545 goto finally;
3546 }
3547 cmsgh->cmsg_level = cmsgs[i].level;
3548 cmsgh->cmsg_type = cmsgs[i].type;
3549 memcpy(CMSG_DATA(cmsgh), cmsgs[i].data.buf, data_len);
3550 }
3551 }
3552
3553 /* Make the system call. */
3554 if (!IS_SELECTABLE(s)) {
3555 select_error();
3556 goto finally;
3557 }
3558
3559 BEGIN_SELECT_LOOP(s)
3560 Py_BEGIN_ALLOW_THREADS;
3561 timeout = internal_select_ex(s, 1, interval);
3562 if (!timeout)
3563 bytes_sent = sendmsg(s->sock_fd, &msg, flags);
3564 Py_END_ALLOW_THREADS;
3565 if (timeout == 1) {
3566 PyErr_SetString(socket_timeout, "timed out");
3567 goto finally;
3568 }
3569 END_SELECT_LOOP(s)
3570
3571 if (bytes_sent < 0) {
3572 s->errorhandler();
3573 goto finally;
3574 }
3575 retval = PyLong_FromSsize_t(bytes_sent);
3576
3577finally:
3578 PyMem_Free(controlbuf);
3579 for (i = 0; i < ncmsgbufs; i++)
3580 PyBuffer_Release(&cmsgs[i].data);
3581 PyMem_Free(cmsgs);
3582 Py_XDECREF(cmsg_fast);
3583 for (i = 0; i < ndatabufs; i++)
3584 PyBuffer_Release(&databufs[i]);
3585 PyMem_Free(databufs);
3586 PyMem_Free(iovs);
3587 Py_XDECREF(data_fast);
3588 return retval;
3589}
3590
3591PyDoc_STRVAR(sendmsg_doc,
3592"sendmsg(buffers[, ancdata[, flags[, address]]]) -> count\n\
3593\n\
3594Send normal and ancillary data to the socket, gathering the\n\
3595non-ancillary data from a series of buffers and concatenating it into\n\
3596a single message. The buffers argument specifies the non-ancillary\n\
3597data as an iterable of buffer-compatible objects (e.g. bytes objects).\n\
3598The ancdata argument specifies the ancillary data (control messages)\n\
3599as an iterable of zero or more tuples (cmsg_level, cmsg_type,\n\
3600cmsg_data), where cmsg_level and cmsg_type are integers specifying the\n\
3601protocol level and protocol-specific type respectively, and cmsg_data\n\
3602is a buffer-compatible object holding the associated data. The flags\n\
3603argument defaults to 0 and has the same meaning as for send(). If\n\
3604address is supplied and not None, it sets a destination address for\n\
3605the message. The return value is the number of bytes of non-ancillary\n\
3606data sent.");
3607#endif /* CMSG_LEN */
3608
3609
Guido van Rossum30a685f1991-06-27 15:51:29 +00003610/* s.shutdown(how) method */
3611
Guido van Rossum73624e91994-10-10 17:59:00 +00003612static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003613sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003614{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003615 int how;
3616 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003617
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003618 how = PyLong_AsLong(arg);
3619 if (how == -1 && PyErr_Occurred())
3620 return NULL;
3621 Py_BEGIN_ALLOW_THREADS
3622 res = shutdown(s->sock_fd, how);
3623 Py_END_ALLOW_THREADS
3624 if (res < 0)
3625 return s->errorhandler();
3626 Py_INCREF(Py_None);
3627 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003628}
3629
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003630PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003631"shutdown(flag)\n\
3632\n\
Martin v. Löwis94681fc2003-11-27 19:40:22 +00003633Shut down the reading side of the socket (flag == SHUT_RD), the writing side\n\
3634of the socket (flag == SHUT_WR), or both ends (flag == SHUT_RDWR).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003635
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00003636#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Christian Heimesfaf2f632008-01-06 16:59:19 +00003637static PyObject*
3638sock_ioctl(PySocketSockObject *s, PyObject *arg)
3639{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003640 unsigned long cmd = SIO_RCVALL;
3641 PyObject *argO;
3642 DWORD recv;
Christian Heimesfaf2f632008-01-06 16:59:19 +00003643
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003644 if (!PyArg_ParseTuple(arg, "kO:ioctl", &cmd, &argO))
3645 return NULL;
Christian Heimesfaf2f632008-01-06 16:59:19 +00003646
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003647 switch (cmd) {
3648 case SIO_RCVALL: {
3649 unsigned int option = RCVALL_ON;
3650 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
3651 return NULL;
3652 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
3653 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
3654 return set_error();
3655 }
3656 return PyLong_FromUnsignedLong(recv); }
3657 case SIO_KEEPALIVE_VALS: {
3658 struct tcp_keepalive ka;
3659 if (!PyArg_ParseTuple(arg, "k(kkk):ioctl", &cmd,
3660 &ka.onoff, &ka.keepalivetime, &ka.keepaliveinterval))
3661 return NULL;
3662 if (WSAIoctl(s->sock_fd, cmd, &ka, sizeof(ka),
3663 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
3664 return set_error();
3665 }
3666 return PyLong_FromUnsignedLong(recv); }
3667 default:
3668 PyErr_Format(PyExc_ValueError, "invalid ioctl command %d", cmd);
3669 return NULL;
3670 }
Christian Heimesfaf2f632008-01-06 16:59:19 +00003671}
3672PyDoc_STRVAR(sock_ioctl_doc,
3673"ioctl(cmd, option) -> long\n\
3674\n\
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00003675Control the socket with WSAIoctl syscall. Currently supported 'cmd' values are\n\
3676SIO_RCVALL: 'option' must be one of the socket.RCVALL_* constants.\n\
3677SIO_KEEPALIVE_VALS: 'option' is a tuple of (onoff, timeout, interval).");
Christian Heimesfaf2f632008-01-06 16:59:19 +00003678
3679#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00003680
3681/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003682
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003683static PyMethodDef sock_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003684 {"_accept", (PyCFunction)sock_accept, METH_NOARGS,
3685 accept_doc},
3686 {"bind", (PyCFunction)sock_bind, METH_O,
3687 bind_doc},
3688 {"close", (PyCFunction)sock_close, METH_NOARGS,
3689 close_doc},
3690 {"connect", (PyCFunction)sock_connect, METH_O,
3691 connect_doc},
3692 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
3693 connect_ex_doc},
Antoine Pitrou6e451df2010-08-09 20:39:54 +00003694 {"detach", (PyCFunction)sock_detach, METH_NOARGS,
3695 detach_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003696 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
3697 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00003698#ifdef HAVE_GETPEERNAME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003699 {"getpeername", (PyCFunction)sock_getpeername,
3700 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00003701#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003702 {"getsockname", (PyCFunction)sock_getsockname,
3703 METH_NOARGS, getsockname_doc},
3704 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
3705 getsockopt_doc},
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00003706#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003707 {"ioctl", (PyCFunction)sock_ioctl, METH_VARARGS,
3708 sock_ioctl_doc},
Christian Heimesfaf2f632008-01-06 16:59:19 +00003709#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003710 {"listen", (PyCFunction)sock_listen, METH_O,
3711 listen_doc},
3712 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
3713 recv_doc},
3714 {"recv_into", (PyCFunction)sock_recv_into, METH_VARARGS | METH_KEYWORDS,
3715 recv_into_doc},
3716 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
3717 recvfrom_doc},
3718 {"recvfrom_into", (PyCFunction)sock_recvfrom_into, METH_VARARGS | METH_KEYWORDS,
3719 recvfrom_into_doc},
3720 {"send", (PyCFunction)sock_send, METH_VARARGS,
3721 send_doc},
3722 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
3723 sendall_doc},
3724 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
3725 sendto_doc},
3726 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
3727 setblocking_doc},
3728 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
3729 settimeout_doc},
3730 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
3731 gettimeout_doc},
3732 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
3733 setsockopt_doc},
3734 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
3735 shutdown_doc},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003736#ifdef CMSG_LEN
3737 {"recvmsg", (PyCFunction)sock_recvmsg, METH_VARARGS,
3738 recvmsg_doc},
3739 {"recvmsg_into", (PyCFunction)sock_recvmsg_into, METH_VARARGS,
3740 recvmsg_into_doc,},
3741 {"sendmsg", (PyCFunction)sock_sendmsg, METH_VARARGS,
3742 sendmsg_doc},
3743#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003744 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003745};
3746
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003747/* SockObject members */
3748static PyMemberDef sock_memberlist[] = {
3749 {"family", T_INT, offsetof(PySocketSockObject, sock_family), READONLY, "the socket family"},
3750 {"type", T_INT, offsetof(PySocketSockObject, sock_type), READONLY, "the socket type"},
3751 {"proto", T_INT, offsetof(PySocketSockObject, sock_proto), READONLY, "the socket protocol"},
3752 {"timeout", T_DOUBLE, offsetof(PySocketSockObject, sock_timeout), READONLY, "the socket timeout"},
3753 {0},
3754};
Guido van Rossum30a685f1991-06-27 15:51:29 +00003755
Guido van Rossum73624e91994-10-10 17:59:00 +00003756/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00003757 First close the file description. */
3758
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003759static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003760sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003761{
Antoine Pitroue033e062010-10-29 10:38:18 +00003762 if (s->sock_fd != -1) {
3763 PyObject *exc, *val, *tb;
3764 Py_ssize_t old_refcount = Py_REFCNT(s);
3765 ++Py_REFCNT(s);
3766 PyErr_Fetch(&exc, &val, &tb);
3767 if (PyErr_WarnFormat(PyExc_ResourceWarning, 1,
3768 "unclosed %R", s))
3769 /* Spurious errors can appear at shutdown */
3770 if (PyErr_ExceptionMatches(PyExc_Warning))
3771 PyErr_WriteUnraisable((PyObject *) s);
3772 PyErr_Restore(exc, val, tb);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003773 (void) SOCKETCLOSE(s->sock_fd);
Antoine Pitroue033e062010-10-29 10:38:18 +00003774 Py_REFCNT(s) = old_refcount;
3775 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003776 Py_TYPE(s)->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003777}
3778
Guido van Rossum30a685f1991-06-27 15:51:29 +00003779
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003780static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003781sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003782{
Fred Drakea04eaad2000-06-30 02:46:07 +00003783#if SIZEOF_SOCKET_T > SIZEOF_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003784 if (s->sock_fd > LONG_MAX) {
3785 /* this can occur on Win64, and actually there is a special
3786 ugly printf formatter for decimal pointer length integer
3787 printing, only bother if necessary*/
3788 PyErr_SetString(PyExc_OverflowError,
3789 "no printf formatter to display "
3790 "the socket descriptor in decimal");
3791 return NULL;
3792 }
Fred Drakea04eaad2000-06-30 02:46:07 +00003793#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003794 return PyUnicode_FromFormat(
3795 "<socket object, fd=%ld, family=%d, type=%d, proto=%d>",
3796 (long)s->sock_fd, s->sock_family,
3797 s->sock_type,
3798 s->sock_proto);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003799}
3800
3801
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003802/* Create a new, uninitialized socket object. */
3803
3804static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003805sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003806{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003807 PyObject *new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003808
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003809 new = type->tp_alloc(type, 0);
3810 if (new != NULL) {
3811 ((PySocketSockObject *)new)->sock_fd = -1;
3812 ((PySocketSockObject *)new)->sock_timeout = -1.0;
3813 ((PySocketSockObject *)new)->errorhandler = &set_error;
3814 }
3815 return new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003816}
3817
3818
3819/* Initialize a new socket object. */
3820
3821/*ARGSUSED*/
3822static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00003823sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003824{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003825 PySocketSockObject *s = (PySocketSockObject *)self;
3826 PyObject *fdobj = NULL;
3827 SOCKET_T fd = INVALID_SOCKET;
3828 int family = AF_INET, type = SOCK_STREAM, proto = 0;
3829 static char *keywords[] = {"family", "type", "proto", "fileno", 0};
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003830
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003831 if (!PyArg_ParseTupleAndKeywords(args, kwds,
3832 "|iiiO:socket", keywords,
3833 &family, &type, &proto, &fdobj))
3834 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003835
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003836 if (fdobj != NULL && fdobj != Py_None) {
3837 fd = PyLong_AsSocket_t(fdobj);
3838 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
3839 return -1;
3840 if (fd == INVALID_SOCKET) {
3841 PyErr_SetString(PyExc_ValueError,
3842 "can't use invalid socket value");
3843 return -1;
3844 }
3845 }
3846 else {
3847 Py_BEGIN_ALLOW_THREADS
3848 fd = socket(family, type, proto);
3849 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00003850
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003851 if (fd == INVALID_SOCKET) {
3852 set_error();
3853 return -1;
3854 }
3855 }
3856 init_sockobject(s, fd, family, type, proto);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003857
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003858 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003859
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003860}
3861
3862
Guido van Rossumb6775db1994-08-01 11:34:53 +00003863/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003864
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003865static PyTypeObject sock_type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003866 PyVarObject_HEAD_INIT(0, 0) /* Must fill in type value later */
3867 "_socket.socket", /* tp_name */
3868 sizeof(PySocketSockObject), /* tp_basicsize */
3869 0, /* tp_itemsize */
3870 (destructor)sock_dealloc, /* tp_dealloc */
3871 0, /* tp_print */
3872 0, /* tp_getattr */
3873 0, /* tp_setattr */
3874 0, /* tp_reserved */
3875 (reprfunc)sock_repr, /* tp_repr */
3876 0, /* tp_as_number */
3877 0, /* tp_as_sequence */
3878 0, /* tp_as_mapping */
3879 0, /* tp_hash */
3880 0, /* tp_call */
3881 0, /* tp_str */
3882 PyObject_GenericGetAttr, /* tp_getattro */
3883 0, /* tp_setattro */
3884 0, /* tp_as_buffer */
3885 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
3886 sock_doc, /* tp_doc */
3887 0, /* tp_traverse */
3888 0, /* tp_clear */
3889 0, /* tp_richcompare */
3890 0, /* tp_weaklistoffset */
3891 0, /* tp_iter */
3892 0, /* tp_iternext */
3893 sock_methods, /* tp_methods */
3894 sock_memberlist, /* tp_members */
3895 0, /* tp_getset */
3896 0, /* tp_base */
3897 0, /* tp_dict */
3898 0, /* tp_descr_get */
3899 0, /* tp_descr_set */
3900 0, /* tp_dictoffset */
3901 sock_initobj, /* tp_init */
3902 PyType_GenericAlloc, /* tp_alloc */
3903 sock_new, /* tp_new */
3904 PyObject_Del, /* tp_free */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003905};
3906
Guido van Rossum30a685f1991-06-27 15:51:29 +00003907
Guido van Rossum81194471991-07-27 21:42:02 +00003908/* Python interface to gethostname(). */
3909
3910/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00003911static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00003912socket_gethostname(PyObject *self, PyObject *unused)
Guido van Rossum81194471991-07-27 21:42:02 +00003913{
Martin v. Löwis72f48422010-10-29 18:20:08 +00003914#ifdef MS_WINDOWS
3915 /* Don't use winsock's gethostname, as this returns the ANSI
3916 version of the hostname, whereas we need a Unicode string.
3917 Otherwise, gethostname apparently also returns the DNS name. */
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00003918 wchar_t buf[MAX_COMPUTERNAME_LENGTH + 1];
Victor Stinner63941882011-09-29 00:42:28 +02003919 DWORD size = Py_ARRAY_LENGTH(buf);
Victor Stinner74168972011-11-17 01:11:36 +01003920 wchar_t *name;
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00003921 PyObject *result;
Victor Stinner74168972011-11-17 01:11:36 +01003922
3923 if (GetComputerNameExW(ComputerNamePhysicalDnsHostname, buf, &size))
Victor Stinner9d3b93b2011-11-22 02:27:30 +01003924 return PyUnicode_FromWideChar(buf, size);
Victor Stinner74168972011-11-17 01:11:36 +01003925
3926 if (GetLastError() != ERROR_MORE_DATA)
3927 return PyErr_SetFromWindowsErr(0);
3928
3929 if (size == 0)
3930 return PyUnicode_New(0, 0);
3931
3932 /* MSDN says ERROR_MORE_DATA may occur because DNS allows longer
3933 names */
3934 name = PyMem_Malloc(size * sizeof(wchar_t));
3935 if (!name)
3936 return NULL;
3937 if (!GetComputerNameExW(ComputerNamePhysicalDnsHostname,
3938 name,
3939 &size))
3940 {
3941 PyMem_Free(name);
3942 return PyErr_SetFromWindowsErr(0);
Martin v. Löwis72f48422010-10-29 18:20:08 +00003943 }
Victor Stinner74168972011-11-17 01:11:36 +01003944
3945 result = PyUnicode_FromWideChar(name, size);
3946 PyMem_Free(name);
3947 return result;
Martin v. Löwis72f48422010-10-29 18:20:08 +00003948#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003949 char buf[1024];
3950 int res;
3951 Py_BEGIN_ALLOW_THREADS
3952 res = gethostname(buf, (int) sizeof buf - 1);
3953 Py_END_ALLOW_THREADS
3954 if (res < 0)
3955 return set_error();
3956 buf[sizeof buf - 1] = '\0';
3957 return PyUnicode_FromString(buf);
Martin v. Löwis72f48422010-10-29 18:20:08 +00003958#endif
Guido van Rossum81194471991-07-27 21:42:02 +00003959}
Guido van Rossumff4949e1992-08-05 19:58:53 +00003960
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003961PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003962"gethostname() -> string\n\
3963\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003964Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003965
Antoine Pitrou061cfb52011-02-28 22:25:22 +00003966#ifdef HAVE_SETHOSTNAME
3967PyDoc_STRVAR(sethostname_doc,
3968"sethostname(name)\n\n\
3969Sets the hostname to name.");
3970
3971static PyObject *
3972socket_sethostname(PyObject *self, PyObject *args)
3973{
3974 PyObject *hnobj;
3975 Py_buffer buf;
3976 int res, flag = 0;
3977
3978 if (!PyArg_ParseTuple(args, "S:sethostname", &hnobj)) {
3979 PyErr_Clear();
3980 if (!PyArg_ParseTuple(args, "O&:sethostname",
3981 PyUnicode_FSConverter, &hnobj))
3982 return NULL;
3983 flag = 1;
3984 }
3985 res = PyObject_GetBuffer(hnobj, &buf, PyBUF_SIMPLE);
3986 if (!res) {
3987 res = sethostname(buf.buf, buf.len);
3988 PyBuffer_Release(&buf);
3989 }
3990 if (flag)
3991 Py_DECREF(hnobj);
3992 if (res)
3993 return set_error();
3994 Py_RETURN_NONE;
3995}
3996#endif
Guido van Rossumff4949e1992-08-05 19:58:53 +00003997
Guido van Rossum30a685f1991-06-27 15:51:29 +00003998/* Python interface to gethostbyname(name). */
3999
4000/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004001static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004002socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00004003{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004004 char *name;
4005 sock_addr_t addrbuf;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004006 PyObject *ret = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004007
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004008 if (!PyArg_ParseTuple(args, "et:gethostbyname", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004009 return NULL;
4010 if (setipaddr(name, SAS2SA(&addrbuf), sizeof(addrbuf), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004011 goto finally;
4012 ret = makeipaddr(SAS2SA(&addrbuf), sizeof(struct sockaddr_in));
4013finally:
4014 PyMem_Free(name);
4015 return ret;
Guido van Rossum30a685f1991-06-27 15:51:29 +00004016}
4017
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004018PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004019"gethostbyname(host) -> address\n\
4020\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004021Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004022
4023
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004024/* Convenience function common to gethostbyname_ex and gethostbyaddr */
4025
4026static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004027gethost_common(struct hostent *h, struct sockaddr *addr, int alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004028{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004029 char **pch;
4030 PyObject *rtn_tuple = (PyObject *)NULL;
4031 PyObject *name_list = (PyObject *)NULL;
4032 PyObject *addr_list = (PyObject *)NULL;
4033 PyObject *tmp;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004034
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004035 if (h == NULL) {
4036 /* Let's get real error message to return */
4037 set_herror(h_errno);
4038 return NULL;
4039 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004040
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004041 if (h->h_addrtype != af) {
4042 /* Let's get real error message to return */
Victor Stinner1f33f2b2011-12-17 04:45:09 +01004043 errno = EAFNOSUPPORT;
4044 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004045 return NULL;
4046 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004047
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004048 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00004049
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004050 case AF_INET:
4051 if (alen < sizeof(struct sockaddr_in))
4052 return NULL;
4053 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004054
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004055#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004056 case AF_INET6:
4057 if (alen < sizeof(struct sockaddr_in6))
4058 return NULL;
4059 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004060#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00004061
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004062 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004063
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004064 if ((name_list = PyList_New(0)) == NULL)
4065 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004066
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004067 if ((addr_list = PyList_New(0)) == NULL)
4068 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004069
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004070 /* SF #1511317: h_aliases can be NULL */
4071 if (h->h_aliases) {
4072 for (pch = h->h_aliases; *pch != NULL; pch++) {
4073 int status;
4074 tmp = PyUnicode_FromString(*pch);
4075 if (tmp == NULL)
4076 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004077
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004078 status = PyList_Append(name_list, tmp);
4079 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004080
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004081 if (status)
4082 goto err;
4083 }
4084 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004085
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004086 for (pch = h->h_addr_list; *pch != NULL; pch++) {
4087 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004088
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004089 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00004090
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004091 case AF_INET:
4092 {
4093 struct sockaddr_in sin;
4094 memset(&sin, 0, sizeof(sin));
4095 sin.sin_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004096#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004097 sin.sin_len = sizeof(sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004098#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004099 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
4100 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
Guido van Rossum67f7a382002-06-06 21:08:16 +00004101
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004102 if (pch == h->h_addr_list && alen >= sizeof(sin))
4103 memcpy((char *) addr, &sin, sizeof(sin));
4104 break;
4105 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004106
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004107#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004108 case AF_INET6:
4109 {
4110 struct sockaddr_in6 sin6;
4111 memset(&sin6, 0, sizeof(sin6));
4112 sin6.sin6_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004113#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004114 sin6.sin6_len = sizeof(sin6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004115#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004116 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
4117 tmp = makeipaddr((struct sockaddr *)&sin6,
4118 sizeof(sin6));
Guido van Rossum67f7a382002-06-06 21:08:16 +00004119
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004120 if (pch == h->h_addr_list && alen >= sizeof(sin6))
4121 memcpy((char *) addr, &sin6, sizeof(sin6));
4122 break;
4123 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004124#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00004125
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004126 default: /* can't happen */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004127 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004128 "unsupported address family");
4129 return NULL;
4130 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004131
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004132 if (tmp == NULL)
4133 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004134
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004135 status = PyList_Append(addr_list, tmp);
4136 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004137
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004138 if (status)
4139 goto err;
4140 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004141
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004142 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004143
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004144 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004145 Py_XDECREF(name_list);
4146 Py_XDECREF(addr_list);
4147 return rtn_tuple;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004148}
4149
4150
4151/* Python interface to gethostbyname_ex(name). */
4152
4153/*ARGSUSED*/
4154static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004155socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004156{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004157 char *name;
4158 struct hostent *h;
Charles-François Natali8b759652011-12-23 16:44:51 +01004159 sock_addr_t addr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004160 struct sockaddr *sa;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004161 PyObject *ret = NULL;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004162#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004163 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004164#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004165 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004166#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004167 char buf[16384];
4168 int buf_len = (sizeof buf) - 1;
4169 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004170#endif
4171#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004172 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004173#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004174#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004175
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004176 if (!PyArg_ParseTuple(args, "et:gethostbyname_ex", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004177 return NULL;
Charles-François Natali8b759652011-12-23 16:44:51 +01004178 if (setipaddr(name, SAS2SA(&addr), sizeof(addr), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004179 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004180 Py_BEGIN_ALLOW_THREADS
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004181#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004182#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004183 result = gethostbyname_r(name, &hp_allocated, buf, buf_len,
4184 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004185#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004186 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004187#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004188 memset((void *) &data, '\0', sizeof(data));
4189 result = gethostbyname_r(name, &hp_allocated, &data);
4190 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004191#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004192#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00004193#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004194 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004195#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004196 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004197#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004198 Py_END_ALLOW_THREADS
4199 /* Some C libraries would require addr.__ss_family instead of
4200 addr.ss_family.
4201 Therefore, we cast the sockaddr_storage into sockaddr to
4202 access sa_family. */
Charles-François Natali8b759652011-12-23 16:44:51 +01004203 sa = SAS2SA(&addr);
4204 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004205 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00004206#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004207 PyThread_release_lock(netdb_lock);
Guido van Rossum955becc1999-03-22 20:14:53 +00004208#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004209finally:
4210 PyMem_Free(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004211 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004212}
4213
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004214PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004215"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
4216\n\
4217Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004218for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004219
4220
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004221/* Python interface to gethostbyaddr(IP). */
4222
4223/*ARGSUSED*/
4224static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004225socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004226{
Charles-François Natali8b759652011-12-23 16:44:51 +01004227 sock_addr_t addr;
4228 struct sockaddr *sa = SAS2SA(&addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004229 char *ip_num;
4230 struct hostent *h;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004231 PyObject *ret = NULL;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004232#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004233 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004234#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004235 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004236#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004237 /* glibcs up to 2.10 assume that the buf argument to
4238 gethostbyaddr_r is 8-byte aligned, which at least llvm-gcc
4239 does not ensure. The attribute below instructs the compiler
4240 to maintain this alignment. */
4241 char buf[16384] Py_ALIGNED(8);
4242 int buf_len = (sizeof buf) - 1;
4243 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004244#endif
4245#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004246 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004247#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004248#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004249 char *ap;
4250 int al;
4251 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004252
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004253 if (!PyArg_ParseTuple(args, "et:gethostbyaddr", "idna", &ip_num))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004254 return NULL;
4255 af = AF_UNSPEC;
4256 if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004257 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004258 af = sa->sa_family;
4259 ap = NULL;
Brett Cannonb94767f2011-02-22 20:15:44 +00004260 /* al = 0; */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004261 switch (af) {
4262 case AF_INET:
4263 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
4264 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
4265 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004266#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004267 case AF_INET6:
4268 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
4269 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
4270 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004271#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004272 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004273 PyErr_SetString(PyExc_OSError, "unsupported address family");
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004274 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004275 }
4276 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004277#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004278#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004279 result = gethostbyaddr_r(ap, al, af,
4280 &hp_allocated, buf, buf_len,
4281 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004282#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004283 h = gethostbyaddr_r(ap, al, af,
4284 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004285#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004286 memset((void *) &data, '\0', sizeof(data));
4287 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
4288 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004289#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004290#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00004291#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004292 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004293#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004294 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004295#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004296 Py_END_ALLOW_THREADS
Charles-François Natali8b759652011-12-23 16:44:51 +01004297 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00004298#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004299 PyThread_release_lock(netdb_lock);
Guido van Rossum3baaa131999-03-22 21:44:51 +00004300#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004301finally:
4302 PyMem_Free(ip_num);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004303 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004304}
4305
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004306PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004307"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
4308\n\
4309Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004310for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004311
Guido van Rossum30a685f1991-06-27 15:51:29 +00004312
4313/* Python interface to getservbyname(name).
4314 This only returns the port number, since the other info is already
4315 known or not useful (like the list of aliases). */
4316
4317/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004318static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004319socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00004320{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004321 char *name, *proto=NULL;
4322 struct servent *sp;
4323 if (!PyArg_ParseTuple(args, "s|s:getservbyname", &name, &proto))
4324 return NULL;
4325 Py_BEGIN_ALLOW_THREADS
4326 sp = getservbyname(name, proto);
4327 Py_END_ALLOW_THREADS
4328 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004329 PyErr_SetString(PyExc_OSError, "service/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004330 return NULL;
4331 }
4332 return PyLong_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00004333}
4334
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004335PyDoc_STRVAR(getservbyname_doc,
Barry Warsaw11b91a02004-06-28 00:50:43 +00004336"getservbyname(servicename[, protocolname]) -> integer\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00004337\n\
4338Return a port number from a service name and protocol name.\n\
Barry Warsaw11b91a02004-06-28 00:50:43 +00004339The optional protocol name, if given, should be 'tcp' or 'udp',\n\
4340otherwise any protocol will match.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004341
Guido van Rossum30a685f1991-06-27 15:51:29 +00004342
Barry Warsaw11b91a02004-06-28 00:50:43 +00004343/* Python interface to getservbyport(port).
4344 This only returns the service name, since the other info is already
4345 known or not useful (like the list of aliases). */
4346
4347/*ARGSUSED*/
4348static PyObject *
4349socket_getservbyport(PyObject *self, PyObject *args)
4350{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004351 int port;
4352 char *proto=NULL;
4353 struct servent *sp;
4354 if (!PyArg_ParseTuple(args, "i|s:getservbyport", &port, &proto))
4355 return NULL;
4356 if (port < 0 || port > 0xffff) {
4357 PyErr_SetString(
4358 PyExc_OverflowError,
4359 "getservbyport: port must be 0-65535.");
4360 return NULL;
4361 }
4362 Py_BEGIN_ALLOW_THREADS
4363 sp = getservbyport(htons((short)port), proto);
4364 Py_END_ALLOW_THREADS
4365 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004366 PyErr_SetString(PyExc_OSError, "port/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004367 return NULL;
4368 }
4369 return PyUnicode_FromString(sp->s_name);
Barry Warsaw11b91a02004-06-28 00:50:43 +00004370}
4371
4372PyDoc_STRVAR(getservbyport_doc,
4373"getservbyport(port[, protocolname]) -> string\n\
4374\n\
4375Return the service name from a port number and protocol name.\n\
4376The optional protocol name, if given, should be 'tcp' or 'udp',\n\
4377otherwise any protocol will match.");
4378
Guido van Rossum3901d851996-12-19 16:35:04 +00004379/* Python interface to getprotobyname(name).
4380 This only returns the protocol number, since the other info is
4381 already known or not useful (like the list of aliases). */
4382
4383/*ARGSUSED*/
4384static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004385socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00004386{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004387 char *name;
4388 struct protoent *sp;
4389 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
4390 return NULL;
4391 Py_BEGIN_ALLOW_THREADS
4392 sp = getprotobyname(name);
4393 Py_END_ALLOW_THREADS
4394 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004395 PyErr_SetString(PyExc_OSError, "protocol not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004396 return NULL;
4397 }
4398 return PyLong_FromLong((long) sp->p_proto);
Guido van Rossum3901d851996-12-19 16:35:04 +00004399}
4400
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004401PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004402"getprotobyname(name) -> integer\n\
4403\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004404Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004405
Guido van Rossum3901d851996-12-19 16:35:04 +00004406
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004407#ifndef NO_DUP
4408/* dup() function for socket fds */
4409
4410static PyObject *
4411socket_dup(PyObject *self, PyObject *fdobj)
4412{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004413 SOCKET_T fd, newfd;
4414 PyObject *newfdobj;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004415
4416
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004417 fd = PyLong_AsSocket_t(fdobj);
4418 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
4419 return NULL;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004420
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004421 newfd = dup_socket(fd);
4422 if (newfd == INVALID_SOCKET)
4423 return set_error();
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004424
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004425 newfdobj = PyLong_FromSocket_t(newfd);
4426 if (newfdobj == NULL)
4427 SOCKETCLOSE(newfd);
4428 return newfdobj;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004429}
4430
4431PyDoc_STRVAR(dup_doc,
4432"dup(integer) -> integer\n\
4433\n\
4434Duplicate an integer socket file descriptor. This is like os.dup(), but for\n\
4435sockets; on some platforms os.dup() won't work for socket file descriptors.");
4436#endif
4437
4438
Dave Cole331708b2004-08-09 04:51:41 +00004439#ifdef HAVE_SOCKETPAIR
4440/* Create a pair of sockets using the socketpair() function.
Dave Cole07fda7e2004-08-23 05:16:23 +00004441 Arguments as for socket() except the default family is AF_UNIX if
Dave Colee8bbfe42004-08-26 00:51:16 +00004442 defined on the platform; otherwise, the default is AF_INET. */
Dave Cole331708b2004-08-09 04:51:41 +00004443
4444/*ARGSUSED*/
4445static PyObject *
4446socket_socketpair(PyObject *self, PyObject *args)
4447{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004448 PySocketSockObject *s0 = NULL, *s1 = NULL;
4449 SOCKET_T sv[2];
4450 int family, type = SOCK_STREAM, proto = 0;
4451 PyObject *res = NULL;
Dave Cole331708b2004-08-09 04:51:41 +00004452
4453#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004454 family = AF_UNIX;
Dave Cole331708b2004-08-09 04:51:41 +00004455#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004456 family = AF_INET;
Dave Cole331708b2004-08-09 04:51:41 +00004457#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004458 if (!PyArg_ParseTuple(args, "|iii:socketpair",
4459 &family, &type, &proto))
4460 return NULL;
4461 /* Create a pair of socket fds */
4462 if (socketpair(family, type, proto, sv) < 0)
4463 return set_error();
4464 s0 = new_sockobject(sv[0], family, type, proto);
4465 if (s0 == NULL)
4466 goto finally;
4467 s1 = new_sockobject(sv[1], family, type, proto);
4468 if (s1 == NULL)
4469 goto finally;
4470 res = PyTuple_Pack(2, s0, s1);
Dave Cole331708b2004-08-09 04:51:41 +00004471
4472finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004473 if (res == NULL) {
4474 if (s0 == NULL)
4475 SOCKETCLOSE(sv[0]);
4476 if (s1 == NULL)
4477 SOCKETCLOSE(sv[1]);
4478 }
4479 Py_XDECREF(s0);
4480 Py_XDECREF(s1);
4481 return res;
Dave Cole331708b2004-08-09 04:51:41 +00004482}
4483
4484PyDoc_STRVAR(socketpair_doc,
4485"socketpair([family[, type[, proto]]]) -> (socket object, socket object)\n\
4486\n\
4487Create a pair of socket objects from the sockets returned by the platform\n\
4488socketpair() function.\n\
Dave Cole07fda7e2004-08-23 05:16:23 +00004489The arguments are the same as for socket() except the default family is\n\
Dave Colee8bbfe42004-08-26 00:51:16 +00004490AF_UNIX if defined on the platform; otherwise, the default is AF_INET.");
Dave Cole331708b2004-08-09 04:51:41 +00004491
4492#endif /* HAVE_SOCKETPAIR */
4493
4494
Guido van Rossum006bf911996-06-12 04:04:55 +00004495static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004496socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00004497{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004498 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00004499
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004500 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
4501 return NULL;
4502 }
4503 if (x1 < 0) {
4504 PyErr_SetString(PyExc_OverflowError,
4505 "can't convert negative number to unsigned long");
4506 return NULL;
4507 }
4508 x2 = (unsigned int)ntohs((unsigned short)x1);
4509 return PyLong_FromLong(x2);
Guido van Rossum006bf911996-06-12 04:04:55 +00004510}
4511
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004512PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004513"ntohs(integer) -> integer\n\
4514\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004515Convert a 16-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004516
4517
Guido van Rossum006bf911996-06-12 04:04:55 +00004518static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004519socket_ntohl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00004520{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004521 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00004522
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004523 if (PyLong_Check(arg)) {
4524 x = PyLong_AsUnsignedLong(arg);
4525 if (x == (unsigned long) -1 && PyErr_Occurred())
4526 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004527#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004528 {
4529 unsigned long y;
4530 /* only want the trailing 32 bits */
4531 y = x & 0xFFFFFFFFUL;
4532 if (y ^ x)
4533 return PyErr_Format(PyExc_OverflowError,
4534 "long int larger than 32 bits");
4535 x = y;
4536 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004537#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004538 }
4539 else
4540 return PyErr_Format(PyExc_TypeError,
4541 "expected int/long, %s found",
4542 Py_TYPE(arg)->tp_name);
4543 if (x == (unsigned long) -1 && PyErr_Occurred())
4544 return NULL;
4545 return PyLong_FromUnsignedLong(ntohl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00004546}
4547
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004548PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004549"ntohl(integer) -> integer\n\
4550\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004551Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004552
4553
Guido van Rossum006bf911996-06-12 04:04:55 +00004554static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004555socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00004556{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004557 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00004558
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004559 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
4560 return NULL;
4561 }
4562 if (x1 < 0) {
4563 PyErr_SetString(PyExc_OverflowError,
4564 "can't convert negative number to unsigned long");
4565 return NULL;
4566 }
4567 x2 = (unsigned int)htons((unsigned short)x1);
4568 return PyLong_FromLong(x2);
Guido van Rossum006bf911996-06-12 04:04:55 +00004569}
4570
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004571PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004572"htons(integer) -> integer\n\
4573\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004574Convert a 16-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004575
4576
Guido van Rossum006bf911996-06-12 04:04:55 +00004577static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004578socket_htonl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00004579{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004580 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00004581
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004582 if (PyLong_Check(arg)) {
4583 x = PyLong_AsUnsignedLong(arg);
4584 if (x == (unsigned long) -1 && PyErr_Occurred())
4585 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004586#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004587 {
4588 unsigned long y;
4589 /* only want the trailing 32 bits */
4590 y = x & 0xFFFFFFFFUL;
4591 if (y ^ x)
4592 return PyErr_Format(PyExc_OverflowError,
4593 "long int larger than 32 bits");
4594 x = y;
4595 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004596#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004597 }
4598 else
4599 return PyErr_Format(PyExc_TypeError,
4600 "expected int/long, %s found",
4601 Py_TYPE(arg)->tp_name);
4602 return PyLong_FromUnsignedLong(htonl((unsigned long)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00004603}
4604
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004605PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004606"htonl(integer) -> integer\n\
4607\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004608Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004609
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004610/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004611
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004612PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004613"inet_aton(string) -> bytes giving packed 32-bit IP representation\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004614\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00004615Convert 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 +00004616binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004617
4618static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004619socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004620{
Guido van Rossuma2e48551999-09-09 15:42:59 +00004621#ifndef INADDR_NONE
4622#define INADDR_NONE (-1)
4623#endif
Neal Norwitz88f115b2003-02-13 02:15:42 +00004624#ifdef HAVE_INET_ATON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004625 struct in_addr buf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00004626#endif
4627
4628#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
Benjamin Petersonf91df042009-02-13 02:50:59 +00004629#if (SIZEOF_INT != 4)
4630#error "Not sure if in_addr_t exists and int is not 32-bits."
4631#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004632 /* Have to use inet_addr() instead */
4633 unsigned int packed_addr;
Tim Peters1df9fdd2003-02-13 03:13:40 +00004634#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004635 char *ip_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00004636
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004637 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))
4638 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00004639
Tim Peters1df9fdd2003-02-13 03:13:40 +00004640
4641#ifdef HAVE_INET_ATON
Thomas Wouters477c8d52006-05-27 19:21:47 +00004642
4643#ifdef USE_INET_ATON_WEAKLINK
4644 if (inet_aton != NULL) {
4645#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004646 if (inet_aton(ip_addr, &buf))
4647 return PyBytes_FromStringAndSize((char *)(&buf),
4648 sizeof(buf));
Guido van Rossumad05cdf2003-02-12 23:08:22 +00004649
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004650 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004651 "illegal IP address string passed to inet_aton");
4652 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00004653
Thomas Wouters477c8d52006-05-27 19:21:47 +00004654#ifdef USE_INET_ATON_WEAKLINK
4655 } else {
4656#endif
4657
4658#endif
4659
4660#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
4661
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004662 /* special-case this address as inet_addr might return INADDR_NONE
4663 * for this */
4664 if (strcmp(ip_addr, "255.255.255.255") == 0) {
4665 packed_addr = 0xFFFFFFFF;
4666 } else {
Thomas Wouters477c8d52006-05-27 19:21:47 +00004667
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004668 packed_addr = inet_addr(ip_addr);
Guido van Rossumc6a164b1999-08-20 19:11:27 +00004669
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004670 if (packed_addr == INADDR_NONE) { /* invalid address */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004671 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004672 "illegal IP address string passed to inet_aton");
4673 return NULL;
4674 }
4675 }
4676 return PyBytes_FromStringAndSize((char *) &packed_addr,
4677 sizeof(packed_addr));
Thomas Wouters477c8d52006-05-27 19:21:47 +00004678
4679#ifdef USE_INET_ATON_WEAKLINK
4680 }
4681#endif
4682
Guido van Rossumad05cdf2003-02-12 23:08:22 +00004683#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004684}
4685
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004686PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00004687"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004688\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004689Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004690
4691static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004692socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004693{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004694 char *packed_str;
4695 int addr_len;
4696 struct in_addr packed_addr;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004697
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004698 if (!PyArg_ParseTuple(args, "y#:inet_ntoa", &packed_str, &addr_len)) {
4699 return NULL;
4700 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00004701
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004702 if (addr_len != sizeof(packed_addr)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004703 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004704 "packed IP wrong length for inet_ntoa");
4705 return NULL;
4706 }
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004707
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004708 memcpy(&packed_addr, packed_str, addr_len);
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004709
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004710 return PyUnicode_FromString(inet_ntoa(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004711}
Guido van Rossum82a5c661998-07-07 20:45:43 +00004712
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004713#ifdef HAVE_INET_PTON
4714
4715PyDoc_STRVAR(inet_pton_doc,
4716"inet_pton(af, ip) -> packed IP address string\n\
4717\n\
4718Convert an IP address from string format to a packed string suitable\n\
4719for use with low-level network functions.");
4720
4721static PyObject *
4722socket_inet_pton(PyObject *self, PyObject *args)
4723{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004724 int af;
4725 char* ip;
4726 int retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004727#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004728 char packed[MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004729#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004730 char packed[sizeof(struct in_addr)];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004731#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004732 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
4733 return NULL;
4734 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004735
Martin v. Löwis04697e82004-06-02 12:35:29 +00004736#if !defined(ENABLE_IPV6) && defined(AF_INET6)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004737 if(af == AF_INET6) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004738 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004739 "can't use AF_INET6, IPv6 is disabled");
4740 return NULL;
4741 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00004742#endif
Martin v. Löwis10649092003-08-05 06:25:06 +00004743
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004744 retval = inet_pton(af, ip, packed);
4745 if (retval < 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004746 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004747 return NULL;
4748 } else if (retval == 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004749 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004750 "illegal IP address string passed to inet_pton");
4751 return NULL;
4752 } else if (af == AF_INET) {
4753 return PyBytes_FromStringAndSize(packed,
4754 sizeof(struct in_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004755#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004756 } else if (af == AF_INET6) {
4757 return PyBytes_FromStringAndSize(packed,
4758 sizeof(struct in6_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004759#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004760 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004761 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004762 return NULL;
4763 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004764}
Thomas Wouters477c8d52006-05-27 19:21:47 +00004765
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004766PyDoc_STRVAR(inet_ntop_doc,
4767"inet_ntop(af, packed_ip) -> string formatted IP address\n\
4768\n\
4769Convert a packed IP address of the given family to string format.");
4770
4771static PyObject *
4772socket_inet_ntop(PyObject *self, PyObject *args)
4773{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004774 int af;
4775 char* packed;
4776 int len;
4777 const char* retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004778#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004779 char ip[MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004780#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004781 char ip[INET_ADDRSTRLEN + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004782#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00004783
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004784 /* Guarantee NUL-termination for PyUnicode_FromString() below */
4785 memset((void *) &ip[0], '\0', sizeof(ip));
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004786
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004787 if (!PyArg_ParseTuple(args, "iy#:inet_ntop", &af, &packed, &len)) {
4788 return NULL;
4789 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004790
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004791 if (af == AF_INET) {
4792 if (len != sizeof(struct in_addr)) {
4793 PyErr_SetString(PyExc_ValueError,
4794 "invalid length of packed IP address string");
4795 return NULL;
4796 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004797#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004798 } else if (af == AF_INET6) {
4799 if (len != sizeof(struct in6_addr)) {
4800 PyErr_SetString(PyExc_ValueError,
4801 "invalid length of packed IP address string");
4802 return NULL;
4803 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004804#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004805 } else {
4806 PyErr_Format(PyExc_ValueError,
4807 "unknown address family %d", af);
4808 return NULL;
4809 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004810
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004811 retval = inet_ntop(af, packed, ip, sizeof(ip));
4812 if (!retval) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004813 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004814 return NULL;
4815 } else {
4816 return PyUnicode_FromString(retval);
4817 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004818
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004819 /* NOTREACHED */
4820 PyErr_SetString(PyExc_RuntimeError, "invalid handling of inet_ntop");
4821 return NULL;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004822}
4823
4824#endif /* HAVE_INET_PTON */
4825
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004826/* Python interface to getaddrinfo(host, port). */
4827
4828/*ARGSUSED*/
4829static PyObject *
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00004830socket_getaddrinfo(PyObject *self, PyObject *args, PyObject* kwargs)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004831{
Victor Stinner77af1722011-05-26 14:05:59 +02004832 static char* kwnames[] = {"host", "port", "family", "type", "proto",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00004833 "flags", 0};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004834 struct addrinfo hints, *res;
4835 struct addrinfo *res0 = NULL;
4836 PyObject *hobj = NULL;
4837 PyObject *pobj = (PyObject *)NULL;
4838 char pbuf[30];
4839 char *hptr, *pptr;
4840 int family, socktype, protocol, flags;
4841 int error;
4842 PyObject *all = (PyObject *)NULL;
4843 PyObject *idna = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004844
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004845 family = socktype = protocol = flags = 0;
4846 family = AF_UNSPEC;
Victor Stinner77af1722011-05-26 14:05:59 +02004847 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OO|iiii:getaddrinfo",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00004848 kwnames, &hobj, &pobj, &family, &socktype,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004849 &protocol, &flags)) {
4850 return NULL;
4851 }
4852 if (hobj == Py_None) {
4853 hptr = NULL;
4854 } else if (PyUnicode_Check(hobj)) {
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02004855 _Py_IDENTIFIER(encode);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02004856
4857 idna = _PyObject_CallMethodId(hobj, &PyId_encode, "s", "idna");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004858 if (!idna)
4859 return NULL;
4860 assert(PyBytes_Check(idna));
4861 hptr = PyBytes_AS_STRING(idna);
4862 } else if (PyBytes_Check(hobj)) {
4863 hptr = PyBytes_AsString(hobj);
4864 } else {
4865 PyErr_SetString(PyExc_TypeError,
4866 "getaddrinfo() argument 1 must be string or None");
4867 return NULL;
4868 }
4869 if (PyLong_CheckExact(pobj)) {
4870 long value = PyLong_AsLong(pobj);
4871 if (value == -1 && PyErr_Occurred())
4872 goto err;
4873 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", value);
4874 pptr = pbuf;
4875 } else if (PyUnicode_Check(pobj)) {
4876 pptr = _PyUnicode_AsString(pobj);
Alexander Belopolskye239d232010-12-08 23:31:48 +00004877 if (pptr == NULL)
4878 goto err;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004879 } else if (PyBytes_Check(pobj)) {
Alexander Belopolskye239d232010-12-08 23:31:48 +00004880 pptr = PyBytes_AS_STRING(pobj);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004881 } else if (pobj == Py_None) {
4882 pptr = (char *)NULL;
4883 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004884 PyErr_SetString(PyExc_OSError, "Int or String expected");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004885 goto err;
4886 }
4887 memset(&hints, 0, sizeof(hints));
4888 hints.ai_family = family;
4889 hints.ai_socktype = socktype;
4890 hints.ai_protocol = protocol;
4891 hints.ai_flags = flags;
4892 Py_BEGIN_ALLOW_THREADS
4893 ACQUIRE_GETADDRINFO_LOCK
4894 error = getaddrinfo(hptr, pptr, &hints, &res0);
4895 Py_END_ALLOW_THREADS
4896 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
4897 if (error) {
4898 set_gaierror(error);
4899 goto err;
4900 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004901
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004902 if ((all = PyList_New(0)) == NULL)
4903 goto err;
4904 for (res = res0; res; res = res->ai_next) {
4905 PyObject *single;
4906 PyObject *addr =
4907 makesockaddr(-1, res->ai_addr, res->ai_addrlen, protocol);
4908 if (addr == NULL)
4909 goto err;
4910 single = Py_BuildValue("iiisO", res->ai_family,
4911 res->ai_socktype, res->ai_protocol,
4912 res->ai_canonname ? res->ai_canonname : "",
4913 addr);
4914 Py_DECREF(addr);
4915 if (single == NULL)
4916 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004917
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004918 if (PyList_Append(all, single))
4919 goto err;
4920 Py_XDECREF(single);
4921 }
4922 Py_XDECREF(idna);
4923 if (res0)
4924 freeaddrinfo(res0);
4925 return all;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004926 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004927 Py_XDECREF(all);
4928 Py_XDECREF(idna);
4929 if (res0)
4930 freeaddrinfo(res0);
4931 return (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004932}
4933
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004934PyDoc_STRVAR(getaddrinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004935"getaddrinfo(host, port [, family, socktype, proto, flags])\n\
4936 -> list of (family, socktype, proto, canonname, sockaddr)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004937\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004938Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004939
4940/* Python interface to getnameinfo(sa, flags). */
4941
4942/*ARGSUSED*/
4943static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004944socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004945{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004946 PyObject *sa = (PyObject *)NULL;
4947 int flags;
4948 char *hostp;
Charles-François Natali366999a2012-01-02 15:47:29 +01004949 int port;
4950 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004951 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
4952 struct addrinfo hints, *res = NULL;
4953 int error;
4954 PyObject *ret = (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004955
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004956 flags = flowinfo = scope_id = 0;
4957 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
4958 return NULL;
4959 if (!PyTuple_Check(sa)) {
4960 PyErr_SetString(PyExc_TypeError,
4961 "getnameinfo() argument 1 must be a tuple");
4962 return NULL;
4963 }
Charles-François Natali366999a2012-01-02 15:47:29 +01004964 if (!PyArg_ParseTuple(sa, "si|II",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004965 &hostp, &port, &flowinfo, &scope_id))
4966 return NULL;
Charles-François Natali366999a2012-01-02 15:47:29 +01004967 if (flowinfo < 0 || flowinfo > 0xfffff) {
4968 PyErr_SetString(PyExc_OverflowError,
4969 "getsockaddrarg: flowinfo must be 0-1048575.");
4970 return NULL;
4971 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004972 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
4973 memset(&hints, 0, sizeof(hints));
4974 hints.ai_family = AF_UNSPEC;
4975 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Martin v. Löwis112c0f32010-08-25 07:38:15 +00004976 hints.ai_flags = AI_NUMERICHOST; /* don't do any name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004977 Py_BEGIN_ALLOW_THREADS
4978 ACQUIRE_GETADDRINFO_LOCK
4979 error = getaddrinfo(hostp, pbuf, &hints, &res);
4980 Py_END_ALLOW_THREADS
4981 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
4982 if (error) {
4983 set_gaierror(error);
4984 goto fail;
4985 }
4986 if (res->ai_next) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004987 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004988 "sockaddr resolved to multiple addresses");
4989 goto fail;
4990 }
4991 switch (res->ai_family) {
4992 case AF_INET:
4993 {
4994 if (PyTuple_GET_SIZE(sa) != 2) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004995 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004996 "IPv4 sockaddr must be 2 tuple");
4997 goto fail;
4998 }
4999 break;
5000 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005001#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005002 case AF_INET6:
5003 {
5004 struct sockaddr_in6 *sin6;
5005 sin6 = (struct sockaddr_in6 *)res->ai_addr;
Charles-François Natali366999a2012-01-02 15:47:29 +01005006 sin6->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005007 sin6->sin6_scope_id = scope_id;
5008 break;
5009 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005010#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005011 }
Antoine Pitrou19467d22010-08-17 19:33:30 +00005012 error = getnameinfo(res->ai_addr, (socklen_t) res->ai_addrlen,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005013 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
5014 if (error) {
5015 set_gaierror(error);
5016 goto fail;
5017 }
5018 ret = Py_BuildValue("ss", hbuf, pbuf);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005019
5020fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005021 if (res)
5022 freeaddrinfo(res);
5023 return ret;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005024}
5025
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005026PyDoc_STRVAR(getnameinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005027"getnameinfo(sockaddr, flags) --> (host, port)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005028\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005029Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005030
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005031
5032/* Python API to getting and setting the default timeout value. */
5033
5034static PyObject *
5035socket_getdefaulttimeout(PyObject *self)
5036{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005037 if (defaulttimeout < 0.0) {
5038 Py_INCREF(Py_None);
5039 return Py_None;
5040 }
5041 else
5042 return PyFloat_FromDouble(defaulttimeout);
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005043}
5044
5045PyDoc_STRVAR(getdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005046"getdefaulttimeout() -> timeout\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005047\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03005048Returns the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005049A value of None indicates that new socket objects have no timeout.\n\
5050When the socket module is first imported, the default is None.");
5051
5052static PyObject *
5053socket_setdefaulttimeout(PyObject *self, PyObject *arg)
5054{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005055 double timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005056
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005057 if (arg == Py_None)
5058 timeout = -1.0;
5059 else {
5060 timeout = PyFloat_AsDouble(arg);
5061 if (timeout < 0.0) {
5062 if (!PyErr_Occurred())
5063 PyErr_SetString(PyExc_ValueError,
5064 "Timeout value out of range");
5065 return NULL;
5066 }
5067 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005068
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005069 defaulttimeout = timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005070
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005071 Py_INCREF(Py_None);
5072 return Py_None;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005073}
5074
5075PyDoc_STRVAR(setdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005076"setdefaulttimeout(timeout)\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005077\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03005078Set the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005079A value of None indicates that new socket objects have no timeout.\n\
5080When the socket module is first imported, the default is None.");
5081
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005082#ifdef HAVE_IF_NAMEINDEX
5083/* Python API for getting interface indices and names */
5084
5085static PyObject *
5086socket_if_nameindex(PyObject *self, PyObject *arg)
5087{
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005088 PyObject *list;
Charles-François Natali60713592011-05-20 16:55:06 +02005089 int i;
5090 struct if_nameindex *ni;
Victor Stinner77af1722011-05-26 14:05:59 +02005091
Charles-François Natali60713592011-05-20 16:55:06 +02005092 ni = if_nameindex();
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005093 if (ni == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005094 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005095 return NULL;
5096 }
5097
5098 list = PyList_New(0);
5099 if (list == NULL) {
5100 if_freenameindex(ni);
5101 return NULL;
5102 }
5103
Charles-François Natali60713592011-05-20 16:55:06 +02005104 for (i = 0; ni[i].if_index != 0 && i < INT_MAX; i++) {
5105 PyObject *ni_tuple = Py_BuildValue("IO&",
5106 ni[i].if_index, PyUnicode_DecodeFSDefault, ni[i].if_name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005107
5108 if (ni_tuple == NULL || PyList_Append(list, ni_tuple) == -1) {
5109 Py_XDECREF(ni_tuple);
Charles-François Natali60713592011-05-20 16:55:06 +02005110 Py_DECREF(list);
5111 if_freenameindex(ni);
5112 return NULL;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005113 }
5114 Py_DECREF(ni_tuple);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005115 }
5116
5117 if_freenameindex(ni);
5118 return list;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005119}
5120
5121PyDoc_STRVAR(if_nameindex_doc,
5122"if_nameindex()\n\
5123\n\
5124Returns a list of network interface information (index, name) tuples.");
5125
Charles-François Natali60713592011-05-20 16:55:06 +02005126static PyObject *
5127socket_if_nametoindex(PyObject *self, PyObject *args)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005128{
Charles-François Natali60713592011-05-20 16:55:06 +02005129 PyObject *oname;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005130 unsigned long index;
5131
Charles-François Natali60713592011-05-20 16:55:06 +02005132 if (!PyArg_ParseTuple(args, "O&:if_nametoindex",
5133 PyUnicode_FSConverter, &oname))
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005134 return NULL;
5135
Charles-François Natali60713592011-05-20 16:55:06 +02005136 index = if_nametoindex(PyBytes_AS_STRING(oname));
5137 Py_DECREF(oname);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005138 if (index == 0) {
Charles-François Natali60713592011-05-20 16:55:06 +02005139 /* if_nametoindex() doesn't set errno */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005140 PyErr_SetString(PyExc_OSError, "no interface with this name");
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005141 return NULL;
5142 }
5143
5144 return PyLong_FromUnsignedLong(index);
5145}
5146
5147PyDoc_STRVAR(if_nametoindex_doc,
5148"if_nametoindex(if_name)\n\
5149\n\
5150Returns the interface index corresponding to the interface name if_name.");
5151
Charles-François Natali60713592011-05-20 16:55:06 +02005152static PyObject *
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005153socket_if_indextoname(PyObject *self, PyObject *arg)
5154{
Charles-François Natali60713592011-05-20 16:55:06 +02005155 unsigned long index;
5156 char name[IF_NAMESIZE + 1];
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005157
Charles-François Natali60713592011-05-20 16:55:06 +02005158 index = PyLong_AsUnsignedLong(arg);
5159 if (index == (unsigned long) -1)
5160 return NULL;
5161
5162 if (if_indextoname(index, name) == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005163 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005164 return NULL;
5165 }
5166
Charles-François Natali60713592011-05-20 16:55:06 +02005167 return PyUnicode_DecodeFSDefault(name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005168}
5169
5170PyDoc_STRVAR(if_indextoname_doc,
5171"if_indextoname(if_index)\n\
5172\n\
5173Returns the interface name corresponding to the interface index if_index.");
5174
5175#endif /* HAVE_IF_NAMEINDEX */
5176
5177
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005178#ifdef CMSG_LEN
5179/* Python interface to CMSG_LEN(length). */
5180
5181static PyObject *
5182socket_CMSG_LEN(PyObject *self, PyObject *args)
5183{
5184 Py_ssize_t length;
5185 size_t result;
5186
5187 if (!PyArg_ParseTuple(args, "n:CMSG_LEN", &length))
5188 return NULL;
5189 if (length < 0 || !get_CMSG_LEN(length, &result)) {
5190 PyErr_Format(PyExc_OverflowError, "CMSG_LEN() argument out of range");
5191 return NULL;
5192 }
5193 return PyLong_FromSize_t(result);
5194}
5195
5196PyDoc_STRVAR(CMSG_LEN_doc,
5197"CMSG_LEN(length) -> control message length\n\
5198\n\
5199Return the total length, without trailing padding, of an ancillary\n\
5200data item with associated data of the given length. This value can\n\
5201often be used as the buffer size for recvmsg() to receive a single\n\
5202item of ancillary data, but RFC 3542 requires portable applications to\n\
5203use CMSG_SPACE() and thus include space for padding, even when the\n\
5204item will be the last in the buffer. Raises OverflowError if length\n\
5205is outside the permissible range of values.");
5206
5207
5208#ifdef CMSG_SPACE
5209/* Python interface to CMSG_SPACE(length). */
5210
5211static PyObject *
5212socket_CMSG_SPACE(PyObject *self, PyObject *args)
5213{
5214 Py_ssize_t length;
5215 size_t result;
5216
5217 if (!PyArg_ParseTuple(args, "n:CMSG_SPACE", &length))
5218 return NULL;
5219 if (length < 0 || !get_CMSG_SPACE(length, &result)) {
5220 PyErr_SetString(PyExc_OverflowError,
5221 "CMSG_SPACE() argument out of range");
5222 return NULL;
5223 }
5224 return PyLong_FromSize_t(result);
5225}
5226
5227PyDoc_STRVAR(CMSG_SPACE_doc,
5228"CMSG_SPACE(length) -> buffer size\n\
5229\n\
5230Return the buffer size needed for recvmsg() to receive an ancillary\n\
5231data item with associated data of the given length, along with any\n\
5232trailing padding. The buffer space needed to receive multiple items\n\
5233is the sum of the CMSG_SPACE() values for their associated data\n\
5234lengths. Raises OverflowError if length is outside the permissible\n\
5235range of values.");
5236#endif /* CMSG_SPACE */
5237#endif /* CMSG_LEN */
5238
5239
Guido van Rossum30a685f1991-06-27 15:51:29 +00005240/* List of functions exported by this module. */
5241
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005242static PyMethodDef socket_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005243 {"gethostbyname", socket_gethostbyname,
5244 METH_VARARGS, gethostbyname_doc},
5245 {"gethostbyname_ex", socket_gethostbyname_ex,
5246 METH_VARARGS, ghbn_ex_doc},
5247 {"gethostbyaddr", socket_gethostbyaddr,
5248 METH_VARARGS, gethostbyaddr_doc},
5249 {"gethostname", socket_gethostname,
5250 METH_NOARGS, gethostname_doc},
Antoine Pitrou061cfb52011-02-28 22:25:22 +00005251#ifdef HAVE_SETHOSTNAME
5252 {"sethostname", socket_sethostname,
5253 METH_VARARGS, sethostname_doc},
5254#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005255 {"getservbyname", socket_getservbyname,
5256 METH_VARARGS, getservbyname_doc},
5257 {"getservbyport", socket_getservbyport,
5258 METH_VARARGS, getservbyport_doc},
5259 {"getprotobyname", socket_getprotobyname,
5260 METH_VARARGS, getprotobyname_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005261#ifndef NO_DUP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005262 {"dup", socket_dup,
5263 METH_O, dup_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005264#endif
Dave Cole331708b2004-08-09 04:51:41 +00005265#ifdef HAVE_SOCKETPAIR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005266 {"socketpair", socket_socketpair,
5267 METH_VARARGS, socketpair_doc},
Dave Cole331708b2004-08-09 04:51:41 +00005268#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005269 {"ntohs", socket_ntohs,
5270 METH_VARARGS, ntohs_doc},
5271 {"ntohl", socket_ntohl,
5272 METH_O, ntohl_doc},
5273 {"htons", socket_htons,
5274 METH_VARARGS, htons_doc},
5275 {"htonl", socket_htonl,
5276 METH_O, htonl_doc},
5277 {"inet_aton", socket_inet_aton,
5278 METH_VARARGS, inet_aton_doc},
5279 {"inet_ntoa", socket_inet_ntoa,
5280 METH_VARARGS, inet_ntoa_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005281#ifdef HAVE_INET_PTON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005282 {"inet_pton", socket_inet_pton,
5283 METH_VARARGS, inet_pton_doc},
5284 {"inet_ntop", socket_inet_ntop,
5285 METH_VARARGS, inet_ntop_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005286#endif
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005287 {"getaddrinfo", (PyCFunction)socket_getaddrinfo,
5288 METH_VARARGS | METH_KEYWORDS, getaddrinfo_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005289 {"getnameinfo", socket_getnameinfo,
5290 METH_VARARGS, getnameinfo_doc},
5291 {"getdefaulttimeout", (PyCFunction)socket_getdefaulttimeout,
5292 METH_NOARGS, getdefaulttimeout_doc},
5293 {"setdefaulttimeout", socket_setdefaulttimeout,
5294 METH_O, setdefaulttimeout_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005295#ifdef HAVE_IF_NAMEINDEX
5296 {"if_nameindex", socket_if_nameindex,
5297 METH_NOARGS, if_nameindex_doc},
5298 {"if_nametoindex", socket_if_nametoindex,
Charles-François Natali60713592011-05-20 16:55:06 +02005299 METH_VARARGS, if_nametoindex_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005300 {"if_indextoname", socket_if_indextoname,
5301 METH_O, if_indextoname_doc},
5302#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005303#ifdef CMSG_LEN
5304 {"CMSG_LEN", socket_CMSG_LEN,
5305 METH_VARARGS, CMSG_LEN_doc},
5306#ifdef CMSG_SPACE
5307 {"CMSG_SPACE", socket_CMSG_SPACE,
5308 METH_VARARGS, CMSG_SPACE_doc},
5309#endif
5310#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005311 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005312};
5313
Guido van Rossum30a685f1991-06-27 15:51:29 +00005314
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005315#ifdef MS_WINDOWS
5316#define OS_INIT_DEFINED
5317
5318/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00005319
5320static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005321os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00005322{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005323 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00005324}
5325
5326static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005327os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00005328{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005329 WSADATA WSAData;
5330 int ret;
5331 ret = WSAStartup(0x0101, &WSAData);
5332 switch (ret) {
5333 case 0: /* No error */
5334 Py_AtExit(os_cleanup);
5335 return 1; /* Success */
5336 case WSASYSNOTREADY:
5337 PyErr_SetString(PyExc_ImportError,
5338 "WSAStartup failed: network not ready");
5339 break;
5340 case WSAVERNOTSUPPORTED:
5341 case WSAEINVAL:
5342 PyErr_SetString(
5343 PyExc_ImportError,
5344 "WSAStartup failed: requested version not supported");
5345 break;
5346 default:
5347 PyErr_Format(PyExc_ImportError, "WSAStartup failed: error code %d", ret);
5348 break;
5349 }
5350 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00005351}
5352
Guido van Rossum8d665e61996-06-26 18:22:49 +00005353#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00005354
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005355
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005356#ifdef PYOS_OS2
5357#define OS_INIT_DEFINED
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005358
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005359/* Additional initialization for OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005360
5361static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005362os_init(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005363{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005364#ifndef PYCC_GCC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005365 int rc = sock_init();
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005366
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005367 if (rc == 0) {
5368 return 1; /* Success */
5369 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005370
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005371 PyErr_Format(PyExc_ImportError, "OS/2 TCP/IP Error# %d", sock_errno());
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005372
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005373 return 0; /* Failure */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00005374#else
Ezio Melotti13925002011-03-16 11:05:33 +02005375 /* No need to initialize sockets with GCC/EMX */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005376 return 1; /* Success */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00005377#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005378}
5379
5380#endif /* PYOS_OS2 */
5381
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005382
5383#ifndef OS_INIT_DEFINED
5384static int
5385os_init(void)
5386{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005387 return 1; /* Success */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005388}
5389#endif
5390
5391
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005392/* C API table - always add new things to the end for binary
5393 compatibility. */
5394static
5395PySocketModule_APIObject PySocketModuleAPI =
5396{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005397 &sock_type,
Antoine Pitrouc4df7842010-12-03 19:59:41 +00005398 NULL,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005399 NULL
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005400};
5401
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005402
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005403/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005404
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005405 This module is actually called "_socket", and there's a wrapper
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005406 "socket.py" which implements some additional functionality.
5407 The import of "_socket" may fail with an ImportError exception if
5408 os-specific initialization fails. On Windows, this does WINSOCK
Ezio Melotti13925002011-03-16 11:05:33 +02005409 initialization. When WINSOCK is initialized successfully, a call to
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005410 WSACleanup() is scheduled to be made at exit time.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005411*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005412
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005413PyDoc_STRVAR(socket_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005414"Implementation module for socket operations.\n\
5415\n\
5416See the socket module for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005417
Martin v. Löwis1a214512008-06-11 05:26:20 +00005418static struct PyModuleDef socketmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005419 PyModuleDef_HEAD_INIT,
5420 PySocket_MODULE_NAME,
5421 socket_doc,
5422 -1,
5423 socket_methods,
5424 NULL,
5425 NULL,
5426 NULL,
5427 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00005428};
5429
Mark Hammondfe51c6d2002-08-02 02:27:13 +00005430PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00005431PyInit__socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005432{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005433 PyObject *m, *has_ipv6;
Fred Drake4baedc12002-04-01 14:53:37 +00005434
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005435 if (!os_init())
5436 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005437
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005438 Py_TYPE(&sock_type) = &PyType_Type;
5439 m = PyModule_Create(&socketmodule);
5440 if (m == NULL)
5441 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005442
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005443 Py_INCREF(PyExc_OSError);
5444 PySocketModuleAPI.error = PyExc_OSError;
5445 Py_INCREF(PyExc_OSError);
5446 PyModule_AddObject(m, "error", PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005447 socket_herror = PyErr_NewException("socket.herror",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005448 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005449 if (socket_herror == NULL)
5450 return NULL;
5451 Py_INCREF(socket_herror);
5452 PyModule_AddObject(m, "herror", socket_herror);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005453 socket_gaierror = PyErr_NewException("socket.gaierror", PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005454 NULL);
5455 if (socket_gaierror == NULL)
5456 return NULL;
5457 Py_INCREF(socket_gaierror);
5458 PyModule_AddObject(m, "gaierror", socket_gaierror);
5459 socket_timeout = PyErr_NewException("socket.timeout",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005460 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005461 if (socket_timeout == NULL)
5462 return NULL;
Antoine Pitrouc4df7842010-12-03 19:59:41 +00005463 PySocketModuleAPI.timeout_error = socket_timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005464 Py_INCREF(socket_timeout);
5465 PyModule_AddObject(m, "timeout", socket_timeout);
5466 Py_INCREF((PyObject *)&sock_type);
5467 if (PyModule_AddObject(m, "SocketType",
5468 (PyObject *)&sock_type) != 0)
5469 return NULL;
5470 Py_INCREF((PyObject *)&sock_type);
5471 if (PyModule_AddObject(m, "socket",
5472 (PyObject *)&sock_type) != 0)
5473 return NULL;
Guido van Rossum09be4091999-08-09 14:40:40 +00005474
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005475#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005476 has_ipv6 = Py_True;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005477#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005478 has_ipv6 = Py_False;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005479#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005480 Py_INCREF(has_ipv6);
5481 PyModule_AddObject(m, "has_ipv6", has_ipv6);
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005482
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005483 /* Export C API */
5484 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
5485 PyCapsule_New(&PySocketModuleAPI, PySocket_CAPSULE_NAME, NULL)
5486 ) != 0)
5487 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005488
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005489 /* Address families (we only support AF_INET and AF_UNIX) */
Guido van Rossum09be4091999-08-09 14:40:40 +00005490#ifdef AF_UNSPEC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005491 PyModule_AddIntConstant(m, "AF_UNSPEC", AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00005492#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005493 PyModule_AddIntConstant(m, "AF_INET", AF_INET);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005494#ifdef AF_INET6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005495 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005496#endif /* AF_INET6 */
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00005497#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005498 PyModule_AddIntConstant(m, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00005499#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00005500#ifdef AF_AX25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005501 /* Amateur Radio AX.25 */
5502 PyModule_AddIntConstant(m, "AF_AX25", AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00005503#endif
5504#ifdef AF_IPX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005505 PyModule_AddIntConstant(m, "AF_IPX", AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00005506#endif
5507#ifdef AF_APPLETALK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005508 /* Appletalk DDP */
5509 PyModule_AddIntConstant(m, "AF_APPLETALK", AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00005510#endif
5511#ifdef AF_NETROM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005512 /* Amateur radio NetROM */
5513 PyModule_AddIntConstant(m, "AF_NETROM", AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00005514#endif
5515#ifdef AF_BRIDGE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005516 /* Multiprotocol bridge */
5517 PyModule_AddIntConstant(m, "AF_BRIDGE", AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00005518#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005519#ifdef AF_ATMPVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005520 /* ATM PVCs */
5521 PyModule_AddIntConstant(m, "AF_ATMPVC", AF_ATMPVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005522#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00005523#ifdef AF_AAL5
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005524 /* Reserved for Werner's ATM */
5525 PyModule_AddIntConstant(m, "AF_AAL5", AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00005526#endif
5527#ifdef AF_X25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005528 /* Reserved for X.25 project */
5529 PyModule_AddIntConstant(m, "AF_X25", AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00005530#endif
5531#ifdef AF_INET6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005532 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00005533#endif
5534#ifdef AF_ROSE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005535 /* Amateur Radio X.25 PLP */
5536 PyModule_AddIntConstant(m, "AF_ROSE", AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00005537#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005538#ifdef AF_DECnet
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005539 /* Reserved for DECnet project */
5540 PyModule_AddIntConstant(m, "AF_DECnet", AF_DECnet);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005541#endif
5542#ifdef AF_NETBEUI
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005543 /* Reserved for 802.2LLC project */
5544 PyModule_AddIntConstant(m, "AF_NETBEUI", AF_NETBEUI);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005545#endif
5546#ifdef AF_SECURITY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005547 /* Security callback pseudo AF */
5548 PyModule_AddIntConstant(m, "AF_SECURITY", AF_SECURITY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005549#endif
5550#ifdef AF_KEY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005551 /* PF_KEY key management API */
5552 PyModule_AddIntConstant(m, "AF_KEY", AF_KEY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005553#endif
5554#ifdef AF_NETLINK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005555 /* */
5556 PyModule_AddIntConstant(m, "AF_NETLINK", AF_NETLINK);
5557 PyModule_AddIntConstant(m, "NETLINK_ROUTE", NETLINK_ROUTE);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005558#ifdef NETLINK_SKIP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005559 PyModule_AddIntConstant(m, "NETLINK_SKIP", NETLINK_SKIP);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005560#endif
5561#ifdef NETLINK_W1
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005562 PyModule_AddIntConstant(m, "NETLINK_W1", NETLINK_W1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005563#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005564 PyModule_AddIntConstant(m, "NETLINK_USERSOCK", NETLINK_USERSOCK);
5565 PyModule_AddIntConstant(m, "NETLINK_FIREWALL", NETLINK_FIREWALL);
Guido van Rossum668a94a2006-02-21 01:07:27 +00005566#ifdef NETLINK_TCPDIAG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005567 PyModule_AddIntConstant(m, "NETLINK_TCPDIAG", NETLINK_TCPDIAG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00005568#endif
5569#ifdef NETLINK_NFLOG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005570 PyModule_AddIntConstant(m, "NETLINK_NFLOG", NETLINK_NFLOG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00005571#endif
Neal Norwitz65851662006-01-16 04:31:40 +00005572#ifdef NETLINK_XFRM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005573 PyModule_AddIntConstant(m, "NETLINK_XFRM", NETLINK_XFRM);
Neal Norwitz65851662006-01-16 04:31:40 +00005574#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005575#ifdef NETLINK_ARPD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005576 PyModule_AddIntConstant(m, "NETLINK_ARPD", NETLINK_ARPD);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005577#endif
5578#ifdef NETLINK_ROUTE6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005579 PyModule_AddIntConstant(m, "NETLINK_ROUTE6", NETLINK_ROUTE6);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005580#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005581 PyModule_AddIntConstant(m, "NETLINK_IP6_FW", NETLINK_IP6_FW);
Thomas Wouterscf297e42007-02-23 15:07:44 +00005582#ifdef NETLINK_DNRTMSG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005583 PyModule_AddIntConstant(m, "NETLINK_DNRTMSG", NETLINK_DNRTMSG);
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005584#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005585#ifdef NETLINK_TAPBASE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005586 PyModule_AddIntConstant(m, "NETLINK_TAPBASE", NETLINK_TAPBASE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005587#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005588#endif /* AF_NETLINK */
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005589#ifdef AF_ROUTE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005590 /* Alias to emulate 4.4BSD */
5591 PyModule_AddIntConstant(m, "AF_ROUTE", AF_ROUTE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005592#endif
5593#ifdef AF_ASH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005594 /* Ash */
5595 PyModule_AddIntConstant(m, "AF_ASH", AF_ASH);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005596#endif
5597#ifdef AF_ECONET
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005598 /* Acorn Econet */
5599 PyModule_AddIntConstant(m, "AF_ECONET", AF_ECONET);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005600#endif
5601#ifdef AF_ATMSVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005602 /* ATM SVCs */
5603 PyModule_AddIntConstant(m, "AF_ATMSVC", AF_ATMSVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005604#endif
5605#ifdef AF_SNA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005606 /* Linux SNA Project (nutters!) */
5607 PyModule_AddIntConstant(m, "AF_SNA", AF_SNA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005608#endif
5609#ifdef AF_IRDA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005610 /* IRDA sockets */
5611 PyModule_AddIntConstant(m, "AF_IRDA", AF_IRDA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005612#endif
5613#ifdef AF_PPPOX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005614 /* PPPoX sockets */
5615 PyModule_AddIntConstant(m, "AF_PPPOX", AF_PPPOX);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005616#endif
5617#ifdef AF_WANPIPE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005618 /* Wanpipe API Sockets */
5619 PyModule_AddIntConstant(m, "AF_WANPIPE", AF_WANPIPE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005620#endif
5621#ifdef AF_LLC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005622 /* Linux LLC */
5623 PyModule_AddIntConstant(m, "AF_LLC", AF_LLC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005624#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00005625
Hye-Shik Chang81268602004-02-02 06:05:24 +00005626#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005627 PyModule_AddIntConstant(m, "AF_BLUETOOTH", AF_BLUETOOTH);
5628 PyModule_AddIntConstant(m, "BTPROTO_L2CAP", BTPROTO_L2CAP);
5629 PyModule_AddIntConstant(m, "BTPROTO_HCI", BTPROTO_HCI);
5630 PyModule_AddIntConstant(m, "SOL_HCI", SOL_HCI);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00005631#if !defined(__NetBSD__) && !defined(__DragonFly__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005632 PyModule_AddIntConstant(m, "HCI_FILTER", HCI_FILTER);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00005633#endif
Hye-Shik Chang81268602004-02-02 06:05:24 +00005634#if !defined(__FreeBSD__)
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00005635#if !defined(__NetBSD__) && !defined(__DragonFly__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005636 PyModule_AddIntConstant(m, "HCI_TIME_STAMP", HCI_TIME_STAMP);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00005637#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005638 PyModule_AddIntConstant(m, "HCI_DATA_DIR", HCI_DATA_DIR);
5639 PyModule_AddIntConstant(m, "BTPROTO_SCO", BTPROTO_SCO);
Hye-Shik Chang81268602004-02-02 06:05:24 +00005640#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005641 PyModule_AddIntConstant(m, "BTPROTO_RFCOMM", BTPROTO_RFCOMM);
5642 PyModule_AddStringConstant(m, "BDADDR_ANY", "00:00:00:00:00:00");
5643 PyModule_AddStringConstant(m, "BDADDR_LOCAL", "00:00:00:FF:FF:FF");
Martin v. Löwis12af0482004-01-31 12:34:17 +00005644#endif
5645
Charles-François Natali47413c12011-10-06 19:47:44 +02005646#ifdef AF_CAN
5647 /* Controller Area Network */
5648 PyModule_AddIntConstant(m, "AF_CAN", AF_CAN);
5649#endif
5650#ifdef PF_CAN
5651 /* Controller Area Network */
5652 PyModule_AddIntConstant(m, "PF_CAN", PF_CAN);
5653#endif
5654
Charles-François Natali10b8cf42011-11-10 19:21:37 +01005655/* Reliable Datagram Sockets */
5656#ifdef AF_RDS
5657 PyModule_AddIntConstant(m, "AF_RDS", AF_RDS);
5658#endif
5659#ifdef PF_RDS
5660 PyModule_AddIntConstant(m, "PF_RDS", PF_RDS);
5661#endif
5662
Antoine Pitroub156a462010-10-27 20:13:57 +00005663#ifdef AF_PACKET
5664 PyModule_AddIntMacro(m, AF_PACKET);
5665#endif
5666#ifdef PF_PACKET
5667 PyModule_AddIntMacro(m, PF_PACKET);
5668#endif
5669#ifdef PACKET_HOST
5670 PyModule_AddIntMacro(m, PACKET_HOST);
5671#endif
5672#ifdef PACKET_BROADCAST
5673 PyModule_AddIntMacro(m, PACKET_BROADCAST);
5674#endif
5675#ifdef PACKET_MULTICAST
5676 PyModule_AddIntMacro(m, PACKET_MULTICAST);
5677#endif
5678#ifdef PACKET_OTHERHOST
5679 PyModule_AddIntMacro(m, PACKET_OTHERHOST);
5680#endif
5681#ifdef PACKET_OUTGOING
5682 PyModule_AddIntMacro(m, PACKET_OUTGOING);
5683#endif
5684#ifdef PACKET_LOOPBACK
5685 PyModule_AddIntMacro(m, PACKET_LOOPBACK);
5686#endif
5687#ifdef PACKET_FASTROUTE
5688 PyModule_AddIntMacro(m, PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00005689#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00005690
Christian Heimes043d6f62008-01-07 17:19:16 +00005691#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005692 PyModule_AddIntConstant(m, "AF_TIPC", AF_TIPC);
Christian Heimes043d6f62008-01-07 17:19:16 +00005693
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005694 /* for addresses */
5695 PyModule_AddIntConstant(m, "TIPC_ADDR_NAMESEQ", TIPC_ADDR_NAMESEQ);
5696 PyModule_AddIntConstant(m, "TIPC_ADDR_NAME", TIPC_ADDR_NAME);
5697 PyModule_AddIntConstant(m, "TIPC_ADDR_ID", TIPC_ADDR_ID);
Christian Heimes043d6f62008-01-07 17:19:16 +00005698
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005699 PyModule_AddIntConstant(m, "TIPC_ZONE_SCOPE", TIPC_ZONE_SCOPE);
5700 PyModule_AddIntConstant(m, "TIPC_CLUSTER_SCOPE", TIPC_CLUSTER_SCOPE);
5701 PyModule_AddIntConstant(m, "TIPC_NODE_SCOPE", TIPC_NODE_SCOPE);
Christian Heimes043d6f62008-01-07 17:19:16 +00005702
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005703 /* for setsockopt() */
5704 PyModule_AddIntConstant(m, "SOL_TIPC", SOL_TIPC);
5705 PyModule_AddIntConstant(m, "TIPC_IMPORTANCE", TIPC_IMPORTANCE);
5706 PyModule_AddIntConstant(m, "TIPC_SRC_DROPPABLE", TIPC_SRC_DROPPABLE);
5707 PyModule_AddIntConstant(m, "TIPC_DEST_DROPPABLE",
5708 TIPC_DEST_DROPPABLE);
5709 PyModule_AddIntConstant(m, "TIPC_CONN_TIMEOUT", TIPC_CONN_TIMEOUT);
Christian Heimes043d6f62008-01-07 17:19:16 +00005710
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005711 PyModule_AddIntConstant(m, "TIPC_LOW_IMPORTANCE",
5712 TIPC_LOW_IMPORTANCE);
5713 PyModule_AddIntConstant(m, "TIPC_MEDIUM_IMPORTANCE",
5714 TIPC_MEDIUM_IMPORTANCE);
5715 PyModule_AddIntConstant(m, "TIPC_HIGH_IMPORTANCE",
5716 TIPC_HIGH_IMPORTANCE);
5717 PyModule_AddIntConstant(m, "TIPC_CRITICAL_IMPORTANCE",
5718 TIPC_CRITICAL_IMPORTANCE);
Christian Heimes043d6f62008-01-07 17:19:16 +00005719
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005720 /* for subscriptions */
5721 PyModule_AddIntConstant(m, "TIPC_SUB_PORTS", TIPC_SUB_PORTS);
5722 PyModule_AddIntConstant(m, "TIPC_SUB_SERVICE", TIPC_SUB_SERVICE);
Christian Heimes25bb7832008-01-11 16:17:00 +00005723#ifdef TIPC_SUB_CANCEL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005724 /* doesn't seem to be available everywhere */
5725 PyModule_AddIntConstant(m, "TIPC_SUB_CANCEL", TIPC_SUB_CANCEL);
Christian Heimes25bb7832008-01-11 16:17:00 +00005726#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005727 PyModule_AddIntConstant(m, "TIPC_WAIT_FOREVER", TIPC_WAIT_FOREVER);
5728 PyModule_AddIntConstant(m, "TIPC_PUBLISHED", TIPC_PUBLISHED);
5729 PyModule_AddIntConstant(m, "TIPC_WITHDRAWN", TIPC_WITHDRAWN);
5730 PyModule_AddIntConstant(m, "TIPC_SUBSCR_TIMEOUT", TIPC_SUBSCR_TIMEOUT);
5731 PyModule_AddIntConstant(m, "TIPC_CFG_SRV", TIPC_CFG_SRV);
5732 PyModule_AddIntConstant(m, "TIPC_TOP_SRV", TIPC_TOP_SRV);
Christian Heimes043d6f62008-01-07 17:19:16 +00005733#endif
5734
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005735 /* Socket types */
5736 PyModule_AddIntConstant(m, "SOCK_STREAM", SOCK_STREAM);
5737 PyModule_AddIntConstant(m, "SOCK_DGRAM", SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00005738/* We have incomplete socket support. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005739 PyModule_AddIntConstant(m, "SOCK_RAW", SOCK_RAW);
5740 PyModule_AddIntConstant(m, "SOCK_SEQPACKET", SOCK_SEQPACKET);
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00005741#if defined(SOCK_RDM)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005742 PyModule_AddIntConstant(m, "SOCK_RDM", SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00005743#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +00005744#ifdef SOCK_CLOEXEC
5745 PyModule_AddIntConstant(m, "SOCK_CLOEXEC", SOCK_CLOEXEC);
5746#endif
5747#ifdef SOCK_NONBLOCK
5748 PyModule_AddIntConstant(m, "SOCK_NONBLOCK", SOCK_NONBLOCK);
5749#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005750
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005751#ifdef SO_DEBUG
5752 PyModule_AddIntConstant(m, "SO_DEBUG", SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005753#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005754#ifdef SO_ACCEPTCONN
5755 PyModule_AddIntConstant(m, "SO_ACCEPTCONN", SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005756#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005757#ifdef SO_REUSEADDR
5758 PyModule_AddIntConstant(m, "SO_REUSEADDR", SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005759#endif
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00005760#ifdef SO_EXCLUSIVEADDRUSE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005761 PyModule_AddIntConstant(m, "SO_EXCLUSIVEADDRUSE", SO_EXCLUSIVEADDRUSE);
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00005762#endif
5763
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005764#ifdef SO_KEEPALIVE
5765 PyModule_AddIntConstant(m, "SO_KEEPALIVE", SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005766#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005767#ifdef SO_DONTROUTE
5768 PyModule_AddIntConstant(m, "SO_DONTROUTE", SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005769#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005770#ifdef SO_BROADCAST
5771 PyModule_AddIntConstant(m, "SO_BROADCAST", SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005772#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005773#ifdef SO_USELOOPBACK
5774 PyModule_AddIntConstant(m, "SO_USELOOPBACK", SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005775#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005776#ifdef SO_LINGER
5777 PyModule_AddIntConstant(m, "SO_LINGER", SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005778#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005779#ifdef SO_OOBINLINE
5780 PyModule_AddIntConstant(m, "SO_OOBINLINE", SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005781#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005782#ifdef SO_REUSEPORT
5783 PyModule_AddIntConstant(m, "SO_REUSEPORT", SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005784#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005785#ifdef SO_SNDBUF
5786 PyModule_AddIntConstant(m, "SO_SNDBUF", SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005787#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005788#ifdef SO_RCVBUF
5789 PyModule_AddIntConstant(m, "SO_RCVBUF", SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005790#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005791#ifdef SO_SNDLOWAT
5792 PyModule_AddIntConstant(m, "SO_SNDLOWAT", SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005793#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005794#ifdef SO_RCVLOWAT
5795 PyModule_AddIntConstant(m, "SO_RCVLOWAT", SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005796#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005797#ifdef SO_SNDTIMEO
5798 PyModule_AddIntConstant(m, "SO_SNDTIMEO", SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005799#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005800#ifdef SO_RCVTIMEO
5801 PyModule_AddIntConstant(m, "SO_RCVTIMEO", SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005802#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005803#ifdef SO_ERROR
5804 PyModule_AddIntConstant(m, "SO_ERROR", SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005805#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005806#ifdef SO_TYPE
5807 PyModule_AddIntConstant(m, "SO_TYPE", SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005808#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005809#ifdef SO_SETFIB
5810 PyModule_AddIntConstant(m, "SO_SETFIB", SO_SETFIB);
Larry Hastingsf0f37952010-04-02 11:47:10 +00005811#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005812#ifdef SO_PASSCRED
5813 PyModule_AddIntConstant(m, "SO_PASSCRED", SO_PASSCRED);
5814#endif
5815#ifdef SO_PEERCRED
5816 PyModule_AddIntConstant(m, "SO_PEERCRED", SO_PEERCRED);
5817#endif
5818#ifdef LOCAL_PEERCRED
5819 PyModule_AddIntConstant(m, "LOCAL_PEERCRED", LOCAL_PEERCRED);
5820#endif
Victor Stinnercb98bed2011-10-25 13:45:48 +02005821#ifdef SO_BINDTODEVICE
5822 PyModule_AddIntMacro(m, SO_BINDTODEVICE);
5823#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005824
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005825 /* Maximum number of connections for "listen" */
5826#ifdef SOMAXCONN
5827 PyModule_AddIntConstant(m, "SOMAXCONN", SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005828#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005829 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005830#endif
5831
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005832 /* Ancilliary message types */
5833#ifdef SCM_RIGHTS
5834 PyModule_AddIntConstant(m, "SCM_RIGHTS", SCM_RIGHTS);
5835#endif
5836#ifdef SCM_CREDENTIALS
5837 PyModule_AddIntConstant(m, "SCM_CREDENTIALS", SCM_CREDENTIALS);
5838#endif
5839#ifdef SCM_CREDS
5840 PyModule_AddIntConstant(m, "SCM_CREDS", SCM_CREDS);
5841#endif
5842
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005843 /* Flags for send, recv */
5844#ifdef MSG_OOB
5845 PyModule_AddIntConstant(m, "MSG_OOB", MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005846#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005847#ifdef MSG_PEEK
5848 PyModule_AddIntConstant(m, "MSG_PEEK", MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005849#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005850#ifdef MSG_DONTROUTE
5851 PyModule_AddIntConstant(m, "MSG_DONTROUTE", MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005852#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005853#ifdef MSG_DONTWAIT
5854 PyModule_AddIntConstant(m, "MSG_DONTWAIT", MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00005855#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005856#ifdef MSG_EOR
5857 PyModule_AddIntConstant(m, "MSG_EOR", MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005858#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005859#ifdef MSG_TRUNC
5860 PyModule_AddIntConstant(m, "MSG_TRUNC", MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005861#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005862#ifdef MSG_CTRUNC
5863 PyModule_AddIntConstant(m, "MSG_CTRUNC", MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005864#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005865#ifdef MSG_WAITALL
5866 PyModule_AddIntConstant(m, "MSG_WAITALL", MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005867#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005868#ifdef MSG_BTAG
5869 PyModule_AddIntConstant(m, "MSG_BTAG", MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005870#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005871#ifdef MSG_ETAG
5872 PyModule_AddIntConstant(m, "MSG_ETAG", MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005873#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005874#ifdef MSG_NOSIGNAL
5875 PyModule_AddIntConstant(m, "MSG_NOSIGNAL", MSG_NOSIGNAL);
5876#endif
5877#ifdef MSG_NOTIFICATION
5878 PyModule_AddIntConstant(m, "MSG_NOTIFICATION", MSG_NOTIFICATION);
5879#endif
5880#ifdef MSG_CMSG_CLOEXEC
5881 PyModule_AddIntConstant(m, "MSG_CMSG_CLOEXEC", MSG_CMSG_CLOEXEC);
5882#endif
5883#ifdef MSG_ERRQUEUE
5884 PyModule_AddIntConstant(m, "MSG_ERRQUEUE", MSG_ERRQUEUE);
5885#endif
5886#ifdef MSG_CONFIRM
5887 PyModule_AddIntConstant(m, "MSG_CONFIRM", MSG_CONFIRM);
5888#endif
5889#ifdef MSG_MORE
5890 PyModule_AddIntConstant(m, "MSG_MORE", MSG_MORE);
5891#endif
5892#ifdef MSG_EOF
5893 PyModule_AddIntConstant(m, "MSG_EOF", MSG_EOF);
5894#endif
5895#ifdef MSG_BCAST
5896 PyModule_AddIntConstant(m, "MSG_BCAST", MSG_BCAST);
5897#endif
5898#ifdef MSG_MCAST
5899 PyModule_AddIntConstant(m, "MSG_MCAST", MSG_MCAST);
5900#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005901
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005902 /* Protocol level and numbers, usable for [gs]etsockopt */
5903#ifdef SOL_SOCKET
5904 PyModule_AddIntConstant(m, "SOL_SOCKET", SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005905#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005906#ifdef SOL_IP
5907 PyModule_AddIntConstant(m, "SOL_IP", SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00005908#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005909 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00005910#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005911#ifdef SOL_IPX
5912 PyModule_AddIntConstant(m, "SOL_IPX", SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00005913#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005914#ifdef SOL_AX25
5915 PyModule_AddIntConstant(m, "SOL_AX25", SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00005916#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005917#ifdef SOL_ATALK
5918 PyModule_AddIntConstant(m, "SOL_ATALK", SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00005919#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005920#ifdef SOL_NETROM
5921 PyModule_AddIntConstant(m, "SOL_NETROM", SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00005922#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005923#ifdef SOL_ROSE
5924 PyModule_AddIntConstant(m, "SOL_ROSE", SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00005925#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005926#ifdef SOL_TCP
5927 PyModule_AddIntConstant(m, "SOL_TCP", SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00005928#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005929 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00005930#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005931#ifdef SOL_UDP
5932 PyModule_AddIntConstant(m, "SOL_UDP", SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00005933#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005934 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00005935#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02005936#ifdef SOL_CAN_BASE
5937 PyModule_AddIntConstant(m, "SOL_CAN_BASE", SOL_CAN_BASE);
5938#endif
5939#ifdef SOL_CAN_RAW
5940 PyModule_AddIntConstant(m, "SOL_CAN_RAW", SOL_CAN_RAW);
5941 PyModule_AddIntConstant(m, "CAN_RAW", CAN_RAW);
5942#endif
5943#ifdef HAVE_LINUX_CAN_H
5944 PyModule_AddIntConstant(m, "CAN_EFF_FLAG", CAN_EFF_FLAG);
5945 PyModule_AddIntConstant(m, "CAN_RTR_FLAG", CAN_RTR_FLAG);
5946 PyModule_AddIntConstant(m, "CAN_ERR_FLAG", CAN_ERR_FLAG);
5947
5948 PyModule_AddIntConstant(m, "CAN_SFF_MASK", CAN_SFF_MASK);
5949 PyModule_AddIntConstant(m, "CAN_EFF_MASK", CAN_EFF_MASK);
5950 PyModule_AddIntConstant(m, "CAN_ERR_MASK", CAN_ERR_MASK);
5951#endif
5952#ifdef HAVE_LINUX_CAN_RAW_H
5953 PyModule_AddIntConstant(m, "CAN_RAW_FILTER", CAN_RAW_FILTER);
5954 PyModule_AddIntConstant(m, "CAN_RAW_ERR_FILTER", CAN_RAW_ERR_FILTER);
5955 PyModule_AddIntConstant(m, "CAN_RAW_LOOPBACK", CAN_RAW_LOOPBACK);
5956 PyModule_AddIntConstant(m, "CAN_RAW_RECV_OWN_MSGS", CAN_RAW_RECV_OWN_MSGS);
5957#endif
Charles-François Natali10b8cf42011-11-10 19:21:37 +01005958#ifdef SOL_RDS
5959 PyModule_AddIntConstant(m, "SOL_RDS", SOL_RDS);
5960#endif
5961#ifdef RDS_CANCEL_SENT_TO
5962 PyModule_AddIntConstant(m, "RDS_CANCEL_SENT_TO", RDS_CANCEL_SENT_TO);
5963#endif
5964#ifdef RDS_GET_MR
5965 PyModule_AddIntConstant(m, "RDS_GET_MR", RDS_GET_MR);
5966#endif
5967#ifdef RDS_FREE_MR
5968 PyModule_AddIntConstant(m, "RDS_FREE_MR", RDS_FREE_MR);
5969#endif
5970#ifdef RDS_RECVERR
5971 PyModule_AddIntConstant(m, "RDS_RECVERR", RDS_RECVERR);
5972#endif
5973#ifdef RDS_CONG_MONITOR
5974 PyModule_AddIntConstant(m, "RDS_CONG_MONITOR", RDS_CONG_MONITOR);
5975#endif
5976#ifdef RDS_GET_MR_FOR_DEST
5977 PyModule_AddIntConstant(m, "RDS_GET_MR_FOR_DEST", RDS_GET_MR_FOR_DEST);
5978#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005979#ifdef IPPROTO_IP
5980 PyModule_AddIntConstant(m, "IPPROTO_IP", IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00005981#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005982 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005983#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005984#ifdef IPPROTO_HOPOPTS
5985 PyModule_AddIntConstant(m, "IPPROTO_HOPOPTS", IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005986#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005987#ifdef IPPROTO_ICMP
5988 PyModule_AddIntConstant(m, "IPPROTO_ICMP", IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00005989#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005990 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005991#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005992#ifdef IPPROTO_IGMP
5993 PyModule_AddIntConstant(m, "IPPROTO_IGMP", IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005994#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005995#ifdef IPPROTO_GGP
5996 PyModule_AddIntConstant(m, "IPPROTO_GGP", IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005997#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005998#ifdef IPPROTO_IPV4
5999 PyModule_AddIntConstant(m, "IPPROTO_IPV4", IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006000#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006001#ifdef IPPROTO_IPV6
6002 PyModule_AddIntConstant(m, "IPPROTO_IPV6", IPPROTO_IPV6);
Martin v. Löwisa0f17342003-10-03 13:56:20 +00006003#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006004#ifdef IPPROTO_IPIP
6005 PyModule_AddIntConstant(m, "IPPROTO_IPIP", IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006006#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006007#ifdef IPPROTO_TCP
6008 PyModule_AddIntConstant(m, "IPPROTO_TCP", IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00006009#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006010 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006011#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006012#ifdef IPPROTO_EGP
6013 PyModule_AddIntConstant(m, "IPPROTO_EGP", IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006014#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006015#ifdef IPPROTO_PUP
6016 PyModule_AddIntConstant(m, "IPPROTO_PUP", IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006017#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006018#ifdef IPPROTO_UDP
6019 PyModule_AddIntConstant(m, "IPPROTO_UDP", IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00006020#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006021 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006022#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006023#ifdef IPPROTO_IDP
6024 PyModule_AddIntConstant(m, "IPPROTO_IDP", IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006025#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006026#ifdef IPPROTO_HELLO
6027 PyModule_AddIntConstant(m, "IPPROTO_HELLO", IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006028#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006029#ifdef IPPROTO_ND
6030 PyModule_AddIntConstant(m, "IPPROTO_ND", IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006031#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006032#ifdef IPPROTO_TP
6033 PyModule_AddIntConstant(m, "IPPROTO_TP", IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006034#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006035#ifdef IPPROTO_IPV6
6036 PyModule_AddIntConstant(m, "IPPROTO_IPV6", IPPROTO_IPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006037#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006038#ifdef IPPROTO_ROUTING
6039 PyModule_AddIntConstant(m, "IPPROTO_ROUTING", IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006040#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006041#ifdef IPPROTO_FRAGMENT
6042 PyModule_AddIntConstant(m, "IPPROTO_FRAGMENT", IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006043#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006044#ifdef IPPROTO_RSVP
6045 PyModule_AddIntConstant(m, "IPPROTO_RSVP", IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006046#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006047#ifdef IPPROTO_GRE
6048 PyModule_AddIntConstant(m, "IPPROTO_GRE", IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006049#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006050#ifdef IPPROTO_ESP
6051 PyModule_AddIntConstant(m, "IPPROTO_ESP", IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006052#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006053#ifdef IPPROTO_AH
6054 PyModule_AddIntConstant(m, "IPPROTO_AH", IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006055#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006056#ifdef IPPROTO_MOBILE
6057 PyModule_AddIntConstant(m, "IPPROTO_MOBILE", IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006058#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006059#ifdef IPPROTO_ICMPV6
6060 PyModule_AddIntConstant(m, "IPPROTO_ICMPV6", IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006061#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006062#ifdef IPPROTO_NONE
6063 PyModule_AddIntConstant(m, "IPPROTO_NONE", IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006064#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006065#ifdef IPPROTO_DSTOPTS
6066 PyModule_AddIntConstant(m, "IPPROTO_DSTOPTS", IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006067#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006068#ifdef IPPROTO_XTP
6069 PyModule_AddIntConstant(m, "IPPROTO_XTP", IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006070#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006071#ifdef IPPROTO_EON
6072 PyModule_AddIntConstant(m, "IPPROTO_EON", IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006073#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006074#ifdef IPPROTO_PIM
6075 PyModule_AddIntConstant(m, "IPPROTO_PIM", IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006076#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006077#ifdef IPPROTO_IPCOMP
6078 PyModule_AddIntConstant(m, "IPPROTO_IPCOMP", IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006079#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006080#ifdef IPPROTO_VRRP
6081 PyModule_AddIntConstant(m, "IPPROTO_VRRP", IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006082#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006083#ifdef IPPROTO_SCTP
6084 PyModule_AddIntConstant(m, "IPPROTO_SCTP", IPPROTO_SCTP);
6085#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006086#ifdef IPPROTO_BIP
6087 PyModule_AddIntConstant(m, "IPPROTO_BIP", IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006088#endif
6089/**/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006090#ifdef IPPROTO_RAW
6091 PyModule_AddIntConstant(m, "IPPROTO_RAW", IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00006092#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006093 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006094#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006095#ifdef IPPROTO_MAX
6096 PyModule_AddIntConstant(m, "IPPROTO_MAX", IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006097#endif
6098
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006099 /* Some port configuration */
6100#ifdef IPPORT_RESERVED
6101 PyModule_AddIntConstant(m, "IPPORT_RESERVED", IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006102#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006103 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006104#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006105#ifdef IPPORT_USERRESERVED
6106 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006107#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006108 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006109#endif
6110
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006111 /* Some reserved IP v.4 addresses */
6112#ifdef INADDR_ANY
6113 PyModule_AddIntConstant(m, "INADDR_ANY", INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006114#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006115 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006116#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006117#ifdef INADDR_BROADCAST
6118 PyModule_AddIntConstant(m, "INADDR_BROADCAST", INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006119#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006120 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006121#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006122#ifdef INADDR_LOOPBACK
6123 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006124#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006125 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006126#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006127#ifdef INADDR_UNSPEC_GROUP
6128 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006129#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006130 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006131#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006132#ifdef INADDR_ALLHOSTS_GROUP
6133 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
6134 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006135#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006136 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006137#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006138#ifdef INADDR_MAX_LOCAL_GROUP
6139 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP",
6140 INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006141#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006142 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006143#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006144#ifdef INADDR_NONE
6145 PyModule_AddIntConstant(m, "INADDR_NONE", INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006146#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006147 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006148#endif
6149
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006150 /* IPv4 [gs]etsockopt options */
6151#ifdef IP_OPTIONS
6152 PyModule_AddIntConstant(m, "IP_OPTIONS", IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006153#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006154#ifdef IP_HDRINCL
6155 PyModule_AddIntConstant(m, "IP_HDRINCL", IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006156#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006157#ifdef IP_TOS
6158 PyModule_AddIntConstant(m, "IP_TOS", IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006159#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006160#ifdef IP_TTL
6161 PyModule_AddIntConstant(m, "IP_TTL", IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006162#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006163#ifdef IP_RECVOPTS
6164 PyModule_AddIntConstant(m, "IP_RECVOPTS", IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006165#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006166#ifdef IP_RECVRETOPTS
6167 PyModule_AddIntConstant(m, "IP_RECVRETOPTS", IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006168#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006169#ifdef IP_RECVDSTADDR
6170 PyModule_AddIntConstant(m, "IP_RECVDSTADDR", IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006171#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006172#ifdef IP_RETOPTS
6173 PyModule_AddIntConstant(m, "IP_RETOPTS", IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006174#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006175#ifdef IP_MULTICAST_IF
6176 PyModule_AddIntConstant(m, "IP_MULTICAST_IF", IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006177#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006178#ifdef IP_MULTICAST_TTL
6179 PyModule_AddIntConstant(m, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006180#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006181#ifdef IP_MULTICAST_LOOP
6182 PyModule_AddIntConstant(m, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006183#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006184#ifdef IP_ADD_MEMBERSHIP
6185 PyModule_AddIntConstant(m, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006186#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006187#ifdef IP_DROP_MEMBERSHIP
6188 PyModule_AddIntConstant(m, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006189#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006190#ifdef IP_DEFAULT_MULTICAST_TTL
6191 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_TTL",
6192 IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00006193#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006194#ifdef IP_DEFAULT_MULTICAST_LOOP
6195 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_LOOP",
6196 IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006197#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006198#ifdef IP_MAX_MEMBERSHIPS
6199 PyModule_AddIntConstant(m, "IP_MAX_MEMBERSHIPS", IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00006200#endif
Charles-François Natali564a42c2011-12-17 14:59:56 +01006201#ifdef IP_TRANSPARENT
6202 PyModule_AddIntConstant(m, "IP_TRANSPARENT", IP_TRANSPARENT);
6203#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006204
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006205 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
6206#ifdef IPV6_JOIN_GROUP
6207 PyModule_AddIntConstant(m, "IPV6_JOIN_GROUP", IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006208#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006209#ifdef IPV6_LEAVE_GROUP
6210 PyModule_AddIntConstant(m, "IPV6_LEAVE_GROUP", IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006211#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006212#ifdef IPV6_MULTICAST_HOPS
6213 PyModule_AddIntConstant(m, "IPV6_MULTICAST_HOPS", IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006214#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006215#ifdef IPV6_MULTICAST_IF
6216 PyModule_AddIntConstant(m, "IPV6_MULTICAST_IF", IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006217#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006218#ifdef IPV6_MULTICAST_LOOP
6219 PyModule_AddIntConstant(m, "IPV6_MULTICAST_LOOP", IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006220#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006221#ifdef IPV6_UNICAST_HOPS
6222 PyModule_AddIntConstant(m, "IPV6_UNICAST_HOPS", IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006223#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006224 /* Additional IPV6 socket options, defined in RFC 3493 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00006225#ifdef IPV6_V6ONLY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006226 PyModule_AddIntConstant(m, "IPV6_V6ONLY", IPV6_V6ONLY);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006227#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006228 /* Advanced IPV6 socket options, from RFC 3542 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00006229#ifdef IPV6_CHECKSUM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006230 PyModule_AddIntConstant(m, "IPV6_CHECKSUM", IPV6_CHECKSUM);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006231#endif
6232#ifdef IPV6_DONTFRAG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006233 PyModule_AddIntConstant(m, "IPV6_DONTFRAG", IPV6_DONTFRAG);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006234#endif
6235#ifdef IPV6_DSTOPTS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006236 PyModule_AddIntConstant(m, "IPV6_DSTOPTS", IPV6_DSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006237#endif
6238#ifdef IPV6_HOPLIMIT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006239 PyModule_AddIntConstant(m, "IPV6_HOPLIMIT", IPV6_HOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006240#endif
6241#ifdef IPV6_HOPOPTS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006242 PyModule_AddIntConstant(m, "IPV6_HOPOPTS", IPV6_HOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006243#endif
6244#ifdef IPV6_NEXTHOP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006245 PyModule_AddIntConstant(m, "IPV6_NEXTHOP", IPV6_NEXTHOP);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006246#endif
6247#ifdef IPV6_PATHMTU
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006248 PyModule_AddIntConstant(m, "IPV6_PATHMTU", IPV6_PATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006249#endif
6250#ifdef IPV6_PKTINFO
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006251 PyModule_AddIntConstant(m, "IPV6_PKTINFO", IPV6_PKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006252#endif
6253#ifdef IPV6_RECVDSTOPTS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006254 PyModule_AddIntConstant(m, "IPV6_RECVDSTOPTS", IPV6_RECVDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006255#endif
6256#ifdef IPV6_RECVHOPLIMIT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006257 PyModule_AddIntConstant(m, "IPV6_RECVHOPLIMIT", IPV6_RECVHOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006258#endif
6259#ifdef IPV6_RECVHOPOPTS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006260 PyModule_AddIntConstant(m, "IPV6_RECVHOPOPTS", IPV6_RECVHOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006261#endif
6262#ifdef IPV6_RECVPKTINFO
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006263 PyModule_AddIntConstant(m, "IPV6_RECVPKTINFO", IPV6_RECVPKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006264#endif
6265#ifdef IPV6_RECVRTHDR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006266 PyModule_AddIntConstant(m, "IPV6_RECVRTHDR", IPV6_RECVRTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006267#endif
6268#ifdef IPV6_RECVTCLASS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006269 PyModule_AddIntConstant(m, "IPV6_RECVTCLASS", IPV6_RECVTCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006270#endif
6271#ifdef IPV6_RTHDR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006272 PyModule_AddIntConstant(m, "IPV6_RTHDR", IPV6_RTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006273#endif
6274#ifdef IPV6_RTHDRDSTOPTS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006275 PyModule_AddIntConstant(m, "IPV6_RTHDRDSTOPTS", IPV6_RTHDRDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006276#endif
6277#ifdef IPV6_RTHDR_TYPE_0
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006278 PyModule_AddIntConstant(m, "IPV6_RTHDR_TYPE_0", IPV6_RTHDR_TYPE_0);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006279#endif
6280#ifdef IPV6_RECVPATHMTU
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006281 PyModule_AddIntConstant(m, "IPV6_RECVPATHMTU", IPV6_RECVPATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006282#endif
6283#ifdef IPV6_TCLASS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006284 PyModule_AddIntConstant(m, "IPV6_TCLASS", IPV6_TCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006285#endif
6286#ifdef IPV6_USE_MIN_MTU
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006287 PyModule_AddIntConstant(m, "IPV6_USE_MIN_MTU", IPV6_USE_MIN_MTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006288#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006289
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006290 /* TCP options */
6291#ifdef TCP_NODELAY
6292 PyModule_AddIntConstant(m, "TCP_NODELAY", TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00006293#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006294#ifdef TCP_MAXSEG
6295 PyModule_AddIntConstant(m, "TCP_MAXSEG", TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00006296#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006297#ifdef TCP_CORK
6298 PyModule_AddIntConstant(m, "TCP_CORK", TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006299#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006300#ifdef TCP_KEEPIDLE
6301 PyModule_AddIntConstant(m, "TCP_KEEPIDLE", TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006302#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006303#ifdef TCP_KEEPINTVL
6304 PyModule_AddIntConstant(m, "TCP_KEEPINTVL", TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006305#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006306#ifdef TCP_KEEPCNT
6307 PyModule_AddIntConstant(m, "TCP_KEEPCNT", TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006308#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006309#ifdef TCP_SYNCNT
6310 PyModule_AddIntConstant(m, "TCP_SYNCNT", TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006311#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006312#ifdef TCP_LINGER2
6313 PyModule_AddIntConstant(m, "TCP_LINGER2", TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006314#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006315#ifdef TCP_DEFER_ACCEPT
6316 PyModule_AddIntConstant(m, "TCP_DEFER_ACCEPT", TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006317#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006318#ifdef TCP_WINDOW_CLAMP
6319 PyModule_AddIntConstant(m, "TCP_WINDOW_CLAMP", TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006320#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006321#ifdef TCP_INFO
6322 PyModule_AddIntConstant(m, "TCP_INFO", TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006323#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006324#ifdef TCP_QUICKACK
6325 PyModule_AddIntConstant(m, "TCP_QUICKACK", TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006326#endif
6327
Guido van Rossum09be4091999-08-09 14:40:40 +00006328
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006329 /* IPX options */
6330#ifdef IPX_TYPE
6331 PyModule_AddIntConstant(m, "IPX_TYPE", IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006332#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00006333
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006334/* Reliable Datagram Sockets */
6335#ifdef RDS_CMSG_RDMA_ARGS
6336 PyModule_AddIntConstant(m, "RDS_CMSG_RDMA_ARGS", RDS_CMSG_RDMA_ARGS);
6337#endif
6338#ifdef RDS_CMSG_RDMA_DEST
6339 PyModule_AddIntConstant(m, "RDS_CMSG_RDMA_DEST", RDS_CMSG_RDMA_DEST);
6340#endif
6341#ifdef RDS_CMSG_RDMA_MAP
6342 PyModule_AddIntConstant(m, "RDS_CMSG_RDMA_MAP", RDS_CMSG_RDMA_MAP);
6343#endif
6344#ifdef RDS_CMSG_RDMA_STATUS
6345 PyModule_AddIntConstant(m, "RDS_CMSG_RDMA_STATUS", RDS_CMSG_RDMA_STATUS);
6346#endif
6347#ifdef RDS_CMSG_RDMA_UPDATE
6348 PyModule_AddIntConstant(m, "RDS_CMSG_RDMA_UPDATE", RDS_CMSG_RDMA_UPDATE);
6349#endif
6350#ifdef RDS_RDMA_READWRITE
6351 PyModule_AddIntConstant(m, "RDS_RDMA_READWRITE", RDS_RDMA_READWRITE);
6352#endif
6353#ifdef RDS_RDMA_FENCE
6354 PyModule_AddIntConstant(m, "RDS_RDMA_FENCE", RDS_RDMA_FENCE);
6355#endif
6356#ifdef RDS_RDMA_INVALIDATE
6357 PyModule_AddIntConstant(m, "RDS_RDMA_INVALIDATE", RDS_RDMA_INVALIDATE);
6358#endif
6359#ifdef RDS_RDMA_USE_ONCE
6360 PyModule_AddIntConstant(m, "RDS_RDMA_USE_ONCE", RDS_RDMA_USE_ONCE);
6361#endif
6362#ifdef RDS_RDMA_DONTWAIT
6363 PyModule_AddIntConstant(m, "RDS_RDMA_DONTWAIT", RDS_RDMA_DONTWAIT);
6364#endif
6365#ifdef RDS_RDMA_NOTIFY_ME
6366 PyModule_AddIntConstant(m, "RDS_RDMA_NOTIFY_ME", RDS_RDMA_NOTIFY_ME);
6367#endif
6368#ifdef RDS_RDMA_SILENT
6369 PyModule_AddIntConstant(m, "RDS_RDMA_SILENT", RDS_RDMA_SILENT);
6370#endif
6371
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006372 /* get{addr,name}info parameters */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006373#ifdef EAI_ADDRFAMILY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006374 PyModule_AddIntConstant(m, "EAI_ADDRFAMILY", EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006375#endif
6376#ifdef EAI_AGAIN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006377 PyModule_AddIntConstant(m, "EAI_AGAIN", EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006378#endif
6379#ifdef EAI_BADFLAGS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006380 PyModule_AddIntConstant(m, "EAI_BADFLAGS", EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006381#endif
6382#ifdef EAI_FAIL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006383 PyModule_AddIntConstant(m, "EAI_FAIL", EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006384#endif
6385#ifdef EAI_FAMILY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006386 PyModule_AddIntConstant(m, "EAI_FAMILY", EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006387#endif
6388#ifdef EAI_MEMORY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006389 PyModule_AddIntConstant(m, "EAI_MEMORY", EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006390#endif
6391#ifdef EAI_NODATA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006392 PyModule_AddIntConstant(m, "EAI_NODATA", EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006393#endif
6394#ifdef EAI_NONAME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006395 PyModule_AddIntConstant(m, "EAI_NONAME", EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006396#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00006397#ifdef EAI_OVERFLOW
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006398 PyModule_AddIntConstant(m, "EAI_OVERFLOW", EAI_OVERFLOW);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006399#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006400#ifdef EAI_SERVICE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006401 PyModule_AddIntConstant(m, "EAI_SERVICE", EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006402#endif
6403#ifdef EAI_SOCKTYPE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006404 PyModule_AddIntConstant(m, "EAI_SOCKTYPE", EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006405#endif
6406#ifdef EAI_SYSTEM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006407 PyModule_AddIntConstant(m, "EAI_SYSTEM", EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006408#endif
6409#ifdef EAI_BADHINTS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006410 PyModule_AddIntConstant(m, "EAI_BADHINTS", EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006411#endif
6412#ifdef EAI_PROTOCOL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006413 PyModule_AddIntConstant(m, "EAI_PROTOCOL", EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006414#endif
6415#ifdef EAI_MAX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006416 PyModule_AddIntConstant(m, "EAI_MAX", EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006417#endif
6418#ifdef AI_PASSIVE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006419 PyModule_AddIntConstant(m, "AI_PASSIVE", AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006420#endif
6421#ifdef AI_CANONNAME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006422 PyModule_AddIntConstant(m, "AI_CANONNAME", AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006423#endif
6424#ifdef AI_NUMERICHOST
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006425 PyModule_AddIntConstant(m, "AI_NUMERICHOST", AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006426#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00006427#ifdef AI_NUMERICSERV
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006428 PyModule_AddIntConstant(m, "AI_NUMERICSERV", AI_NUMERICSERV);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006429#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006430#ifdef AI_MASK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006431 PyModule_AddIntConstant(m, "AI_MASK", AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006432#endif
6433#ifdef AI_ALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006434 PyModule_AddIntConstant(m, "AI_ALL", AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006435#endif
6436#ifdef AI_V4MAPPED_CFG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006437 PyModule_AddIntConstant(m, "AI_V4MAPPED_CFG", AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006438#endif
6439#ifdef AI_ADDRCONFIG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006440 PyModule_AddIntConstant(m, "AI_ADDRCONFIG", AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006441#endif
6442#ifdef AI_V4MAPPED
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006443 PyModule_AddIntConstant(m, "AI_V4MAPPED", AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006444#endif
6445#ifdef AI_DEFAULT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006446 PyModule_AddIntConstant(m, "AI_DEFAULT", AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006447#endif
6448#ifdef NI_MAXHOST
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006449 PyModule_AddIntConstant(m, "NI_MAXHOST", NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006450#endif
6451#ifdef NI_MAXSERV
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006452 PyModule_AddIntConstant(m, "NI_MAXSERV", NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006453#endif
6454#ifdef NI_NOFQDN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006455 PyModule_AddIntConstant(m, "NI_NOFQDN", NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006456#endif
6457#ifdef NI_NUMERICHOST
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006458 PyModule_AddIntConstant(m, "NI_NUMERICHOST", NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006459#endif
6460#ifdef NI_NAMEREQD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006461 PyModule_AddIntConstant(m, "NI_NAMEREQD", NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006462#endif
6463#ifdef NI_NUMERICSERV
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006464 PyModule_AddIntConstant(m, "NI_NUMERICSERV", NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006465#endif
6466#ifdef NI_DGRAM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006467 PyModule_AddIntConstant(m, "NI_DGRAM", NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006468#endif
6469
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006470 /* shutdown() parameters */
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006471#ifdef SHUT_RD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006472 PyModule_AddIntConstant(m, "SHUT_RD", SHUT_RD);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006473#elif defined(SD_RECEIVE)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006474 PyModule_AddIntConstant(m, "SHUT_RD", SD_RECEIVE);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006475#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006476 PyModule_AddIntConstant(m, "SHUT_RD", 0);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006477#endif
6478#ifdef SHUT_WR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006479 PyModule_AddIntConstant(m, "SHUT_WR", SHUT_WR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006480#elif defined(SD_SEND)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006481 PyModule_AddIntConstant(m, "SHUT_WR", SD_SEND);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006482#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006483 PyModule_AddIntConstant(m, "SHUT_WR", 1);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006484#endif
6485#ifdef SHUT_RDWR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006486 PyModule_AddIntConstant(m, "SHUT_RDWR", SHUT_RDWR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006487#elif defined(SD_BOTH)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006488 PyModule_AddIntConstant(m, "SHUT_RDWR", SD_BOTH);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006489#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006490 PyModule_AddIntConstant(m, "SHUT_RDWR", 2);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006491#endif
6492
Christian Heimesfaf2f632008-01-06 16:59:19 +00006493#ifdef SIO_RCVALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006494 {
6495 DWORD codes[] = {SIO_RCVALL, SIO_KEEPALIVE_VALS};
6496 const char *names[] = {"SIO_RCVALL", "SIO_KEEPALIVE_VALS"};
6497 int i;
Victor Stinner63941882011-09-29 00:42:28 +02006498 for(i = 0; i<Py_ARRAY_LENGTH(codes); ++i) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006499 PyObject *tmp;
6500 tmp = PyLong_FromUnsignedLong(codes[i]);
6501 if (tmp == NULL)
6502 return NULL;
6503 PyModule_AddObject(m, names[i], tmp);
6504 }
6505 }
6506 PyModule_AddIntConstant(m, "RCVALL_OFF", RCVALL_OFF);
6507 PyModule_AddIntConstant(m, "RCVALL_ON", RCVALL_ON);
6508 PyModule_AddIntConstant(m, "RCVALL_SOCKETLEVELONLY", RCVALL_SOCKETLEVELONLY);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00006509#ifdef RCVALL_IPLEVEL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006510 PyModule_AddIntConstant(m, "RCVALL_IPLEVEL", RCVALL_IPLEVEL);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00006511#endif
6512#ifdef RCVALL_MAX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006513 PyModule_AddIntConstant(m, "RCVALL_MAX", RCVALL_MAX);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00006514#endif
Christian Heimesfaf2f632008-01-06 16:59:19 +00006515#endif /* _MSTCPIP_ */
6516
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006517 /* Initialize gethostbyname lock */
Just van Rossum1040d2c2003-05-09 07:53:18 +00006518#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006519 netdb_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00006520#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006521 return m;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00006522}
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006523
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006524
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006525#ifndef HAVE_INET_PTON
Christian Heimes96e7b3d2007-11-20 06:51:17 +00006526#if !defined(NTDDI_VERSION) || (NTDDI_VERSION < NTDDI_LONGHORN)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006527
6528/* Simplistic emulation code for inet_pton that only works for IPv4 */
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006529/* These are not exposed because they do not set errno properly */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006530
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006531int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006532inet_pton(int af, const char *src, void *dst)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006533{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006534 if (af == AF_INET) {
Benjamin Petersonf91df042009-02-13 02:50:59 +00006535#if (SIZEOF_INT != 4)
6536#error "Not sure if in_addr_t exists and int is not 32-bits."
6537#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006538 unsigned int packed_addr;
6539 packed_addr = inet_addr(src);
6540 if (packed_addr == INADDR_NONE)
6541 return 0;
6542 memcpy(dst, &packed_addr, 4);
6543 return 1;
6544 }
6545 /* Should set errno to EAFNOSUPPORT */
6546 return -1;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006547}
6548
Martin v. Löwisc925b1532001-07-21 09:42:15 +00006549const char *
6550inet_ntop(int af, const void *src, char *dst, socklen_t size)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006551{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006552 if (af == AF_INET) {
6553 struct in_addr packed_addr;
6554 if (size < 16)
6555 /* Should set errno to ENOSPC. */
6556 return NULL;
6557 memcpy(&packed_addr, src, sizeof(packed_addr));
6558 return strncpy(dst, inet_ntoa(packed_addr), size);
6559 }
6560 /* Should set errno to EAFNOSUPPORT */
6561 return NULL;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006562}
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006563
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006564#endif
Christian Heimesb6150692007-11-15 23:37:07 +00006565#endif