blob: bdc055dd384f60c40019a02d999fe93163786971 [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 Heimesfb2d25a2008-01-07 16:12:44 +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 Pitrouc83ea132010-05-09 14:46:46 +000020 a subclass of socket.error
Martin v. Löwis2d8d4272001-07-21 18:05:31 +000021- socket.herror: exception raised for gethostby* errors,
Antoine Pitrouc83ea132010-05-09 14:46:46 +000022 a subclass of socket.error
Guido van Rossum83a072d2002-09-03 19:10:18 +000023- socket.fromfd(fd, family, type[, proto]) --> new socket object (created
Antoine Pitrouc83ea132010-05-09 14:46:46 +000024 from an existing file descriptor)
Guido van Rossum30a685f1991-06-27 15:51:29 +000025- socket.gethostbyname(hostname) --> host IP address (string: 'dd.dd.dd.dd')
Guido van Rossum3bbc62e1995-01-02 19:30:30 +000026- socket.gethostbyaddr(IP address) --> (hostname, [alias, ...], [IP addr, ...])
Guido van Rossum27e177d1995-03-16 15:43:47 +000027- socket.gethostname() --> host name (string: 'spam' or 'spam.domain.com')
Guido van Rossum25405c71996-12-19 16:42:52 +000028- socket.getprotobyname(protocolname) --> protocol number
Barry Warsaw11b91a02004-06-28 00:50:43 +000029- socket.getservbyname(servicename[, protocolname]) --> port number
30- socket.getservbyport(portnumber[, protocolname]) --> service name
Guido van Rossum83a072d2002-09-03 19:10:18 +000031- socket.socket([family[, type [, proto]]]) --> new socket object
Dave Cole331708b2004-08-09 04:51:41 +000032- socket.socketpair([family[, type [, proto]]]) --> (socket, socket)
Guido van Rossum006bf911996-06-12 04:04:55 +000033- socket.ntohs(16 bit value) --> new int object
34- socket.ntohl(32 bit value) --> new int object
35- socket.htons(16 bit value) --> new int object
36- socket.htonl(32 bit value) --> new int object
Martin v. Löwis2d8d4272001-07-21 18:05:31 +000037- socket.getaddrinfo(host, port [, family, socktype, proto, flags])
Antoine Pitrouc83ea132010-05-09 14:46:46 +000038 --> List of (family, socktype, proto, canonname, sockaddr)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +000039- socket.getnameinfo(sockaddr, flags) --> (host, port)
Guido van Rossum27e177d1995-03-16 15:43:47 +000040- socket.AF_INET, socket.SOCK_STREAM, etc.: constants from <socket.h>
Guido van Rossum47dfa4a2003-04-25 05:48:32 +000041- socket.has_ipv6: boolean value indicating if IPv6 is supported
Guido van Rossum5c9eb211999-08-20 18:21:51 +000042- socket.inet_aton(IP address) -> 32-bit packed IP representation
43- socket.inet_ntoa(packed IP) -> IP address string
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +000044- socket.getdefaulttimeout() -> None | float
45- socket.setdefaulttimeout(None | float)
Guido van Rossum6574b3e1991-06-25 21:36:08 +000046- an Internet socket address is a pair (hostname, port)
47 where hostname can be anything recognized by gethostbyname()
48 (including the dd.dd.dd.dd notation) and port is in host byte order
49- where a hostname is returned, the dd.dd.dd.dd notation is used
Guido van Rossum27e177d1995-03-16 15:43:47 +000050- a UNIX domain socket address is a string specifying the pathname
Jeremy Hylton22308652001-02-02 03:23:09 +000051- an AF_PACKET socket address is a tuple containing a string
52 specifying the ethernet interface and an integer specifying
53 the Ethernet protocol number to be received. For example:
Jeremy Hyltondbfb6622001-02-02 19:55:17 +000054 ("eth0",0x1234). Optional 3rd,4th,5th elements in the tuple
Andrew M. Kuchlingb8e17172004-07-10 23:39:35 +000055 specify packet-type and ha-type/addr.
Christian Heimesfb2d25a2008-01-07 16:12:44 +000056- an AF_TIPC socket address is expressed as
57 (addr_type, v1, v2, v3 [, scope]); where addr_type can be one of:
Antoine Pitrouc83ea132010-05-09 14:46:46 +000058 TIPC_ADDR_NAMESEQ, TIPC_ADDR_NAME, and TIPC_ADDR_ID;
Christian Heimesfb2d25a2008-01-07 16:12:44 +000059 and scope can be one of:
Antoine Pitrouc83ea132010-05-09 14:46:46 +000060 TIPC_ZONE_SCOPE, TIPC_CLUSTER_SCOPE, and TIPC_NODE_SCOPE.
Christian Heimesfb2d25a2008-01-07 16:12:44 +000061 The meaning of v1, v2 and v3 depends on the value of addr_type:
Antoine Pitrouc83ea132010-05-09 14:46:46 +000062 if addr_type is TIPC_ADDR_NAME:
63 v1 is the server type
64 v2 is the port identifier
65 v3 is ignored
66 if addr_type is TIPC_ADDR_NAMESEQ:
67 v1 is the server type
68 v2 is the lower port number
69 v3 is the upper port number
70 if addr_type is TIPC_ADDR_ID:
71 v1 is the node
72 v2 is the ref
73 v3 is ignored
Christian Heimesfb2d25a2008-01-07 16:12:44 +000074
Guido van Rossum6574b3e1991-06-25 21:36:08 +000075
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000076Local naming conventions:
Guido van Rossum6574b3e1991-06-25 21:36:08 +000077
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000078- names starting with sock_ are socket object methods
79- names starting with socket_ are module-level functions
80- names starting with PySocket are exported through socketmodule.h
Guido van Rossum30a685f1991-06-27 15:51:29 +000081
Guido van Rossum6574b3e1991-06-25 21:36:08 +000082*/
83
Ronald Oussorend06b6f22006-04-23 11:59:25 +000084#ifdef __APPLE__
85 /*
86 * inet_aton is not available on OSX 10.3, yet we want to use a binary
87 * that was build on 10.4 or later to work on that release, weak linking
88 * comes to the rescue.
89 */
90# pragma weak inet_aton
91#endif
92
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000093#include "Python.h"
Georg Brandlbc45a3f2006-03-17 19:17:34 +000094#include "structmember.h"
Kristján Valur Jónsson868f0aa2013-03-19 13:53:56 -070095#include "timefuncs.h"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000096
Guido van Rossum47dfa4a2003-04-25 05:48:32 +000097#undef MAX
98#define MAX(x, y) ((x) < (y) ? (y) : (x))
99
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000100/* Socket object documentation */
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000101PyDoc_STRVAR(sock_doc,
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000102"socket([family[, type[, proto]]]) -> socket object\n\
103\n\
104Open a socket of the given type. The family argument specifies the\n\
105address family; it defaults to AF_INET. The type argument specifies\n\
106whether this is a stream (SOCK_STREAM, this is the default)\n\
107or datagram (SOCK_DGRAM) socket. The protocol argument defaults to 0,\n\
108specifying the default protocol. Keyword arguments are accepted.\n\
109\n\
110A socket object represents one endpoint of a network connection.\n\
111\n\
112Methods of socket objects (keyword arguments not allowed):\n\
113\n\
114accept() -- accept a connection, returning new socket and client address\n\
115bind(addr) -- bind the socket to a local address\n\
116close() -- close the socket\n\
117connect(addr) -- connect the socket to a remote address\n\
118connect_ex(addr) -- connect, return an error code instead of an exception\n\
119dup() -- return a new socket object identical to the current one [*]\n\
120fileno() -- return underlying file descriptor\n\
121getpeername() -- return remote address [*]\n\
122getsockname() -- return local address\n\
123getsockopt(level, optname[, buflen]) -- get socket options\n\
124gettimeout() -- return timeout or None\n\
125listen(n) -- start listening for incoming connections\n\
126makefile([mode, [bufsize]]) -- return a file object for the socket [*]\n\
127recv(buflen[, flags]) -- receive data\n\
Martin Blaisaf2ae722006-06-04 13:49:49 +0000128recv_into(buffer[, nbytes[, flags]]) -- receive data (into a buffer)\n\
Martin Blais2856e5f2006-05-26 12:03:27 +0000129recvfrom(buflen[, flags]) -- receive data and sender\'s address\n\
Martin Blaisaf2ae722006-06-04 13:49:49 +0000130recvfrom_into(buffer[, nbytes, [, flags])\n\
Martin Blais2856e5f2006-05-26 12:03:27 +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\
139\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000140 [*] not available on all platforms!");
Guido van Rossum3baaa131999-03-22 21:44:51 +0000141
Walter Dörwaldf0dfc7a2003-10-20 14:01:56 +0000142/* XXX This is a terrible mess of platform-dependent preprocessor hacks.
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000143 I hope some day someone can clean this up please... */
144
Guido van Rossum9376b741999-09-15 22:01:40 +0000145/* Hacks for gethostbyname_r(). On some non-Linux platforms, the configure
146 script doesn't get this right, so we hardcode some platform checks below.
147 On the other hand, not all Linux versions agree, so there the settings
148 computed by the configure script are needed! */
149
150#ifndef linux
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000151# undef HAVE_GETHOSTBYNAME_R_3_ARG
152# undef HAVE_GETHOSTBYNAME_R_5_ARG
153# undef HAVE_GETHOSTBYNAME_R_6_ARG
Guido van Rossum9376b741999-09-15 22:01:40 +0000154#endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000155
Guido van Rossum7a122991999-04-13 04:07:32 +0000156#ifndef WITH_THREAD
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000157# undef HAVE_GETHOSTBYNAME_R
Guido van Rossum7a122991999-04-13 04:07:32 +0000158#endif
159
Guido van Rossume7de2061999-03-24 17:24:33 +0000160#ifdef HAVE_GETHOSTBYNAME_R
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000161# if defined(_AIX) || defined(__osf__)
162# define HAVE_GETHOSTBYNAME_R_3_ARG
163# elif defined(__sun) || defined(__sgi)
164# define HAVE_GETHOSTBYNAME_R_5_ARG
165# elif defined(linux)
Guido van Rossum9376b741999-09-15 22:01:40 +0000166/* Rely on the configure script */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000167# else
168# undef HAVE_GETHOSTBYNAME_R
169# endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000170#endif
171
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000172#if !defined(HAVE_GETHOSTBYNAME_R) && defined(WITH_THREAD) && \
173 !defined(MS_WINDOWS)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000174# define USE_GETHOSTBYNAME_LOCK
Guido van Rossum3baaa131999-03-22 21:44:51 +0000175#endif
176
Hye-Shik Chang9ceebd52005-09-24 14:58:47 +0000177/* To use __FreeBSD_version */
178#ifdef HAVE_SYS_PARAM_H
179#include <sys/param.h>
180#endif
Just van Rossum1040d2c2003-05-09 07:53:18 +0000181/* On systems on which getaddrinfo() is believed to not be thread-safe,
Just van Rossum09aecd72003-05-09 08:03:44 +0000182 (this includes the getaddrinfo emulation) protect access with a lock. */
Hye-Shik Chang9ceebd52005-09-24 14:58:47 +0000183#if defined(WITH_THREAD) && (defined(__APPLE__) || \
184 (defined(__FreeBSD__) && __FreeBSD_version+0 < 503000) || \
Neal Norwitz2a30cd02006-07-10 01:18:57 +0000185 defined(__OpenBSD__) || defined(__NetBSD__) || \
186 defined(__VMS) || !defined(HAVE_GETADDRINFO))
Just van Rossum1040d2c2003-05-09 07:53:18 +0000187#define USE_GETADDRINFO_LOCK
188#endif
189
190#ifdef USE_GETADDRINFO_LOCK
191#define ACQUIRE_GETADDRINFO_LOCK PyThread_acquire_lock(netdb_lock, 1);
192#define RELEASE_GETADDRINFO_LOCK PyThread_release_lock(netdb_lock);
193#else
194#define ACQUIRE_GETADDRINFO_LOCK
195#define RELEASE_GETADDRINFO_LOCK
196#endif
197
198#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000199# include "pythread.h"
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000200#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000201
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000202#if defined(PYCC_VACPP)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000203# include <types.h>
204# include <io.h>
205# include <sys/ioctl.h>
206# include <utils.h>
207# include <ctype.h>
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000208#endif
209
Martin v. Löwis9e437302002-12-06 12:57:26 +0000210#if defined(__VMS)
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000211# include <ioctl.h>
212#endif
213
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000214#if defined(PYOS_OS2)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000215# define INCL_DOS
216# define INCL_DOSERRORS
217# define INCL_NOPMAPI
218# include <os2.h>
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000219#endif
220
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000221#if defined(__sgi) && _COMPILER_VERSION>700 && !_SGIAPI
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000222/* make sure that the reentrant (gethostbyaddr_r etc)
223 functions are declared correctly if compiling with
224 MIPSPro 7.x in ANSI C mode (default) */
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000225
Martin Blais2856e5f2006-05-26 12:03:27 +0000226/* XXX Using _SGIAPI is the wrong thing,
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000227 but I don't know what the right thing is. */
Trent Mick8ea5bdf2004-09-13 17:48:41 +0000228#undef _SGIAPI /* to avoid warning */
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000229#define _SGIAPI 1
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000230
Trent Mick8ea5bdf2004-09-13 17:48:41 +0000231#undef _XOPEN_SOURCE
232#include <sys/socket.h>
233#include <sys/types.h>
234#include <netinet/in.h>
235#ifdef _SS_ALIGNSIZE
236#define HAVE_GETADDRINFO 1
237#define HAVE_GETNAMEINFO 1
238#endif
239
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000240#define HAVE_INET_PTON
241#include <netdb.h>
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000242#endif
243
Martin Blais2856e5f2006-05-26 12:03:27 +0000244/* Irix 6.5 fails to define this variable at all. This is needed
245 for both GCC and SGI's compiler. I'd say that the SGI headers
Georg Brandldbd83392006-02-20 09:42:33 +0000246 are just busted. Same thing for Solaris. */
247#if (defined(__sgi) || defined(sun)) && !defined(INET_ADDRSTRLEN)
Anthony Baxterbab23cf2003-10-04 08:00:49 +0000248#define INET_ADDRSTRLEN 16
249#endif
250
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000251/* Generic includes */
Martin v. Löwis0e8bd7e2006-06-10 12:23:46 +0000252#ifdef HAVE_SYS_TYPES_H
Guido van Rossumb6775db1994-08-01 11:34:53 +0000253#include <sys/types.h>
Martin v. Löwis0e8bd7e2006-06-10 12:23:46 +0000254#endif
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000255
Marc-André Lemburg976ade62002-02-16 18:47:07 +0000256/* Generic socket object definitions and includes */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000257#define PySocket_BUILDING_SOCKET
Marc-André Lemburgbb8b78b2002-02-16 18:44:52 +0000258#include "socketmodule.h"
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000259
260/* Addressing includes */
261
Guido van Rossum6f489d91996-06-28 20:15:15 +0000262#ifndef MS_WINDOWS
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000263
264/* Non-MS WINDOWS includes */
265# include <netdb.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000266
Guido van Rossum9376b741999-09-15 22:01:40 +0000267/* Headers needed for inet_ntoa() and inet_addr() */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000268# ifdef __BEOS__
269# include <net/netdb.h>
270# elif defined(PYOS_OS2) && defined(PYCC_VACPP)
271# include <netdb.h>
Tim Peters603c6832001-11-05 02:45:59 +0000272typedef size_t socklen_t;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000273# else
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000274# include <arpa/inet.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000275# endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000276
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000277# ifndef RISCOS
278# include <fcntl.h>
279# else
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000280# include <sys/ioctl.h>
281# include <socklib.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000282# define NO_DUP
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000283int h_errno; /* not used */
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000284# define INET_ADDRSTRLEN 16
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000285# endif
286
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000287#else
Guido van Rossum48a680c2001-03-02 06:34:14 +0000288
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000289/* MS_WINDOWS includes */
Martin v. Löwis0e8bd7e2006-06-10 12:23:46 +0000290# ifdef HAVE_FCNTL_H
291# include <fcntl.h>
292# endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000293
Jeremy Hylton22308652001-02-02 03:23:09 +0000294#endif
295
Skip Montanaro7befb992004-02-10 16:50:21 +0000296#include <stddef.h>
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000297
298#ifndef offsetof
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000299# define offsetof(type, member) ((size_t)(&((type *)0)->member))
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000300#endif
301
Neal Norwitz39d22e52002-11-02 19:55:21 +0000302#ifndef O_NONBLOCK
303# define O_NONBLOCK O_NDELAY
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000304#endif
305
Trent Micka708d6e2004-09-07 17:48:26 +0000306/* include Python's addrinfo.h unless it causes trouble */
307#if defined(__sgi) && _COMPILER_VERSION>700 && defined(_SS_ALIGNSIZE)
308 /* Do not include addinfo.h on some newer IRIX versions.
309 * _SS_ALIGNSIZE is defined in sys/socket.h by 6.5.21,
310 * for example, but not by 6.5.10.
311 */
Martin v. Löwis0e8bd7e2006-06-10 12:23:46 +0000312#elif defined(_MSC_VER) && _MSC_VER>1201
Trent Micka708d6e2004-09-07 17:48:26 +0000313 /* Do not include addrinfo.h for MSVC7 or greater. 'addrinfo' and
314 * EAI_* constants are defined in (the already included) ws2tcpip.h.
315 */
316#else
317# include "addrinfo.h"
318#endif
Jason Tishlerc246cb72004-08-09 13:25:59 +0000319
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000320#ifndef HAVE_INET_PTON
Christian Heimese8954f82007-11-22 11:21:16 +0000321#if !defined(NTDDI_VERSION) || (NTDDI_VERSION < NTDDI_LONGHORN)
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000322int inet_pton(int af, const char *src, void *dst);
Martin v. Löwisc925b1532001-07-21 09:42:15 +0000323const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000324#endif
Christian Heimese8954f82007-11-22 11:21:16 +0000325#endif
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000326
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000327#ifdef __APPLE__
328/* On OS X, getaddrinfo returns no error indication of lookup
329 failure, so we must use the emulation instead of the libinfo
330 implementation. Unfortunately, performing an autoconf test
331 for this bug would require DNS access for the machine performing
332 the configuration, which is not acceptable. Therefore, we
333 determine the bug just by checking for __APPLE__. If this bug
334 gets ever fixed, perhaps checking for sys/version.h would be
335 appropriate, which is 10/0 on the system with the bug. */
Jack Jansen84262fb2002-07-02 14:40:42 +0000336#ifndef HAVE_GETNAMEINFO
337/* This bug seems to be fixed in Jaguar. Ths easiest way I could
338 Find to check for Jaguar is that it has getnameinfo(), which
339 older releases don't have */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000340#undef HAVE_GETADDRINFO
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000341#endif
Ronald Oussorend06b6f22006-04-23 11:59:25 +0000342
343#ifdef HAVE_INET_ATON
344#define USE_INET_ATON_WEAKLINK
345#endif
346
Jack Jansen84262fb2002-07-02 14:40:42 +0000347#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000348
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000349/* I know this is a bad practice, but it is the easiest... */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000350#if !defined(HAVE_GETADDRINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000351/* avoid clashes with the C library definition of the symbol. */
352#define getaddrinfo fake_getaddrinfo
353#define gai_strerror fake_gai_strerror
354#define freeaddrinfo fake_freeaddrinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000355#include "getaddrinfo.c"
356#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000357#if !defined(HAVE_GETNAMEINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000358#define getnameinfo fake_getnameinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000359#include "getnameinfo.c"
360#endif
361
Guido van Rossumbcc20741998-08-04 22:53:56 +0000362#if defined(MS_WINDOWS) || defined(__BEOS__)
363/* BeOS suffers from the same socket dichotomy as Win32... - [cjh] */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000364/* seem to be a few differences in the API */
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000365#define SOCKETCLOSE closesocket
Guido van Rossumbe32c891996-06-20 16:25:29 +0000366#define NO_DUP /* Actually it exists on NT 3.5, but what the heck... */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000367#endif
368
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000369#ifdef MS_WIN32
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000370#define EAFNOSUPPORT WSAEAFNOSUPPORT
371#define snprintf _snprintf
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000372#endif
Fred Drakea04eaad2000-06-30 02:46:07 +0000373
Andrew MacIntyreba43e872002-03-03 03:03:52 +0000374#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000375#define SOCKETCLOSE soclose
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000376#define NO_DUP /* Sockets are Not Actual File Handles under OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000377#endif
378
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000379#ifndef SOCKETCLOSE
380#define SOCKETCLOSE close
381#endif
382
Gregory P. Smith886a1cd2010-10-17 04:28:14 +0000383#if (defined(HAVE_BLUETOOTH_H) || defined(HAVE_BLUETOOTH_BLUETOOTH_H)) && !defined(__NetBSD__) && !defined(__DragonFly__)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000384#define USE_BLUETOOTH 1
385#if defined(__FreeBSD__)
386#define BTPROTO_L2CAP BLUETOOTH_PROTO_L2CAP
387#define BTPROTO_RFCOMM BLUETOOTH_PROTO_RFCOMM
Martin v. Löwis45423a72007-02-14 10:07:37 +0000388#define BTPROTO_HCI BLUETOOTH_PROTO_HCI
Hye-Shik Chang82958f02007-06-05 18:16:52 +0000389#define SOL_HCI SOL_HCI_RAW
390#define HCI_FILTER SO_HCI_RAW_FILTER
Hye-Shik Chang81268602004-02-02 06:05:24 +0000391#define sockaddr_l2 sockaddr_l2cap
392#define sockaddr_rc sockaddr_rfcomm
Hye-Shik Chang82958f02007-06-05 18:16:52 +0000393#define hci_dev hci_node
Hye-Shik Chang81268602004-02-02 06:05:24 +0000394#define _BT_L2_MEMB(sa, memb) ((sa)->l2cap_##memb)
395#define _BT_RC_MEMB(sa, memb) ((sa)->rfcomm_##memb)
Martin v. Löwis45423a72007-02-14 10:07:37 +0000396#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Gregory P. Smith886a1cd2010-10-17 04:28:14 +0000397#elif defined(__NetBSD__) || defined(__DragonFly__)
Matt Flemingec926502006-07-28 11:27:27 +0000398#define sockaddr_l2 sockaddr_bt
399#define sockaddr_rc sockaddr_bt
Martin v. Löwis45423a72007-02-14 10:07:37 +0000400#define sockaddr_hci sockaddr_bt
Matt Flemingec926502006-07-28 11:27:27 +0000401#define sockaddr_sco sockaddr_bt
Gregory P. Smith886a1cd2010-10-17 04:28:14 +0000402#define SOL_HCI BTPROTO_HCI
403#define HCI_DATA_DIR SO_HCI_DIRECTION
Matt Flemingec926502006-07-28 11:27:27 +0000404#define _BT_L2_MEMB(sa, memb) ((sa)->bt_##memb)
405#define _BT_RC_MEMB(sa, memb) ((sa)->bt_##memb)
Martin v. Löwis45423a72007-02-14 10:07:37 +0000406#define _BT_HCI_MEMB(sa, memb) ((sa)->bt_##memb)
Matt Flemingec926502006-07-28 11:27:27 +0000407#define _BT_SCO_MEMB(sa, memb) ((sa)->bt_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000408#else
Hye-Shik Chang81268602004-02-02 06:05:24 +0000409#define _BT_L2_MEMB(sa, memb) ((sa)->l2_##memb)
410#define _BT_RC_MEMB(sa, memb) ((sa)->rc_##memb)
Martin v. Löwis45423a72007-02-14 10:07:37 +0000411#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000412#define _BT_SCO_MEMB(sa, memb) ((sa)->sco_##memb)
413#endif
414#endif
415
Neal Norwitz2a30cd02006-07-10 01:18:57 +0000416#ifdef __VMS
417/* TCP/IP Services for VMS uses a maximum send/recv buffer length */
418#define SEGMENT_SIZE (32 * 1024 -1)
419#endif
420
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000421#define SAS2SA(x) ((struct sockaddr *)(x))
Martin v. Löwis046c4d12006-12-03 11:23:45 +0000422
Martin v. Löwise9416172003-05-03 10:12:45 +0000423/*
424 * Constants for getnameinfo()
425 */
426#if !defined(NI_MAXHOST)
427#define NI_MAXHOST 1025
428#endif
429#if !defined(NI_MAXSERV)
430#define NI_MAXSERV 32
431#endif
432
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000433/* XXX There's a problem here: *static* functions are not supposed to have
434 a Py prefix (or use CapitalizedWords). Later... */
435
Guido van Rossum30a685f1991-06-27 15:51:29 +0000436/* Global variable holding the exception type for errors detected
437 by this module (but not argument type or memory errors, etc.). */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000438static PyObject *socket_error;
439static PyObject *socket_herror;
440static PyObject *socket_gaierror;
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000441static PyObject *socket_timeout;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000442
Guido van Rossum48a680c2001-03-02 06:34:14 +0000443#ifdef RISCOS
444/* Global variable which is !=0 if Python is running in a RISC OS taskwindow */
445static int taskwindow;
446#endif
447
Tim Peters643a7fc2002-02-17 04:13:21 +0000448/* A forward reference to the socket type object.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000449 The sock_type variable contains pointers to various functions,
450 some of which call new_sockobject(), which uses sock_type, so
Tim Peters643a7fc2002-02-17 04:13:21 +0000451 there has to be a circular reference. */
Jeremy Hylton938ace62002-07-17 16:30:39 +0000452static PyTypeObject sock_type;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000453
Anthony Baxter93ab5fa2006-07-11 02:04:09 +0000454#if defined(HAVE_POLL_H)
455#include <poll.h>
456#elif defined(HAVE_SYS_POLL_H)
457#include <sys/poll.h>
458#endif
459
Charles-François Natalifda7b372011-08-28 16:22:33 +0200460#ifdef HAVE_POLL
Anthony Baxter93ab5fa2006-07-11 02:04:09 +0000461/* Instead of select(), we'll use poll() since poll() works on any fd. */
462#define IS_SELECTABLE(s) 1
463/* Can we call select() with this socket without a buffer overrun? */
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000464#else
Charles-François Natalifda7b372011-08-28 16:22:33 +0200465/* If there's no timeout left, we don't have to call select, so it's a safe,
466 * little white lie. */
467#define IS_SELECTABLE(s) (_PyIsSelectable_fd((s)->sock_fd) || (s)->sock_timeout <= 0.0)
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000468#endif
Neal Norwitz082b2df2006-02-07 07:04:46 +0000469
470static PyObject*
471select_error(void)
472{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000473 PyErr_SetString(socket_error, "unable to select on socket");
474 return NULL;
Neal Norwitz082b2df2006-02-07 07:04:46 +0000475}
476
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -0700477#ifdef MS_WINDOWS
478#ifndef WSAEAGAIN
479#define WSAEAGAIN WSAEWOULDBLOCK
480#endif
481#define CHECK_ERRNO(expected) \
482 (WSAGetLastError() == WSA ## expected)
483#else
484#define CHECK_ERRNO(expected) \
485 (errno == expected)
486#endif
487
Guido van Rossum30a685f1991-06-27 15:51:29 +0000488/* Convenience function to raise an error according to errno
489 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000490
Guido van Rossum73624e91994-10-10 17:59:00 +0000491static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000492set_error(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000493{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000494#ifdef MS_WINDOWS
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000495 int err_no = WSAGetLastError();
496 /* PyErr_SetExcFromWindowsErr() invokes FormatMessage() which
497 recognizes the error codes used by both GetLastError() and
498 WSAGetLastError */
499 if (err_no)
500 return PyErr_SetExcFromWindowsErr(socket_error, err_no);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000501#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000502
Andrew MacIntyreba43e872002-03-03 03:03:52 +0000503#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000504 if (sock_errno() != NO_ERROR) {
505 APIRET rc;
506 ULONG msglen;
507 char outbuf[100];
508 int myerrorcode = sock_errno();
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000509
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000510 /* Retrieve socket-related error message from MPTN.MSG file */
511 rc = DosGetMessage(NULL, 0, outbuf, sizeof(outbuf),
512 myerrorcode - SOCBASEERR + 26,
513 "mptn.msg",
514 &msglen);
515 if (rc == NO_ERROR) {
516 PyObject *v;
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000517
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000518 /* OS/2 doesn't guarantee a terminator */
519 outbuf[msglen] = '\0';
520 if (strlen(outbuf) > 0) {
521 /* If non-empty msg, trim CRLF */
522 char *lastc = &outbuf[ strlen(outbuf)-1 ];
523 while (lastc > outbuf &&
524 isspace(Py_CHARMASK(*lastc))) {
525 /* Trim trailing whitespace (CRLF) */
526 *lastc-- = '\0';
527 }
528 }
529 v = Py_BuildValue("(is)", myerrorcode, outbuf);
530 if (v != NULL) {
531 PyErr_SetObject(socket_error, v);
532 Py_DECREF(v);
533 }
534 return NULL;
535 }
536 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000537#endif
538
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000539#if defined(RISCOS)
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000540 if (_inet_error.errnum != NULL) {
541 PyObject *v;
542 v = Py_BuildValue("(is)", errno, _inet_err());
543 if (v != NULL) {
544 PyErr_SetObject(socket_error, v);
545 Py_DECREF(v);
546 }
547 return NULL;
548 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000549#endif
550
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000551 return PyErr_SetFromErrno(socket_error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000552}
553
Guido van Rossum30a685f1991-06-27 15:51:29 +0000554
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000555static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000556set_herror(int h_error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000557{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000558 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000559
560#ifdef HAVE_HSTRERROR
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000561 v = Py_BuildValue("(is)", h_error, (char *)hstrerror(h_error));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000562#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000563 v = Py_BuildValue("(is)", h_error, "host not found");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000564#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000565 if (v != NULL) {
566 PyErr_SetObject(socket_herror, v);
567 Py_DECREF(v);
568 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000569
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000570 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000571}
572
573
574static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000575set_gaierror(int error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000576{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000577 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000578
Martin v. Löwis272cb402002-03-01 08:31:07 +0000579#ifdef EAI_SYSTEM
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000580 /* EAI_SYSTEM is not available on Windows XP. */
581 if (error == EAI_SYSTEM)
582 return set_error();
Martin v. Löwis272cb402002-03-01 08:31:07 +0000583#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000584
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000585#ifdef HAVE_GAI_STRERROR
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000586 v = Py_BuildValue("(is)", error, gai_strerror(error));
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000587#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000588 v = Py_BuildValue("(is)", error, "getaddrinfo failed");
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000589#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000590 if (v != NULL) {
591 PyErr_SetObject(socket_gaierror, v);
592 Py_DECREF(v);
593 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000594
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000595 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000596}
597
Neal Norwitz2a30cd02006-07-10 01:18:57 +0000598#ifdef __VMS
599/* Function to send in segments */
600static int
601sendsegmented(int sock_fd, char *buf, int len, int flags)
602{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000603 int n = 0;
604 int remaining = len;
Neal Norwitz2a30cd02006-07-10 01:18:57 +0000605
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000606 while (remaining > 0) {
607 unsigned int segment;
Neal Norwitz2a30cd02006-07-10 01:18:57 +0000608
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000609 segment = (remaining >= SEGMENT_SIZE ? SEGMENT_SIZE : remaining);
610 n = send(sock_fd, buf, segment, flags);
611 if (n < 0) {
612 return n;
613 }
614 remaining -= segment;
615 buf += segment;
616 } /* end while */
Neal Norwitz2a30cd02006-07-10 01:18:57 +0000617
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000618 return len;
Neal Norwitz2a30cd02006-07-10 01:18:57 +0000619}
620#endif
621
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000622/* Function to perform the setting of socket blocking mode
623 internally. block = (1 | 0). */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000624static int
625internal_setblocking(PySocketSockObject *s, int block)
626{
627#ifndef RISCOS
628#ifndef MS_WINDOWS
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000629 int delay_flag;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000630#endif
631#endif
632
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000633 Py_BEGIN_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000634#ifdef __BEOS__
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000635 block = !block;
636 setsockopt(s->sock_fd, SOL_SOCKET, SO_NONBLOCK,
637 (void *)(&block), sizeof(int));
Guido van Rossum67f7a382002-06-06 21:08:16 +0000638#else
639#ifndef RISCOS
640#ifndef MS_WINDOWS
641#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000642 block = !block;
643 ioctl(s->sock_fd, FIONBIO, (caddr_t)&block, sizeof(block));
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000644#elif defined(__VMS)
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000645 block = !block;
646 ioctl(s->sock_fd, FIONBIO, (unsigned int *)&block);
Neal Norwitz2a30cd02006-07-10 01:18:57 +0000647#else /* !PYOS_OS2 && !__VMS */
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000648 delay_flag = fcntl(s->sock_fd, F_GETFL, 0);
649 if (block)
650 delay_flag &= (~O_NONBLOCK);
651 else
652 delay_flag |= O_NONBLOCK;
653 fcntl(s->sock_fd, F_SETFL, delay_flag);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000654#endif /* !PYOS_OS2 */
655#else /* MS_WINDOWS */
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000656 block = !block;
657 ioctlsocket(s->sock_fd, FIONBIO, (u_long*)&block);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000658#endif /* MS_WINDOWS */
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000659#else /* RISCOS */
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000660 block = !block;
661 socketioctl(s->sock_fd, FIONBIO, (u_long*)&block);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000662#endif /* RISCOS */
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000663#endif /* __BEOS__ */
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000664 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000665
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000666 /* Since these don't return anything */
667 return 1;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000668}
669
Anthony Baxter93ab5fa2006-07-11 02:04:09 +0000670/* Do a select()/poll() on the socket, if necessary (sock_timeout > 0).
Guido van Rossum11ba0942002-06-13 15:07:44 +0000671 The argument writing indicates the direction.
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000672 This does not raise an exception; we'll let our caller do that
673 after they've reacquired the interpreter lock.
Neal Norwitz9b0ca792006-08-02 06:46:21 +0000674 Returns 1 on timeout, -1 on error, 0 otherwise. */
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000675static int
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -0700676internal_select_ex(PySocketSockObject *s, int writing, double interval)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000677{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000678 int n;
Guido van Rossum11ba0942002-06-13 15:07:44 +0000679
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000680 /* Nothing to do unless we're in timeout mode (not non-blocking) */
681 if (s->sock_timeout <= 0.0)
682 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000683
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000684 /* Guard against closed socket */
685 if (s->sock_fd < 0)
686 return 0;
Guido van Rossumad654902002-07-19 12:44:59 +0000687
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -0700688 /* Handling this condition here simplifies the select loops */
689 if (interval < 0.0)
690 return 1;
691
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000692 /* Prefer poll, if available, since you can poll() any fd
693 * which can't be done with select(). */
Anthony Baxter93ab5fa2006-07-11 02:04:09 +0000694#ifdef HAVE_POLL
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000695 {
696 struct pollfd pollfd;
697 int timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000698
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000699 pollfd.fd = s->sock_fd;
700 pollfd.events = writing ? POLLOUT : POLLIN;
Anthony Baxter93ab5fa2006-07-11 02:04:09 +0000701
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000702 /* s->sock_timeout is in seconds, timeout in ms */
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -0700703 timeout = (int)(interval * 1000 + 0.5);
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000704 n = poll(&pollfd, 1, timeout);
705 }
Anthony Baxter93ab5fa2006-07-11 02:04:09 +0000706#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000707 {
708 /* Construct the arguments to select */
709 fd_set fds;
710 struct timeval tv;
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -0700711 tv.tv_sec = (int)interval;
712 tv.tv_usec = (int)((interval - tv.tv_sec) * 1e6);
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000713 FD_ZERO(&fds);
714 FD_SET(s->sock_fd, &fds);
Anthony Baxter93ab5fa2006-07-11 02:04:09 +0000715
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000716 /* See if the socket is ready */
717 if (writing)
718 n = select(s->sock_fd+1, NULL, &fds, NULL, &tv);
719 else
720 n = select(s->sock_fd+1, &fds, NULL, NULL, &tv);
721 }
Anthony Baxter93ab5fa2006-07-11 02:04:09 +0000722#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000723
724 if (n < 0)
725 return -1;
726 if (n == 0)
727 return 1;
728 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000729}
730
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -0700731static int
732internal_select(PySocketSockObject *s, int writing)
733{
734 return internal_select_ex(s, writing, s->sock_timeout);
735}
736
737/*
738 Two macros for automatic retry of select() in case of false positives
739 (for example, select() could indicate a socket is ready for reading
740 but the data then discarded by the OS because of a wrong checksum).
741 Here is an example of use:
742
743 BEGIN_SELECT_LOOP(s)
744 Py_BEGIN_ALLOW_THREADS
745 timeout = internal_select_ex(s, 0, interval);
746 if (!timeout)
747 outlen = recv(s->sock_fd, cbuf, len, flags);
748 Py_END_ALLOW_THREADS
749 if (timeout == 1) {
750 PyErr_SetString(socket_timeout, "timed out");
751 return -1;
752 }
753 END_SELECT_LOOP(s)
754*/
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -0700755#define BEGIN_SELECT_LOOP(s) \
756 { \
757 double deadline, interval = s->sock_timeout; \
758 int has_timeout = s->sock_timeout > 0.0; \
759 if (has_timeout) { \
Kristján Valur Jónsson868f0aa2013-03-19 13:53:56 -0700760 deadline = _PyTime_FloatTime() + s->sock_timeout; \
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -0700761 } \
762 while (1) { \
Kristján Valur Jónsson868f0aa2013-03-19 13:53:56 -0700763 errno = 0;
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -0700764
765#define END_SELECT_LOOP(s) \
766 if (!has_timeout || \
767 (!CHECK_ERRNO(EWOULDBLOCK) && !CHECK_ERRNO(EAGAIN))) \
768 break; \
Kristján Valur Jónsson868f0aa2013-03-19 13:53:56 -0700769 interval = deadline - _PyTime_FloatTime(); \
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -0700770 } \
Kristján Valur Jónsson620e3642013-03-19 13:01:05 -0700771 }
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -0700772
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000773/* Initialize a new socket object. */
774
Tim Petersa12b4cf2002-07-18 22:38:44 +0000775static double defaulttimeout = -1.0; /* Default timeout for new sockets */
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000776
Mark Hammond62b1ab12002-07-23 06:31:15 +0000777PyMODINIT_FUNC
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000778init_sockobject(PySocketSockObject *s,
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000779 SOCKET_T fd, int family, int type, int proto)
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000780{
781#ifdef RISCOS
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000782 int block = 1;
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000783#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000784 s->sock_fd = fd;
785 s->sock_family = family;
786 s->sock_type = type;
787 s->sock_proto = proto;
788 s->sock_timeout = defaulttimeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000789
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000790 s->errorhandler = &set_error;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000791
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000792 if (defaulttimeout >= 0.0)
793 internal_setblocking(s, 0);
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000794
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000795#ifdef RISCOS
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000796 if (taskwindow)
797 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000798#endif
799}
800
801
Guido van Rossum30a685f1991-06-27 15:51:29 +0000802/* Create a new socket object.
803 This just creates the object and initializes it.
804 If the creation fails, return NULL and set an exception (implicit
805 in NEWOBJ()). */
806
Guido van Rossum73624e91994-10-10 17:59:00 +0000807static PySocketSockObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000808new_sockobject(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000809{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000810 PySocketSockObject *s;
811 s = (PySocketSockObject *)
812 PyType_GenericNew(&sock_type, NULL, NULL);
813 if (s != NULL)
814 init_sockobject(s, fd, family, type, proto);
815 return s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000816}
817
Guido van Rossum30a685f1991-06-27 15:51:29 +0000818
Guido van Rossum48a680c2001-03-02 06:34:14 +0000819/* Lock to allow python interpreter to continue, but only allow one
Just van Rossum1040d2c2003-05-09 07:53:18 +0000820 thread to be in gethostbyname or getaddrinfo */
821#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Matthias Klosec5517762012-08-14 17:24:47 +0200822static PyThread_type_lock netdb_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000823#endif
824
825
Guido van Rossum30a685f1991-06-27 15:51:29 +0000826/* Convert a string specifying a host name or one of a few symbolic
827 names to a numeric IP address. This usually calls gethostbyname()
828 to do the work; the names "" and "<broadcast>" are special.
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000829 Return the length (IPv4 should be 4 bytes), or negative if
Guido van Rossum30a685f1991-06-27 15:51:29 +0000830 an error occurred; then an exception is raised. */
831
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000832static int
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000833setipaddr(char *name, struct sockaddr *addr_ret, size_t addr_ret_size, int af)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000834{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000835 struct addrinfo hints, *res;
836 int error;
837 int d1, d2, d3, d4;
838 char ch;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000839
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000840 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
841 if (name[0] == '\0') {
842 int siz;
843 memset(&hints, 0, sizeof(hints));
844 hints.ai_family = af;
845 hints.ai_socktype = SOCK_DGRAM; /*dummy*/
846 hints.ai_flags = AI_PASSIVE;
847 Py_BEGIN_ALLOW_THREADS
848 ACQUIRE_GETADDRINFO_LOCK
849 error = getaddrinfo(NULL, "0", &hints, &res);
850 Py_END_ALLOW_THREADS
851 /* We assume that those thread-unsafe getaddrinfo() versions
852 *are* safe regarding their return value, ie. that a
853 subsequent call to getaddrinfo() does not destroy the
854 outcome of the first call. */
855 RELEASE_GETADDRINFO_LOCK
856 if (error) {
857 set_gaierror(error);
858 return -1;
859 }
860 switch (res->ai_family) {
861 case AF_INET:
862 siz = 4;
863 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000864#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000865 case AF_INET6:
866 siz = 16;
867 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000868#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000869 default:
870 freeaddrinfo(res);
871 PyErr_SetString(socket_error,
872 "unsupported address family");
873 return -1;
874 }
875 if (res->ai_next) {
876 freeaddrinfo(res);
877 PyErr_SetString(socket_error,
878 "wildcard resolved to multiple address");
879 return -1;
880 }
881 if (res->ai_addrlen < addr_ret_size)
882 addr_ret_size = res->ai_addrlen;
883 memcpy(addr_ret, res->ai_addr, addr_ret_size);
884 freeaddrinfo(res);
885 return siz;
886 }
887 if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
888 struct sockaddr_in *sin;
889 if (af != AF_INET && af != AF_UNSPEC) {
890 PyErr_SetString(socket_error,
891 "address family mismatched");
892 return -1;
893 }
894 sin = (struct sockaddr_in *)addr_ret;
895 memset((void *) sin, '\0', sizeof(*sin));
896 sin->sin_family = AF_INET;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000897#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000898 sin->sin_len = sizeof(*sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000899#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000900 sin->sin_addr.s_addr = INADDR_BROADCAST;
901 return sizeof(sin->sin_addr);
902 }
903 if (sscanf(name, "%d.%d.%d.%d%c", &d1, &d2, &d3, &d4, &ch) == 4 &&
904 0 <= d1 && d1 <= 255 && 0 <= d2 && d2 <= 255 &&
905 0 <= d3 && d3 <= 255 && 0 <= d4 && d4 <= 255) {
906 struct sockaddr_in *sin;
907 sin = (struct sockaddr_in *)addr_ret;
908 sin->sin_addr.s_addr = htonl(
909 ((long) d1 << 24) | ((long) d2 << 16) |
910 ((long) d3 << 8) | ((long) d4 << 0));
911 sin->sin_family = AF_INET;
Anthony Baxter0e85f9d2003-05-02 15:40:46 +0000912#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000913 sin->sin_len = sizeof(*sin);
Anthony Baxter0e85f9d2003-05-02 15:40:46 +0000914#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000915 return 4;
916 }
917 memset(&hints, 0, sizeof(hints));
918 hints.ai_family = af;
919 Py_BEGIN_ALLOW_THREADS
920 ACQUIRE_GETADDRINFO_LOCK
921 error = getaddrinfo(name, NULL, &hints, &res);
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000922#if defined(__digital__) && defined(__unix__)
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000923 if (error == EAI_NONAME && af == AF_UNSPEC) {
924 /* On Tru64 V5.1, numeric-to-addr conversion fails
925 if no address family is given. Assume IPv4 for now.*/
926 hints.ai_family = AF_INET;
927 error = getaddrinfo(name, NULL, &hints, &res);
928 }
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000929#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000930 Py_END_ALLOW_THREADS
931 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
932 if (error) {
933 set_gaierror(error);
934 return -1;
935 }
936 if (res->ai_addrlen < addr_ret_size)
937 addr_ret_size = res->ai_addrlen;
938 memcpy((char *) addr_ret, res->ai_addr, addr_ret_size);
939 freeaddrinfo(res);
940 switch (addr_ret->sa_family) {
941 case AF_INET:
942 return 4;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000943#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000944 case AF_INET6:
945 return 16;
Guido van Rossum955becc1999-03-22 20:14:53 +0000946#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000947 default:
948 PyErr_SetString(socket_error, "unknown address family");
949 return -1;
950 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000951}
952
Guido van Rossum30a685f1991-06-27 15:51:29 +0000953
Guido van Rossum30a685f1991-06-27 15:51:29 +0000954/* Create a string object representing an IP address.
955 This is always a string of the form 'dd.dd.dd.dd' (with variable
956 size numbers). */
957
Guido van Rossum73624e91994-10-10 17:59:00 +0000958static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000959makeipaddr(struct sockaddr *addr, int addrlen)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000960{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000961 char buf[NI_MAXHOST];
962 int error;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000963
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000964 error = getnameinfo(addr, addrlen, buf, sizeof(buf), NULL, 0,
965 NI_NUMERICHOST);
966 if (error) {
967 set_gaierror(error);
968 return NULL;
969 }
970 return PyString_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000971}
972
973
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000974#ifdef USE_BLUETOOTH
975/* Convert a string representation of a Bluetooth address into a numeric
976 address. Returns the length (6), or raises an exception and returns -1 if
977 an error occurred. */
978
979static int
980setbdaddr(char *name, bdaddr_t *bdaddr)
981{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000982 unsigned int b0, b1, b2, b3, b4, b5;
983 char ch;
984 int n;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000985
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000986 n = sscanf(name, "%X:%X:%X:%X:%X:%X%c",
987 &b5, &b4, &b3, &b2, &b1, &b0, &ch);
988 if (n == 6 && (b0 | b1 | b2 | b3 | b4 | b5) < 256) {
989 bdaddr->b[0] = b0;
990 bdaddr->b[1] = b1;
991 bdaddr->b[2] = b2;
992 bdaddr->b[3] = b3;
993 bdaddr->b[4] = b4;
994 bdaddr->b[5] = b5;
995 return 6;
996 } else {
997 PyErr_SetString(socket_error, "bad bluetooth address");
998 return -1;
999 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001000}
1001
1002/* Create a string representation of the Bluetooth address. This is always a
1003 string of the form 'XX:XX:XX:XX:XX:XX' where XX is a two digit hexadecimal
1004 value (zero padded if necessary). */
1005
1006static PyObject *
1007makebdaddr(bdaddr_t *bdaddr)
1008{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001009 char buf[(6 * 2) + 5 + 1];
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001010
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001011 sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X",
1012 bdaddr->b[5], bdaddr->b[4], bdaddr->b[3],
1013 bdaddr->b[2], bdaddr->b[1], bdaddr->b[0]);
1014 return PyString_FromString(buf);
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001015}
1016#endif
1017
1018
Guido van Rossum30a685f1991-06-27 15:51:29 +00001019/* Create an object representing the given socket address,
1020 suitable for passing it back to bind(), connect() etc.
1021 The family field of the sockaddr structure is inspected
1022 to determine what kind of address it really is. */
1023
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001024/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001025static PyObject *
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001026makesockaddr(int sockfd, struct sockaddr *addr, int addrlen, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001027{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001028 if (addrlen == 0) {
1029 /* No address -- may be recvfrom() from known socket */
1030 Py_INCREF(Py_None);
1031 return Py_None;
1032 }
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001033
Guido van Rossumbcc20741998-08-04 22:53:56 +00001034#ifdef __BEOS__
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001035 /* XXX: BeOS version of accept() doesn't set family correctly */
1036 addr->sa_family = AF_INET;
Guido van Rossumbcc20741998-08-04 22:53:56 +00001037#endif
1038
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001039 switch (addr->sa_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001040
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001041 case AF_INET:
1042 {
1043 struct sockaddr_in *a;
1044 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
1045 PyObject *ret = NULL;
1046 if (addrobj) {
1047 a = (struct sockaddr_in *)addr;
1048 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
1049 Py_DECREF(addrobj);
1050 }
1051 return ret;
1052 }
Guido van Rossum30a685f1991-06-27 15:51:29 +00001053
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001054#if defined(AF_UNIX)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001055 case AF_UNIX:
1056 {
1057 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Armin Rigoa9017c32006-04-19 11:50:27 +00001058#ifdef linux
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001059 if (a->sun_path[0] == 0) { /* Linux abstract namespace */
1060 addrlen -= offsetof(struct sockaddr_un, sun_path);
1061 return PyString_FromStringAndSize(a->sun_path,
1062 addrlen);
1063 }
1064 else
Armin Rigoa9017c32006-04-19 11:50:27 +00001065#endif /* linux */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001066 {
1067 /* regular NULL-terminated string */
1068 return PyString_FromString(a->sun_path);
1069 }
1070 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001071#endif /* AF_UNIX */
1072
Martin v. Löwis11017b12006-01-14 18:12:57 +00001073#if defined(AF_NETLINK)
1074 case AF_NETLINK:
1075 {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001076 struct sockaddr_nl *a = (struct sockaddr_nl *) addr;
1077 return Py_BuildValue("II", a->nl_pid, a->nl_groups);
Martin v. Löwis11017b12006-01-14 18:12:57 +00001078 }
1079#endif /* AF_NETLINK */
1080
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001081#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001082 case AF_INET6:
1083 {
1084 struct sockaddr_in6 *a;
1085 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
1086 PyObject *ret = NULL;
1087 if (addrobj) {
1088 a = (struct sockaddr_in6 *)addr;
Charles-François Natali3aa59e32012-01-02 15:38:27 +01001089 ret = Py_BuildValue("OiII",
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001090 addrobj,
1091 ntohs(a->sin6_port),
Charles-François Natali3aa59e32012-01-02 15:38:27 +01001092 ntohl(a->sin6_flowinfo),
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001093 a->sin6_scope_id);
1094 Py_DECREF(addrobj);
1095 }
1096 return ret;
1097 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001098#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001099
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001100#ifdef USE_BLUETOOTH
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001101 case AF_BLUETOOTH:
1102 switch (proto) {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001103
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001104 case BTPROTO_L2CAP:
1105 {
1106 struct sockaddr_l2 *a = (struct sockaddr_l2 *) addr;
1107 PyObject *addrobj = makebdaddr(&_BT_L2_MEMB(a, bdaddr));
1108 PyObject *ret = NULL;
1109 if (addrobj) {
1110 ret = Py_BuildValue("Oi",
1111 addrobj,
1112 _BT_L2_MEMB(a, psm));
1113 Py_DECREF(addrobj);
1114 }
1115 return ret;
1116 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001117
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001118 case BTPROTO_RFCOMM:
1119 {
1120 struct sockaddr_rc *a = (struct sockaddr_rc *) addr;
1121 PyObject *addrobj = makebdaddr(&_BT_RC_MEMB(a, bdaddr));
1122 PyObject *ret = NULL;
1123 if (addrobj) {
1124 ret = Py_BuildValue("Oi",
1125 addrobj,
1126 _BT_RC_MEMB(a, channel));
1127 Py_DECREF(addrobj);
1128 }
1129 return ret;
1130 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001131
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001132 case BTPROTO_HCI:
1133 {
1134 struct sockaddr_hci *a = (struct sockaddr_hci *) addr;
Gregory P. Smith886a1cd2010-10-17 04:28:14 +00001135#if defined(__NetBSD__) || defined(__DragonFly__)
1136 return makebdaddr(&_BT_HCI_MEMB(a, bdaddr));
1137#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001138 PyObject *ret = NULL;
1139 ret = Py_BuildValue("i", _BT_HCI_MEMB(a, dev));
1140 return ret;
Gregory P. Smith886a1cd2010-10-17 04:28:14 +00001141#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001142 }
Martin v. Löwis45423a72007-02-14 10:07:37 +00001143
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001144#if !defined(__FreeBSD__)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001145 case BTPROTO_SCO:
1146 {
1147 struct sockaddr_sco *a = (struct sockaddr_sco *) addr;
1148 return makebdaddr(&_BT_SCO_MEMB(a, bdaddr));
1149 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001150#endif
1151
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001152 default:
1153 PyErr_SetString(PyExc_ValueError,
1154 "Unknown Bluetooth protocol");
1155 return NULL;
1156 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001157#endif
1158
Antoine Pitroue0c5f3c2010-10-27 20:35:26 +00001159#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFNAME)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001160 case AF_PACKET:
1161 {
1162 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
1163 char *ifname = "";
1164 struct ifreq ifr;
1165 /* need to look up interface name give index */
1166 if (a->sll_ifindex) {
1167 ifr.ifr_ifindex = a->sll_ifindex;
1168 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1169 ifname = ifr.ifr_name;
1170 }
1171 return Py_BuildValue("shbhs#",
1172 ifname,
1173 ntohs(a->sll_protocol),
1174 a->sll_pkttype,
1175 a->sll_hatype,
1176 a->sll_addr,
1177 a->sll_halen);
1178 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001179#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001180
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001181#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001182 case AF_TIPC:
1183 {
1184 struct sockaddr_tipc *a = (struct sockaddr_tipc *) addr;
1185 if (a->addrtype == TIPC_ADDR_NAMESEQ) {
1186 return Py_BuildValue("IIIII",
1187 a->addrtype,
1188 a->addr.nameseq.type,
1189 a->addr.nameseq.lower,
1190 a->addr.nameseq.upper,
1191 a->scope);
1192 } else if (a->addrtype == TIPC_ADDR_NAME) {
1193 return Py_BuildValue("IIIII",
1194 a->addrtype,
1195 a->addr.name.name.type,
1196 a->addr.name.name.instance,
1197 a->addr.name.name.instance,
1198 a->scope);
1199 } else if (a->addrtype == TIPC_ADDR_ID) {
1200 return Py_BuildValue("IIIII",
1201 a->addrtype,
1202 a->addr.id.node,
1203 a->addr.id.ref,
1204 0,
1205 a->scope);
1206 } else {
1207 PyErr_SetString(PyExc_ValueError,
1208 "Invalid address type");
1209 return NULL;
1210 }
1211 }
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001212#endif
1213
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001214 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001215
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001216 default:
1217 /* If we don't know the address family, don't raise an
1218 exception -- return it as a tuple. */
1219 return Py_BuildValue("is#",
1220 addr->sa_family,
1221 addr->sa_data,
1222 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001223
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001224 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001225}
1226
Guido van Rossum30a685f1991-06-27 15:51:29 +00001227
1228/* Parse a socket address argument according to the socket object's
1229 address family. Return 1 if the address was in the proper format,
1230 0 of not. The address is returned through addr_ret, its length
1231 through len_ret. */
1232
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001233static int
Guido van Rossum48a680c2001-03-02 06:34:14 +00001234getsockaddrarg(PySocketSockObject *s, PyObject *args,
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001235 struct sockaddr *addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001236{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001237 switch (s->sock_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001238
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001239#if defined(AF_UNIX)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001240 case AF_UNIX:
1241 {
1242 struct sockaddr_un* addr;
1243 char *path;
1244 int len;
1245 if (!PyArg_Parse(args, "t#", &path, &len))
1246 return 0;
Martin v. Löwis046c4d12006-12-03 11:23:45 +00001247
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001248 addr = (struct sockaddr_un*)addr_ret;
Armin Rigoa9017c32006-04-19 11:50:27 +00001249#ifdef linux
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001250 if (len > 0 && path[0] == 0) {
1251 /* Linux abstract namespace extension */
1252 if (len > sizeof addr->sun_path) {
1253 PyErr_SetString(socket_error,
1254 "AF_UNIX path too long");
1255 return 0;
1256 }
1257 }
1258 else
Armin Rigoa9017c32006-04-19 11:50:27 +00001259#endif /* linux */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001260 {
1261 /* regular NULL-terminated string */
1262 if (len >= sizeof addr->sun_path) {
1263 PyErr_SetString(socket_error,
1264 "AF_UNIX path too long");
1265 return 0;
1266 }
1267 addr->sun_path[len] = 0;
1268 }
1269 addr->sun_family = s->sock_family;
1270 memcpy(addr->sun_path, path, len);
Andrew MacIntyredaedf212004-04-11 12:03:57 +00001271#if defined(PYOS_OS2)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001272 *len_ret = sizeof(*addr);
Andrew MacIntyredaedf212004-04-11 12:03:57 +00001273#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001274 *len_ret = len + offsetof(struct sockaddr_un, sun_path);
Andrew MacIntyredaedf212004-04-11 12:03:57 +00001275#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001276 return 1;
1277 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001278#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001279
Martin v. Löwis11017b12006-01-14 18:12:57 +00001280#if defined(AF_NETLINK)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001281 case AF_NETLINK:
1282 {
1283 struct sockaddr_nl* addr;
1284 int pid, groups;
1285 addr = (struct sockaddr_nl *)addr_ret;
1286 if (!PyTuple_Check(args)) {
1287 PyErr_Format(
1288 PyExc_TypeError,
1289 "getsockaddrarg: "
1290 "AF_NETLINK address must be tuple, not %.500s",
1291 Py_TYPE(args)->tp_name);
1292 return 0;
1293 }
1294 if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &pid, &groups))
1295 return 0;
1296 addr->nl_family = AF_NETLINK;
1297 addr->nl_pid = pid;
1298 addr->nl_groups = groups;
1299 *len_ret = sizeof(*addr);
1300 return 1;
1301 }
Martin v. Löwis11017b12006-01-14 18:12:57 +00001302#endif
1303
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001304 case AF_INET:
1305 {
1306 struct sockaddr_in* addr;
1307 char *host;
1308 int port, result;
1309 if (!PyTuple_Check(args)) {
1310 PyErr_Format(
1311 PyExc_TypeError,
1312 "getsockaddrarg: "
1313 "AF_INET address must be tuple, not %.500s",
1314 Py_TYPE(args)->tp_name);
1315 return 0;
1316 }
1317 if (!PyArg_ParseTuple(args, "eti:getsockaddrarg",
1318 "idna", &host, &port))
1319 return 0;
1320 addr=(struct sockaddr_in*)addr_ret;
1321 result = setipaddr(host, (struct sockaddr *)addr,
1322 sizeof(*addr), AF_INET);
1323 PyMem_Free(host);
1324 if (result < 0)
1325 return 0;
1326 if (port < 0 || port > 0xffff) {
1327 PyErr_SetString(
1328 PyExc_OverflowError,
1329 "getsockaddrarg: port must be 0-65535.");
1330 return 0;
1331 }
1332 addr->sin_family = AF_INET;
1333 addr->sin_port = htons((short)port);
1334 *len_ret = sizeof *addr;
1335 return 1;
1336 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001337
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001338#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001339 case AF_INET6:
1340 {
1341 struct sockaddr_in6* addr;
1342 char *host;
Charles-François Natali3aa59e32012-01-02 15:38:27 +01001343 int port, result;
1344 unsigned int flowinfo, scope_id;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001345 flowinfo = scope_id = 0;
1346 if (!PyTuple_Check(args)) {
1347 PyErr_Format(
1348 PyExc_TypeError,
1349 "getsockaddrarg: "
1350 "AF_INET6 address must be tuple, not %.500s",
1351 Py_TYPE(args)->tp_name);
1352 return 0;
1353 }
Charles-François Natali3aa59e32012-01-02 15:38:27 +01001354 if (!PyArg_ParseTuple(args, "eti|II",
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001355 "idna", &host, &port, &flowinfo,
1356 &scope_id)) {
1357 return 0;
1358 }
1359 addr = (struct sockaddr_in6*)addr_ret;
1360 result = setipaddr(host, (struct sockaddr *)addr,
1361 sizeof(*addr), AF_INET6);
1362 PyMem_Free(host);
1363 if (result < 0)
1364 return 0;
1365 if (port < 0 || port > 0xffff) {
1366 PyErr_SetString(
1367 PyExc_OverflowError,
1368 "getsockaddrarg: port must be 0-65535.");
1369 return 0;
1370 }
Charles-François Natali65dd7452012-06-23 10:06:56 +02001371 if (flowinfo > 0xfffff) {
Charles-François Natali3aa59e32012-01-02 15:38:27 +01001372 PyErr_SetString(
1373 PyExc_OverflowError,
1374 "getsockaddrarg: flowinfo must be 0-1048575.");
1375 return 0;
1376 }
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001377 addr->sin6_family = s->sock_family;
1378 addr->sin6_port = htons((short)port);
Charles-François Natali3aa59e32012-01-02 15:38:27 +01001379 addr->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001380 addr->sin6_scope_id = scope_id;
1381 *len_ret = sizeof *addr;
1382 return 1;
1383 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001384#endif
1385
Hye-Shik Chang81268602004-02-02 06:05:24 +00001386#ifdef USE_BLUETOOTH
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001387 case AF_BLUETOOTH:
1388 {
1389 switch (s->sock_proto) {
1390 case BTPROTO_L2CAP:
1391 {
1392 struct sockaddr_l2 *addr;
1393 char *straddr;
Martin v. Löwis12af0482004-01-31 12:34:17 +00001394
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001395 addr = (struct sockaddr_l2 *)addr_ret;
1396 memset(addr, 0, sizeof(struct sockaddr_l2));
1397 _BT_L2_MEMB(addr, family) = AF_BLUETOOTH;
1398 if (!PyArg_ParseTuple(args, "si", &straddr,
1399 &_BT_L2_MEMB(addr, psm))) {
1400 PyErr_SetString(socket_error, "getsockaddrarg: "
1401 "wrong format");
1402 return 0;
1403 }
1404 if (setbdaddr(straddr, &_BT_L2_MEMB(addr, bdaddr)) < 0)
1405 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001406
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001407 *len_ret = sizeof *addr;
1408 return 1;
1409 }
1410 case BTPROTO_RFCOMM:
1411 {
1412 struct sockaddr_rc *addr;
1413 char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001414
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001415 addr = (struct sockaddr_rc *)addr_ret;
1416 _BT_RC_MEMB(addr, family) = AF_BLUETOOTH;
1417 if (!PyArg_ParseTuple(args, "si", &straddr,
1418 &_BT_RC_MEMB(addr, channel))) {
1419 PyErr_SetString(socket_error, "getsockaddrarg: "
1420 "wrong format");
1421 return 0;
1422 }
1423 if (setbdaddr(straddr, &_BT_RC_MEMB(addr, bdaddr)) < 0)
1424 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001425
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001426 *len_ret = sizeof *addr;
1427 return 1;
1428 }
1429 case BTPROTO_HCI:
1430 {
1431 struct sockaddr_hci *addr = (struct sockaddr_hci *)addr_ret;
Gregory P. Smith886a1cd2010-10-17 04:28:14 +00001432#if defined(__NetBSD__) || defined(__DragonFly__)
1433 char *straddr = PyBytes_AS_STRING(args);
1434
1435 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
1436 if (straddr == NULL) {
1437 PyErr_SetString(socket_error, "getsockaddrarg: "
1438 "wrong format");
1439 return 0;
1440 }
1441 if (setbdaddr(straddr, &_BT_HCI_MEMB(addr, bdaddr)) < 0)
1442 return 0;
1443#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001444 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
1445 if (!PyArg_ParseTuple(args, "i", &_BT_HCI_MEMB(addr, dev))) {
1446 PyErr_SetString(socket_error, "getsockaddrarg: "
1447 "wrong format");
1448 return 0;
1449 }
Gregory P. Smith886a1cd2010-10-17 04:28:14 +00001450#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001451 *len_ret = sizeof *addr;
1452 return 1;
1453 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001454#if !defined(__FreeBSD__)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001455 case BTPROTO_SCO:
1456 {
1457 struct sockaddr_sco *addr;
1458 char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001459
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001460 addr = (struct sockaddr_sco *)addr_ret;
1461 _BT_SCO_MEMB(addr, family) = AF_BLUETOOTH;
1462 straddr = PyString_AsString(args);
1463 if (straddr == NULL) {
1464 PyErr_SetString(socket_error, "getsockaddrarg: "
1465 "wrong format");
1466 return 0;
1467 }
1468 if (setbdaddr(straddr, &_BT_SCO_MEMB(addr, bdaddr)) < 0)
1469 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001470
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001471 *len_ret = sizeof *addr;
1472 return 1;
1473 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001474#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001475 default:
1476 PyErr_SetString(socket_error, "getsockaddrarg: unknown Bluetooth protocol");
1477 return 0;
1478 }
1479 }
Martin v. Löwis12af0482004-01-31 12:34:17 +00001480#endif
1481
Antoine Pitroue0c5f3c2010-10-27 20:35:26 +00001482#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFINDEX)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001483 case AF_PACKET:
1484 {
1485 struct sockaddr_ll* addr;
1486 struct ifreq ifr;
1487 char *interfaceName;
1488 int protoNumber;
1489 int hatype = 0;
1490 int pkttype = 0;
1491 char *haddr = NULL;
1492 unsigned int halen = 0;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001493
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001494 if (!PyTuple_Check(args)) {
1495 PyErr_Format(
1496 PyExc_TypeError,
1497 "getsockaddrarg: "
1498 "AF_PACKET address must be tuple, not %.500s",
1499 Py_TYPE(args)->tp_name);
1500 return 0;
1501 }
1502 if (!PyArg_ParseTuple(args, "si|iis#", &interfaceName,
1503 &protoNumber, &pkttype, &hatype,
1504 &haddr, &halen))
1505 return 0;
1506 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
1507 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
1508 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1509 s->errorhandler();
1510 return 0;
1511 }
1512 if (halen > 8) {
1513 PyErr_SetString(PyExc_ValueError,
1514 "Hardware address must be 8 bytes or less");
1515 return 0;
1516 }
1517 if (protoNumber < 0 || protoNumber > 0xffff) {
1518 PyErr_SetString(
1519 PyExc_OverflowError,
1520 "getsockaddrarg: protoNumber must be 0-65535.");
1521 return 0;
1522 }
1523 addr = (struct sockaddr_ll*)addr_ret;
1524 addr->sll_family = AF_PACKET;
1525 addr->sll_protocol = htons((short)protoNumber);
1526 addr->sll_ifindex = ifr.ifr_ifindex;
1527 addr->sll_pkttype = pkttype;
1528 addr->sll_hatype = hatype;
1529 if (halen != 0) {
1530 memcpy(&addr->sll_addr, haddr, halen);
1531 }
1532 addr->sll_halen = halen;
1533 *len_ret = sizeof *addr;
1534 return 1;
1535 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00001536#endif
1537
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001538#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001539 case AF_TIPC:
1540 {
1541 unsigned int atype, v1, v2, v3;
1542 unsigned int scope = TIPC_CLUSTER_SCOPE;
1543 struct sockaddr_tipc *addr;
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001544
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001545 if (!PyTuple_Check(args)) {
1546 PyErr_Format(
1547 PyExc_TypeError,
1548 "getsockaddrarg: "
1549 "AF_TIPC address must be tuple, not %.500s",
1550 Py_TYPE(args)->tp_name);
1551 return 0;
1552 }
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001553
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001554 if (!PyArg_ParseTuple(args,
1555 "IIII|I;Invalid TIPC address format",
1556 &atype, &v1, &v2, &v3, &scope))
1557 return 0;
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001558
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001559 addr = (struct sockaddr_tipc *) addr_ret;
1560 memset(addr, 0, sizeof(struct sockaddr_tipc));
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001561
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001562 addr->family = AF_TIPC;
1563 addr->scope = scope;
1564 addr->addrtype = atype;
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001565
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001566 if (atype == TIPC_ADDR_NAMESEQ) {
1567 addr->addr.nameseq.type = v1;
1568 addr->addr.nameseq.lower = v2;
1569 addr->addr.nameseq.upper = v3;
1570 } else if (atype == TIPC_ADDR_NAME) {
1571 addr->addr.name.name.type = v1;
1572 addr->addr.name.name.instance = v2;
1573 } else if (atype == TIPC_ADDR_ID) {
1574 addr->addr.id.node = v1;
1575 addr->addr.id.ref = v2;
1576 } else {
1577 /* Shouldn't happen */
1578 PyErr_SetString(PyExc_TypeError, "Invalid address type");
1579 return 0;
1580 }
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001581
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001582 *len_ret = sizeof(*addr);
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001583
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001584 return 1;
1585 }
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001586#endif
1587
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001588 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001589
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001590 default:
1591 PyErr_SetString(socket_error, "getsockaddrarg: bad family");
1592 return 0;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001593
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001594 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001595}
1596
Guido van Rossum30a685f1991-06-27 15:51:29 +00001597
Guido van Rossum48a680c2001-03-02 06:34:14 +00001598/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +00001599 Return 1 if the family is known, 0 otherwise. The length is returned
1600 through len_ret. */
1601
1602static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +00001603getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +00001604{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001605 switch (s->sock_family) {
Guido van Rossum710e1df1992-06-12 10:39:36 +00001606
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001607#if defined(AF_UNIX)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001608 case AF_UNIX:
1609 {
1610 *len_ret = sizeof (struct sockaddr_un);
1611 return 1;
1612 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001613#endif /* AF_UNIX */
Martin v. Löwis11017b12006-01-14 18:12:57 +00001614#if defined(AF_NETLINK)
1615 case AF_NETLINK:
1616 {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001617 *len_ret = sizeof (struct sockaddr_nl);
1618 return 1;
Martin v. Löwis11017b12006-01-14 18:12:57 +00001619 }
1620#endif
Guido van Rossum710e1df1992-06-12 10:39:36 +00001621
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001622 case AF_INET:
1623 {
1624 *len_ret = sizeof (struct sockaddr_in);
1625 return 1;
1626 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00001627
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001628#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001629 case AF_INET6:
1630 {
1631 *len_ret = sizeof (struct sockaddr_in6);
1632 return 1;
1633 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001634#endif
1635
Hye-Shik Chang81268602004-02-02 06:05:24 +00001636#ifdef USE_BLUETOOTH
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001637 case AF_BLUETOOTH:
1638 {
1639 switch(s->sock_proto)
1640 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001641
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001642 case BTPROTO_L2CAP:
1643 *len_ret = sizeof (struct sockaddr_l2);
1644 return 1;
1645 case BTPROTO_RFCOMM:
1646 *len_ret = sizeof (struct sockaddr_rc);
1647 return 1;
1648 case BTPROTO_HCI:
1649 *len_ret = sizeof (struct sockaddr_hci);
1650 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00001651#if !defined(__FreeBSD__)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001652 case BTPROTO_SCO:
1653 *len_ret = sizeof (struct sockaddr_sco);
1654 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00001655#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001656 default:
1657 PyErr_SetString(socket_error, "getsockaddrlen: "
1658 "unknown BT protocol");
1659 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001660
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001661 }
1662 }
Martin v. Löwis12af0482004-01-31 12:34:17 +00001663#endif
1664
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00001665#ifdef HAVE_NETPACKET_PACKET_H
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001666 case AF_PACKET:
1667 {
1668 *len_ret = sizeof (struct sockaddr_ll);
1669 return 1;
1670 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001671#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001672
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001673#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001674 case AF_TIPC:
1675 {
1676 *len_ret = sizeof (struct sockaddr_tipc);
1677 return 1;
1678 }
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001679#endif
1680
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001681 /* More cases here... */
Guido van Rossum710e1df1992-06-12 10:39:36 +00001682
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001683 default:
1684 PyErr_SetString(socket_error, "getsockaddrlen: bad family");
1685 return 0;
Guido van Rossum710e1df1992-06-12 10:39:36 +00001686
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001687 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00001688}
1689
1690
Guido van Rossum30a685f1991-06-27 15:51:29 +00001691/* s.accept() method */
1692
Guido van Rossum73624e91994-10-10 17:59:00 +00001693static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001694sock_accept(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001695{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001696 sock_addr_t addrbuf;
1697 SOCKET_T newfd;
1698 socklen_t addrlen;
1699 PyObject *sock = NULL;
1700 PyObject *addr = NULL;
1701 PyObject *res = NULL;
1702 int timeout;
Barry Warsaw752300b1997-01-03 17:18:10 +00001703
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001704 if (!getsockaddrlen(s, &addrlen))
1705 return NULL;
1706 memset(&addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001707
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001708#ifdef MS_WINDOWS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001709 newfd = INVALID_SOCKET;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001710#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001711 newfd = -1;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001712#endif
1713
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001714 if (!IS_SELECTABLE(s))
1715 return select_error();
Neal Norwitz082b2df2006-02-07 07:04:46 +00001716
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07001717 BEGIN_SELECT_LOOP(s)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001718 Py_BEGIN_ALLOW_THREADS
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07001719 timeout = internal_select_ex(s, 0, interval);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001720 if (!timeout)
1721 newfd = accept(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
1722 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001723
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001724 if (timeout == 1) {
1725 PyErr_SetString(socket_timeout, "timed out");
1726 return NULL;
1727 }
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07001728 END_SELECT_LOOP(s)
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001729
Fred Drakea04eaad2000-06-30 02:46:07 +00001730#ifdef MS_WINDOWS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001731 if (newfd == INVALID_SOCKET)
Fred Drakea04eaad2000-06-30 02:46:07 +00001732#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001733 if (newfd < 0)
Fred Drakea04eaad2000-06-30 02:46:07 +00001734#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001735 return s->errorhandler();
Barry Warsaw752300b1997-01-03 17:18:10 +00001736
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001737 /* Create the new object with unspecified family,
1738 to avoid calls to bind() etc. on it. */
1739 sock = (PyObject *) new_sockobject(newfd,
1740 s->sock_family,
1741 s->sock_type,
1742 s->sock_proto);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001743
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001744 if (sock == NULL) {
1745 SOCKETCLOSE(newfd);
1746 goto finally;
1747 }
1748 addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
1749 addrlen, s->sock_proto);
1750 if (addr == NULL)
1751 goto finally;
Barry Warsaw752300b1997-01-03 17:18:10 +00001752
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001753 res = PyTuple_Pack(2, sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00001754
Guido van Rossum67f7a382002-06-06 21:08:16 +00001755finally:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001756 Py_XDECREF(sock);
1757 Py_XDECREF(addr);
1758 return res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001759}
1760
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001761PyDoc_STRVAR(accept_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001762"accept() -> (socket object, address info)\n\
1763\n\
1764Wait for an incoming connection. Return a new socket representing the\n\
1765connection, and the address of the client. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001766info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001767
Guido van Rossum11ba0942002-06-13 15:07:44 +00001768/* s.setblocking(flag) method. Argument:
1769 False -- non-blocking mode; same as settimeout(0)
1770 True -- blocking mode; same as settimeout(None)
1771*/
Guido van Rossume4485b01994-09-07 14:32:49 +00001772
Guido van Rossum73624e91994-10-10 17:59:00 +00001773static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001774sock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00001775{
Serhiy Storchaka74f49ab2013-01-19 12:55:39 +02001776 long block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001777
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001778 block = PyInt_AsLong(arg);
1779 if (block == -1 && PyErr_Occurred())
1780 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001781
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001782 s->sock_timeout = block ? -1.0 : 0.0;
1783 internal_setblocking(s, block);
Guido van Rossume4485b01994-09-07 14:32:49 +00001784
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001785 Py_INCREF(Py_None);
1786 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +00001787}
Guido van Rossume4485b01994-09-07 14:32:49 +00001788
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001789PyDoc_STRVAR(setblocking_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001790"setblocking(flag)\n\
1791\n\
1792Set the socket to blocking (flag is true) or non-blocking (false).\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00001793setblocking(True) is equivalent to settimeout(None);\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001794setblocking(False) is equivalent to settimeout(0.0).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001795
Guido van Rossum11ba0942002-06-13 15:07:44 +00001796/* s.settimeout(timeout) method. Argument:
1797 None -- no timeout, blocking mode; same as setblocking(True)
1798 0.0 -- non-blocking mode; same as setblocking(False)
1799 > 0 -- timeout mode; operations time out after timeout seconds
1800 < 0 -- illegal; raises an exception
1801*/
Guido van Rossum67f7a382002-06-06 21:08:16 +00001802static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001803sock_settimeout(PySocketSockObject *s, PyObject *arg)
Guido van Rossum67f7a382002-06-06 21:08:16 +00001804{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001805 double timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001806
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001807 if (arg == Py_None)
1808 timeout = -1.0;
1809 else {
1810 timeout = PyFloat_AsDouble(arg);
1811 if (timeout < 0.0) {
1812 if (!PyErr_Occurred())
1813 PyErr_SetString(PyExc_ValueError,
1814 "Timeout value out of range");
1815 return NULL;
1816 }
1817 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00001818
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001819 s->sock_timeout = timeout;
1820 internal_setblocking(s, timeout < 0.0);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001821
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001822 Py_INCREF(Py_None);
1823 return Py_None;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001824}
1825
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001826PyDoc_STRVAR(settimeout_doc,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001827"settimeout(timeout)\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00001828\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00001829Set a timeout on socket operations. 'timeout' can be a float,\n\
1830giving in seconds, or None. Setting a timeout of None disables\n\
1831the timeout feature and is equivalent to setblocking(1).\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001832Setting a timeout of zero is the same as setblocking(0).");
Guido van Rossum67f7a382002-06-06 21:08:16 +00001833
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001834/* s.gettimeout() method.
1835 Returns the timeout associated with a socket. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00001836static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001837sock_gettimeout(PySocketSockObject *s)
Guido van Rossum67f7a382002-06-06 21:08:16 +00001838{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001839 if (s->sock_timeout < 0.0) {
1840 Py_INCREF(Py_None);
1841 return Py_None;
1842 }
1843 else
1844 return PyFloat_FromDouble(s->sock_timeout);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001845}
1846
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001847PyDoc_STRVAR(gettimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00001848"gettimeout() -> timeout\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00001849\n\
Ezio Melottica5e9082011-08-14 08:27:36 +03001850Returns the timeout in seconds (float) associated with socket \n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00001851operations. A timeout of None indicates that timeouts on socket \n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001852operations are disabled.");
Guido van Rossume4485b01994-09-07 14:32:49 +00001853
Guido van Rossum48a680c2001-03-02 06:34:14 +00001854#ifdef RISCOS
1855/* s.sleeptaskw(1 | 0) method */
1856
1857static PyObject *
Martin v. Löwisa94568a2003-05-10 07:36:56 +00001858sock_sleeptaskw(PySocketSockObject *s,PyObject *arg)
Guido van Rossum48a680c2001-03-02 06:34:14 +00001859{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001860 int block;
1861 block = PyInt_AsLong(arg);
1862 if (block == -1 && PyErr_Occurred())
1863 return NULL;
1864 Py_BEGIN_ALLOW_THREADS
1865 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
1866 Py_END_ALLOW_THREADS
Guido van Rossum48a680c2001-03-02 06:34:14 +00001867
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001868 Py_INCREF(Py_None);
1869 return Py_None;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001870}
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001871PyDoc_STRVAR(sleeptaskw_doc,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001872"sleeptaskw(flag)\n\
1873\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001874Allow sleeps in taskwindows.");
Guido van Rossum48a680c2001-03-02 06:34:14 +00001875#endif
1876
1877
Guido van Rossumaee08791992-09-08 09:05:33 +00001878/* s.setsockopt() method.
1879 With an integer third argument, sets an integer option.
1880 With a string third argument, sets an option from a buffer;
1881 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001882
Guido van Rossum73624e91994-10-10 17:59:00 +00001883static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001884sock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001885{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001886 int level;
1887 int optname;
1888 int res;
1889 char *buf;
1890 int buflen;
1891 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001892
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001893 if (PyArg_ParseTuple(args, "iii:setsockopt",
1894 &level, &optname, &flag)) {
1895 buf = (char *) &flag;
1896 buflen = sizeof flag;
1897 }
1898 else {
1899 PyErr_Clear();
1900 if (!PyArg_ParseTuple(args, "iis#:setsockopt",
1901 &level, &optname, &buf, &buflen))
1902 return NULL;
1903 }
1904 res = setsockopt(s->sock_fd, level, optname, (void *)buf, buflen);
1905 if (res < 0)
1906 return s->errorhandler();
1907 Py_INCREF(Py_None);
1908 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001909}
1910
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001911PyDoc_STRVAR(setsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001912"setsockopt(level, option, value)\n\
1913\n\
1914Set a socket option. See the Unix manual for level and option.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001915The value argument can either be an integer or a string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001916
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001917
Guido van Rossumaee08791992-09-08 09:05:33 +00001918/* s.getsockopt() method.
1919 With two arguments, retrieves an integer option.
1920 With a third integer argument, retrieves a string buffer of that size;
1921 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001922
Guido van Rossum73624e91994-10-10 17:59:00 +00001923static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001924sock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001925{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001926 int level;
1927 int optname;
1928 int res;
1929 PyObject *buf;
1930 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001931
Guido van Rossumbcc20741998-08-04 22:53:56 +00001932#ifdef __BEOS__
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001933 /* We have incomplete socket support. */
1934 PyErr_SetString(socket_error, "getsockopt not supported");
1935 return NULL;
Guido van Rossumbcc20741998-08-04 22:53:56 +00001936#else
1937
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001938 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
1939 &level, &optname, &buflen))
1940 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001941
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001942 if (buflen == 0) {
1943 int flag = 0;
1944 socklen_t flagsize = sizeof flag;
1945 res = getsockopt(s->sock_fd, level, optname,
1946 (void *)&flag, &flagsize);
1947 if (res < 0)
1948 return s->errorhandler();
1949 return PyInt_FromLong(flag);
1950 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001951#ifdef __VMS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001952 /* socklen_t is unsigned so no negative test is needed,
1953 test buflen == 0 is previously done */
1954 if (buflen > 1024) {
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001955#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001956 if (buflen <= 0 || buflen > 1024) {
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001957#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001958 PyErr_SetString(socket_error,
1959 "getsockopt buflen out of range");
1960 return NULL;
1961 }
1962 buf = PyString_FromStringAndSize((char *)NULL, buflen);
1963 if (buf == NULL)
1964 return NULL;
1965 res = getsockopt(s->sock_fd, level, optname,
1966 (void *)PyString_AS_STRING(buf), &buflen);
1967 if (res < 0) {
1968 Py_DECREF(buf);
1969 return s->errorhandler();
1970 }
1971 _PyString_Resize(&buf, buflen);
1972 return buf;
Guido van Rossumbcc20741998-08-04 22:53:56 +00001973#endif /* __BEOS__ */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001974}
1975
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001976PyDoc_STRVAR(getsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001977"getsockopt(level, option[, buffersize]) -> value\n\
1978\n\
1979Get a socket option. See the Unix manual for level and option.\n\
1980If a nonzero buffersize argument is given, the return value is a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001981string of that length; otherwise it is an integer.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001982
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001983
Fred Drake728819a2000-07-01 03:40:12 +00001984/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001985
Guido van Rossum73624e91994-10-10 17:59:00 +00001986static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001987sock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001988{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001989 sock_addr_t addrbuf;
1990 int addrlen;
1991 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001992
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001993 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
1994 return NULL;
1995 Py_BEGIN_ALLOW_THREADS
1996 res = bind(s->sock_fd, SAS2SA(&addrbuf), addrlen);
1997 Py_END_ALLOW_THREADS
1998 if (res < 0)
1999 return s->errorhandler();
2000 Py_INCREF(Py_None);
2001 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002002}
2003
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002004PyDoc_STRVAR(bind_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002005"bind(address)\n\
2006\n\
2007Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00002008pair (host, port); the host must refer to the local host. For raw packet\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002009sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002010
Guido van Rossum30a685f1991-06-27 15:51:29 +00002011
2012/* s.close() method.
2013 Set the file descriptor to -1 so operations tried subsequently
2014 will surely fail. */
2015
Guido van Rossum73624e91994-10-10 17:59:00 +00002016static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002017sock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002018{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002019 SOCKET_T fd;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002020
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002021 if ((fd = s->sock_fd) != -1) {
2022 s->sock_fd = -1;
2023 Py_BEGIN_ALLOW_THREADS
2024 (void) SOCKETCLOSE(fd);
2025 Py_END_ALLOW_THREADS
2026 }
2027 Py_INCREF(Py_None);
2028 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002029}
2030
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002031PyDoc_STRVAR(close_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002032"close()\n\
2033\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002034Close the socket. It cannot be used after this call.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002035
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002036static int
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002037internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen,
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002038 int *timeoutp)
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002039{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002040 int res, timeout;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002041
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002042 timeout = 0;
2043 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002044
2045#ifdef MS_WINDOWS
2046
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002047 if (s->sock_timeout > 0.0) {
2048 if (res < 0 && WSAGetLastError() == WSAEWOULDBLOCK &&
2049 IS_SELECTABLE(s)) {
2050 /* This is a mess. Best solution: trust select */
2051 fd_set fds;
2052 fd_set fds_exc;
2053 struct timeval tv;
2054 tv.tv_sec = (int)s->sock_timeout;
2055 tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6);
2056 FD_ZERO(&fds);
2057 FD_SET(s->sock_fd, &fds);
2058 FD_ZERO(&fds_exc);
2059 FD_SET(s->sock_fd, &fds_exc);
2060 res = select(s->sock_fd+1, NULL, &fds, &fds_exc, &tv);
2061 if (res == 0) {
2062 res = WSAEWOULDBLOCK;
2063 timeout = 1;
2064 } else if (res > 0) {
2065 if (FD_ISSET(s->sock_fd, &fds))
2066 /* The socket is in the writeable set - this
2067 means connected */
2068 res = 0;
2069 else {
2070 /* As per MS docs, we need to call getsockopt()
2071 to get the underlying error */
2072 int res_size = sizeof res;
2073 /* It must be in the exception set */
2074 assert(FD_ISSET(s->sock_fd, &fds_exc));
2075 if (0 == getsockopt(s->sock_fd, SOL_SOCKET, SO_ERROR,
2076 (char *)&res, &res_size))
2077 /* getsockopt also clears WSAGetLastError,
2078 so reset it back. */
2079 WSASetLastError(res);
2080 else
2081 res = WSAGetLastError();
2082 }
2083 }
2084 /* else if (res < 0) an error occurred */
2085 }
2086 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002087
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002088 if (res < 0)
2089 res = WSAGetLastError();
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002090
2091#else
2092
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002093 if (s->sock_timeout > 0.0) {
2094 if (res < 0 && errno == EINPROGRESS && IS_SELECTABLE(s)) {
2095 timeout = internal_select(s, 1);
2096 if (timeout == 0) {
2097 /* Bug #1019808: in case of an EINPROGRESS,
2098 use getsockopt(SO_ERROR) to get the real
2099 error. */
2100 socklen_t res_size = sizeof res;
2101 (void)getsockopt(s->sock_fd, SOL_SOCKET,
2102 SO_ERROR, &res, &res_size);
2103 if (res == EISCONN)
2104 res = 0;
2105 errno = res;
2106 }
2107 else if (timeout == -1) {
2108 res = errno; /* had error */
2109 }
2110 else
2111 res = EWOULDBLOCK; /* timed out */
2112 }
2113 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002114
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002115 if (res < 0)
2116 res = errno;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002117
2118#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002119 *timeoutp = timeout;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002120
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002121 return res;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002122}
Guido van Rossum30a685f1991-06-27 15:51:29 +00002123
Fred Drake728819a2000-07-01 03:40:12 +00002124/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002125
Guido van Rossum73624e91994-10-10 17:59:00 +00002126static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002127sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002128{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002129 sock_addr_t addrbuf;
2130 int addrlen;
2131 int res;
2132 int timeout;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002133
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002134 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2135 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002136
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002137 Py_BEGIN_ALLOW_THREADS
2138 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, &timeout);
2139 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002140
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002141 if (timeout == 1) {
2142 PyErr_SetString(socket_timeout, "timed out");
2143 return NULL;
2144 }
2145 if (res != 0)
2146 return s->errorhandler();
2147 Py_INCREF(Py_None);
2148 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002149}
2150
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002151PyDoc_STRVAR(connect_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002152"connect(address)\n\
2153\n\
2154Connect the socket to a remote address. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002155is a pair (host, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002156
Guido van Rossum30a685f1991-06-27 15:51:29 +00002157
Fred Drake728819a2000-07-01 03:40:12 +00002158/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002159
2160static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002161sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002162{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002163 sock_addr_t addrbuf;
2164 int addrlen;
2165 int res;
2166 int timeout;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002167
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002168 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2169 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002170
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002171 Py_BEGIN_ALLOW_THREADS
2172 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, &timeout);
2173 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002174
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002175 /* Signals are not errors (though they may raise exceptions). Adapted
2176 from PyErr_SetFromErrnoWithFilenameObject(). */
Neal Norwitz9b0ca792006-08-02 06:46:21 +00002177#ifdef EINTR
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002178 if (res == EINTR && PyErr_CheckSignals())
2179 return NULL;
Neal Norwitz9b0ca792006-08-02 06:46:21 +00002180#endif
2181
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002182 return PyInt_FromLong((long) res);
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002183}
2184
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002185PyDoc_STRVAR(connect_ex_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002186"connect_ex(address) -> errno\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002187\n\
2188This is like connect(address), but returns an error code (the errno value)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002189instead of raising an exception when an error occurs.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002190
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002191
Guido van Rossumed233a51992-06-23 09:07:03 +00002192/* s.fileno() method */
2193
Guido van Rossum73624e91994-10-10 17:59:00 +00002194static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002195sock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00002196{
Fred Drakea04eaad2000-06-30 02:46:07 +00002197#if SIZEOF_SOCKET_T <= SIZEOF_LONG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002198 return PyInt_FromLong((long) s->sock_fd);
Fred Drakea04eaad2000-06-30 02:46:07 +00002199#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002200 return PyLong_FromLongLong((PY_LONG_LONG)s->sock_fd);
Fred Drakea04eaad2000-06-30 02:46:07 +00002201#endif
Guido van Rossumed233a51992-06-23 09:07:03 +00002202}
2203
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002204PyDoc_STRVAR(fileno_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002205"fileno() -> integer\n\
2206\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002207Return the integer file descriptor of the socket.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002208
Guido van Rossumed233a51992-06-23 09:07:03 +00002209
Guido van Rossumbe32c891996-06-20 16:25:29 +00002210#ifndef NO_DUP
2211/* s.dup() method */
2212
2213static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002214sock_dup(PySocketSockObject *s)
Guido van Rossumbe32c891996-06-20 16:25:29 +00002215{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002216 SOCKET_T newfd;
2217 PyObject *sock;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002218
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002219 newfd = dup(s->sock_fd);
2220 if (newfd < 0)
2221 return s->errorhandler();
2222 sock = (PyObject *) new_sockobject(newfd,
2223 s->sock_family,
2224 s->sock_type,
2225 s->sock_proto);
2226 if (sock == NULL)
2227 SOCKETCLOSE(newfd);
2228 return sock;
Guido van Rossumbe32c891996-06-20 16:25:29 +00002229}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002230
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002231PyDoc_STRVAR(dup_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002232"dup() -> socket object\n\
2233\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002234Return a new socket object connected to the same system resource.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002235
Guido van Rossumbe32c891996-06-20 16:25:29 +00002236#endif
2237
2238
Guido van Rossumc89705d1992-11-26 08:54:07 +00002239/* s.getsockname() method */
2240
Guido van Rossum73624e91994-10-10 17:59:00 +00002241static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002242sock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002243{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002244 sock_addr_t addrbuf;
2245 int res;
2246 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002247
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002248 if (!getsockaddrlen(s, &addrlen))
2249 return NULL;
2250 memset(&addrbuf, 0, addrlen);
2251 Py_BEGIN_ALLOW_THREADS
2252 res = getsockname(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2253 Py_END_ALLOW_THREADS
2254 if (res < 0)
2255 return s->errorhandler();
2256 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2257 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002258}
2259
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002260PyDoc_STRVAR(getsockname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002261"getsockname() -> address info\n\
2262\n\
2263Return the address of the local endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002264info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002265
Guido van Rossumc89705d1992-11-26 08:54:07 +00002266
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002267#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002268/* s.getpeername() method */
2269
Guido van Rossum73624e91994-10-10 17:59:00 +00002270static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002271sock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002272{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002273 sock_addr_t addrbuf;
2274 int res;
2275 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002276
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002277 if (!getsockaddrlen(s, &addrlen))
2278 return NULL;
2279 memset(&addrbuf, 0, addrlen);
2280 Py_BEGIN_ALLOW_THREADS
2281 res = getpeername(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2282 Py_END_ALLOW_THREADS
2283 if (res < 0)
2284 return s->errorhandler();
2285 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2286 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002287}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002288
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002289PyDoc_STRVAR(getpeername_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002290"getpeername() -> address info\n\
2291\n\
2292Return the address of the remote endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002293info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002294
Guido van Rossumb6775db1994-08-01 11:34:53 +00002295#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002296
2297
Guido van Rossum30a685f1991-06-27 15:51:29 +00002298/* s.listen(n) method */
2299
Guido van Rossum73624e91994-10-10 17:59:00 +00002300static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002301sock_listen(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002302{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002303 int backlog;
2304 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002305
Serhiy Storchaka74f49ab2013-01-19 12:55:39 +02002306 backlog = _PyInt_AsInt(arg);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002307 if (backlog == -1 && PyErr_Occurred())
2308 return NULL;
2309 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou47d1d0d2011-05-10 19:16:03 +02002310 /* To avoid problems on systems that don't allow a negative backlog
2311 * (which doesn't make sense anyway) we force a minimum value of 0. */
2312 if (backlog < 0)
2313 backlog = 0;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002314 res = listen(s->sock_fd, backlog);
2315 Py_END_ALLOW_THREADS
2316 if (res < 0)
2317 return s->errorhandler();
2318 Py_INCREF(Py_None);
2319 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002320}
2321
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002322PyDoc_STRVAR(listen_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002323"listen(backlog)\n\
2324\n\
2325Enable a server to accept connections. The backlog argument must be at\n\
Antoine Pitrou47d1d0d2011-05-10 19:16:03 +02002326least 0 (if it is lower, it is set to 0); it specifies the number of\n\
2327unaccepted connections that the system will allow before refusing new\n\
2328connections.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002329
2330
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002331#ifndef NO_DUP
Guido van Rossum30a685f1991-06-27 15:51:29 +00002332/* s.makefile(mode) method.
2333 Create a new open file object referring to a dupped version of
2334 the socket's file descriptor. (The dup() call is necessary so
2335 that the open file and socket objects may be closed independent
2336 of each other.)
2337 The mode argument specifies 'r' or 'w' passed to fdopen(). */
2338
Guido van Rossum73624e91994-10-10 17:59:00 +00002339static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002340sock_makefile(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002341{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002342 extern int fclose(FILE *);
2343 char *mode = "r";
2344 int bufsize = -1;
Fred Drakea04eaad2000-06-30 02:46:07 +00002345#ifdef MS_WIN32
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002346 Py_intptr_t fd;
Fred Drakea04eaad2000-06-30 02:46:07 +00002347#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002348 int fd;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002349#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002350 FILE *fp;
2351 PyObject *f;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002352#ifdef __VMS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002353 char *mode_r = "r";
2354 char *mode_w = "w";
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002355#endif
Guido van Rossum6b144911995-03-14 15:05:13 +00002356
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002357 if (!PyArg_ParseTuple(args, "|si:makefile", &mode, &bufsize))
2358 return NULL;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002359#ifdef __VMS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002360 if (strcmp(mode,"rb") == 0) {
2361 mode = mode_r;
2362 }
2363 else {
2364 if (strcmp(mode,"wb") == 0) {
2365 mode = mode_w;
2366 }
2367 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002368#endif
Guido van Rossum8d665e61996-06-26 18:22:49 +00002369#ifdef MS_WIN32
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002370 if (((fd = _open_osfhandle(s->sock_fd, _O_BINARY)) < 0) ||
2371 ((fd = dup(fd)) < 0) || ((fp = fdopen(fd, mode)) == NULL))
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00002372#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002373 if ((fd = dup(s->sock_fd)) < 0 || (fp = fdopen(fd, mode)) == NULL)
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00002374#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002375 {
2376 if (fd >= 0)
2377 SOCKETCLOSE(fd);
2378 return s->errorhandler();
2379 }
2380 f = PyFile_FromFile(fp, "<socket>", mode, fclose);
2381 if (f != NULL)
2382 PyFile_SetBufSize(f, bufsize);
2383 return f;
Guido van Rossum30a685f1991-06-27 15:51:29 +00002384}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002385
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002386PyDoc_STRVAR(makefile_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002387"makefile([mode[, buffersize]]) -> file object\n\
2388\n\
2389Return a regular file object corresponding to the socket.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002390The mode and buffersize arguments are as for the built-in open() function.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002391
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002392#endif /* NO_DUP */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002393
Martin Blais2856e5f2006-05-26 12:03:27 +00002394/*
Martin Blaisaf2ae722006-06-04 13:49:49 +00002395 * This is the guts of the recv() and recv_into() methods, which reads into a
Andrew M. Kuchling8d0baae2006-12-19 14:29:04 +00002396 * char buffer. If you have any inc/dec ref to do to the objects that contain
Martin Blais2856e5f2006-05-26 12:03:27 +00002397 * the buffer, do it in the caller. This function returns the number of bytes
Ezio Melottic2077b02011-03-16 12:34:31 +02002398 * successfully read. If there was an error, it returns -1. Note that it is
Martin Blais2856e5f2006-05-26 12:03:27 +00002399 * also possible that we return a number of bytes smaller than the request
2400 * bytes.
2401 */
Martin Blaisaf2ae722006-06-04 13:49:49 +00002402static ssize_t
Martin Blais2856e5f2006-05-26 12:03:27 +00002403sock_recv_guts(PySocketSockObject *s, char* cbuf, int len, int flags)
2404{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002405 ssize_t outlen = -1;
2406 int timeout;
Martin Blais2856e5f2006-05-26 12:03:27 +00002407#ifdef __VMS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002408 int remaining;
2409 char *read_buf;
Martin Blais2856e5f2006-05-26 12:03:27 +00002410#endif
2411
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002412 if (!IS_SELECTABLE(s)) {
2413 select_error();
2414 return -1;
2415 }
Martin Blais2856e5f2006-05-26 12:03:27 +00002416
2417#ifndef __VMS
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002418 BEGIN_SELECT_LOOP(s)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002419 Py_BEGIN_ALLOW_THREADS
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002420 timeout = internal_select_ex(s, 0, interval);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002421 if (!timeout)
2422 outlen = recv(s->sock_fd, cbuf, len, flags);
2423 Py_END_ALLOW_THREADS
Martin Blais2856e5f2006-05-26 12:03:27 +00002424
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002425 if (timeout == 1) {
2426 PyErr_SetString(socket_timeout, "timed out");
2427 return -1;
2428 }
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002429 END_SELECT_LOOP(s)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002430 if (outlen < 0) {
2431 /* Note: the call to errorhandler() ALWAYS indirectly returned
2432 NULL, so ignore its return value */
2433 s->errorhandler();
2434 return -1;
2435 }
Martin Blais2856e5f2006-05-26 12:03:27 +00002436#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002437 read_buf = cbuf;
2438 remaining = len;
2439 while (remaining != 0) {
2440 unsigned int segment;
2441 int nread = -1;
Martin Blais2856e5f2006-05-26 12:03:27 +00002442
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002443 segment = remaining /SEGMENT_SIZE;
2444 if (segment != 0) {
2445 segment = SEGMENT_SIZE;
2446 }
2447 else {
2448 segment = remaining;
2449 }
Martin Blais2856e5f2006-05-26 12:03:27 +00002450
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002451 BEGIN_SELECT_LOOP(s)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002452 Py_BEGIN_ALLOW_THREADS
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002453 timeout = internal_select_ex(s, 0, interval);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002454 if (!timeout)
2455 nread = recv(s->sock_fd, read_buf, segment, flags);
2456 Py_END_ALLOW_THREADS
Martin Blais2856e5f2006-05-26 12:03:27 +00002457
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002458 if (timeout == 1) {
2459 PyErr_SetString(socket_timeout, "timed out");
2460 return -1;
2461 }
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002462 END_SELECT_LOOP(s)
2463
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002464 if (nread < 0) {
2465 s->errorhandler();
2466 return -1;
2467 }
2468 if (nread != remaining) {
2469 read_buf += nread;
2470 break;
2471 }
Martin Blais2856e5f2006-05-26 12:03:27 +00002472
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002473 remaining -= segment;
2474 read_buf += segment;
2475 }
2476 outlen = read_buf - cbuf;
Martin Blais2856e5f2006-05-26 12:03:27 +00002477#endif /* !__VMS */
2478
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002479 return outlen;
Martin Blais2856e5f2006-05-26 12:03:27 +00002480}
2481
Guido van Rossum48a680c2001-03-02 06:34:14 +00002482
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002483/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002484
Guido van Rossum73624e91994-10-10 17:59:00 +00002485static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002486sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002487{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002488 int recvlen, flags = 0;
2489 ssize_t outlen;
2490 PyObject *buf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002491
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002492 if (!PyArg_ParseTuple(args, "i|i:recv", &recvlen, &flags))
2493 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002494
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002495 if (recvlen < 0) {
2496 PyErr_SetString(PyExc_ValueError,
2497 "negative buffersize in recv");
2498 return NULL;
2499 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002500
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002501 /* Allocate a new string. */
2502 buf = PyString_FromStringAndSize((char *) 0, recvlen);
2503 if (buf == NULL)
2504 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002505
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002506 /* Call the guts */
2507 outlen = sock_recv_guts(s, PyString_AS_STRING(buf), recvlen, flags);
2508 if (outlen < 0) {
2509 /* An error occurred, release the string and return an
2510 error. */
2511 Py_DECREF(buf);
2512 return NULL;
2513 }
2514 if (outlen != recvlen) {
2515 /* We did not read as many bytes as we anticipated, resize the
Ezio Melottic2077b02011-03-16 12:34:31 +02002516 string if possible and be successful. */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002517 if (_PyString_Resize(&buf, outlen) < 0)
Ezio Melottic2077b02011-03-16 12:34:31 +02002518 /* Oopsy, not so successful after all. */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002519 return NULL;
2520 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002521
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002522 return buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002523}
2524
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002525PyDoc_STRVAR(recv_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002526"recv(buffersize[, flags]) -> data\n\
2527\n\
2528Receive up to buffersize bytes from the socket. For the optional flags\n\
2529argument, see the Unix manual. When no data is available, block until\n\
2530at least one byte is available or until the remote end is closed. When\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002531the remote end is closed and all data is read, return the empty string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002532
Guido van Rossum30a685f1991-06-27 15:51:29 +00002533
Martin Blaisaf2ae722006-06-04 13:49:49 +00002534/* s.recv_into(buffer, [nbytes [,flags]]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002535
Martin Blais2856e5f2006-05-26 12:03:27 +00002536static PyObject*
Martin Blaisaf2ae722006-06-04 13:49:49 +00002537sock_recv_into(PySocketSockObject *s, PyObject *args, PyObject *kwds)
Martin Blais2856e5f2006-05-26 12:03:27 +00002538{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002539 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Martin Blais2856e5f2006-05-26 12:03:27 +00002540
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002541 int recvlen = 0, flags = 0;
2542 ssize_t readlen;
2543 Py_buffer buf;
2544 Py_ssize_t buflen;
Martin Blais2856e5f2006-05-26 12:03:27 +00002545
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002546 /* Get the buffer's memory */
2547 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ii:recv_into", kwlist,
2548 &buf, &recvlen, &flags))
2549 return NULL;
2550 buflen = buf.len;
2551 assert(buf.buf != 0 && buflen > 0);
Martin Blais2856e5f2006-05-26 12:03:27 +00002552
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002553 if (recvlen < 0) {
2554 PyErr_SetString(PyExc_ValueError,
2555 "negative buffersize in recv_into");
2556 goto error;
2557 }
2558 if (recvlen == 0) {
2559 /* If nbytes was not specified, use the buffer's length */
2560 recvlen = buflen;
2561 }
Martin Blais2856e5f2006-05-26 12:03:27 +00002562
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002563 /* Check if the buffer is large enough */
2564 if (buflen < recvlen) {
2565 PyErr_SetString(PyExc_ValueError,
2566 "buffer too small for requested bytes");
2567 goto error;
2568 }
Martin Blais2856e5f2006-05-26 12:03:27 +00002569
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002570 /* Call the guts */
2571 readlen = sock_recv_guts(s, buf.buf, recvlen, flags);
2572 if (readlen < 0) {
2573 /* Return an error. */
2574 goto error;
2575 }
Martin Blais2856e5f2006-05-26 12:03:27 +00002576
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002577 PyBuffer_Release(&buf);
2578 /* Return the number of bytes read. Note that we do not do anything
2579 special here in the case that readlen < recvlen. */
2580 return PyInt_FromSsize_t(readlen);
Antoine Pitroud7b731d2010-03-17 22:45:39 +00002581
2582error:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002583 PyBuffer_Release(&buf);
2584 return NULL;
Martin Blais2856e5f2006-05-26 12:03:27 +00002585}
2586
Martin Blaisaf2ae722006-06-04 13:49:49 +00002587PyDoc_STRVAR(recv_into_doc,
2588"recv_into(buffer, [nbytes[, flags]]) -> nbytes_read\n\
Martin Blais2856e5f2006-05-26 12:03:27 +00002589\n\
2590A version of recv() that stores its data into a buffer rather than creating \n\
2591a new string. Receive up to buffersize bytes from the socket. If buffersize \n\
2592is not specified (or 0), receive up to the size available in the given buffer.\n\
2593\n\
2594See recv() for documentation about the flags.");
2595
2596
2597/*
Guido van Rossum3c887b22007-12-18 20:10:42 +00002598 * This is the guts of the recvfrom() and recvfrom_into() methods, which reads
2599 * into a char buffer. If you have any inc/def ref to do to the objects that
2600 * contain the buffer, do it in the caller. This function returns the number
Ezio Melottic2077b02011-03-16 12:34:31 +02002601 * of bytes successfully read. If there was an error, it returns -1. Note
Guido van Rossum3c887b22007-12-18 20:10:42 +00002602 * that it is also possible that we return a number of bytes smaller than the
2603 * request bytes.
Martin Blais2856e5f2006-05-26 12:03:27 +00002604 *
2605 * 'addr' is a return value for the address object. Note that you must decref
2606 * it yourself.
2607 */
Martin Blaisaf2ae722006-06-04 13:49:49 +00002608static ssize_t
Martin Blais2856e5f2006-05-26 12:03:27 +00002609sock_recvfrom_guts(PySocketSockObject *s, char* cbuf, int len, int flags,
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002610 PyObject** addr)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002611{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002612 sock_addr_t addrbuf;
2613 int timeout;
2614 ssize_t n = -1;
2615 socklen_t addrlen;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002616
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002617 *addr = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002618
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002619 if (!getsockaddrlen(s, &addrlen))
2620 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002621
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002622 if (!IS_SELECTABLE(s)) {
2623 select_error();
2624 return -1;
2625 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00002626
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002627 BEGIN_SELECT_LOOP(s)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002628 Py_BEGIN_ALLOW_THREADS
2629 memset(&addrbuf, 0, addrlen);
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002630 timeout = internal_select_ex(s, 0, interval);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002631 if (!timeout) {
Guido van Rossum8d665e61996-06-26 18:22:49 +00002632#ifndef MS_WINDOWS
Andrew MacIntyreba43e872002-03-03 03:03:52 +00002633#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002634 n = recvfrom(s->sock_fd, cbuf, len, flags,
2635 SAS2SA(&addrbuf), &addrlen);
Guido van Rossum32c575d1997-12-02 20:37:32 +00002636#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002637 n = recvfrom(s->sock_fd, cbuf, len, flags,
2638 (void *) &addrbuf, &addrlen);
Guido van Rossum32c575d1997-12-02 20:37:32 +00002639#endif
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002640#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002641 n = recvfrom(s->sock_fd, cbuf, len, flags,
2642 SAS2SA(&addrbuf), &addrlen);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002643#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002644 }
2645 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002646
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002647 if (timeout == 1) {
2648 PyErr_SetString(socket_timeout, "timed out");
2649 return -1;
2650 }
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002651 END_SELECT_LOOP(s)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002652 if (n < 0) {
2653 s->errorhandler();
2654 return -1;
2655 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002656
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002657 if (!(*addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
2658 addrlen, s->sock_proto)))
2659 return -1;
Martin Blais2856e5f2006-05-26 12:03:27 +00002660
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002661 return n;
Martin Blais2856e5f2006-05-26 12:03:27 +00002662}
2663
2664/* s.recvfrom(nbytes [,flags]) method */
2665
2666static PyObject *
2667sock_recvfrom(PySocketSockObject *s, PyObject *args)
2668{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002669 PyObject *buf = NULL;
2670 PyObject *addr = NULL;
2671 PyObject *ret = NULL;
2672 int recvlen, flags = 0;
2673 ssize_t outlen;
Martin Blais2856e5f2006-05-26 12:03:27 +00002674
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002675 if (!PyArg_ParseTuple(args, "i|i:recvfrom", &recvlen, &flags))
2676 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002677
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002678 if (recvlen < 0) {
2679 PyErr_SetString(PyExc_ValueError,
2680 "negative buffersize in recvfrom");
2681 return NULL;
2682 }
Facundo Batista1fe9f962007-03-28 03:45:20 +00002683
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002684 buf = PyString_FromStringAndSize((char *) 0, recvlen);
2685 if (buf == NULL)
2686 return NULL;
Martin Blais2856e5f2006-05-26 12:03:27 +00002687
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002688 outlen = sock_recvfrom_guts(s, PyString_AS_STRING(buf),
2689 recvlen, flags, &addr);
2690 if (outlen < 0) {
2691 goto finally;
2692 }
Martin Blais2856e5f2006-05-26 12:03:27 +00002693
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002694 if (outlen != recvlen) {
2695 /* We did not read as many bytes as we anticipated, resize the
Ezio Melottic2077b02011-03-16 12:34:31 +02002696 string if possible and be successful. */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002697 if (_PyString_Resize(&buf, outlen) < 0)
Ezio Melottic2077b02011-03-16 12:34:31 +02002698 /* Oopsy, not so successful after all. */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002699 goto finally;
2700 }
Barry Warsaw752300b1997-01-03 17:18:10 +00002701
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002702 ret = PyTuple_Pack(2, buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002703
2704finally:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002705 Py_XDECREF(buf);
2706 Py_XDECREF(addr);
2707 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002708}
2709
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002710PyDoc_STRVAR(recvfrom_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002711"recvfrom(buffersize[, flags]) -> (data, address info)\n\
2712\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002713Like recv(buffersize, flags) but also return the sender's address info.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002714
Martin Blais2856e5f2006-05-26 12:03:27 +00002715
Martin Blaisaf2ae722006-06-04 13:49:49 +00002716/* s.recvfrom_into(buffer[, nbytes [,flags]]) method */
Martin Blais2856e5f2006-05-26 12:03:27 +00002717
2718static PyObject *
Martin Blaisaf2ae722006-06-04 13:49:49 +00002719sock_recvfrom_into(PySocketSockObject *s, PyObject *args, PyObject* kwds)
Martin Blais2856e5f2006-05-26 12:03:27 +00002720{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002721 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Martin Blais2856e5f2006-05-26 12:03:27 +00002722
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002723 int recvlen = 0, flags = 0;
2724 ssize_t readlen;
2725 Py_buffer buf;
2726 int buflen;
Martin Blais2856e5f2006-05-26 12:03:27 +00002727
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002728 PyObject *addr = NULL;
Martin Blais2856e5f2006-05-26 12:03:27 +00002729
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002730 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ii:recvfrom_into",
2731 kwlist, &buf,
2732 &recvlen, &flags))
2733 return NULL;
2734 buflen = buf.len;
2735 assert(buf.buf != 0 && buflen > 0);
Martin Blais2856e5f2006-05-26 12:03:27 +00002736
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002737 if (recvlen < 0) {
2738 PyErr_SetString(PyExc_ValueError,
2739 "negative buffersize in recvfrom_into");
2740 goto error;
2741 }
2742 if (recvlen == 0) {
2743 /* If nbytes was not specified, use the buffer's length */
2744 recvlen = buflen;
2745 }
Martin Blais2856e5f2006-05-26 12:03:27 +00002746
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002747 readlen = sock_recvfrom_guts(s, buf.buf, recvlen, flags, &addr);
2748 if (readlen < 0) {
2749 /* Return an error */
2750 goto error;
2751 }
Martin Blais2856e5f2006-05-26 12:03:27 +00002752
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002753 PyBuffer_Release(&buf);
2754 /* Return the number of bytes read and the address. Note that we do
2755 not do anything special here in the case that readlen < recvlen. */
2756 return Py_BuildValue("lN", readlen, addr);
Antoine Pitroud7b731d2010-03-17 22:45:39 +00002757
2758error:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002759 Py_XDECREF(addr);
2760 PyBuffer_Release(&buf);
2761 return NULL;
Martin Blais2856e5f2006-05-26 12:03:27 +00002762}
2763
Martin Blaisaf2ae722006-06-04 13:49:49 +00002764PyDoc_STRVAR(recvfrom_into_doc,
2765"recvfrom_into(buffer[, nbytes[, flags]]) -> (nbytes, address info)\n\
Martin Blais2856e5f2006-05-26 12:03:27 +00002766\n\
Martin Blaisaf2ae722006-06-04 13:49:49 +00002767Like recv_into(buffer[, nbytes[, flags]]) but also return the sender's address info.");
Martin Blais2856e5f2006-05-26 12:03:27 +00002768
2769
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002770/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002771
Guido van Rossum73624e91994-10-10 17:59:00 +00002772static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002773sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002774{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002775 char *buf;
2776 int len, n = -1, flags = 0, timeout;
2777 Py_buffer pbuf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002778
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002779 if (!PyArg_ParseTuple(args, "s*|i:send", &pbuf, &flags))
2780 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002781
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002782 if (!IS_SELECTABLE(s)) {
2783 PyBuffer_Release(&pbuf);
2784 return select_error();
2785 }
2786 buf = pbuf.buf;
2787 len = pbuf.len;
Neal Norwitz082b2df2006-02-07 07:04:46 +00002788
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002789 BEGIN_SELECT_LOOP(s)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002790 Py_BEGIN_ALLOW_THREADS
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002791 timeout = internal_select_ex(s, 1, interval);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002792 if (!timeout)
Neal Norwitz2a30cd02006-07-10 01:18:57 +00002793#ifdef __VMS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002794 n = sendsegmented(s->sock_fd, buf, len, flags);
Neal Norwitz2a30cd02006-07-10 01:18:57 +00002795#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002796 n = send(s->sock_fd, buf, len, flags);
Neal Norwitz2a30cd02006-07-10 01:18:57 +00002797#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002798 Py_END_ALLOW_THREADS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002799 if (timeout == 1) {
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002800 PyBuffer_Release(&pbuf);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002801 PyErr_SetString(socket_timeout, "timed out");
2802 return NULL;
2803 }
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002804 END_SELECT_LOOP(s)
2805
2806 PyBuffer_Release(&pbuf);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002807 if (n < 0)
2808 return s->errorhandler();
2809 return PyInt_FromLong((long)n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00002810}
2811
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002812PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002813"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002814\n\
2815Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002816argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002817sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002818
2819
2820/* s.sendall(data [,flags]) method */
2821
2822static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002823sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002824{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002825 char *buf;
Antoine Pitrou66b5df62010-09-27 18:16:46 +00002826 int len, n = -1, flags = 0, timeout, saved_errno;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002827 Py_buffer pbuf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002828
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002829 if (!PyArg_ParseTuple(args, "s*|i:sendall", &pbuf, &flags))
2830 return NULL;
2831 buf = pbuf.buf;
2832 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002833
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002834 if (!IS_SELECTABLE(s)) {
2835 PyBuffer_Release(&pbuf);
2836 return select_error();
2837 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00002838
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002839 do {
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002840 BEGIN_SELECT_LOOP(s)
Antoine Pitrou66b5df62010-09-27 18:16:46 +00002841 Py_BEGIN_ALLOW_THREADS
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002842 timeout = internal_select_ex(s, 1, interval);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002843 n = -1;
Antoine Pitrou66b5df62010-09-27 18:16:46 +00002844 if (!timeout) {
Neal Norwitz2a30cd02006-07-10 01:18:57 +00002845#ifdef __VMS
Antoine Pitrou66b5df62010-09-27 18:16:46 +00002846 n = sendsegmented(s->sock_fd, buf, len, flags);
Neal Norwitz2a30cd02006-07-10 01:18:57 +00002847#else
Antoine Pitrou66b5df62010-09-27 18:16:46 +00002848 n = send(s->sock_fd, buf, len, flags);
Neal Norwitz2a30cd02006-07-10 01:18:57 +00002849#endif
Antoine Pitrou66b5df62010-09-27 18:16:46 +00002850 }
2851 Py_END_ALLOW_THREADS
2852 if (timeout == 1) {
2853 PyBuffer_Release(&pbuf);
2854 PyErr_SetString(socket_timeout, "timed out");
2855 return NULL;
2856 }
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002857 END_SELECT_LOOP(s)
Antoine Pitrou66b5df62010-09-27 18:16:46 +00002858 /* PyErr_CheckSignals() might change errno */
2859 saved_errno = errno;
2860 /* We must run our signal handlers before looping again.
2861 send() can return a successful partial write when it is
2862 interrupted, so we can't restrict ourselves to EINTR. */
2863 if (PyErr_CheckSignals()) {
2864 PyBuffer_Release(&pbuf);
2865 return NULL;
2866 }
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002867 if (n < 0) {
Antoine Pitrou66b5df62010-09-27 18:16:46 +00002868 /* If interrupted, try again */
2869 if (saved_errno == EINTR)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002870 continue;
Antoine Pitrou66b5df62010-09-27 18:16:46 +00002871 else
2872 break;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002873 }
2874 buf += n;
2875 len -= n;
2876 } while (len > 0);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002877 PyBuffer_Release(&pbuf);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002878
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002879 if (n < 0)
2880 return s->errorhandler();
Guido van Rossum67f7a382002-06-06 21:08:16 +00002881
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002882 Py_INCREF(Py_None);
2883 return Py_None;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002884}
2885
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002886PyDoc_STRVAR(sendall_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002887"sendall(data[, flags])\n\
2888\n\
2889Send a data string to the socket. For the optional flags\n\
2890argument, see the Unix manual. This calls send() repeatedly\n\
2891until all data is sent. If an error occurs, it's impossible\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002892to tell how much data has been sent.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002893
Guido van Rossum30a685f1991-06-27 15:51:29 +00002894
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002895/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002896
Guido van Rossum73624e91994-10-10 17:59:00 +00002897static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002898sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002899{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002900 Py_buffer pbuf;
2901 PyObject *addro;
2902 char *buf;
2903 Py_ssize_t len;
2904 sock_addr_t addrbuf;
2905 int addrlen, n = -1, flags, timeout;
Ezio Melotti0639be62011-05-07 19:21:22 +03002906 int arglen;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002907
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002908 flags = 0;
Ezio Melotti0639be62011-05-07 19:21:22 +03002909 arglen = PyTuple_Size(args);
2910 switch(arglen) {
2911 case 2:
2912 PyArg_ParseTuple(args, "s*O:sendto", &pbuf, &addro);
2913 break;
2914 case 3:
2915 PyArg_ParseTuple(args, "s*iO:sendto", &pbuf, &flags, &addro);
2916 break;
2917 default:
2918 PyErr_Format(PyExc_TypeError, "sendto() takes 2 or 3"
2919 " arguments (%d given)", arglen);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002920 }
Ezio Melotti0639be62011-05-07 19:21:22 +03002921 if (PyErr_Occurred())
2922 return NULL;
2923
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002924 buf = pbuf.buf;
2925 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002926
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002927 if (!IS_SELECTABLE(s)) {
2928 PyBuffer_Release(&pbuf);
2929 return select_error();
2930 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00002931
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002932 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen)) {
2933 PyBuffer_Release(&pbuf);
2934 return NULL;
2935 }
Martin v. Löwis046c4d12006-12-03 11:23:45 +00002936
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002937 BEGIN_SELECT_LOOP(s)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002938 Py_BEGIN_ALLOW_THREADS
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002939 timeout = internal_select_ex(s, 1, interval);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002940 if (!timeout)
2941 n = sendto(s->sock_fd, buf, len, flags, SAS2SA(&addrbuf), addrlen);
2942 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002943
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002944 if (timeout == 1) {
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002945 PyBuffer_Release(&pbuf);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002946 PyErr_SetString(socket_timeout, "timed out");
2947 return NULL;
2948 }
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002949 END_SELECT_LOOP(s)
2950 PyBuffer_Release(&pbuf);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002951 if (n < 0)
2952 return s->errorhandler();
2953 return PyInt_FromLong((long)n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002954}
2955
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002956PyDoc_STRVAR(sendto_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002957"sendto(data[, flags], address) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002958\n\
2959Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002960For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002961
Guido van Rossum30a685f1991-06-27 15:51:29 +00002962
2963/* s.shutdown(how) method */
2964
Guido van Rossum73624e91994-10-10 17:59:00 +00002965static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002966sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002967{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002968 int how;
2969 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002970
Serhiy Storchaka74f49ab2013-01-19 12:55:39 +02002971 how = _PyInt_AsInt(arg);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002972 if (how == -1 && PyErr_Occurred())
2973 return NULL;
2974 Py_BEGIN_ALLOW_THREADS
2975 res = shutdown(s->sock_fd, how);
2976 Py_END_ALLOW_THREADS
2977 if (res < 0)
2978 return s->errorhandler();
2979 Py_INCREF(Py_None);
2980 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002981}
2982
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002983PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002984"shutdown(flag)\n\
2985\n\
Martin v. Löwis94681fc2003-11-27 19:40:22 +00002986Shut down the reading side of the socket (flag == SHUT_RD), the writing side\n\
2987of the socket (flag == SHUT_WR), or both ends (flag == SHUT_RDWR).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002988
Amaury Forgeot d'Arca4dd2e22008-06-13 00:42:22 +00002989#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Christian Heimes04ae9162008-01-04 15:23:30 +00002990static PyObject*
2991sock_ioctl(PySocketSockObject *s, PyObject *arg)
2992{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002993 unsigned long cmd = SIO_RCVALL;
2994 PyObject *argO;
2995 DWORD recv;
Christian Heimes04ae9162008-01-04 15:23:30 +00002996
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002997 if (!PyArg_ParseTuple(arg, "kO:ioctl", &cmd, &argO))
2998 return NULL;
Christian Heimes04ae9162008-01-04 15:23:30 +00002999
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003000 switch (cmd) {
3001 case SIO_RCVALL: {
3002 unsigned int option = RCVALL_ON;
3003 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
3004 return NULL;
3005 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
3006 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
3007 return set_error();
3008 }
3009 return PyLong_FromUnsignedLong(recv); }
3010 case SIO_KEEPALIVE_VALS: {
3011 struct tcp_keepalive ka;
3012 if (!PyArg_ParseTuple(arg, "k(kkk):ioctl", &cmd,
3013 &ka.onoff, &ka.keepalivetime, &ka.keepaliveinterval))
3014 return NULL;
3015 if (WSAIoctl(s->sock_fd, cmd, &ka, sizeof(ka),
3016 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
3017 return set_error();
3018 }
3019 return PyLong_FromUnsignedLong(recv); }
3020 default:
3021 PyErr_Format(PyExc_ValueError, "invalid ioctl command %d", cmd);
3022 return NULL;
3023 }
Christian Heimes04ae9162008-01-04 15:23:30 +00003024}
3025PyDoc_STRVAR(sock_ioctl_doc,
3026"ioctl(cmd, option) -> long\n\
3027\n\
Kristján Valur Jónsson2fcd03b2009-09-25 15:19:51 +00003028Control the socket with WSAIoctl syscall. Currently supported 'cmd' values are\n\
3029SIO_RCVALL: 'option' must be one of the socket.RCVALL_* constants.\n\
3030SIO_KEEPALIVE_VALS: 'option' is a tuple of (onoff, timeout, interval).");
Christian Heimes04ae9162008-01-04 15:23:30 +00003031
3032#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00003033
3034/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003035
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003036static PyMethodDef sock_methods[] = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003037 {"accept", (PyCFunction)sock_accept, METH_NOARGS,
3038 accept_doc},
3039 {"bind", (PyCFunction)sock_bind, METH_O,
3040 bind_doc},
3041 {"close", (PyCFunction)sock_close, METH_NOARGS,
3042 close_doc},
3043 {"connect", (PyCFunction)sock_connect, METH_O,
3044 connect_doc},
3045 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
3046 connect_ex_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00003047#ifndef NO_DUP
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003048 {"dup", (PyCFunction)sock_dup, METH_NOARGS,
3049 dup_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00003050#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003051 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
3052 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00003053#ifdef HAVE_GETPEERNAME
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003054 {"getpeername", (PyCFunction)sock_getpeername,
3055 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00003056#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003057 {"getsockname", (PyCFunction)sock_getsockname,
3058 METH_NOARGS, getsockname_doc},
3059 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
3060 getsockopt_doc},
Amaury Forgeot d'Arca4dd2e22008-06-13 00:42:22 +00003061#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003062 {"ioctl", (PyCFunction)sock_ioctl, METH_VARARGS,
3063 sock_ioctl_doc},
Christian Heimes04ae9162008-01-04 15:23:30 +00003064#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003065 {"listen", (PyCFunction)sock_listen, METH_O,
3066 listen_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00003067#ifndef NO_DUP
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003068 {"makefile", (PyCFunction)sock_makefile, METH_VARARGS,
3069 makefile_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00003070#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003071 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
3072 recv_doc},
3073 {"recv_into", (PyCFunction)sock_recv_into, METH_VARARGS | METH_KEYWORDS,
3074 recv_into_doc},
3075 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
3076 recvfrom_doc},
3077 {"recvfrom_into", (PyCFunction)sock_recvfrom_into, METH_VARARGS | METH_KEYWORDS,
3078 recvfrom_into_doc},
3079 {"send", (PyCFunction)sock_send, METH_VARARGS,
3080 send_doc},
3081 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
3082 sendall_doc},
3083 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
3084 sendto_doc},
3085 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
3086 setblocking_doc},
3087 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
3088 settimeout_doc},
3089 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
3090 gettimeout_doc},
3091 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
3092 setsockopt_doc},
3093 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
3094 shutdown_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00003095#ifdef RISCOS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003096 {"sleeptaskw", (PyCFunction)sock_sleeptaskw, METH_O,
3097 sleeptaskw_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00003098#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003099 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003100};
3101
Georg Brandlbc45a3f2006-03-17 19:17:34 +00003102/* SockObject members */
3103static PyMemberDef sock_memberlist[] = {
3104 {"family", T_INT, offsetof(PySocketSockObject, sock_family), READONLY, "the socket family"},
3105 {"type", T_INT, offsetof(PySocketSockObject, sock_type), READONLY, "the socket type"},
3106 {"proto", T_INT, offsetof(PySocketSockObject, sock_proto), READONLY, "the socket protocol"},
3107 {"timeout", T_DOUBLE, offsetof(PySocketSockObject, sock_timeout), READONLY, "the socket timeout"},
3108 {0},
3109};
Guido van Rossum30a685f1991-06-27 15:51:29 +00003110
Guido van Rossum73624e91994-10-10 17:59:00 +00003111/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00003112 First close the file description. */
3113
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003114static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003115sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003116{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003117 if (s->sock_fd != -1)
3118 (void) SOCKETCLOSE(s->sock_fd);
3119 Py_TYPE(s)->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003120}
3121
Guido van Rossum30a685f1991-06-27 15:51:29 +00003122
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003123static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003124sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003125{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003126 char buf[512];
Fred Drakea04eaad2000-06-30 02:46:07 +00003127#if SIZEOF_SOCKET_T > SIZEOF_LONG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003128 if (s->sock_fd > LONG_MAX) {
3129 /* this can occur on Win64, and actually there is a special
3130 ugly printf formatter for decimal pointer length integer
3131 printing, only bother if necessary*/
3132 PyErr_SetString(PyExc_OverflowError,
3133 "no printf formatter to display "
3134 "the socket descriptor in decimal");
3135 return NULL;
3136 }
Fred Drakea04eaad2000-06-30 02:46:07 +00003137#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003138 PyOS_snprintf(
3139 buf, sizeof(buf),
3140 "<socket object, fd=%ld, family=%d, type=%d, protocol=%d>",
3141 (long)s->sock_fd, s->sock_family,
3142 s->sock_type,
3143 s->sock_proto);
3144 return PyString_FromString(buf);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003145}
3146
3147
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003148/* Create a new, uninitialized socket object. */
3149
3150static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003151sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003152{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003153 PyObject *new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003154
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003155 new = type->tp_alloc(type, 0);
3156 if (new != NULL) {
3157 ((PySocketSockObject *)new)->sock_fd = -1;
3158 ((PySocketSockObject *)new)->sock_timeout = -1.0;
3159 ((PySocketSockObject *)new)->errorhandler = &set_error;
3160 }
3161 return new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003162}
3163
3164
3165/* Initialize a new socket object. */
3166
3167/*ARGSUSED*/
3168static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00003169sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003170{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003171 PySocketSockObject *s = (PySocketSockObject *)self;
3172 SOCKET_T fd;
3173 int family = AF_INET, type = SOCK_STREAM, proto = 0;
3174 static char *keywords[] = {"family", "type", "proto", 0};
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003175
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003176 if (!PyArg_ParseTupleAndKeywords(args, kwds,
3177 "|iii:socket", keywords,
3178 &family, &type, &proto))
3179 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003180
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003181 Py_BEGIN_ALLOW_THREADS
3182 fd = socket(family, type, proto);
3183 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00003184
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003185#ifdef MS_WINDOWS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003186 if (fd == INVALID_SOCKET)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003187#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003188 if (fd < 0)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003189#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003190 {
3191 set_error();
3192 return -1;
3193 }
3194 init_sockobject(s, fd, family, type, proto);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003195
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003196 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003197
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003198}
3199
3200
Guido van Rossumb6775db1994-08-01 11:34:53 +00003201/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003202
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003203static PyTypeObject sock_type = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003204 PyVarObject_HEAD_INIT(0, 0) /* Must fill in type value later */
3205 "_socket.socket", /* tp_name */
3206 sizeof(PySocketSockObject), /* tp_basicsize */
3207 0, /* tp_itemsize */
3208 (destructor)sock_dealloc, /* tp_dealloc */
3209 0, /* tp_print */
3210 0, /* tp_getattr */
3211 0, /* tp_setattr */
3212 0, /* tp_compare */
3213 (reprfunc)sock_repr, /* tp_repr */
3214 0, /* tp_as_number */
3215 0, /* tp_as_sequence */
3216 0, /* tp_as_mapping */
3217 0, /* tp_hash */
3218 0, /* tp_call */
3219 0, /* tp_str */
3220 PyObject_GenericGetAttr, /* tp_getattro */
3221 0, /* tp_setattro */
3222 0, /* tp_as_buffer */
3223 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
3224 sock_doc, /* tp_doc */
3225 0, /* tp_traverse */
3226 0, /* tp_clear */
3227 0, /* tp_richcompare */
3228 0, /* tp_weaklistoffset */
3229 0, /* tp_iter */
3230 0, /* tp_iternext */
3231 sock_methods, /* tp_methods */
3232 sock_memberlist, /* tp_members */
3233 0, /* tp_getset */
3234 0, /* tp_base */
3235 0, /* tp_dict */
3236 0, /* tp_descr_get */
3237 0, /* tp_descr_set */
3238 0, /* tp_dictoffset */
3239 sock_initobj, /* tp_init */
3240 PyType_GenericAlloc, /* tp_alloc */
3241 sock_new, /* tp_new */
3242 PyObject_Del, /* tp_free */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003243};
3244
Guido van Rossum30a685f1991-06-27 15:51:29 +00003245
Guido van Rossum81194471991-07-27 21:42:02 +00003246/* Python interface to gethostname(). */
3247
3248/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00003249static PyObject *
Georg Brandl96a8c392006-05-29 21:04:52 +00003250socket_gethostname(PyObject *self, PyObject *unused)
Guido van Rossum81194471991-07-27 21:42:02 +00003251{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003252 char buf[1024];
3253 int res;
3254 Py_BEGIN_ALLOW_THREADS
3255 res = gethostname(buf, (int) sizeof buf - 1);
3256 Py_END_ALLOW_THREADS
3257 if (res < 0)
3258 return set_error();
3259 buf[sizeof buf - 1] = '\0';
3260 return PyString_FromString(buf);
Guido van Rossum81194471991-07-27 21:42:02 +00003261}
Guido van Rossumff4949e1992-08-05 19:58:53 +00003262
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003263PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003264"gethostname() -> string\n\
3265\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003266Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003267
Guido van Rossumff4949e1992-08-05 19:58:53 +00003268
Guido van Rossum30a685f1991-06-27 15:51:29 +00003269/* Python interface to gethostbyname(name). */
3270
3271/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00003272static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003273socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003274{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003275 char *name;
3276 sock_addr_t addrbuf;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003277
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003278 if (!PyArg_ParseTuple(args, "s:gethostbyname", &name))
3279 return NULL;
3280 if (setipaddr(name, SAS2SA(&addrbuf), sizeof(addrbuf), AF_INET) < 0)
3281 return NULL;
3282 return makeipaddr(SAS2SA(&addrbuf), sizeof(struct sockaddr_in));
Guido van Rossum30a685f1991-06-27 15:51:29 +00003283}
3284
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003285PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003286"gethostbyname(host) -> address\n\
3287\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003288Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003289
3290
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003291/* Convenience function common to gethostbyname_ex and gethostbyaddr */
3292
3293static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003294gethost_common(struct hostent *h, struct sockaddr *addr, int alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003295{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003296 char **pch;
3297 PyObject *rtn_tuple = (PyObject *)NULL;
3298 PyObject *name_list = (PyObject *)NULL;
3299 PyObject *addr_list = (PyObject *)NULL;
3300 PyObject *tmp;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003301
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003302 if (h == NULL) {
3303 /* Let's get real error message to return */
Guido van Rossume2ae77b2001-10-24 20:42:55 +00003304#ifndef RISCOS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003305 set_herror(h_errno);
Guido van Rossume2ae77b2001-10-24 20:42:55 +00003306#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003307 PyErr_SetString(socket_error, "host not found");
Guido van Rossume2ae77b2001-10-24 20:42:55 +00003308#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003309 return NULL;
3310 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003311
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003312 if (h->h_addrtype != af) {
3313 /* Let's get real error message to return */
3314 PyErr_SetString(socket_error,
3315 (char *)strerror(EAFNOSUPPORT));
Brett Cannon10ed0f52008-03-18 15:35:58 +00003316
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003317 return NULL;
3318 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003319
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003320 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00003321
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003322 case AF_INET:
3323 if (alen < sizeof(struct sockaddr_in))
3324 return NULL;
3325 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003326
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00003327#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003328 case AF_INET6:
3329 if (alen < sizeof(struct sockaddr_in6))
3330 return NULL;
3331 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003332#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00003333
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003334 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003335
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003336 if ((name_list = PyList_New(0)) == NULL)
3337 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003338
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003339 if ((addr_list = PyList_New(0)) == NULL)
3340 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003341
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003342 /* SF #1511317: h_aliases can be NULL */
3343 if (h->h_aliases) {
3344 for (pch = h->h_aliases; *pch != NULL; pch++) {
3345 int status;
3346 tmp = PyString_FromString(*pch);
3347 if (tmp == NULL)
3348 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003349
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003350 status = PyList_Append(name_list, tmp);
3351 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003352
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003353 if (status)
3354 goto err;
3355 }
3356 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003357
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003358 for (pch = h->h_addr_list; *pch != NULL; pch++) {
3359 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003360
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003361 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00003362
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003363 case AF_INET:
3364 {
3365 struct sockaddr_in sin;
3366 memset(&sin, 0, sizeof(sin));
3367 sin.sin_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003368#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003369 sin.sin_len = sizeof(sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003370#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003371 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
3372 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
Guido van Rossum67f7a382002-06-06 21:08:16 +00003373
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003374 if (pch == h->h_addr_list && alen >= sizeof(sin))
3375 memcpy((char *) addr, &sin, sizeof(sin));
3376 break;
3377 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003378
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00003379#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003380 case AF_INET6:
3381 {
3382 struct sockaddr_in6 sin6;
3383 memset(&sin6, 0, sizeof(sin6));
3384 sin6.sin6_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003385#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003386 sin6.sin6_len = sizeof(sin6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003387#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003388 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
3389 tmp = makeipaddr((struct sockaddr *)&sin6,
3390 sizeof(sin6));
Guido van Rossum67f7a382002-06-06 21:08:16 +00003391
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003392 if (pch == h->h_addr_list && alen >= sizeof(sin6))
3393 memcpy((char *) addr, &sin6, sizeof(sin6));
3394 break;
3395 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003396#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00003397
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003398 default: /* can't happen */
3399 PyErr_SetString(socket_error,
3400 "unsupported address family");
3401 return NULL;
3402 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003403
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003404 if (tmp == NULL)
3405 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003406
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003407 status = PyList_Append(addr_list, tmp);
3408 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003409
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003410 if (status)
3411 goto err;
3412 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003413
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003414 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003415
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003416 err:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003417 Py_XDECREF(name_list);
3418 Py_XDECREF(addr_list);
3419 return rtn_tuple;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003420}
3421
3422
3423/* Python interface to gethostbyname_ex(name). */
3424
3425/*ARGSUSED*/
3426static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003427socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003428{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003429 char *name;
3430 struct hostent *h;
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00003431#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003432 struct sockaddr_storage addr;
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00003433#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003434 struct sockaddr_in addr;
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00003435#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003436 struct sockaddr *sa;
3437 PyObject *ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003438#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003439 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003440#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003441 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003442#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003443 char buf[16384];
3444 int buf_len = (sizeof buf) - 1;
3445 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003446#endif
3447#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003448 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00003449#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003450#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003451
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003452 if (!PyArg_ParseTuple(args, "s:gethostbyname_ex", &name))
3453 return NULL;
3454 if (setipaddr(name, (struct sockaddr *)&addr, sizeof(addr), AF_INET) < 0)
3455 return NULL;
3456 Py_BEGIN_ALLOW_THREADS
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003457#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003458#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003459 result = gethostbyname_r(name, &hp_allocated, buf, buf_len,
3460 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003461#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003462 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003463#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003464 memset((void *) &data, '\0', sizeof(data));
3465 result = gethostbyname_r(name, &hp_allocated, &data);
3466 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00003467#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003468#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00003469#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003470 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003471#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003472 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003473#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003474 Py_END_ALLOW_THREADS
3475 /* Some C libraries would require addr.__ss_family instead of
3476 addr.ss_family.
3477 Therefore, we cast the sockaddr_storage into sockaddr to
3478 access sa_family. */
3479 sa = (struct sockaddr*)&addr;
3480 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr),
3481 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00003482#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003483 PyThread_release_lock(netdb_lock);
Guido van Rossum955becc1999-03-22 20:14:53 +00003484#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003485 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003486}
3487
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003488PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003489"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
3490\n\
3491Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003492for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003493
3494
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003495/* Python interface to gethostbyaddr(IP). */
3496
3497/*ARGSUSED*/
3498static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003499socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003500{
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00003501#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003502 struct sockaddr_storage addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003503#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003504 struct sockaddr_in addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003505#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003506 struct sockaddr *sa = (struct sockaddr *)&addr;
3507 char *ip_num;
3508 struct hostent *h;
3509 PyObject *ret;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003510#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003511 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003512#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003513 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003514#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003515 /* glibcs up to 2.10 assume that the buf argument to
3516 gethostbyaddr_r is 8-byte aligned, which at least llvm-gcc
3517 does not ensure. The attribute below instructs the compiler
3518 to maintain this alignment. */
3519 char buf[16384] Py_ALIGNED(8);
3520 int buf_len = (sizeof buf) - 1;
3521 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003522#endif
3523#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003524 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00003525#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003526#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003527 char *ap;
3528 int al;
3529 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003530
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003531 if (!PyArg_ParseTuple(args, "s:gethostbyaddr", &ip_num))
3532 return NULL;
3533 af = AF_UNSPEC;
3534 if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
3535 return NULL;
3536 af = sa->sa_family;
3537 ap = NULL;
3538 switch (af) {
3539 case AF_INET:
3540 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
3541 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
3542 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00003543#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003544 case AF_INET6:
3545 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
3546 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
3547 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003548#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003549 default:
3550 PyErr_SetString(socket_error, "unsupported address family");
3551 return NULL;
3552 }
3553 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003554#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003555#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003556 result = gethostbyaddr_r(ap, al, af,
3557 &hp_allocated, buf, buf_len,
3558 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003559#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003560 h = gethostbyaddr_r(ap, al, af,
3561 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003562#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003563 memset((void *) &data, '\0', sizeof(data));
3564 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
3565 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00003566#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003567#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00003568#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003569 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003570#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003571 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003572#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003573 Py_END_ALLOW_THREADS
3574 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00003575#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003576 PyThread_release_lock(netdb_lock);
Guido van Rossum3baaa131999-03-22 21:44:51 +00003577#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003578 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003579}
3580
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003581PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003582"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
3583\n\
3584Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003585for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003586
Guido van Rossum30a685f1991-06-27 15:51:29 +00003587
3588/* Python interface to getservbyname(name).
3589 This only returns the port number, since the other info is already
3590 known or not useful (like the list of aliases). */
3591
3592/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00003593static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003594socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003595{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003596 char *name, *proto=NULL;
3597 struct servent *sp;
3598 if (!PyArg_ParseTuple(args, "s|s:getservbyname", &name, &proto))
3599 return NULL;
3600 Py_BEGIN_ALLOW_THREADS
3601 sp = getservbyname(name, proto);
3602 Py_END_ALLOW_THREADS
3603 if (sp == NULL) {
3604 PyErr_SetString(socket_error, "service/proto not found");
3605 return NULL;
3606 }
3607 return PyInt_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00003608}
3609
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003610PyDoc_STRVAR(getservbyname_doc,
Barry Warsaw11b91a02004-06-28 00:50:43 +00003611"getservbyname(servicename[, protocolname]) -> integer\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003612\n\
3613Return a port number from a service name and protocol name.\n\
Barry Warsaw11b91a02004-06-28 00:50:43 +00003614The optional protocol name, if given, should be 'tcp' or 'udp',\n\
3615otherwise any protocol will match.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003616
Guido van Rossum30a685f1991-06-27 15:51:29 +00003617
Barry Warsaw11b91a02004-06-28 00:50:43 +00003618/* Python interface to getservbyport(port).
3619 This only returns the service name, since the other info is already
3620 known or not useful (like the list of aliases). */
3621
3622/*ARGSUSED*/
3623static PyObject *
3624socket_getservbyport(PyObject *self, PyObject *args)
3625{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003626 int port;
3627 char *proto=NULL;
3628 struct servent *sp;
3629 if (!PyArg_ParseTuple(args, "i|s:getservbyport", &port, &proto))
3630 return NULL;
3631 if (port < 0 || port > 0xffff) {
3632 PyErr_SetString(
3633 PyExc_OverflowError,
3634 "getservbyport: port must be 0-65535.");
3635 return NULL;
3636 }
3637 Py_BEGIN_ALLOW_THREADS
3638 sp = getservbyport(htons((short)port), proto);
3639 Py_END_ALLOW_THREADS
3640 if (sp == NULL) {
3641 PyErr_SetString(socket_error, "port/proto not found");
3642 return NULL;
3643 }
3644 return PyString_FromString(sp->s_name);
Barry Warsaw11b91a02004-06-28 00:50:43 +00003645}
3646
3647PyDoc_STRVAR(getservbyport_doc,
3648"getservbyport(port[, protocolname]) -> string\n\
3649\n\
3650Return the service name from a port number and protocol name.\n\
3651The optional protocol name, if given, should be 'tcp' or 'udp',\n\
3652otherwise any protocol will match.");
3653
Guido van Rossum3901d851996-12-19 16:35:04 +00003654/* Python interface to getprotobyname(name).
3655 This only returns the protocol number, since the other info is
3656 already known or not useful (like the list of aliases). */
3657
3658/*ARGSUSED*/
3659static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003660socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00003661{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003662 char *name;
3663 struct protoent *sp;
Guido van Rossumbcc20741998-08-04 22:53:56 +00003664#ifdef __BEOS__
3665/* Not available in BeOS yet. - [cjh] */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003666 PyErr_SetString(socket_error, "getprotobyname not supported");
3667 return NULL;
Guido van Rossumbcc20741998-08-04 22:53:56 +00003668#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003669 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
3670 return NULL;
3671 Py_BEGIN_ALLOW_THREADS
3672 sp = getprotobyname(name);
3673 Py_END_ALLOW_THREADS
3674 if (sp == NULL) {
3675 PyErr_SetString(socket_error, "protocol not found");
3676 return NULL;
3677 }
3678 return PyInt_FromLong((long) sp->p_proto);
Guido van Rossumbcc20741998-08-04 22:53:56 +00003679#endif
Guido van Rossum3901d851996-12-19 16:35:04 +00003680}
3681
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003682PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003683"getprotobyname(name) -> integer\n\
3684\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003685Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003686
Guido van Rossum3901d851996-12-19 16:35:04 +00003687
Dave Cole331708b2004-08-09 04:51:41 +00003688#ifdef HAVE_SOCKETPAIR
3689/* Create a pair of sockets using the socketpair() function.
Dave Cole07fda7e2004-08-23 05:16:23 +00003690 Arguments as for socket() except the default family is AF_UNIX if
Dave Colee8bbfe42004-08-26 00:51:16 +00003691 defined on the platform; otherwise, the default is AF_INET. */
Dave Cole331708b2004-08-09 04:51:41 +00003692
3693/*ARGSUSED*/
3694static PyObject *
3695socket_socketpair(PyObject *self, PyObject *args)
3696{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003697 PySocketSockObject *s0 = NULL, *s1 = NULL;
3698 SOCKET_T sv[2];
3699 int family, type = SOCK_STREAM, proto = 0;
3700 PyObject *res = NULL;
Dave Cole331708b2004-08-09 04:51:41 +00003701
3702#if defined(AF_UNIX)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003703 family = AF_UNIX;
Dave Cole331708b2004-08-09 04:51:41 +00003704#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003705 family = AF_INET;
Dave Cole331708b2004-08-09 04:51:41 +00003706#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003707 if (!PyArg_ParseTuple(args, "|iii:socketpair",
3708 &family, &type, &proto))
3709 return NULL;
3710 /* Create a pair of socket fds */
3711 if (socketpair(family, type, proto, sv) < 0)
3712 return set_error();
3713 s0 = new_sockobject(sv[0], family, type, proto);
3714 if (s0 == NULL)
3715 goto finally;
3716 s1 = new_sockobject(sv[1], family, type, proto);
3717 if (s1 == NULL)
3718 goto finally;
3719 res = PyTuple_Pack(2, s0, s1);
Dave Cole331708b2004-08-09 04:51:41 +00003720
3721finally:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003722 if (res == NULL) {
3723 if (s0 == NULL)
3724 SOCKETCLOSE(sv[0]);
3725 if (s1 == NULL)
3726 SOCKETCLOSE(sv[1]);
3727 }
3728 Py_XDECREF(s0);
3729 Py_XDECREF(s1);
3730 return res;
Dave Cole331708b2004-08-09 04:51:41 +00003731}
3732
3733PyDoc_STRVAR(socketpair_doc,
3734"socketpair([family[, type[, proto]]]) -> (socket object, socket object)\n\
3735\n\
3736Create a pair of socket objects from the sockets returned by the platform\n\
3737socketpair() function.\n\
Dave Cole07fda7e2004-08-23 05:16:23 +00003738The arguments are the same as for socket() except the default family is\n\
Dave Colee8bbfe42004-08-26 00:51:16 +00003739AF_UNIX if defined on the platform; otherwise, the default is AF_INET.");
Dave Cole331708b2004-08-09 04:51:41 +00003740
3741#endif /* HAVE_SOCKETPAIR */
3742
3743
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00003744#ifndef NO_DUP
Guido van Rossum2a7178e1992-12-08 13:38:24 +00003745/* Create a socket object from a numeric file description.
3746 Useful e.g. if stdin is a socket.
3747 Additional arguments as for socket(). */
3748
3749/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00003750static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003751socket_fromfd(PyObject *self, PyObject *args)
Guido van Rossum2a7178e1992-12-08 13:38:24 +00003752{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003753 PySocketSockObject *s;
3754 SOCKET_T fd;
3755 int family, type, proto = 0;
3756 if (!PyArg_ParseTuple(args, "iii|i:fromfd",
3757 &fd, &family, &type, &proto))
3758 return NULL;
3759 /* Dup the fd so it and the socket can be closed independently */
3760 fd = dup(fd);
3761 if (fd < 0)
3762 return set_error();
3763 s = new_sockobject(fd, family, type, proto);
3764 return (PyObject *) s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00003765}
Guido van Rossum82a5c661998-07-07 20:45:43 +00003766
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003767PyDoc_STRVAR(fromfd_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003768"fromfd(fd, family, type[, proto]) -> socket object\n\
3769\n\
Georg Brandldcfdae72006-04-01 07:33:08 +00003770Create a socket object from a duplicate of the given\n\
3771file descriptor.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003772The remaining arguments are the same as for socket().");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003773
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00003774#endif /* NO_DUP */
Guido van Rossum2a7178e1992-12-08 13:38:24 +00003775
Guido van Rossum82a5c661998-07-07 20:45:43 +00003776
Guido van Rossum006bf911996-06-12 04:04:55 +00003777static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003778socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00003779{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003780 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00003781
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003782 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
3783 return NULL;
3784 }
3785 if (x1 < 0) {
3786 PyErr_SetString(PyExc_OverflowError,
3787 "can't convert negative number to unsigned long");
3788 return NULL;
3789 }
3790 x2 = (unsigned int)ntohs((unsigned short)x1);
3791 return PyInt_FromLong(x2);
Guido van Rossum006bf911996-06-12 04:04:55 +00003792}
3793
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003794PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003795"ntohs(integer) -> integer\n\
3796\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003797Convert a 16-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003798
3799
Guido van Rossum006bf911996-06-12 04:04:55 +00003800static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003801socket_ntohl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00003802{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003803 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00003804
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003805 if (PyInt_Check(arg)) {
3806 x = PyInt_AS_LONG(arg);
3807 if (x == (unsigned long) -1 && PyErr_Occurred())
3808 return NULL;
3809 if ((long)x < 0) {
3810 PyErr_SetString(PyExc_OverflowError,
3811 "can't convert negative number to unsigned long");
3812 return NULL;
3813 }
3814 }
3815 else if (PyLong_Check(arg)) {
3816 x = PyLong_AsUnsignedLong(arg);
3817 if (x == (unsigned long) -1 && PyErr_Occurred())
3818 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003819#if SIZEOF_LONG > 4
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003820 {
3821 unsigned long y;
3822 /* only want the trailing 32 bits */
3823 y = x & 0xFFFFFFFFUL;
3824 if (y ^ x)
3825 return PyErr_Format(PyExc_OverflowError,
3826 "long int larger than 32 bits");
3827 x = y;
3828 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003829#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003830 }
3831 else
3832 return PyErr_Format(PyExc_TypeError,
3833 "expected int/long, %s found",
3834 Py_TYPE(arg)->tp_name);
3835 if (x == (unsigned long) -1 && PyErr_Occurred())
3836 return NULL;
3837 return PyLong_FromUnsignedLong(ntohl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00003838}
3839
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003840PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003841"ntohl(integer) -> integer\n\
3842\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003843Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003844
3845
Guido van Rossum006bf911996-06-12 04:04:55 +00003846static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003847socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00003848{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003849 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00003850
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003851 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
3852 return NULL;
3853 }
3854 if (x1 < 0) {
3855 PyErr_SetString(PyExc_OverflowError,
3856 "can't convert negative number to unsigned long");
3857 return NULL;
3858 }
3859 x2 = (unsigned int)htons((unsigned short)x1);
3860 return PyInt_FromLong(x2);
Guido van Rossum006bf911996-06-12 04:04:55 +00003861}
3862
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003863PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003864"htons(integer) -> integer\n\
3865\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003866Convert a 16-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003867
3868
Guido van Rossum006bf911996-06-12 04:04:55 +00003869static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003870socket_htonl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00003871{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003872 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00003873
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003874 if (PyInt_Check(arg)) {
3875 x = PyInt_AS_LONG(arg);
3876 if (x == (unsigned long) -1 && PyErr_Occurred())
3877 return NULL;
3878 if ((long)x < 0) {
3879 PyErr_SetString(PyExc_OverflowError,
3880 "can't convert negative number to unsigned long");
3881 return NULL;
3882 }
3883 }
3884 else if (PyLong_Check(arg)) {
3885 x = PyLong_AsUnsignedLong(arg);
3886 if (x == (unsigned long) -1 && PyErr_Occurred())
3887 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003888#if SIZEOF_LONG > 4
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003889 {
3890 unsigned long y;
3891 /* only want the trailing 32 bits */
3892 y = x & 0xFFFFFFFFUL;
3893 if (y ^ x)
3894 return PyErr_Format(PyExc_OverflowError,
3895 "long int larger than 32 bits");
3896 x = y;
3897 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003898#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003899 }
3900 else
3901 return PyErr_Format(PyExc_TypeError,
3902 "expected int/long, %s found",
3903 Py_TYPE(arg)->tp_name);
3904 return PyLong_FromUnsignedLong(htonl((unsigned long)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00003905}
3906
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003907PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003908"htonl(integer) -> integer\n\
3909\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003910Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003911
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003912/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003913
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003914PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003915"inet_aton(string) -> packed 32-bit IP representation\n\
3916\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003917Convert 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 +00003918binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003919
3920static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003921socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003922{
Guido van Rossuma2e48551999-09-09 15:42:59 +00003923#ifndef INADDR_NONE
3924#define INADDR_NONE (-1)
3925#endif
Neal Norwitz88f115b2003-02-13 02:15:42 +00003926#ifdef HAVE_INET_ATON
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003927 struct in_addr buf;
Ronald Oussorend06b6f22006-04-23 11:59:25 +00003928#endif
3929
3930#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
Gregory P. Smith3605b5c2009-02-11 23:45:25 +00003931#if (SIZEOF_INT != 4)
3932#error "Not sure if in_addr_t exists and int is not 32-bits."
3933#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003934 /* Have to use inet_addr() instead */
3935 unsigned int packed_addr;
Tim Peters1df9fdd2003-02-13 03:13:40 +00003936#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003937 char *ip_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003938
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003939 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))
3940 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003941
Tim Peters1df9fdd2003-02-13 03:13:40 +00003942
3943#ifdef HAVE_INET_ATON
Ronald Oussorend06b6f22006-04-23 11:59:25 +00003944
3945#ifdef USE_INET_ATON_WEAKLINK
3946 if (inet_aton != NULL) {
3947#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003948 if (inet_aton(ip_addr, &buf))
3949 return PyString_FromStringAndSize((char *)(&buf),
3950 sizeof(buf));
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003951
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003952 PyErr_SetString(socket_error,
3953 "illegal IP address string passed to inet_aton");
3954 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003955
Ronald Oussorend06b6f22006-04-23 11:59:25 +00003956#ifdef USE_INET_ATON_WEAKLINK
3957 } else {
3958#endif
3959
3960#endif
3961
3962#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
3963
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003964 /* special-case this address as inet_addr might return INADDR_NONE
3965 * for this */
3966 if (strcmp(ip_addr, "255.255.255.255") == 0) {
3967 packed_addr = 0xFFFFFFFF;
3968 } else {
Martin Blais2856e5f2006-05-26 12:03:27 +00003969
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003970 packed_addr = inet_addr(ip_addr);
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003971
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003972 if (packed_addr == INADDR_NONE) { /* invalid address */
3973 PyErr_SetString(socket_error,
3974 "illegal IP address string passed to inet_aton");
3975 return NULL;
3976 }
3977 }
3978 return PyString_FromStringAndSize((char *) &packed_addr,
3979 sizeof(packed_addr));
Ronald Oussorend06b6f22006-04-23 11:59:25 +00003980
3981#ifdef USE_INET_ATON_WEAKLINK
3982 }
3983#endif
3984
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003985#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003986}
3987
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003988PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00003989"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003990\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003991Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003992
3993static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003994socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003995{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003996 char *packed_str;
3997 int addr_len;
3998 struct in_addr packed_addr;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003999
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004000 if (!PyArg_ParseTuple(args, "s#:inet_ntoa", &packed_str, &addr_len)) {
4001 return NULL;
4002 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00004003
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004004 if (addr_len != sizeof(packed_addr)) {
4005 PyErr_SetString(socket_error,
4006 "packed IP wrong length for inet_ntoa");
4007 return NULL;
4008 }
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004009
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004010 memcpy(&packed_addr, packed_str, addr_len);
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004011
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004012 return PyString_FromString(inet_ntoa(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004013}
Guido van Rossum82a5c661998-07-07 20:45:43 +00004014
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004015#ifdef HAVE_INET_PTON
4016
4017PyDoc_STRVAR(inet_pton_doc,
4018"inet_pton(af, ip) -> packed IP address string\n\
4019\n\
4020Convert an IP address from string format to a packed string suitable\n\
4021for use with low-level network functions.");
4022
4023static PyObject *
4024socket_inet_pton(PyObject *self, PyObject *args)
4025{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004026 int af;
4027 char* ip;
4028 int retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004029#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004030 char packed[MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004031#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004032 char packed[sizeof(struct in_addr)];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004033#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004034 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
4035 return NULL;
4036 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004037
Martin v. Löwis04697e82004-06-02 12:35:29 +00004038#if !defined(ENABLE_IPV6) && defined(AF_INET6)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004039 if(af == AF_INET6) {
4040 PyErr_SetString(socket_error,
4041 "can't use AF_INET6, IPv6 is disabled");
4042 return NULL;
4043 }
Martin Blais2856e5f2006-05-26 12:03:27 +00004044#endif
Martin v. Löwis10649092003-08-05 06:25:06 +00004045
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004046 retval = inet_pton(af, ip, packed);
4047 if (retval < 0) {
4048 PyErr_SetFromErrno(socket_error);
4049 return NULL;
4050 } else if (retval == 0) {
4051 PyErr_SetString(socket_error,
4052 "illegal IP address string passed to inet_pton");
4053 return NULL;
4054 } else if (af == AF_INET) {
4055 return PyString_FromStringAndSize(packed,
4056 sizeof(struct in_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004057#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004058 } else if (af == AF_INET6) {
4059 return PyString_FromStringAndSize(packed,
4060 sizeof(struct in6_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004061#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004062 } else {
4063 PyErr_SetString(socket_error, "unknown address family");
4064 return NULL;
4065 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004066}
Martin Blais2856e5f2006-05-26 12:03:27 +00004067
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004068PyDoc_STRVAR(inet_ntop_doc,
4069"inet_ntop(af, packed_ip) -> string formatted IP address\n\
4070\n\
4071Convert a packed IP address of the given family to string format.");
4072
4073static PyObject *
4074socket_inet_ntop(PyObject *self, PyObject *args)
4075{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004076 int af;
4077 char* packed;
4078 int len;
4079 const char* retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004080#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004081 char ip[MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004082#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004083 char ip[INET_ADDRSTRLEN + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004084#endif
Martin Blais2856e5f2006-05-26 12:03:27 +00004085
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004086 /* Guarantee NUL-termination for PyString_FromString() below */
4087 memset((void *) &ip[0], '\0', sizeof(ip));
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004088
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004089 if (!PyArg_ParseTuple(args, "is#:inet_ntop", &af, &packed, &len)) {
4090 return NULL;
4091 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004092
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004093 if (af == AF_INET) {
4094 if (len != sizeof(struct in_addr)) {
4095 PyErr_SetString(PyExc_ValueError,
4096 "invalid length of packed IP address string");
4097 return NULL;
4098 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004099#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004100 } else if (af == AF_INET6) {
4101 if (len != sizeof(struct in6_addr)) {
4102 PyErr_SetString(PyExc_ValueError,
4103 "invalid length of packed IP address string");
4104 return NULL;
4105 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004106#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004107 } else {
4108 PyErr_Format(PyExc_ValueError,
4109 "unknown address family %d", af);
4110 return NULL;
4111 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004112
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004113 retval = inet_ntop(af, packed, ip, sizeof(ip));
4114 if (!retval) {
4115 PyErr_SetFromErrno(socket_error);
4116 return NULL;
4117 } else {
4118 return PyString_FromString(retval);
4119 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004120
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004121 /* NOTREACHED */
4122 PyErr_SetString(PyExc_RuntimeError, "invalid handling of inet_ntop");
4123 return NULL;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004124}
4125
4126#endif /* HAVE_INET_PTON */
4127
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004128/* Python interface to getaddrinfo(host, port). */
4129
4130/*ARGSUSED*/
4131static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004132socket_getaddrinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004133{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004134 struct addrinfo hints, *res;
4135 struct addrinfo *res0 = NULL;
4136 PyObject *hobj = NULL;
4137 PyObject *pobj = (PyObject *)NULL;
4138 char pbuf[30];
4139 char *hptr, *pptr;
4140 int family, socktype, protocol, flags;
4141 int error;
4142 PyObject *all = (PyObject *)NULL;
4143 PyObject *single = (PyObject *)NULL;
4144 PyObject *idna = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004145
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004146 family = socktype = protocol = flags = 0;
4147 family = AF_UNSPEC;
4148 if (!PyArg_ParseTuple(args, "OO|iiii:getaddrinfo",
4149 &hobj, &pobj, &family, &socktype,
4150 &protocol, &flags)) {
4151 return NULL;
4152 }
4153 if (hobj == Py_None) {
4154 hptr = NULL;
4155 } else if (PyUnicode_Check(hobj)) {
4156 idna = PyObject_CallMethod(hobj, "encode", "s", "idna");
4157 if (!idna)
4158 return NULL;
4159 hptr = PyString_AsString(idna);
4160 } else if (PyString_Check(hobj)) {
4161 hptr = PyString_AsString(hobj);
4162 } else {
4163 PyErr_SetString(PyExc_TypeError,
4164 "getaddrinfo() argument 1 must be string or None");
4165 return NULL;
4166 }
Petri Lehtinenab7dd182012-12-20 21:06:14 +02004167 if (PyInt_Check(pobj) || PyLong_Check(pobj)) {
4168 long value = PyLong_AsLong(pobj);
4169 if (value == -1 && PyErr_Occurred())
4170 return NULL;
4171 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", value);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004172 pptr = pbuf;
4173 } else if (PyString_Check(pobj)) {
4174 pptr = PyString_AsString(pobj);
4175 } else if (pobj == Py_None) {
4176 pptr = (char *)NULL;
4177 } else {
Petri Lehtinenab7dd182012-12-20 21:06:14 +02004178 PyErr_SetString(socket_error,
4179 "getaddrinfo() argument 2 must be integer or string");
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004180 goto err;
4181 }
4182 memset(&hints, 0, sizeof(hints));
4183 hints.ai_family = family;
4184 hints.ai_socktype = socktype;
4185 hints.ai_protocol = protocol;
4186 hints.ai_flags = flags;
4187 Py_BEGIN_ALLOW_THREADS
4188 ACQUIRE_GETADDRINFO_LOCK
4189 error = getaddrinfo(hptr, pptr, &hints, &res0);
4190 Py_END_ALLOW_THREADS
4191 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
4192 if (error) {
4193 set_gaierror(error);
4194 goto err;
4195 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004196
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004197 if ((all = PyList_New(0)) == NULL)
4198 goto err;
4199 for (res = res0; res; res = res->ai_next) {
4200 PyObject *addr =
4201 makesockaddr(-1, res->ai_addr, res->ai_addrlen, protocol);
4202 if (addr == NULL)
4203 goto err;
4204 single = Py_BuildValue("iiisO", res->ai_family,
4205 res->ai_socktype, res->ai_protocol,
4206 res->ai_canonname ? res->ai_canonname : "",
4207 addr);
4208 Py_DECREF(addr);
4209 if (single == NULL)
4210 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004211
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004212 if (PyList_Append(all, single))
4213 goto err;
4214 Py_XDECREF(single);
4215 }
4216 Py_XDECREF(idna);
4217 if (res0)
4218 freeaddrinfo(res0);
4219 return all;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004220 err:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004221 Py_XDECREF(single);
4222 Py_XDECREF(all);
4223 Py_XDECREF(idna);
4224 if (res0)
4225 freeaddrinfo(res0);
4226 return (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004227}
4228
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004229PyDoc_STRVAR(getaddrinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004230"getaddrinfo(host, port [, family, socktype, proto, flags])\n\
4231 -> list of (family, socktype, proto, canonname, sockaddr)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004232\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004233Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004234
4235/* Python interface to getnameinfo(sa, flags). */
4236
4237/*ARGSUSED*/
4238static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004239socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004240{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004241 PyObject *sa = (PyObject *)NULL;
4242 int flags;
4243 char *hostp;
Charles-François Natali3aa59e32012-01-02 15:38:27 +01004244 int port;
4245 unsigned int flowinfo, scope_id;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004246 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
4247 struct addrinfo hints, *res = NULL;
4248 int error;
4249 PyObject *ret = (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004250
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004251 flags = flowinfo = scope_id = 0;
4252 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
4253 return NULL;
4254 if (!PyTuple_Check(sa)) {
4255 PyErr_SetString(PyExc_TypeError,
4256 "getnameinfo() argument 1 must be a tuple");
4257 return NULL;
4258 }
Charles-François Natali3aa59e32012-01-02 15:38:27 +01004259 if (!PyArg_ParseTuple(sa, "si|II",
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004260 &hostp, &port, &flowinfo, &scope_id))
4261 return NULL;
Charles-François Natali65dd7452012-06-23 10:06:56 +02004262 if (flowinfo > 0xfffff) {
Charles-François Natali3aa59e32012-01-02 15:38:27 +01004263 PyErr_SetString(PyExc_OverflowError,
4264 "getsockaddrarg: flowinfo must be 0-1048575.");
4265 return NULL;
4266 }
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004267 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
4268 memset(&hints, 0, sizeof(hints));
4269 hints.ai_family = AF_UNSPEC;
4270 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
4271 Py_BEGIN_ALLOW_THREADS
4272 ACQUIRE_GETADDRINFO_LOCK
4273 error = getaddrinfo(hostp, pbuf, &hints, &res);
4274 Py_END_ALLOW_THREADS
4275 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
4276 if (error) {
4277 set_gaierror(error);
4278 goto fail;
4279 }
4280 if (res->ai_next) {
4281 PyErr_SetString(socket_error,
4282 "sockaddr resolved to multiple addresses");
4283 goto fail;
4284 }
4285 switch (res->ai_family) {
4286 case AF_INET:
4287 {
4288 if (PyTuple_GET_SIZE(sa) != 2) {
4289 PyErr_SetString(socket_error,
4290 "IPv4 sockaddr must be 2 tuple");
4291 goto fail;
4292 }
4293 break;
4294 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004295#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004296 case AF_INET6:
4297 {
4298 struct sockaddr_in6 *sin6;
4299 sin6 = (struct sockaddr_in6 *)res->ai_addr;
Charles-François Natali3aa59e32012-01-02 15:38:27 +01004300 sin6->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004301 sin6->sin6_scope_id = scope_id;
4302 break;
4303 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004304#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004305 }
4306 error = getnameinfo(res->ai_addr, res->ai_addrlen,
4307 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
4308 if (error) {
4309 set_gaierror(error);
4310 goto fail;
4311 }
4312 ret = Py_BuildValue("ss", hbuf, pbuf);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004313
4314fail:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004315 if (res)
4316 freeaddrinfo(res);
4317 return ret;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004318}
4319
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004320PyDoc_STRVAR(getnameinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004321"getnameinfo(sockaddr, flags) --> (host, port)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004322\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004323Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004324
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004325
4326/* Python API to getting and setting the default timeout value. */
4327
4328static PyObject *
4329socket_getdefaulttimeout(PyObject *self)
4330{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004331 if (defaulttimeout < 0.0) {
4332 Py_INCREF(Py_None);
4333 return Py_None;
4334 }
4335 else
4336 return PyFloat_FromDouble(defaulttimeout);
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004337}
4338
4339PyDoc_STRVAR(getdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004340"getdefaulttimeout() -> timeout\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004341\n\
Ezio Melottica5e9082011-08-14 08:27:36 +03004342Returns the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004343A value of None indicates that new socket objects have no timeout.\n\
4344When the socket module is first imported, the default is None.");
4345
4346static PyObject *
4347socket_setdefaulttimeout(PyObject *self, PyObject *arg)
4348{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004349 double timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004350
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004351 if (arg == Py_None)
4352 timeout = -1.0;
4353 else {
4354 timeout = PyFloat_AsDouble(arg);
4355 if (timeout < 0.0) {
4356 if (!PyErr_Occurred())
4357 PyErr_SetString(PyExc_ValueError,
4358 "Timeout value out of range");
4359 return NULL;
4360 }
4361 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004362
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004363 defaulttimeout = timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004364
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004365 Py_INCREF(Py_None);
4366 return Py_None;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004367}
4368
4369PyDoc_STRVAR(setdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004370"setdefaulttimeout(timeout)\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004371\n\
Ezio Melottica5e9082011-08-14 08:27:36 +03004372Set the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004373A value of None indicates that new socket objects have no timeout.\n\
4374When the socket module is first imported, the default is None.");
4375
4376
Guido van Rossum30a685f1991-06-27 15:51:29 +00004377/* List of functions exported by this module. */
4378
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004379static PyMethodDef socket_methods[] = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004380 {"gethostbyname", socket_gethostbyname,
4381 METH_VARARGS, gethostbyname_doc},
4382 {"gethostbyname_ex", socket_gethostbyname_ex,
4383 METH_VARARGS, ghbn_ex_doc},
4384 {"gethostbyaddr", socket_gethostbyaddr,
4385 METH_VARARGS, gethostbyaddr_doc},
4386 {"gethostname", socket_gethostname,
4387 METH_NOARGS, gethostname_doc},
4388 {"getservbyname", socket_getservbyname,
4389 METH_VARARGS, getservbyname_doc},
4390 {"getservbyport", socket_getservbyport,
4391 METH_VARARGS, getservbyport_doc},
4392 {"getprotobyname", socket_getprotobyname,
4393 METH_VARARGS, getprotobyname_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004394#ifndef NO_DUP
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004395 {"fromfd", socket_fromfd,
4396 METH_VARARGS, fromfd_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004397#endif
Dave Cole331708b2004-08-09 04:51:41 +00004398#ifdef HAVE_SOCKETPAIR
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004399 {"socketpair", socket_socketpair,
4400 METH_VARARGS, socketpair_doc},
Dave Cole331708b2004-08-09 04:51:41 +00004401#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004402 {"ntohs", socket_ntohs,
4403 METH_VARARGS, ntohs_doc},
4404 {"ntohl", socket_ntohl,
4405 METH_O, ntohl_doc},
4406 {"htons", socket_htons,
4407 METH_VARARGS, htons_doc},
4408 {"htonl", socket_htonl,
4409 METH_O, htonl_doc},
4410 {"inet_aton", socket_inet_aton,
4411 METH_VARARGS, inet_aton_doc},
4412 {"inet_ntoa", socket_inet_ntoa,
4413 METH_VARARGS, inet_ntoa_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004414#ifdef HAVE_INET_PTON
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004415 {"inet_pton", socket_inet_pton,
4416 METH_VARARGS, inet_pton_doc},
4417 {"inet_ntop", socket_inet_ntop,
4418 METH_VARARGS, inet_ntop_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004419#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004420 {"getaddrinfo", socket_getaddrinfo,
4421 METH_VARARGS, getaddrinfo_doc},
4422 {"getnameinfo", socket_getnameinfo,
4423 METH_VARARGS, getnameinfo_doc},
4424 {"getdefaulttimeout", (PyCFunction)socket_getdefaulttimeout,
4425 METH_NOARGS, getdefaulttimeout_doc},
4426 {"setdefaulttimeout", socket_setdefaulttimeout,
4427 METH_O, setdefaulttimeout_doc},
4428 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004429};
4430
Guido van Rossum30a685f1991-06-27 15:51:29 +00004431
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004432#ifdef RISCOS
4433#define OS_INIT_DEFINED
Guido van Rossumbe32c891996-06-20 16:25:29 +00004434
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004435static int
4436os_init(void)
4437{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004438 _kernel_swi_regs r;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004439
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004440 r.r[0] = 0;
4441 _kernel_swi(0x43380, &r, &r);
4442 taskwindow = r.r[0];
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004443
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004444 return 1;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004445}
4446
4447#endif /* RISCOS */
4448
4449
4450#ifdef MS_WINDOWS
4451#define OS_INIT_DEFINED
4452
4453/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00004454
4455static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004456os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00004457{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004458 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00004459}
4460
4461static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004462os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00004463{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004464 WSADATA WSAData;
4465 int ret;
4466 char buf[100];
4467 ret = WSAStartup(0x0101, &WSAData);
4468 switch (ret) {
4469 case 0: /* No error */
4470 Py_AtExit(os_cleanup);
4471 return 1; /* Success */
4472 case WSASYSNOTREADY:
4473 PyErr_SetString(PyExc_ImportError,
4474 "WSAStartup failed: network not ready");
4475 break;
4476 case WSAVERNOTSUPPORTED:
4477 case WSAEINVAL:
4478 PyErr_SetString(
4479 PyExc_ImportError,
4480 "WSAStartup failed: requested version not supported");
4481 break;
4482 default:
4483 PyOS_snprintf(buf, sizeof(buf),
4484 "WSAStartup failed: error code %d", ret);
4485 PyErr_SetString(PyExc_ImportError, buf);
4486 break;
4487 }
4488 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00004489}
4490
Guido van Rossum8d665e61996-06-26 18:22:49 +00004491#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00004492
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004493
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004494#ifdef PYOS_OS2
4495#define OS_INIT_DEFINED
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004496
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004497/* Additional initialization for OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004498
4499static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004500os_init(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004501{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004502#ifndef PYCC_GCC
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004503 char reason[64];
4504 int rc = sock_init();
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004505
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004506 if (rc == 0) {
4507 return 1; /* Success */
4508 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004509
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004510 PyOS_snprintf(reason, sizeof(reason),
4511 "OS/2 TCP/IP Error# %d", sock_errno());
4512 PyErr_SetString(PyExc_ImportError, reason);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004513
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004514 return 0; /* Failure */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00004515#else
Ezio Melottic2077b02011-03-16 12:34:31 +02004516 /* No need to initialize sockets with GCC/EMX */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004517 return 1; /* Success */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00004518#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004519}
4520
4521#endif /* PYOS_OS2 */
4522
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004523
4524#ifndef OS_INIT_DEFINED
4525static int
4526os_init(void)
4527{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004528 return 1; /* Success */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004529}
4530#endif
4531
4532
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00004533/* C API table - always add new things to the end for binary
4534 compatibility. */
4535static
4536PySocketModule_APIObject PySocketModuleAPI =
4537{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004538 &sock_type,
4539 NULL
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00004540};
4541
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004542
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004543/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004544
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004545 This module is actually called "_socket", and there's a wrapper
4546 "socket.py" which implements some additional functionality. On some
4547 platforms (e.g. Windows and OS/2), socket.py also implements a
4548 wrapper for the socket type that provides missing functionality such
4549 as makefile(), dup() and fromfd(). The import of "_socket" may fail
4550 with an ImportError exception if os-specific initialization fails.
4551 On Windows, this does WINSOCK initialization. When WINSOCK is
Ezio Melottic2077b02011-03-16 12:34:31 +02004552 initialized successfully, a call to WSACleanup() is scheduled to be
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004553 made at exit time.
4554*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004555
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004556PyDoc_STRVAR(socket_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004557"Implementation module for socket operations.\n\
4558\n\
4559See the socket module for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004560
Mark Hammondfe51c6d2002-08-02 02:27:13 +00004561PyMODINIT_FUNC
Thomas Wouters1e0c2f42000-07-24 16:06:23 +00004562init_socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004563{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004564 PyObject *m, *has_ipv6;
Fred Drake4baedc12002-04-01 14:53:37 +00004565
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004566 if (!os_init())
4567 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004568
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004569 Py_TYPE(&sock_type) = &PyType_Type;
4570 m = Py_InitModule3(PySocket_MODULE_NAME,
4571 socket_methods,
4572 socket_doc);
4573 if (m == NULL)
4574 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004575
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004576 socket_error = PyErr_NewException("socket.error",
4577 PyExc_IOError, NULL);
4578 if (socket_error == NULL)
4579 return;
4580 PySocketModuleAPI.error = socket_error;
4581 Py_INCREF(socket_error);
4582 PyModule_AddObject(m, "error", socket_error);
4583 socket_herror = PyErr_NewException("socket.herror",
4584 socket_error, NULL);
4585 if (socket_herror == NULL)
4586 return;
4587 Py_INCREF(socket_herror);
4588 PyModule_AddObject(m, "herror", socket_herror);
4589 socket_gaierror = PyErr_NewException("socket.gaierror", socket_error,
4590 NULL);
4591 if (socket_gaierror == NULL)
4592 return;
4593 Py_INCREF(socket_gaierror);
4594 PyModule_AddObject(m, "gaierror", socket_gaierror);
4595 socket_timeout = PyErr_NewException("socket.timeout",
4596 socket_error, NULL);
4597 if (socket_timeout == NULL)
4598 return;
4599 Py_INCREF(socket_timeout);
4600 PyModule_AddObject(m, "timeout", socket_timeout);
4601 Py_INCREF((PyObject *)&sock_type);
4602 if (PyModule_AddObject(m, "SocketType",
4603 (PyObject *)&sock_type) != 0)
4604 return;
4605 Py_INCREF((PyObject *)&sock_type);
4606 if (PyModule_AddObject(m, "socket",
4607 (PyObject *)&sock_type) != 0)
4608 return;
Guido van Rossum09be4091999-08-09 14:40:40 +00004609
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004610#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004611 has_ipv6 = Py_True;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004612#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004613 has_ipv6 = Py_False;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004614#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004615 Py_INCREF(has_ipv6);
4616 PyModule_AddObject(m, "has_ipv6", has_ipv6);
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004617
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004618 /* Export C API */
4619 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
4620 PyCapsule_New(&PySocketModuleAPI, PySocket_CAPSULE_NAME, NULL)
4621 ) != 0)
4622 return;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00004623
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004624 /* Address families (we only support AF_INET and AF_UNIX) */
Guido van Rossum09be4091999-08-09 14:40:40 +00004625#ifdef AF_UNSPEC
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004626 PyModule_AddIntConstant(m, "AF_UNSPEC", AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00004627#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004628 PyModule_AddIntConstant(m, "AF_INET", AF_INET);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004629#ifdef AF_INET6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004630 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004631#endif /* AF_INET6 */
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00004632#if defined(AF_UNIX)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004633 PyModule_AddIntConstant(m, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00004634#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00004635#ifdef AF_AX25
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004636 /* Amateur Radio AX.25 */
4637 PyModule_AddIntConstant(m, "AF_AX25", AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00004638#endif
4639#ifdef AF_IPX
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004640 PyModule_AddIntConstant(m, "AF_IPX", AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00004641#endif
4642#ifdef AF_APPLETALK
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004643 /* Appletalk DDP */
4644 PyModule_AddIntConstant(m, "AF_APPLETALK", AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00004645#endif
4646#ifdef AF_NETROM
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004647 /* Amateur radio NetROM */
4648 PyModule_AddIntConstant(m, "AF_NETROM", AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00004649#endif
4650#ifdef AF_BRIDGE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004651 /* Multiprotocol bridge */
4652 PyModule_AddIntConstant(m, "AF_BRIDGE", AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00004653#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004654#ifdef AF_ATMPVC
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004655 /* ATM PVCs */
4656 PyModule_AddIntConstant(m, "AF_ATMPVC", AF_ATMPVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004657#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00004658#ifdef AF_AAL5
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004659 /* Reserved for Werner's ATM */
4660 PyModule_AddIntConstant(m, "AF_AAL5", AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00004661#endif
4662#ifdef AF_X25
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004663 /* Reserved for X.25 project */
4664 PyModule_AddIntConstant(m, "AF_X25", AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00004665#endif
4666#ifdef AF_INET6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004667 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00004668#endif
4669#ifdef AF_ROSE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004670 /* Amateur Radio X.25 PLP */
4671 PyModule_AddIntConstant(m, "AF_ROSE", AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00004672#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004673#ifdef AF_DECnet
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004674 /* Reserved for DECnet project */
4675 PyModule_AddIntConstant(m, "AF_DECnet", AF_DECnet);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004676#endif
4677#ifdef AF_NETBEUI
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004678 /* Reserved for 802.2LLC project */
4679 PyModule_AddIntConstant(m, "AF_NETBEUI", AF_NETBEUI);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004680#endif
4681#ifdef AF_SECURITY
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004682 /* Security callback pseudo AF */
4683 PyModule_AddIntConstant(m, "AF_SECURITY", AF_SECURITY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004684#endif
4685#ifdef AF_KEY
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004686 /* PF_KEY key management API */
4687 PyModule_AddIntConstant(m, "AF_KEY", AF_KEY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004688#endif
4689#ifdef AF_NETLINK
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004690 /* */
4691 PyModule_AddIntConstant(m, "AF_NETLINK", AF_NETLINK);
4692 PyModule_AddIntConstant(m, "NETLINK_ROUTE", NETLINK_ROUTE);
Martin v. Löwis5fe60e72006-04-06 22:29:33 +00004693#ifdef NETLINK_SKIP
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004694 PyModule_AddIntConstant(m, "NETLINK_SKIP", NETLINK_SKIP);
Martin v. Löwis5fe60e72006-04-06 22:29:33 +00004695#endif
4696#ifdef NETLINK_W1
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004697 PyModule_AddIntConstant(m, "NETLINK_W1", NETLINK_W1);
Martin v. Löwis5fe60e72006-04-06 22:29:33 +00004698#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004699 PyModule_AddIntConstant(m, "NETLINK_USERSOCK", NETLINK_USERSOCK);
4700 PyModule_AddIntConstant(m, "NETLINK_FIREWALL", NETLINK_FIREWALL);
Guido van Rossum668a94a2006-02-21 01:07:27 +00004701#ifdef NETLINK_TCPDIAG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004702 PyModule_AddIntConstant(m, "NETLINK_TCPDIAG", NETLINK_TCPDIAG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00004703#endif
4704#ifdef NETLINK_NFLOG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004705 PyModule_AddIntConstant(m, "NETLINK_NFLOG", NETLINK_NFLOG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00004706#endif
Neal Norwitz65851662006-01-16 04:31:40 +00004707#ifdef NETLINK_XFRM
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004708 PyModule_AddIntConstant(m, "NETLINK_XFRM", NETLINK_XFRM);
Neal Norwitz65851662006-01-16 04:31:40 +00004709#endif
Martin v. Löwis5fe60e72006-04-06 22:29:33 +00004710#ifdef NETLINK_ARPD
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004711 PyModule_AddIntConstant(m, "NETLINK_ARPD", NETLINK_ARPD);
Martin v. Löwis5fe60e72006-04-06 22:29:33 +00004712#endif
4713#ifdef NETLINK_ROUTE6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004714 PyModule_AddIntConstant(m, "NETLINK_ROUTE6", NETLINK_ROUTE6);
Martin v. Löwis5fe60e72006-04-06 22:29:33 +00004715#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004716 PyModule_AddIntConstant(m, "NETLINK_IP6_FW", NETLINK_IP6_FW);
Martin v. Löwisb1cc1d42007-02-13 12:14:19 +00004717#ifdef NETLINK_DNRTMSG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004718 PyModule_AddIntConstant(m, "NETLINK_DNRTMSG", NETLINK_DNRTMSG);
4719#endif
Martin v. Löwis5fe60e72006-04-06 22:29:33 +00004720#ifdef NETLINK_TAPBASE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004721 PyModule_AddIntConstant(m, "NETLINK_TAPBASE", NETLINK_TAPBASE);
Martin v. Löwis5fe60e72006-04-06 22:29:33 +00004722#endif
Georg Brandldcfdae72006-04-01 07:33:08 +00004723#endif /* AF_NETLINK */
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004724#ifdef AF_ROUTE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004725 /* Alias to emulate 4.4BSD */
4726 PyModule_AddIntConstant(m, "AF_ROUTE", AF_ROUTE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004727#endif
4728#ifdef AF_ASH
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004729 /* Ash */
4730 PyModule_AddIntConstant(m, "AF_ASH", AF_ASH);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004731#endif
4732#ifdef AF_ECONET
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004733 /* Acorn Econet */
4734 PyModule_AddIntConstant(m, "AF_ECONET", AF_ECONET);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004735#endif
4736#ifdef AF_ATMSVC
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004737 /* ATM SVCs */
4738 PyModule_AddIntConstant(m, "AF_ATMSVC", AF_ATMSVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004739#endif
4740#ifdef AF_SNA
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004741 /* Linux SNA Project (nutters!) */
4742 PyModule_AddIntConstant(m, "AF_SNA", AF_SNA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004743#endif
4744#ifdef AF_IRDA
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004745 /* IRDA sockets */
4746 PyModule_AddIntConstant(m, "AF_IRDA", AF_IRDA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004747#endif
4748#ifdef AF_PPPOX
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004749 /* PPPoX sockets */
4750 PyModule_AddIntConstant(m, "AF_PPPOX", AF_PPPOX);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004751#endif
4752#ifdef AF_WANPIPE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004753 /* Wanpipe API Sockets */
4754 PyModule_AddIntConstant(m, "AF_WANPIPE", AF_WANPIPE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004755#endif
4756#ifdef AF_LLC
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004757 /* Linux LLC */
4758 PyModule_AddIntConstant(m, "AF_LLC", AF_LLC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004759#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00004760
Hye-Shik Chang81268602004-02-02 06:05:24 +00004761#ifdef USE_BLUETOOTH
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004762 PyModule_AddIntConstant(m, "AF_BLUETOOTH", AF_BLUETOOTH);
4763 PyModule_AddIntConstant(m, "BTPROTO_L2CAP", BTPROTO_L2CAP);
4764 PyModule_AddIntConstant(m, "BTPROTO_HCI", BTPROTO_HCI);
4765 PyModule_AddIntConstant(m, "SOL_HCI", SOL_HCI);
Gregory P. Smith886a1cd2010-10-17 04:28:14 +00004766#if !defined(__NetBSD__) && !defined(__DragonFly__)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004767 PyModule_AddIntConstant(m, "HCI_FILTER", HCI_FILTER);
Gregory P. Smith886a1cd2010-10-17 04:28:14 +00004768#endif
Hye-Shik Chang81268602004-02-02 06:05:24 +00004769#if !defined(__FreeBSD__)
Gregory P. Smith886a1cd2010-10-17 04:28:14 +00004770#if !defined(__NetBSD__) && !defined(__DragonFly__)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004771 PyModule_AddIntConstant(m, "HCI_TIME_STAMP", HCI_TIME_STAMP);
Gregory P. Smith886a1cd2010-10-17 04:28:14 +00004772#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004773 PyModule_AddIntConstant(m, "HCI_DATA_DIR", HCI_DATA_DIR);
4774 PyModule_AddIntConstant(m, "BTPROTO_SCO", BTPROTO_SCO);
Hye-Shik Chang81268602004-02-02 06:05:24 +00004775#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004776 PyModule_AddIntConstant(m, "BTPROTO_RFCOMM", BTPROTO_RFCOMM);
4777 PyModule_AddStringConstant(m, "BDADDR_ANY", "00:00:00:00:00:00");
4778 PyModule_AddStringConstant(m, "BDADDR_LOCAL", "00:00:00:FF:FF:FF");
Martin v. Löwis12af0482004-01-31 12:34:17 +00004779#endif
4780
Antoine Pitroue0c5f3c2010-10-27 20:35:26 +00004781#ifdef AF_PACKET
4782 PyModule_AddIntMacro(m, AF_PACKET);
4783#endif
4784#ifdef PF_PACKET
4785 PyModule_AddIntMacro(m, PF_PACKET);
4786#endif
4787#ifdef PACKET_HOST
4788 PyModule_AddIntMacro(m, PACKET_HOST);
4789#endif
4790#ifdef PACKET_BROADCAST
4791 PyModule_AddIntMacro(m, PACKET_BROADCAST);
4792#endif
4793#ifdef PACKET_MULTICAST
4794 PyModule_AddIntMacro(m, PACKET_MULTICAST);
4795#endif
4796#ifdef PACKET_OTHERHOST
4797 PyModule_AddIntMacro(m, PACKET_OTHERHOST);
4798#endif
4799#ifdef PACKET_OUTGOING
4800 PyModule_AddIntMacro(m, PACKET_OUTGOING);
4801#endif
4802#ifdef PACKET_LOOPBACK
4803 PyModule_AddIntMacro(m, PACKET_LOOPBACK);
4804#endif
4805#ifdef PACKET_FASTROUTE
4806 PyModule_AddIntMacro(m, PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00004807#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00004808
Christian Heimesfb2d25a2008-01-07 16:12:44 +00004809#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004810 PyModule_AddIntConstant(m, "AF_TIPC", AF_TIPC);
Christian Heimesfb2d25a2008-01-07 16:12:44 +00004811
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004812 /* for addresses */
4813 PyModule_AddIntConstant(m, "TIPC_ADDR_NAMESEQ", TIPC_ADDR_NAMESEQ);
4814 PyModule_AddIntConstant(m, "TIPC_ADDR_NAME", TIPC_ADDR_NAME);
4815 PyModule_AddIntConstant(m, "TIPC_ADDR_ID", TIPC_ADDR_ID);
Christian Heimesfb2d25a2008-01-07 16:12:44 +00004816
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004817 PyModule_AddIntConstant(m, "TIPC_ZONE_SCOPE", TIPC_ZONE_SCOPE);
4818 PyModule_AddIntConstant(m, "TIPC_CLUSTER_SCOPE", TIPC_CLUSTER_SCOPE);
4819 PyModule_AddIntConstant(m, "TIPC_NODE_SCOPE", TIPC_NODE_SCOPE);
Christian Heimesfb2d25a2008-01-07 16:12:44 +00004820
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004821 /* for setsockopt() */
4822 PyModule_AddIntConstant(m, "SOL_TIPC", SOL_TIPC);
4823 PyModule_AddIntConstant(m, "TIPC_IMPORTANCE", TIPC_IMPORTANCE);
4824 PyModule_AddIntConstant(m, "TIPC_SRC_DROPPABLE", TIPC_SRC_DROPPABLE);
4825 PyModule_AddIntConstant(m, "TIPC_DEST_DROPPABLE",
4826 TIPC_DEST_DROPPABLE);
4827 PyModule_AddIntConstant(m, "TIPC_CONN_TIMEOUT", TIPC_CONN_TIMEOUT);
Christian Heimesfb2d25a2008-01-07 16:12:44 +00004828
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004829 PyModule_AddIntConstant(m, "TIPC_LOW_IMPORTANCE",
4830 TIPC_LOW_IMPORTANCE);
4831 PyModule_AddIntConstant(m, "TIPC_MEDIUM_IMPORTANCE",
4832 TIPC_MEDIUM_IMPORTANCE);
4833 PyModule_AddIntConstant(m, "TIPC_HIGH_IMPORTANCE",
4834 TIPC_HIGH_IMPORTANCE);
4835 PyModule_AddIntConstant(m, "TIPC_CRITICAL_IMPORTANCE",
4836 TIPC_CRITICAL_IMPORTANCE);
Christian Heimesfb2d25a2008-01-07 16:12:44 +00004837
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004838 /* for subscriptions */
4839 PyModule_AddIntConstant(m, "TIPC_SUB_PORTS", TIPC_SUB_PORTS);
4840 PyModule_AddIntConstant(m, "TIPC_SUB_SERVICE", TIPC_SUB_SERVICE);
Georg Brandlff15c862008-01-11 09:19:11 +00004841#ifdef TIPC_SUB_CANCEL
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004842 /* doesn't seem to be available everywhere */
4843 PyModule_AddIntConstant(m, "TIPC_SUB_CANCEL", TIPC_SUB_CANCEL);
Georg Brandlff15c862008-01-11 09:19:11 +00004844#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004845 PyModule_AddIntConstant(m, "TIPC_WAIT_FOREVER", TIPC_WAIT_FOREVER);
4846 PyModule_AddIntConstant(m, "TIPC_PUBLISHED", TIPC_PUBLISHED);
4847 PyModule_AddIntConstant(m, "TIPC_WITHDRAWN", TIPC_WITHDRAWN);
4848 PyModule_AddIntConstant(m, "TIPC_SUBSCR_TIMEOUT", TIPC_SUBSCR_TIMEOUT);
4849 PyModule_AddIntConstant(m, "TIPC_CFG_SRV", TIPC_CFG_SRV);
4850 PyModule_AddIntConstant(m, "TIPC_TOP_SRV", TIPC_TOP_SRV);
Christian Heimesfb2d25a2008-01-07 16:12:44 +00004851#endif
4852
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004853 /* Socket types */
4854 PyModule_AddIntConstant(m, "SOCK_STREAM", SOCK_STREAM);
4855 PyModule_AddIntConstant(m, "SOCK_DGRAM", SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00004856#ifndef __BEOS__
4857/* We have incomplete socket support. */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004858 PyModule_AddIntConstant(m, "SOCK_RAW", SOCK_RAW);
4859 PyModule_AddIntConstant(m, "SOCK_SEQPACKET", SOCK_SEQPACKET);
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00004860#if defined(SOCK_RDM)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004861 PyModule_AddIntConstant(m, "SOCK_RDM", SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00004862#endif
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00004863#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004864
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004865#ifdef SO_DEBUG
4866 PyModule_AddIntConstant(m, "SO_DEBUG", SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004867#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004868#ifdef SO_ACCEPTCONN
4869 PyModule_AddIntConstant(m, "SO_ACCEPTCONN", SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004870#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004871#ifdef SO_REUSEADDR
4872 PyModule_AddIntConstant(m, "SO_REUSEADDR", SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004873#endif
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00004874#ifdef SO_EXCLUSIVEADDRUSE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004875 PyModule_AddIntConstant(m, "SO_EXCLUSIVEADDRUSE", SO_EXCLUSIVEADDRUSE);
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00004876#endif
4877
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004878#ifdef SO_KEEPALIVE
4879 PyModule_AddIntConstant(m, "SO_KEEPALIVE", SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004880#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004881#ifdef SO_DONTROUTE
4882 PyModule_AddIntConstant(m, "SO_DONTROUTE", SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004883#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004884#ifdef SO_BROADCAST
4885 PyModule_AddIntConstant(m, "SO_BROADCAST", SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004886#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004887#ifdef SO_USELOOPBACK
4888 PyModule_AddIntConstant(m, "SO_USELOOPBACK", SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004889#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004890#ifdef SO_LINGER
4891 PyModule_AddIntConstant(m, "SO_LINGER", SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004892#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004893#ifdef SO_OOBINLINE
4894 PyModule_AddIntConstant(m, "SO_OOBINLINE", SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004895#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004896#ifdef SO_REUSEPORT
4897 PyModule_AddIntConstant(m, "SO_REUSEPORT", SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004898#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004899#ifdef SO_SNDBUF
4900 PyModule_AddIntConstant(m, "SO_SNDBUF", SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004901#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004902#ifdef SO_RCVBUF
4903 PyModule_AddIntConstant(m, "SO_RCVBUF", SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004904#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004905#ifdef SO_SNDLOWAT
4906 PyModule_AddIntConstant(m, "SO_SNDLOWAT", SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004907#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004908#ifdef SO_RCVLOWAT
4909 PyModule_AddIntConstant(m, "SO_RCVLOWAT", SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004910#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004911#ifdef SO_SNDTIMEO
4912 PyModule_AddIntConstant(m, "SO_SNDTIMEO", SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004913#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004914#ifdef SO_RCVTIMEO
4915 PyModule_AddIntConstant(m, "SO_RCVTIMEO", SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004916#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004917#ifdef SO_ERROR
4918 PyModule_AddIntConstant(m, "SO_ERROR", SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004919#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004920#ifdef SO_TYPE
4921 PyModule_AddIntConstant(m, "SO_TYPE", SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004922#endif
Larry Hastings3b958e32010-04-02 11:18:17 +00004923#ifdef SO_SETFIB
4924 PyModule_AddIntConstant(m, "SO_SETFIB", SO_SETFIB);
4925#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004926
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004927 /* Maximum number of connections for "listen" */
4928#ifdef SOMAXCONN
4929 PyModule_AddIntConstant(m, "SOMAXCONN", SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004930#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004931 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004932#endif
4933
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004934 /* Flags for send, recv */
4935#ifdef MSG_OOB
4936 PyModule_AddIntConstant(m, "MSG_OOB", MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004937#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004938#ifdef MSG_PEEK
4939 PyModule_AddIntConstant(m, "MSG_PEEK", MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004940#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004941#ifdef MSG_DONTROUTE
4942 PyModule_AddIntConstant(m, "MSG_DONTROUTE", MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004943#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004944#ifdef MSG_DONTWAIT
4945 PyModule_AddIntConstant(m, "MSG_DONTWAIT", MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00004946#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004947#ifdef MSG_EOR
4948 PyModule_AddIntConstant(m, "MSG_EOR", MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004949#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004950#ifdef MSG_TRUNC
4951 PyModule_AddIntConstant(m, "MSG_TRUNC", MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004952#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004953#ifdef MSG_CTRUNC
4954 PyModule_AddIntConstant(m, "MSG_CTRUNC", MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004955#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004956#ifdef MSG_WAITALL
4957 PyModule_AddIntConstant(m, "MSG_WAITALL", MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004958#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004959#ifdef MSG_BTAG
4960 PyModule_AddIntConstant(m, "MSG_BTAG", MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004961#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004962#ifdef MSG_ETAG
4963 PyModule_AddIntConstant(m, "MSG_ETAG", MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004964#endif
4965
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004966 /* Protocol level and numbers, usable for [gs]etsockopt */
4967#ifdef SOL_SOCKET
4968 PyModule_AddIntConstant(m, "SOL_SOCKET", SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004969#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004970#ifdef SOL_IP
4971 PyModule_AddIntConstant(m, "SOL_IP", SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00004972#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004973 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00004974#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004975#ifdef SOL_IPX
4976 PyModule_AddIntConstant(m, "SOL_IPX", SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00004977#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004978#ifdef SOL_AX25
4979 PyModule_AddIntConstant(m, "SOL_AX25", SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00004980#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004981#ifdef SOL_ATALK
4982 PyModule_AddIntConstant(m, "SOL_ATALK", SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00004983#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004984#ifdef SOL_NETROM
4985 PyModule_AddIntConstant(m, "SOL_NETROM", SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00004986#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004987#ifdef SOL_ROSE
4988 PyModule_AddIntConstant(m, "SOL_ROSE", SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00004989#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004990#ifdef SOL_TCP
4991 PyModule_AddIntConstant(m, "SOL_TCP", SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00004992#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004993 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00004994#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004995#ifdef SOL_UDP
4996 PyModule_AddIntConstant(m, "SOL_UDP", SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00004997#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004998 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00004999#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005000#ifdef IPPROTO_IP
5001 PyModule_AddIntConstant(m, "IPPROTO_IP", IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00005002#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005003 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005004#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005005#ifdef IPPROTO_HOPOPTS
5006 PyModule_AddIntConstant(m, "IPPROTO_HOPOPTS", IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005007#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005008#ifdef IPPROTO_ICMP
5009 PyModule_AddIntConstant(m, "IPPROTO_ICMP", IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00005010#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005011 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005012#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005013#ifdef IPPROTO_IGMP
5014 PyModule_AddIntConstant(m, "IPPROTO_IGMP", IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005015#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005016#ifdef IPPROTO_GGP
5017 PyModule_AddIntConstant(m, "IPPROTO_GGP", IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005018#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005019#ifdef IPPROTO_IPV4
5020 PyModule_AddIntConstant(m, "IPPROTO_IPV4", IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005021#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005022#ifdef IPPROTO_IPV6
5023 PyModule_AddIntConstant(m, "IPPROTO_IPV6", IPPROTO_IPV6);
Martin v. Löwisa0f17342003-10-03 13:56:20 +00005024#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005025#ifdef IPPROTO_IPIP
5026 PyModule_AddIntConstant(m, "IPPROTO_IPIP", IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005027#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005028#ifdef IPPROTO_TCP
5029 PyModule_AddIntConstant(m, "IPPROTO_TCP", IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00005030#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005031 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005032#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005033#ifdef IPPROTO_EGP
5034 PyModule_AddIntConstant(m, "IPPROTO_EGP", IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005035#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005036#ifdef IPPROTO_PUP
5037 PyModule_AddIntConstant(m, "IPPROTO_PUP", IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005038#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005039#ifdef IPPROTO_UDP
5040 PyModule_AddIntConstant(m, "IPPROTO_UDP", IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00005041#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005042 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005043#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005044#ifdef IPPROTO_IDP
5045 PyModule_AddIntConstant(m, "IPPROTO_IDP", IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005046#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005047#ifdef IPPROTO_HELLO
5048 PyModule_AddIntConstant(m, "IPPROTO_HELLO", IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005049#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005050#ifdef IPPROTO_ND
5051 PyModule_AddIntConstant(m, "IPPROTO_ND", IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005052#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005053#ifdef IPPROTO_TP
5054 PyModule_AddIntConstant(m, "IPPROTO_TP", IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005055#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005056#ifdef IPPROTO_IPV6
5057 PyModule_AddIntConstant(m, "IPPROTO_IPV6", IPPROTO_IPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005058#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005059#ifdef IPPROTO_ROUTING
5060 PyModule_AddIntConstant(m, "IPPROTO_ROUTING", IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005061#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005062#ifdef IPPROTO_FRAGMENT
5063 PyModule_AddIntConstant(m, "IPPROTO_FRAGMENT", IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005064#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005065#ifdef IPPROTO_RSVP
5066 PyModule_AddIntConstant(m, "IPPROTO_RSVP", IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005067#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005068#ifdef IPPROTO_GRE
5069 PyModule_AddIntConstant(m, "IPPROTO_GRE", IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005070#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005071#ifdef IPPROTO_ESP
5072 PyModule_AddIntConstant(m, "IPPROTO_ESP", IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005073#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005074#ifdef IPPROTO_AH
5075 PyModule_AddIntConstant(m, "IPPROTO_AH", IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005076#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005077#ifdef IPPROTO_MOBILE
5078 PyModule_AddIntConstant(m, "IPPROTO_MOBILE", IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005079#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005080#ifdef IPPROTO_ICMPV6
5081 PyModule_AddIntConstant(m, "IPPROTO_ICMPV6", IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005082#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005083#ifdef IPPROTO_NONE
5084 PyModule_AddIntConstant(m, "IPPROTO_NONE", IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005085#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005086#ifdef IPPROTO_DSTOPTS
5087 PyModule_AddIntConstant(m, "IPPROTO_DSTOPTS", IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005088#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005089#ifdef IPPROTO_XTP
5090 PyModule_AddIntConstant(m, "IPPROTO_XTP", IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005091#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005092#ifdef IPPROTO_EON
5093 PyModule_AddIntConstant(m, "IPPROTO_EON", IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005094#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005095#ifdef IPPROTO_PIM
5096 PyModule_AddIntConstant(m, "IPPROTO_PIM", IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005097#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005098#ifdef IPPROTO_IPCOMP
5099 PyModule_AddIntConstant(m, "IPPROTO_IPCOMP", IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005100#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005101#ifdef IPPROTO_VRRP
5102 PyModule_AddIntConstant(m, "IPPROTO_VRRP", IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005103#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005104#ifdef IPPROTO_BIP
5105 PyModule_AddIntConstant(m, "IPPROTO_BIP", IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005106#endif
5107/**/
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005108#ifdef IPPROTO_RAW
5109 PyModule_AddIntConstant(m, "IPPROTO_RAW", IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00005110#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005111 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005112#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005113#ifdef IPPROTO_MAX
5114 PyModule_AddIntConstant(m, "IPPROTO_MAX", IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005115#endif
5116
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005117 /* Some port configuration */
5118#ifdef IPPORT_RESERVED
5119 PyModule_AddIntConstant(m, "IPPORT_RESERVED", IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005120#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005121 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005122#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005123#ifdef IPPORT_USERRESERVED
5124 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005125#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005126 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005127#endif
5128
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005129 /* Some reserved IP v.4 addresses */
5130#ifdef INADDR_ANY
5131 PyModule_AddIntConstant(m, "INADDR_ANY", INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005132#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005133 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005134#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005135#ifdef INADDR_BROADCAST
5136 PyModule_AddIntConstant(m, "INADDR_BROADCAST", INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005137#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005138 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005139#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005140#ifdef INADDR_LOOPBACK
5141 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005142#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005143 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005144#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005145#ifdef INADDR_UNSPEC_GROUP
5146 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005147#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005148 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005149#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005150#ifdef INADDR_ALLHOSTS_GROUP
5151 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
5152 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005153#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005154 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005155#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005156#ifdef INADDR_MAX_LOCAL_GROUP
5157 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP",
5158 INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005159#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005160 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005161#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005162#ifdef INADDR_NONE
5163 PyModule_AddIntConstant(m, "INADDR_NONE", INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005164#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005165 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005166#endif
5167
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005168 /* IPv4 [gs]etsockopt options */
5169#ifdef IP_OPTIONS
5170 PyModule_AddIntConstant(m, "IP_OPTIONS", IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005171#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005172#ifdef IP_HDRINCL
5173 PyModule_AddIntConstant(m, "IP_HDRINCL", IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005174#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005175#ifdef IP_TOS
5176 PyModule_AddIntConstant(m, "IP_TOS", IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005177#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005178#ifdef IP_TTL
5179 PyModule_AddIntConstant(m, "IP_TTL", IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005180#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005181#ifdef IP_RECVOPTS
5182 PyModule_AddIntConstant(m, "IP_RECVOPTS", IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005183#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005184#ifdef IP_RECVRETOPTS
5185 PyModule_AddIntConstant(m, "IP_RECVRETOPTS", IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005186#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005187#ifdef IP_RECVDSTADDR
5188 PyModule_AddIntConstant(m, "IP_RECVDSTADDR", IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005189#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005190#ifdef IP_RETOPTS
5191 PyModule_AddIntConstant(m, "IP_RETOPTS", IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005192#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005193#ifdef IP_MULTICAST_IF
5194 PyModule_AddIntConstant(m, "IP_MULTICAST_IF", IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005195#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005196#ifdef IP_MULTICAST_TTL
5197 PyModule_AddIntConstant(m, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005198#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005199#ifdef IP_MULTICAST_LOOP
5200 PyModule_AddIntConstant(m, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005201#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005202#ifdef IP_ADD_MEMBERSHIP
5203 PyModule_AddIntConstant(m, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005204#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005205#ifdef IP_DROP_MEMBERSHIP
5206 PyModule_AddIntConstant(m, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005207#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005208#ifdef IP_DEFAULT_MULTICAST_TTL
5209 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_TTL",
5210 IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00005211#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005212#ifdef IP_DEFAULT_MULTICAST_LOOP
5213 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_LOOP",
5214 IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00005215#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005216#ifdef IP_MAX_MEMBERSHIPS
5217 PyModule_AddIntConstant(m, "IP_MAX_MEMBERSHIPS", IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00005218#endif
5219
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005220 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
5221#ifdef IPV6_JOIN_GROUP
5222 PyModule_AddIntConstant(m, "IPV6_JOIN_GROUP", IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005223#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005224#ifdef IPV6_LEAVE_GROUP
5225 PyModule_AddIntConstant(m, "IPV6_LEAVE_GROUP", IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005226#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005227#ifdef IPV6_MULTICAST_HOPS
5228 PyModule_AddIntConstant(m, "IPV6_MULTICAST_HOPS", IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005229#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005230#ifdef IPV6_MULTICAST_IF
5231 PyModule_AddIntConstant(m, "IPV6_MULTICAST_IF", IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005232#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005233#ifdef IPV6_MULTICAST_LOOP
5234 PyModule_AddIntConstant(m, "IPV6_MULTICAST_LOOP", IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005235#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005236#ifdef IPV6_UNICAST_HOPS
5237 PyModule_AddIntConstant(m, "IPV6_UNICAST_HOPS", IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005238#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005239 /* Additional IPV6 socket options, defined in RFC 3493 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00005240#ifdef IPV6_V6ONLY
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005241 PyModule_AddIntConstant(m, "IPV6_V6ONLY", IPV6_V6ONLY);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005242#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005243 /* Advanced IPV6 socket options, from RFC 3542 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00005244#ifdef IPV6_CHECKSUM
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005245 PyModule_AddIntConstant(m, "IPV6_CHECKSUM", IPV6_CHECKSUM);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005246#endif
5247#ifdef IPV6_DONTFRAG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005248 PyModule_AddIntConstant(m, "IPV6_DONTFRAG", IPV6_DONTFRAG);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005249#endif
5250#ifdef IPV6_DSTOPTS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005251 PyModule_AddIntConstant(m, "IPV6_DSTOPTS", IPV6_DSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005252#endif
5253#ifdef IPV6_HOPLIMIT
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005254 PyModule_AddIntConstant(m, "IPV6_HOPLIMIT", IPV6_HOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005255#endif
5256#ifdef IPV6_HOPOPTS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005257 PyModule_AddIntConstant(m, "IPV6_HOPOPTS", IPV6_HOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005258#endif
5259#ifdef IPV6_NEXTHOP
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005260 PyModule_AddIntConstant(m, "IPV6_NEXTHOP", IPV6_NEXTHOP);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005261#endif
5262#ifdef IPV6_PATHMTU
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005263 PyModule_AddIntConstant(m, "IPV6_PATHMTU", IPV6_PATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005264#endif
5265#ifdef IPV6_PKTINFO
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005266 PyModule_AddIntConstant(m, "IPV6_PKTINFO", IPV6_PKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005267#endif
5268#ifdef IPV6_RECVDSTOPTS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005269 PyModule_AddIntConstant(m, "IPV6_RECVDSTOPTS", IPV6_RECVDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005270#endif
5271#ifdef IPV6_RECVHOPLIMIT
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005272 PyModule_AddIntConstant(m, "IPV6_RECVHOPLIMIT", IPV6_RECVHOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005273#endif
5274#ifdef IPV6_RECVHOPOPTS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005275 PyModule_AddIntConstant(m, "IPV6_RECVHOPOPTS", IPV6_RECVHOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005276#endif
5277#ifdef IPV6_RECVPKTINFO
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005278 PyModule_AddIntConstant(m, "IPV6_RECVPKTINFO", IPV6_RECVPKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005279#endif
5280#ifdef IPV6_RECVRTHDR
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005281 PyModule_AddIntConstant(m, "IPV6_RECVRTHDR", IPV6_RECVRTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005282#endif
5283#ifdef IPV6_RECVTCLASS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005284 PyModule_AddIntConstant(m, "IPV6_RECVTCLASS", IPV6_RECVTCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005285#endif
5286#ifdef IPV6_RTHDR
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005287 PyModule_AddIntConstant(m, "IPV6_RTHDR", IPV6_RTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005288#endif
5289#ifdef IPV6_RTHDRDSTOPTS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005290 PyModule_AddIntConstant(m, "IPV6_RTHDRDSTOPTS", IPV6_RTHDRDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005291#endif
5292#ifdef IPV6_RTHDR_TYPE_0
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005293 PyModule_AddIntConstant(m, "IPV6_RTHDR_TYPE_0", IPV6_RTHDR_TYPE_0);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005294#endif
5295#ifdef IPV6_RECVPATHMTU
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005296 PyModule_AddIntConstant(m, "IPV6_RECVPATHMTU", IPV6_RECVPATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005297#endif
5298#ifdef IPV6_TCLASS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005299 PyModule_AddIntConstant(m, "IPV6_TCLASS", IPV6_TCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005300#endif
5301#ifdef IPV6_USE_MIN_MTU
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005302 PyModule_AddIntConstant(m, "IPV6_USE_MIN_MTU", IPV6_USE_MIN_MTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005303#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005304
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005305 /* TCP options */
5306#ifdef TCP_NODELAY
5307 PyModule_AddIntConstant(m, "TCP_NODELAY", TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00005308#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005309#ifdef TCP_MAXSEG
5310 PyModule_AddIntConstant(m, "TCP_MAXSEG", TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00005311#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005312#ifdef TCP_CORK
5313 PyModule_AddIntConstant(m, "TCP_CORK", TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005314#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005315#ifdef TCP_KEEPIDLE
5316 PyModule_AddIntConstant(m, "TCP_KEEPIDLE", TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005317#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005318#ifdef TCP_KEEPINTVL
5319 PyModule_AddIntConstant(m, "TCP_KEEPINTVL", TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005320#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005321#ifdef TCP_KEEPCNT
5322 PyModule_AddIntConstant(m, "TCP_KEEPCNT", TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005323#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005324#ifdef TCP_SYNCNT
5325 PyModule_AddIntConstant(m, "TCP_SYNCNT", TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005326#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005327#ifdef TCP_LINGER2
5328 PyModule_AddIntConstant(m, "TCP_LINGER2", TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005329#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005330#ifdef TCP_DEFER_ACCEPT
5331 PyModule_AddIntConstant(m, "TCP_DEFER_ACCEPT", TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005332#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005333#ifdef TCP_WINDOW_CLAMP
5334 PyModule_AddIntConstant(m, "TCP_WINDOW_CLAMP", TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005335#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005336#ifdef TCP_INFO
5337 PyModule_AddIntConstant(m, "TCP_INFO", TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005338#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005339#ifdef TCP_QUICKACK
5340 PyModule_AddIntConstant(m, "TCP_QUICKACK", TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005341#endif
5342
Guido van Rossum09be4091999-08-09 14:40:40 +00005343
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005344 /* IPX options */
5345#ifdef IPX_TYPE
5346 PyModule_AddIntConstant(m, "IPX_TYPE", IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00005347#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005348
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005349 /* get{addr,name}info parameters */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005350#ifdef EAI_ADDRFAMILY
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005351 PyModule_AddIntConstant(m, "EAI_ADDRFAMILY", EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005352#endif
5353#ifdef EAI_AGAIN
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005354 PyModule_AddIntConstant(m, "EAI_AGAIN", EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005355#endif
5356#ifdef EAI_BADFLAGS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005357 PyModule_AddIntConstant(m, "EAI_BADFLAGS", EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005358#endif
5359#ifdef EAI_FAIL
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005360 PyModule_AddIntConstant(m, "EAI_FAIL", EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005361#endif
5362#ifdef EAI_FAMILY
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005363 PyModule_AddIntConstant(m, "EAI_FAMILY", EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005364#endif
5365#ifdef EAI_MEMORY
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005366 PyModule_AddIntConstant(m, "EAI_MEMORY", EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005367#endif
5368#ifdef EAI_NODATA
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005369 PyModule_AddIntConstant(m, "EAI_NODATA", EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005370#endif
5371#ifdef EAI_NONAME
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005372 PyModule_AddIntConstant(m, "EAI_NONAME", EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005373#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00005374#ifdef EAI_OVERFLOW
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005375 PyModule_AddIntConstant(m, "EAI_OVERFLOW", EAI_OVERFLOW);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005376#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005377#ifdef EAI_SERVICE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005378 PyModule_AddIntConstant(m, "EAI_SERVICE", EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005379#endif
5380#ifdef EAI_SOCKTYPE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005381 PyModule_AddIntConstant(m, "EAI_SOCKTYPE", EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005382#endif
5383#ifdef EAI_SYSTEM
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005384 PyModule_AddIntConstant(m, "EAI_SYSTEM", EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005385#endif
5386#ifdef EAI_BADHINTS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005387 PyModule_AddIntConstant(m, "EAI_BADHINTS", EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005388#endif
5389#ifdef EAI_PROTOCOL
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005390 PyModule_AddIntConstant(m, "EAI_PROTOCOL", EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005391#endif
5392#ifdef EAI_MAX
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005393 PyModule_AddIntConstant(m, "EAI_MAX", EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005394#endif
5395#ifdef AI_PASSIVE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005396 PyModule_AddIntConstant(m, "AI_PASSIVE", AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005397#endif
5398#ifdef AI_CANONNAME
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005399 PyModule_AddIntConstant(m, "AI_CANONNAME", AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005400#endif
5401#ifdef AI_NUMERICHOST
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005402 PyModule_AddIntConstant(m, "AI_NUMERICHOST", AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005403#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00005404#ifdef AI_NUMERICSERV
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005405 PyModule_AddIntConstant(m, "AI_NUMERICSERV", AI_NUMERICSERV);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005406#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005407#ifdef AI_MASK
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005408 PyModule_AddIntConstant(m, "AI_MASK", AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005409#endif
5410#ifdef AI_ALL
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005411 PyModule_AddIntConstant(m, "AI_ALL", AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005412#endif
5413#ifdef AI_V4MAPPED_CFG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005414 PyModule_AddIntConstant(m, "AI_V4MAPPED_CFG", AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005415#endif
5416#ifdef AI_ADDRCONFIG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005417 PyModule_AddIntConstant(m, "AI_ADDRCONFIG", AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005418#endif
5419#ifdef AI_V4MAPPED
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005420 PyModule_AddIntConstant(m, "AI_V4MAPPED", AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005421#endif
5422#ifdef AI_DEFAULT
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005423 PyModule_AddIntConstant(m, "AI_DEFAULT", AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005424#endif
5425#ifdef NI_MAXHOST
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005426 PyModule_AddIntConstant(m, "NI_MAXHOST", NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005427#endif
5428#ifdef NI_MAXSERV
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005429 PyModule_AddIntConstant(m, "NI_MAXSERV", NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005430#endif
5431#ifdef NI_NOFQDN
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005432 PyModule_AddIntConstant(m, "NI_NOFQDN", NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005433#endif
5434#ifdef NI_NUMERICHOST
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005435 PyModule_AddIntConstant(m, "NI_NUMERICHOST", NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005436#endif
5437#ifdef NI_NAMEREQD
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005438 PyModule_AddIntConstant(m, "NI_NAMEREQD", NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005439#endif
5440#ifdef NI_NUMERICSERV
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005441 PyModule_AddIntConstant(m, "NI_NUMERICSERV", NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005442#endif
5443#ifdef NI_DGRAM
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005444 PyModule_AddIntConstant(m, "NI_DGRAM", NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005445#endif
5446
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005447 /* shutdown() parameters */
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005448#ifdef SHUT_RD
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005449 PyModule_AddIntConstant(m, "SHUT_RD", SHUT_RD);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005450#elif defined(SD_RECEIVE)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005451 PyModule_AddIntConstant(m, "SHUT_RD", SD_RECEIVE);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005452#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005453 PyModule_AddIntConstant(m, "SHUT_RD", 0);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005454#endif
5455#ifdef SHUT_WR
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005456 PyModule_AddIntConstant(m, "SHUT_WR", SHUT_WR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005457#elif defined(SD_SEND)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005458 PyModule_AddIntConstant(m, "SHUT_WR", SD_SEND);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005459#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005460 PyModule_AddIntConstant(m, "SHUT_WR", 1);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005461#endif
5462#ifdef SHUT_RDWR
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005463 PyModule_AddIntConstant(m, "SHUT_RDWR", SHUT_RDWR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005464#elif defined(SD_BOTH)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005465 PyModule_AddIntConstant(m, "SHUT_RDWR", SD_BOTH);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005466#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005467 PyModule_AddIntConstant(m, "SHUT_RDWR", 2);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005468#endif
5469
Christian Heimes04ae9162008-01-04 15:23:30 +00005470#ifdef SIO_RCVALL
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005471 {
5472 DWORD codes[] = {SIO_RCVALL, SIO_KEEPALIVE_VALS};
5473 const char *names[] = {"SIO_RCVALL", "SIO_KEEPALIVE_VALS"};
5474 int i;
5475 for(i = 0; i<sizeof(codes)/sizeof(*codes); ++i) {
5476 PyObject *tmp;
5477 tmp = PyLong_FromUnsignedLong(codes[i]);
5478 if (tmp == NULL)
5479 return;
5480 PyModule_AddObject(m, names[i], tmp);
5481 }
5482 }
5483 PyModule_AddIntConstant(m, "RCVALL_OFF", RCVALL_OFF);
5484 PyModule_AddIntConstant(m, "RCVALL_ON", RCVALL_ON);
5485 PyModule_AddIntConstant(m, "RCVALL_SOCKETLEVELONLY", RCVALL_SOCKETLEVELONLY);
Amaury Forgeot d'Arc94eba712008-03-28 21:55:29 +00005486#ifdef RCVALL_IPLEVEL
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005487 PyModule_AddIntConstant(m, "RCVALL_IPLEVEL", RCVALL_IPLEVEL);
Amaury Forgeot d'Arc94eba712008-03-28 21:55:29 +00005488#endif
5489#ifdef RCVALL_MAX
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005490 PyModule_AddIntConstant(m, "RCVALL_MAX", RCVALL_MAX);
Amaury Forgeot d'Arc94eba712008-03-28 21:55:29 +00005491#endif
Christian Heimes04ae9162008-01-04 15:23:30 +00005492#endif /* _MSTCPIP_ */
5493
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005494 /* Initialize gethostbyname lock */
Just van Rossum1040d2c2003-05-09 07:53:18 +00005495#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005496 netdb_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005497#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005498}
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005499
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005500
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005501#ifndef HAVE_INET_PTON
Christian Heimese8954f82007-11-22 11:21:16 +00005502#if !defined(NTDDI_VERSION) || (NTDDI_VERSION < NTDDI_LONGHORN)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005503
5504/* Simplistic emulation code for inet_pton that only works for IPv4 */
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005505/* These are not exposed because they do not set errno properly */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005506
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005507int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005508inet_pton(int af, const char *src, void *dst)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005509{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005510 if (af == AF_INET) {
Gregory P. Smith3605b5c2009-02-11 23:45:25 +00005511#if (SIZEOF_INT != 4)
5512#error "Not sure if in_addr_t exists and int is not 32-bits."
5513#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005514 unsigned int packed_addr;
5515 packed_addr = inet_addr(src);
5516 if (packed_addr == INADDR_NONE)
5517 return 0;
5518 memcpy(dst, &packed_addr, 4);
5519 return 1;
5520 }
5521 /* Should set errno to EAFNOSUPPORT */
5522 return -1;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005523}
5524
Martin v. Löwisc925b1532001-07-21 09:42:15 +00005525const char *
5526inet_ntop(int af, const void *src, char *dst, socklen_t size)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005527{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005528 if (af == AF_INET) {
5529 struct in_addr packed_addr;
5530 if (size < 16)
5531 /* Should set errno to ENOSPC. */
5532 return NULL;
5533 memcpy(&packed_addr, src, sizeof(packed_addr));
5534 return strncpy(dst, inet_ntoa(packed_addr), size);
5535 }
5536 /* Should set errno to EAFNOSUPPORT */
5537 return NULL;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005538}
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005539
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005540#endif
Christian Heimese8954f82007-11-22 11:21:16 +00005541#endif