blob: e9e4479a667870293461ef22f8b3e15502174fe7 [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
Victor Stinner465db3c2014-07-26 14:47:56 +020097#ifndef INVALID_SOCKET /* MS defines this */
98#define INVALID_SOCKET (-1)
99#endif
100
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000101#undef MAX
102#define MAX(x, y) ((x) < (y) ? (y) : (x))
103
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000104/* Socket object documentation */
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000105PyDoc_STRVAR(sock_doc,
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000106"socket([family[, type[, proto]]]) -> socket object\n\
107\n\
108Open a socket of the given type. The family argument specifies the\n\
109address family; it defaults to AF_INET. The type argument specifies\n\
110whether this is a stream (SOCK_STREAM, this is the default)\n\
111or datagram (SOCK_DGRAM) socket. The protocol argument defaults to 0,\n\
112specifying the default protocol. Keyword arguments are accepted.\n\
113\n\
114A socket object represents one endpoint of a network connection.\n\
115\n\
116Methods of socket objects (keyword arguments not allowed):\n\
117\n\
118accept() -- accept a connection, returning new socket and client address\n\
119bind(addr) -- bind the socket to a local address\n\
120close() -- close the socket\n\
121connect(addr) -- connect the socket to a remote address\n\
122connect_ex(addr) -- connect, return an error code instead of an exception\n\
123dup() -- return a new socket object identical to the current one [*]\n\
124fileno() -- return underlying file descriptor\n\
125getpeername() -- return remote address [*]\n\
126getsockname() -- return local address\n\
127getsockopt(level, optname[, buflen]) -- get socket options\n\
128gettimeout() -- return timeout or None\n\
129listen(n) -- start listening for incoming connections\n\
130makefile([mode, [bufsize]]) -- return a file object for the socket [*]\n\
131recv(buflen[, flags]) -- receive data\n\
Martin Blaisaf2ae722006-06-04 13:49:49 +0000132recv_into(buffer[, nbytes[, flags]]) -- receive data (into a buffer)\n\
Martin Blais2856e5f2006-05-26 12:03:27 +0000133recvfrom(buflen[, flags]) -- receive data and sender\'s address\n\
Martin Blaisaf2ae722006-06-04 13:49:49 +0000134recvfrom_into(buffer[, nbytes, [, flags])\n\
Martin Blais2856e5f2006-05-26 12:03:27 +0000135 -- receive data and sender\'s address (into a buffer)\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000136sendall(data[, flags]) -- send all data\n\
137send(data[, flags]) -- send data, may not send all of it\n\
138sendto(data[, flags], addr) -- send data to a given address\n\
139setblocking(0 | 1) -- set or clear the blocking I/O flag\n\
140setsockopt(level, optname, value) -- set socket options\n\
141settimeout(None | float) -- set or clear the timeout\n\
142shutdown(how) -- shut down traffic in one or both directions\n\
143\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000144 [*] not available on all platforms!");
Guido van Rossum3baaa131999-03-22 21:44:51 +0000145
Walter Dörwaldf0dfc7a2003-10-20 14:01:56 +0000146/* XXX This is a terrible mess of platform-dependent preprocessor hacks.
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000147 I hope some day someone can clean this up please... */
148
Guido van Rossum9376b741999-09-15 22:01:40 +0000149/* Hacks for gethostbyname_r(). On some non-Linux platforms, the configure
150 script doesn't get this right, so we hardcode some platform checks below.
151 On the other hand, not all Linux versions agree, so there the settings
152 computed by the configure script are needed! */
153
154#ifndef linux
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000155# undef HAVE_GETHOSTBYNAME_R_3_ARG
156# undef HAVE_GETHOSTBYNAME_R_5_ARG
157# undef HAVE_GETHOSTBYNAME_R_6_ARG
Guido van Rossum9376b741999-09-15 22:01:40 +0000158#endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000159
Guido van Rossum7a122991999-04-13 04:07:32 +0000160#ifndef WITH_THREAD
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000161# undef HAVE_GETHOSTBYNAME_R
Guido van Rossum7a122991999-04-13 04:07:32 +0000162#endif
163
Guido van Rossume7de2061999-03-24 17:24:33 +0000164#ifdef HAVE_GETHOSTBYNAME_R
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000165# if defined(_AIX) || defined(__osf__)
166# define HAVE_GETHOSTBYNAME_R_3_ARG
167# elif defined(__sun) || defined(__sgi)
168# define HAVE_GETHOSTBYNAME_R_5_ARG
169# elif defined(linux)
Guido van Rossum9376b741999-09-15 22:01:40 +0000170/* Rely on the configure script */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000171# else
172# undef HAVE_GETHOSTBYNAME_R
173# endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000174#endif
175
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000176#if !defined(HAVE_GETHOSTBYNAME_R) && defined(WITH_THREAD) && \
177 !defined(MS_WINDOWS)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000178# define USE_GETHOSTBYNAME_LOCK
Guido van Rossum3baaa131999-03-22 21:44:51 +0000179#endif
180
Hye-Shik Chang9ceebd52005-09-24 14:58:47 +0000181/* To use __FreeBSD_version */
182#ifdef HAVE_SYS_PARAM_H
183#include <sys/param.h>
184#endif
Just van Rossum1040d2c2003-05-09 07:53:18 +0000185/* On systems on which getaddrinfo() is believed to not be thread-safe,
Just van Rossum09aecd72003-05-09 08:03:44 +0000186 (this includes the getaddrinfo emulation) protect access with a lock. */
Hye-Shik Chang9ceebd52005-09-24 14:58:47 +0000187#if defined(WITH_THREAD) && (defined(__APPLE__) || \
188 (defined(__FreeBSD__) && __FreeBSD_version+0 < 503000) || \
Neal Norwitz2a30cd02006-07-10 01:18:57 +0000189 defined(__OpenBSD__) || defined(__NetBSD__) || \
190 defined(__VMS) || !defined(HAVE_GETADDRINFO))
Just van Rossum1040d2c2003-05-09 07:53:18 +0000191#define USE_GETADDRINFO_LOCK
192#endif
193
194#ifdef USE_GETADDRINFO_LOCK
195#define ACQUIRE_GETADDRINFO_LOCK PyThread_acquire_lock(netdb_lock, 1);
196#define RELEASE_GETADDRINFO_LOCK PyThread_release_lock(netdb_lock);
197#else
198#define ACQUIRE_GETADDRINFO_LOCK
199#define RELEASE_GETADDRINFO_LOCK
200#endif
201
202#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000203# include "pythread.h"
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000204#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000205
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000206#if defined(PYCC_VACPP)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000207# include <types.h>
208# include <io.h>
209# include <sys/ioctl.h>
210# include <utils.h>
211# include <ctype.h>
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000212#endif
213
Martin v. Löwis9e437302002-12-06 12:57:26 +0000214#if defined(__VMS)
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000215# include <ioctl.h>
216#endif
217
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000218#if defined(PYOS_OS2)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000219# define INCL_DOS
220# define INCL_DOSERRORS
221# define INCL_NOPMAPI
222# include <os2.h>
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000223#endif
224
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000225#if defined(__sgi) && _COMPILER_VERSION>700 && !_SGIAPI
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000226/* make sure that the reentrant (gethostbyaddr_r etc)
227 functions are declared correctly if compiling with
228 MIPSPro 7.x in ANSI C mode (default) */
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000229
Martin Blais2856e5f2006-05-26 12:03:27 +0000230/* XXX Using _SGIAPI is the wrong thing,
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000231 but I don't know what the right thing is. */
Trent Mick8ea5bdf2004-09-13 17:48:41 +0000232#undef _SGIAPI /* to avoid warning */
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000233#define _SGIAPI 1
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000234
Trent Mick8ea5bdf2004-09-13 17:48:41 +0000235#undef _XOPEN_SOURCE
236#include <sys/socket.h>
237#include <sys/types.h>
238#include <netinet/in.h>
239#ifdef _SS_ALIGNSIZE
240#define HAVE_GETADDRINFO 1
241#define HAVE_GETNAMEINFO 1
242#endif
243
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000244#define HAVE_INET_PTON
245#include <netdb.h>
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000246#endif
247
Martin Blais2856e5f2006-05-26 12:03:27 +0000248/* Irix 6.5 fails to define this variable at all. This is needed
249 for both GCC and SGI's compiler. I'd say that the SGI headers
Georg Brandldbd83392006-02-20 09:42:33 +0000250 are just busted. Same thing for Solaris. */
251#if (defined(__sgi) || defined(sun)) && !defined(INET_ADDRSTRLEN)
Anthony Baxterbab23cf2003-10-04 08:00:49 +0000252#define INET_ADDRSTRLEN 16
253#endif
254
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000255/* Generic includes */
Martin v. Löwis0e8bd7e2006-06-10 12:23:46 +0000256#ifdef HAVE_SYS_TYPES_H
Guido van Rossumb6775db1994-08-01 11:34:53 +0000257#include <sys/types.h>
Martin v. Löwis0e8bd7e2006-06-10 12:23:46 +0000258#endif
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000259
Marc-André Lemburg976ade62002-02-16 18:47:07 +0000260/* Generic socket object definitions and includes */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000261#define PySocket_BUILDING_SOCKET
Marc-André Lemburgbb8b78b2002-02-16 18:44:52 +0000262#include "socketmodule.h"
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000263
264/* Addressing includes */
265
Guido van Rossum6f489d91996-06-28 20:15:15 +0000266#ifndef MS_WINDOWS
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000267
268/* Non-MS WINDOWS includes */
269# include <netdb.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000270
Guido van Rossum9376b741999-09-15 22:01:40 +0000271/* Headers needed for inet_ntoa() and inet_addr() */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000272# ifdef __BEOS__
273# include <net/netdb.h>
274# elif defined(PYOS_OS2) && defined(PYCC_VACPP)
275# include <netdb.h>
Tim Peters603c6832001-11-05 02:45:59 +0000276typedef size_t socklen_t;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000277# else
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000278# include <arpa/inet.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000279# endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000280
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000281# ifndef RISCOS
282# include <fcntl.h>
283# else
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000284# include <sys/ioctl.h>
285# include <socklib.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000286# define NO_DUP
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000287int h_errno; /* not used */
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000288# define INET_ADDRSTRLEN 16
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000289# endif
290
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000291#else
Guido van Rossum48a680c2001-03-02 06:34:14 +0000292
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000293/* MS_WINDOWS includes */
Martin v. Löwis0e8bd7e2006-06-10 12:23:46 +0000294# ifdef HAVE_FCNTL_H
295# include <fcntl.h>
296# endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000297
Jeremy Hylton22308652001-02-02 03:23:09 +0000298#endif
299
Skip Montanaro7befb992004-02-10 16:50:21 +0000300#include <stddef.h>
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000301
302#ifndef offsetof
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000303# define offsetof(type, member) ((size_t)(&((type *)0)->member))
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000304#endif
305
Neal Norwitz39d22e52002-11-02 19:55:21 +0000306#ifndef O_NONBLOCK
307# define O_NONBLOCK O_NDELAY
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000308#endif
309
Trent Micka708d6e2004-09-07 17:48:26 +0000310/* include Python's addrinfo.h unless it causes trouble */
311#if defined(__sgi) && _COMPILER_VERSION>700 && defined(_SS_ALIGNSIZE)
312 /* Do not include addinfo.h on some newer IRIX versions.
313 * _SS_ALIGNSIZE is defined in sys/socket.h by 6.5.21,
314 * for example, but not by 6.5.10.
315 */
Martin v. Löwis0e8bd7e2006-06-10 12:23:46 +0000316#elif defined(_MSC_VER) && _MSC_VER>1201
Trent Micka708d6e2004-09-07 17:48:26 +0000317 /* Do not include addrinfo.h for MSVC7 or greater. 'addrinfo' and
318 * EAI_* constants are defined in (the already included) ws2tcpip.h.
319 */
320#else
321# include "addrinfo.h"
322#endif
Jason Tishlerc246cb72004-08-09 13:25:59 +0000323
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000324#ifndef HAVE_INET_PTON
Christian Heimese8954f82007-11-22 11:21:16 +0000325#if !defined(NTDDI_VERSION) || (NTDDI_VERSION < NTDDI_LONGHORN)
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000326int inet_pton(int af, const char *src, void *dst);
Martin v. Löwisc925b1532001-07-21 09:42:15 +0000327const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000328#endif
Christian Heimese8954f82007-11-22 11:21:16 +0000329#endif
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000330
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000331#ifdef __APPLE__
332/* On OS X, getaddrinfo returns no error indication of lookup
333 failure, so we must use the emulation instead of the libinfo
334 implementation. Unfortunately, performing an autoconf test
335 for this bug would require DNS access for the machine performing
336 the configuration, which is not acceptable. Therefore, we
337 determine the bug just by checking for __APPLE__. If this bug
338 gets ever fixed, perhaps checking for sys/version.h would be
339 appropriate, which is 10/0 on the system with the bug. */
Jack Jansen84262fb2002-07-02 14:40:42 +0000340#ifndef HAVE_GETNAMEINFO
341/* This bug seems to be fixed in Jaguar. Ths easiest way I could
342 Find to check for Jaguar is that it has getnameinfo(), which
343 older releases don't have */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000344#undef HAVE_GETADDRINFO
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000345#endif
Ronald Oussorend06b6f22006-04-23 11:59:25 +0000346
347#ifdef HAVE_INET_ATON
348#define USE_INET_ATON_WEAKLINK
349#endif
350
Jack Jansen84262fb2002-07-02 14:40:42 +0000351#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000352
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000353/* I know this is a bad practice, but it is the easiest... */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000354#if !defined(HAVE_GETADDRINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000355/* avoid clashes with the C library definition of the symbol. */
356#define getaddrinfo fake_getaddrinfo
357#define gai_strerror fake_gai_strerror
358#define freeaddrinfo fake_freeaddrinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000359#include "getaddrinfo.c"
360#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000361#if !defined(HAVE_GETNAMEINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000362#define getnameinfo fake_getnameinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000363#include "getnameinfo.c"
364#endif
365
Guido van Rossumbcc20741998-08-04 22:53:56 +0000366#if defined(MS_WINDOWS) || defined(__BEOS__)
367/* BeOS suffers from the same socket dichotomy as Win32... - [cjh] */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000368/* seem to be a few differences in the API */
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000369#define SOCKETCLOSE closesocket
Guido van Rossumbe32c891996-06-20 16:25:29 +0000370#define NO_DUP /* Actually it exists on NT 3.5, but what the heck... */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000371#endif
372
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000373#ifdef MS_WIN32
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000374#define EAFNOSUPPORT WSAEAFNOSUPPORT
375#define snprintf _snprintf
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000376#endif
Fred Drakea04eaad2000-06-30 02:46:07 +0000377
Andrew MacIntyreba43e872002-03-03 03:03:52 +0000378#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000379#define SOCKETCLOSE soclose
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000380#define NO_DUP /* Sockets are Not Actual File Handles under OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000381#endif
382
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000383#ifndef SOCKETCLOSE
384#define SOCKETCLOSE close
385#endif
386
Gregory P. Smith886a1cd2010-10-17 04:28:14 +0000387#if (defined(HAVE_BLUETOOTH_H) || defined(HAVE_BLUETOOTH_BLUETOOTH_H)) && !defined(__NetBSD__) && !defined(__DragonFly__)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000388#define USE_BLUETOOTH 1
389#if defined(__FreeBSD__)
390#define BTPROTO_L2CAP BLUETOOTH_PROTO_L2CAP
391#define BTPROTO_RFCOMM BLUETOOTH_PROTO_RFCOMM
Martin v. Löwis45423a72007-02-14 10:07:37 +0000392#define BTPROTO_HCI BLUETOOTH_PROTO_HCI
Hye-Shik Chang82958f02007-06-05 18:16:52 +0000393#define SOL_HCI SOL_HCI_RAW
394#define HCI_FILTER SO_HCI_RAW_FILTER
Hye-Shik Chang81268602004-02-02 06:05:24 +0000395#define sockaddr_l2 sockaddr_l2cap
396#define sockaddr_rc sockaddr_rfcomm
Hye-Shik Chang82958f02007-06-05 18:16:52 +0000397#define hci_dev hci_node
Hye-Shik Chang81268602004-02-02 06:05:24 +0000398#define _BT_L2_MEMB(sa, memb) ((sa)->l2cap_##memb)
399#define _BT_RC_MEMB(sa, memb) ((sa)->rfcomm_##memb)
Martin v. Löwis45423a72007-02-14 10:07:37 +0000400#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Gregory P. Smith886a1cd2010-10-17 04:28:14 +0000401#elif defined(__NetBSD__) || defined(__DragonFly__)
Matt Flemingec926502006-07-28 11:27:27 +0000402#define sockaddr_l2 sockaddr_bt
403#define sockaddr_rc sockaddr_bt
Martin v. Löwis45423a72007-02-14 10:07:37 +0000404#define sockaddr_hci sockaddr_bt
Matt Flemingec926502006-07-28 11:27:27 +0000405#define sockaddr_sco sockaddr_bt
Gregory P. Smith886a1cd2010-10-17 04:28:14 +0000406#define SOL_HCI BTPROTO_HCI
407#define HCI_DATA_DIR SO_HCI_DIRECTION
Matt Flemingec926502006-07-28 11:27:27 +0000408#define _BT_L2_MEMB(sa, memb) ((sa)->bt_##memb)
409#define _BT_RC_MEMB(sa, memb) ((sa)->bt_##memb)
Martin v. Löwis45423a72007-02-14 10:07:37 +0000410#define _BT_HCI_MEMB(sa, memb) ((sa)->bt_##memb)
Matt Flemingec926502006-07-28 11:27:27 +0000411#define _BT_SCO_MEMB(sa, memb) ((sa)->bt_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000412#else
Hye-Shik Chang81268602004-02-02 06:05:24 +0000413#define _BT_L2_MEMB(sa, memb) ((sa)->l2_##memb)
414#define _BT_RC_MEMB(sa, memb) ((sa)->rc_##memb)
Martin v. Löwis45423a72007-02-14 10:07:37 +0000415#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000416#define _BT_SCO_MEMB(sa, memb) ((sa)->sco_##memb)
417#endif
418#endif
419
Neal Norwitz2a30cd02006-07-10 01:18:57 +0000420#ifdef __VMS
421/* TCP/IP Services for VMS uses a maximum send/recv buffer length */
422#define SEGMENT_SIZE (32 * 1024 -1)
423#endif
424
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000425#define SAS2SA(x) ((struct sockaddr *)(x))
Martin v. Löwis046c4d12006-12-03 11:23:45 +0000426
Martin v. Löwise9416172003-05-03 10:12:45 +0000427/*
428 * Constants for getnameinfo()
429 */
430#if !defined(NI_MAXHOST)
431#define NI_MAXHOST 1025
432#endif
433#if !defined(NI_MAXSERV)
434#define NI_MAXSERV 32
435#endif
436
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000437/* XXX There's a problem here: *static* functions are not supposed to have
438 a Py prefix (or use CapitalizedWords). Later... */
439
Guido van Rossum30a685f1991-06-27 15:51:29 +0000440/* Global variable holding the exception type for errors detected
441 by this module (but not argument type or memory errors, etc.). */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000442static PyObject *socket_error;
443static PyObject *socket_herror;
444static PyObject *socket_gaierror;
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000445static PyObject *socket_timeout;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000446
Guido van Rossum48a680c2001-03-02 06:34:14 +0000447#ifdef RISCOS
448/* Global variable which is !=0 if Python is running in a RISC OS taskwindow */
449static int taskwindow;
450#endif
451
Tim Peters643a7fc2002-02-17 04:13:21 +0000452/* A forward reference to the socket type object.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000453 The sock_type variable contains pointers to various functions,
454 some of which call new_sockobject(), which uses sock_type, so
Tim Peters643a7fc2002-02-17 04:13:21 +0000455 there has to be a circular reference. */
Jeremy Hylton938ace62002-07-17 16:30:39 +0000456static PyTypeObject sock_type;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000457
Anthony Baxter93ab5fa2006-07-11 02:04:09 +0000458#if defined(HAVE_POLL_H)
459#include <poll.h>
460#elif defined(HAVE_SYS_POLL_H)
461#include <sys/poll.h>
462#endif
463
Charles-François Natalifda7b372011-08-28 16:22:33 +0200464#ifdef HAVE_POLL
Anthony Baxter93ab5fa2006-07-11 02:04:09 +0000465/* Instead of select(), we'll use poll() since poll() works on any fd. */
466#define IS_SELECTABLE(s) 1
467/* Can we call select() with this socket without a buffer overrun? */
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000468#else
Charles-François Natalifda7b372011-08-28 16:22:33 +0200469/* If there's no timeout left, we don't have to call select, so it's a safe,
470 * little white lie. */
471#define IS_SELECTABLE(s) (_PyIsSelectable_fd((s)->sock_fd) || (s)->sock_timeout <= 0.0)
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000472#endif
Neal Norwitz082b2df2006-02-07 07:04:46 +0000473
474static PyObject*
475select_error(void)
476{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000477 PyErr_SetString(socket_error, "unable to select on socket");
478 return NULL;
Neal Norwitz082b2df2006-02-07 07:04:46 +0000479}
480
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -0700481#ifdef MS_WINDOWS
482#ifndef WSAEAGAIN
483#define WSAEAGAIN WSAEWOULDBLOCK
484#endif
485#define CHECK_ERRNO(expected) \
486 (WSAGetLastError() == WSA ## expected)
487#else
488#define CHECK_ERRNO(expected) \
489 (errno == expected)
490#endif
491
Guido van Rossum30a685f1991-06-27 15:51:29 +0000492/* Convenience function to raise an error according to errno
493 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000494
Guido van Rossum73624e91994-10-10 17:59:00 +0000495static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000496set_error(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000497{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000498#ifdef MS_WINDOWS
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000499 int err_no = WSAGetLastError();
500 /* PyErr_SetExcFromWindowsErr() invokes FormatMessage() which
501 recognizes the error codes used by both GetLastError() and
502 WSAGetLastError */
503 if (err_no)
504 return PyErr_SetExcFromWindowsErr(socket_error, err_no);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000505#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000506
Andrew MacIntyreba43e872002-03-03 03:03:52 +0000507#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000508 if (sock_errno() != NO_ERROR) {
509 APIRET rc;
510 ULONG msglen;
511 char outbuf[100];
512 int myerrorcode = sock_errno();
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000513
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000514 /* Retrieve socket-related error message from MPTN.MSG file */
515 rc = DosGetMessage(NULL, 0, outbuf, sizeof(outbuf),
516 myerrorcode - SOCBASEERR + 26,
517 "mptn.msg",
518 &msglen);
519 if (rc == NO_ERROR) {
520 PyObject *v;
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000521
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000522 /* OS/2 doesn't guarantee a terminator */
523 outbuf[msglen] = '\0';
524 if (strlen(outbuf) > 0) {
525 /* If non-empty msg, trim CRLF */
526 char *lastc = &outbuf[ strlen(outbuf)-1 ];
527 while (lastc > outbuf &&
528 isspace(Py_CHARMASK(*lastc))) {
529 /* Trim trailing whitespace (CRLF) */
530 *lastc-- = '\0';
531 }
532 }
533 v = Py_BuildValue("(is)", myerrorcode, outbuf);
534 if (v != NULL) {
535 PyErr_SetObject(socket_error, v);
536 Py_DECREF(v);
537 }
538 return NULL;
539 }
540 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000541#endif
542
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000543#if defined(RISCOS)
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000544 if (_inet_error.errnum != NULL) {
545 PyObject *v;
546 v = Py_BuildValue("(is)", errno, _inet_err());
547 if (v != NULL) {
548 PyErr_SetObject(socket_error, v);
549 Py_DECREF(v);
550 }
551 return NULL;
552 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000553#endif
554
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000555 return PyErr_SetFromErrno(socket_error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000556}
557
Guido van Rossum30a685f1991-06-27 15:51:29 +0000558
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000559static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000560set_herror(int h_error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000561{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000562 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000563
564#ifdef HAVE_HSTRERROR
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000565 v = Py_BuildValue("(is)", h_error, (char *)hstrerror(h_error));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000566#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000567 v = Py_BuildValue("(is)", h_error, "host not found");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000568#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000569 if (v != NULL) {
570 PyErr_SetObject(socket_herror, v);
571 Py_DECREF(v);
572 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000573
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000574 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000575}
576
577
578static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000579set_gaierror(int error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000580{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000581 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000582
Martin v. Löwis272cb402002-03-01 08:31:07 +0000583#ifdef EAI_SYSTEM
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000584 /* EAI_SYSTEM is not available on Windows XP. */
585 if (error == EAI_SYSTEM)
586 return set_error();
Martin v. Löwis272cb402002-03-01 08:31:07 +0000587#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000588
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000589#ifdef HAVE_GAI_STRERROR
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000590 v = Py_BuildValue("(is)", error, gai_strerror(error));
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000591#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000592 v = Py_BuildValue("(is)", error, "getaddrinfo failed");
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000593#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000594 if (v != NULL) {
595 PyErr_SetObject(socket_gaierror, v);
596 Py_DECREF(v);
597 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000598
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000599 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000600}
601
Neal Norwitz2a30cd02006-07-10 01:18:57 +0000602#ifdef __VMS
603/* Function to send in segments */
604static int
605sendsegmented(int sock_fd, char *buf, int len, int flags)
606{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000607 int n = 0;
608 int remaining = len;
Neal Norwitz2a30cd02006-07-10 01:18:57 +0000609
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000610 while (remaining > 0) {
611 unsigned int segment;
Neal Norwitz2a30cd02006-07-10 01:18:57 +0000612
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000613 segment = (remaining >= SEGMENT_SIZE ? SEGMENT_SIZE : remaining);
614 n = send(sock_fd, buf, segment, flags);
615 if (n < 0) {
616 return n;
617 }
618 remaining -= segment;
619 buf += segment;
620 } /* end while */
Neal Norwitz2a30cd02006-07-10 01:18:57 +0000621
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000622 return len;
Neal Norwitz2a30cd02006-07-10 01:18:57 +0000623}
624#endif
625
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000626/* Function to perform the setting of socket blocking mode
627 internally. block = (1 | 0). */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000628static int
629internal_setblocking(PySocketSockObject *s, int block)
630{
631#ifndef RISCOS
632#ifndef MS_WINDOWS
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000633 int delay_flag;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000634#endif
635#endif
636
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000637 Py_BEGIN_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000638#ifdef __BEOS__
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000639 block = !block;
640 setsockopt(s->sock_fd, SOL_SOCKET, SO_NONBLOCK,
641 (void *)(&block), sizeof(int));
Guido van Rossum67f7a382002-06-06 21:08:16 +0000642#else
643#ifndef RISCOS
644#ifndef MS_WINDOWS
645#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000646 block = !block;
647 ioctl(s->sock_fd, FIONBIO, (caddr_t)&block, sizeof(block));
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000648#elif defined(__VMS)
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000649 block = !block;
650 ioctl(s->sock_fd, FIONBIO, (unsigned int *)&block);
Neal Norwitz2a30cd02006-07-10 01:18:57 +0000651#else /* !PYOS_OS2 && !__VMS */
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000652 delay_flag = fcntl(s->sock_fd, F_GETFL, 0);
653 if (block)
654 delay_flag &= (~O_NONBLOCK);
655 else
656 delay_flag |= O_NONBLOCK;
657 fcntl(s->sock_fd, F_SETFL, delay_flag);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000658#endif /* !PYOS_OS2 */
659#else /* MS_WINDOWS */
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000660 block = !block;
661 ioctlsocket(s->sock_fd, FIONBIO, (u_long*)&block);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000662#endif /* MS_WINDOWS */
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000663#else /* RISCOS */
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000664 block = !block;
665 socketioctl(s->sock_fd, FIONBIO, (u_long*)&block);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000666#endif /* RISCOS */
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000667#endif /* __BEOS__ */
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000668 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000669
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000670 /* Since these don't return anything */
671 return 1;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000672}
673
Anthony Baxter93ab5fa2006-07-11 02:04:09 +0000674/* Do a select()/poll() on the socket, if necessary (sock_timeout > 0).
Guido van Rossum11ba0942002-06-13 15:07:44 +0000675 The argument writing indicates the direction.
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000676 This does not raise an exception; we'll let our caller do that
677 after they've reacquired the interpreter lock.
Neal Norwitz9b0ca792006-08-02 06:46:21 +0000678 Returns 1 on timeout, -1 on error, 0 otherwise. */
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000679static int
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -0700680internal_select_ex(PySocketSockObject *s, int writing, double interval)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000681{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000682 int n;
Guido van Rossum11ba0942002-06-13 15:07:44 +0000683
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000684 /* Nothing to do unless we're in timeout mode (not non-blocking) */
685 if (s->sock_timeout <= 0.0)
686 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000687
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000688 /* Guard against closed socket */
689 if (s->sock_fd < 0)
690 return 0;
Guido van Rossumad654902002-07-19 12:44:59 +0000691
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -0700692 /* Handling this condition here simplifies the select loops */
693 if (interval < 0.0)
694 return 1;
695
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000696 /* Prefer poll, if available, since you can poll() any fd
697 * which can't be done with select(). */
Anthony Baxter93ab5fa2006-07-11 02:04:09 +0000698#ifdef HAVE_POLL
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000699 {
700 struct pollfd pollfd;
701 int timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000702
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000703 pollfd.fd = s->sock_fd;
704 pollfd.events = writing ? POLLOUT : POLLIN;
Anthony Baxter93ab5fa2006-07-11 02:04:09 +0000705
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000706 /* s->sock_timeout is in seconds, timeout in ms */
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -0700707 timeout = (int)(interval * 1000 + 0.5);
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000708 n = poll(&pollfd, 1, timeout);
709 }
Anthony Baxter93ab5fa2006-07-11 02:04:09 +0000710#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000711 {
712 /* Construct the arguments to select */
713 fd_set fds;
714 struct timeval tv;
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -0700715 tv.tv_sec = (int)interval;
716 tv.tv_usec = (int)((interval - tv.tv_sec) * 1e6);
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000717 FD_ZERO(&fds);
718 FD_SET(s->sock_fd, &fds);
Anthony Baxter93ab5fa2006-07-11 02:04:09 +0000719
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000720 /* See if the socket is ready */
721 if (writing)
722 n = select(s->sock_fd+1, NULL, &fds, NULL, &tv);
723 else
724 n = select(s->sock_fd+1, &fds, NULL, NULL, &tv);
725 }
Anthony Baxter93ab5fa2006-07-11 02:04:09 +0000726#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000727
728 if (n < 0)
729 return -1;
730 if (n == 0)
731 return 1;
732 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000733}
734
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -0700735static int
736internal_select(PySocketSockObject *s, int writing)
737{
738 return internal_select_ex(s, writing, s->sock_timeout);
739}
740
741/*
742 Two macros for automatic retry of select() in case of false positives
743 (for example, select() could indicate a socket is ready for reading
744 but the data then discarded by the OS because of a wrong checksum).
745 Here is an example of use:
746
747 BEGIN_SELECT_LOOP(s)
748 Py_BEGIN_ALLOW_THREADS
749 timeout = internal_select_ex(s, 0, interval);
750 if (!timeout)
751 outlen = recv(s->sock_fd, cbuf, len, flags);
752 Py_END_ALLOW_THREADS
753 if (timeout == 1) {
754 PyErr_SetString(socket_timeout, "timed out");
755 return -1;
756 }
757 END_SELECT_LOOP(s)
758*/
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -0700759#define BEGIN_SELECT_LOOP(s) \
760 { \
761 double deadline, interval = s->sock_timeout; \
762 int has_timeout = s->sock_timeout > 0.0; \
763 if (has_timeout) { \
Kristján Valur Jónsson868f0aa2013-03-19 13:53:56 -0700764 deadline = _PyTime_FloatTime() + s->sock_timeout; \
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -0700765 } \
766 while (1) { \
Kristján Valur Jónsson868f0aa2013-03-19 13:53:56 -0700767 errno = 0;
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -0700768
769#define END_SELECT_LOOP(s) \
770 if (!has_timeout || \
771 (!CHECK_ERRNO(EWOULDBLOCK) && !CHECK_ERRNO(EAGAIN))) \
772 break; \
Kristján Valur Jónsson868f0aa2013-03-19 13:53:56 -0700773 interval = deadline - _PyTime_FloatTime(); \
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -0700774 } \
Kristján Valur Jónsson620e3642013-03-19 13:01:05 -0700775 }
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -0700776
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000777/* Initialize a new socket object. */
778
Tim Petersa12b4cf2002-07-18 22:38:44 +0000779static double defaulttimeout = -1.0; /* Default timeout for new sockets */
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000780
Mark Hammond62b1ab12002-07-23 06:31:15 +0000781PyMODINIT_FUNC
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000782init_sockobject(PySocketSockObject *s,
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000783 SOCKET_T fd, int family, int type, int proto)
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000784{
785#ifdef RISCOS
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000786 int block = 1;
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000787#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000788 s->sock_fd = fd;
789 s->sock_family = family;
790 s->sock_type = type;
791 s->sock_proto = proto;
792 s->sock_timeout = defaulttimeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000793
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000794 s->errorhandler = &set_error;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000795
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000796 if (defaulttimeout >= 0.0)
797 internal_setblocking(s, 0);
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000798
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000799#ifdef RISCOS
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000800 if (taskwindow)
801 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000802#endif
803}
804
805
Guido van Rossum30a685f1991-06-27 15:51:29 +0000806/* Create a new socket object.
807 This just creates the object and initializes it.
808 If the creation fails, return NULL and set an exception (implicit
809 in NEWOBJ()). */
810
Guido van Rossum73624e91994-10-10 17:59:00 +0000811static PySocketSockObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000812new_sockobject(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000813{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000814 PySocketSockObject *s;
815 s = (PySocketSockObject *)
816 PyType_GenericNew(&sock_type, NULL, NULL);
817 if (s != NULL)
818 init_sockobject(s, fd, family, type, proto);
819 return s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000820}
821
Guido van Rossum30a685f1991-06-27 15:51:29 +0000822
Guido van Rossum48a680c2001-03-02 06:34:14 +0000823/* Lock to allow python interpreter to continue, but only allow one
Just van Rossum1040d2c2003-05-09 07:53:18 +0000824 thread to be in gethostbyname or getaddrinfo */
825#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Matthias Klosec5517762012-08-14 17:24:47 +0200826static PyThread_type_lock netdb_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000827#endif
828
829
Guido van Rossum30a685f1991-06-27 15:51:29 +0000830/* Convert a string specifying a host name or one of a few symbolic
831 names to a numeric IP address. This usually calls gethostbyname()
832 to do the work; the names "" and "<broadcast>" are special.
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000833 Return the length (IPv4 should be 4 bytes), or negative if
Guido van Rossum30a685f1991-06-27 15:51:29 +0000834 an error occurred; then an exception is raised. */
835
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000836static int
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000837setipaddr(char *name, struct sockaddr *addr_ret, size_t addr_ret_size, int af)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000838{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000839 struct addrinfo hints, *res;
840 int error;
841 int d1, d2, d3, d4;
842 char ch;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000843
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000844 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
845 if (name[0] == '\0') {
846 int siz;
847 memset(&hints, 0, sizeof(hints));
848 hints.ai_family = af;
849 hints.ai_socktype = SOCK_DGRAM; /*dummy*/
850 hints.ai_flags = AI_PASSIVE;
851 Py_BEGIN_ALLOW_THREADS
852 ACQUIRE_GETADDRINFO_LOCK
853 error = getaddrinfo(NULL, "0", &hints, &res);
854 Py_END_ALLOW_THREADS
855 /* We assume that those thread-unsafe getaddrinfo() versions
856 *are* safe regarding their return value, ie. that a
857 subsequent call to getaddrinfo() does not destroy the
858 outcome of the first call. */
859 RELEASE_GETADDRINFO_LOCK
860 if (error) {
861 set_gaierror(error);
862 return -1;
863 }
864 switch (res->ai_family) {
865 case AF_INET:
866 siz = 4;
867 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000868#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000869 case AF_INET6:
870 siz = 16;
871 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000872#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000873 default:
874 freeaddrinfo(res);
875 PyErr_SetString(socket_error,
876 "unsupported address family");
877 return -1;
878 }
879 if (res->ai_next) {
880 freeaddrinfo(res);
881 PyErr_SetString(socket_error,
882 "wildcard resolved to multiple address");
883 return -1;
884 }
885 if (res->ai_addrlen < addr_ret_size)
886 addr_ret_size = res->ai_addrlen;
887 memcpy(addr_ret, res->ai_addr, addr_ret_size);
888 freeaddrinfo(res);
889 return siz;
890 }
891 if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
892 struct sockaddr_in *sin;
893 if (af != AF_INET && af != AF_UNSPEC) {
894 PyErr_SetString(socket_error,
895 "address family mismatched");
896 return -1;
897 }
898 sin = (struct sockaddr_in *)addr_ret;
899 memset((void *) sin, '\0', sizeof(*sin));
900 sin->sin_family = AF_INET;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000901#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000902 sin->sin_len = sizeof(*sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000903#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000904 sin->sin_addr.s_addr = INADDR_BROADCAST;
905 return sizeof(sin->sin_addr);
906 }
907 if (sscanf(name, "%d.%d.%d.%d%c", &d1, &d2, &d3, &d4, &ch) == 4 &&
908 0 <= d1 && d1 <= 255 && 0 <= d2 && d2 <= 255 &&
909 0 <= d3 && d3 <= 255 && 0 <= d4 && d4 <= 255) {
910 struct sockaddr_in *sin;
911 sin = (struct sockaddr_in *)addr_ret;
912 sin->sin_addr.s_addr = htonl(
913 ((long) d1 << 24) | ((long) d2 << 16) |
914 ((long) d3 << 8) | ((long) d4 << 0));
915 sin->sin_family = AF_INET;
Anthony Baxter0e85f9d2003-05-02 15:40:46 +0000916#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000917 sin->sin_len = sizeof(*sin);
Anthony Baxter0e85f9d2003-05-02 15:40:46 +0000918#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000919 return 4;
920 }
921 memset(&hints, 0, sizeof(hints));
922 hints.ai_family = af;
923 Py_BEGIN_ALLOW_THREADS
924 ACQUIRE_GETADDRINFO_LOCK
925 error = getaddrinfo(name, NULL, &hints, &res);
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000926#if defined(__digital__) && defined(__unix__)
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000927 if (error == EAI_NONAME && af == AF_UNSPEC) {
928 /* On Tru64 V5.1, numeric-to-addr conversion fails
929 if no address family is given. Assume IPv4 for now.*/
930 hints.ai_family = AF_INET;
931 error = getaddrinfo(name, NULL, &hints, &res);
932 }
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000933#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000934 Py_END_ALLOW_THREADS
935 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
936 if (error) {
937 set_gaierror(error);
938 return -1;
939 }
940 if (res->ai_addrlen < addr_ret_size)
941 addr_ret_size = res->ai_addrlen;
942 memcpy((char *) addr_ret, res->ai_addr, addr_ret_size);
943 freeaddrinfo(res);
944 switch (addr_ret->sa_family) {
945 case AF_INET:
946 return 4;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000947#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000948 case AF_INET6:
949 return 16;
Guido van Rossum955becc1999-03-22 20:14:53 +0000950#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000951 default:
952 PyErr_SetString(socket_error, "unknown address family");
953 return -1;
954 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000955}
956
Guido van Rossum30a685f1991-06-27 15:51:29 +0000957
Guido van Rossum30a685f1991-06-27 15:51:29 +0000958/* Create a string object representing an IP address.
959 This is always a string of the form 'dd.dd.dd.dd' (with variable
960 size numbers). */
961
Guido van Rossum73624e91994-10-10 17:59:00 +0000962static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000963makeipaddr(struct sockaddr *addr, int addrlen)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000964{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000965 char buf[NI_MAXHOST];
966 int error;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000967
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000968 error = getnameinfo(addr, addrlen, buf, sizeof(buf), NULL, 0,
969 NI_NUMERICHOST);
970 if (error) {
971 set_gaierror(error);
972 return NULL;
973 }
974 return PyString_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000975}
976
977
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000978#ifdef USE_BLUETOOTH
979/* Convert a string representation of a Bluetooth address into a numeric
980 address. Returns the length (6), or raises an exception and returns -1 if
981 an error occurred. */
982
983static int
984setbdaddr(char *name, bdaddr_t *bdaddr)
985{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000986 unsigned int b0, b1, b2, b3, b4, b5;
987 char ch;
988 int n;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000989
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000990 n = sscanf(name, "%X:%X:%X:%X:%X:%X%c",
991 &b5, &b4, &b3, &b2, &b1, &b0, &ch);
992 if (n == 6 && (b0 | b1 | b2 | b3 | b4 | b5) < 256) {
993 bdaddr->b[0] = b0;
994 bdaddr->b[1] = b1;
995 bdaddr->b[2] = b2;
996 bdaddr->b[3] = b3;
997 bdaddr->b[4] = b4;
998 bdaddr->b[5] = b5;
999 return 6;
1000 } else {
1001 PyErr_SetString(socket_error, "bad bluetooth address");
1002 return -1;
1003 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001004}
1005
1006/* Create a string representation of the Bluetooth address. This is always a
1007 string of the form 'XX:XX:XX:XX:XX:XX' where XX is a two digit hexadecimal
1008 value (zero padded if necessary). */
1009
1010static PyObject *
1011makebdaddr(bdaddr_t *bdaddr)
1012{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001013 char buf[(6 * 2) + 5 + 1];
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001014
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001015 sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X",
1016 bdaddr->b[5], bdaddr->b[4], bdaddr->b[3],
1017 bdaddr->b[2], bdaddr->b[1], bdaddr->b[0]);
1018 return PyString_FromString(buf);
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001019}
1020#endif
1021
1022
Guido van Rossum30a685f1991-06-27 15:51:29 +00001023/* Create an object representing the given socket address,
1024 suitable for passing it back to bind(), connect() etc.
1025 The family field of the sockaddr structure is inspected
1026 to determine what kind of address it really is. */
1027
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001028/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001029static PyObject *
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001030makesockaddr(int sockfd, struct sockaddr *addr, int addrlen, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001031{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001032 if (addrlen == 0) {
1033 /* No address -- may be recvfrom() from known socket */
1034 Py_INCREF(Py_None);
1035 return Py_None;
1036 }
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001037
Guido van Rossumbcc20741998-08-04 22:53:56 +00001038#ifdef __BEOS__
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001039 /* XXX: BeOS version of accept() doesn't set family correctly */
1040 addr->sa_family = AF_INET;
Guido van Rossumbcc20741998-08-04 22:53:56 +00001041#endif
1042
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001043 switch (addr->sa_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001044
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001045 case AF_INET:
1046 {
1047 struct sockaddr_in *a;
1048 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
1049 PyObject *ret = NULL;
1050 if (addrobj) {
1051 a = (struct sockaddr_in *)addr;
1052 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
1053 Py_DECREF(addrobj);
1054 }
1055 return ret;
1056 }
Guido van Rossum30a685f1991-06-27 15:51:29 +00001057
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001058#if defined(AF_UNIX)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001059 case AF_UNIX:
1060 {
1061 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Armin Rigoa9017c32006-04-19 11:50:27 +00001062#ifdef linux
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001063 if (a->sun_path[0] == 0) { /* Linux abstract namespace */
1064 addrlen -= offsetof(struct sockaddr_un, sun_path);
1065 return PyString_FromStringAndSize(a->sun_path,
1066 addrlen);
1067 }
1068 else
Armin Rigoa9017c32006-04-19 11:50:27 +00001069#endif /* linux */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001070 {
1071 /* regular NULL-terminated string */
1072 return PyString_FromString(a->sun_path);
1073 }
1074 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001075#endif /* AF_UNIX */
1076
Martin v. Löwis11017b12006-01-14 18:12:57 +00001077#if defined(AF_NETLINK)
1078 case AF_NETLINK:
1079 {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001080 struct sockaddr_nl *a = (struct sockaddr_nl *) addr;
1081 return Py_BuildValue("II", a->nl_pid, a->nl_groups);
Martin v. Löwis11017b12006-01-14 18:12:57 +00001082 }
1083#endif /* AF_NETLINK */
1084
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001085#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001086 case AF_INET6:
1087 {
1088 struct sockaddr_in6 *a;
1089 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
1090 PyObject *ret = NULL;
1091 if (addrobj) {
1092 a = (struct sockaddr_in6 *)addr;
Charles-François Natali3aa59e32012-01-02 15:38:27 +01001093 ret = Py_BuildValue("OiII",
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001094 addrobj,
1095 ntohs(a->sin6_port),
Charles-François Natali3aa59e32012-01-02 15:38:27 +01001096 ntohl(a->sin6_flowinfo),
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001097 a->sin6_scope_id);
1098 Py_DECREF(addrobj);
1099 }
1100 return ret;
1101 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001102#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001103
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001104#ifdef USE_BLUETOOTH
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001105 case AF_BLUETOOTH:
1106 switch (proto) {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001107
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001108 case BTPROTO_L2CAP:
1109 {
1110 struct sockaddr_l2 *a = (struct sockaddr_l2 *) addr;
1111 PyObject *addrobj = makebdaddr(&_BT_L2_MEMB(a, bdaddr));
1112 PyObject *ret = NULL;
1113 if (addrobj) {
1114 ret = Py_BuildValue("Oi",
1115 addrobj,
1116 _BT_L2_MEMB(a, psm));
1117 Py_DECREF(addrobj);
1118 }
1119 return ret;
1120 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001121
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001122 case BTPROTO_RFCOMM:
1123 {
1124 struct sockaddr_rc *a = (struct sockaddr_rc *) addr;
1125 PyObject *addrobj = makebdaddr(&_BT_RC_MEMB(a, bdaddr));
1126 PyObject *ret = NULL;
1127 if (addrobj) {
1128 ret = Py_BuildValue("Oi",
1129 addrobj,
1130 _BT_RC_MEMB(a, channel));
1131 Py_DECREF(addrobj);
1132 }
1133 return ret;
1134 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001135
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001136 case BTPROTO_HCI:
1137 {
1138 struct sockaddr_hci *a = (struct sockaddr_hci *) addr;
Gregory P. Smith886a1cd2010-10-17 04:28:14 +00001139#if defined(__NetBSD__) || defined(__DragonFly__)
1140 return makebdaddr(&_BT_HCI_MEMB(a, bdaddr));
1141#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001142 PyObject *ret = NULL;
1143 ret = Py_BuildValue("i", _BT_HCI_MEMB(a, dev));
1144 return ret;
Gregory P. Smith886a1cd2010-10-17 04:28:14 +00001145#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001146 }
Martin v. Löwis45423a72007-02-14 10:07:37 +00001147
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001148#if !defined(__FreeBSD__)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001149 case BTPROTO_SCO:
1150 {
1151 struct sockaddr_sco *a = (struct sockaddr_sco *) addr;
1152 return makebdaddr(&_BT_SCO_MEMB(a, bdaddr));
1153 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001154#endif
1155
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001156 default:
1157 PyErr_SetString(PyExc_ValueError,
1158 "Unknown Bluetooth protocol");
1159 return NULL;
1160 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001161#endif
1162
Antoine Pitroue0c5f3c2010-10-27 20:35:26 +00001163#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFNAME)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001164 case AF_PACKET:
1165 {
1166 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
1167 char *ifname = "";
1168 struct ifreq ifr;
1169 /* need to look up interface name give index */
1170 if (a->sll_ifindex) {
1171 ifr.ifr_ifindex = a->sll_ifindex;
1172 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1173 ifname = ifr.ifr_name;
1174 }
1175 return Py_BuildValue("shbhs#",
1176 ifname,
1177 ntohs(a->sll_protocol),
1178 a->sll_pkttype,
1179 a->sll_hatype,
1180 a->sll_addr,
1181 a->sll_halen);
1182 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001183#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001184
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001185#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001186 case AF_TIPC:
1187 {
1188 struct sockaddr_tipc *a = (struct sockaddr_tipc *) addr;
1189 if (a->addrtype == TIPC_ADDR_NAMESEQ) {
1190 return Py_BuildValue("IIIII",
1191 a->addrtype,
1192 a->addr.nameseq.type,
1193 a->addr.nameseq.lower,
1194 a->addr.nameseq.upper,
1195 a->scope);
1196 } else if (a->addrtype == TIPC_ADDR_NAME) {
1197 return Py_BuildValue("IIIII",
1198 a->addrtype,
1199 a->addr.name.name.type,
1200 a->addr.name.name.instance,
1201 a->addr.name.name.instance,
1202 a->scope);
1203 } else if (a->addrtype == TIPC_ADDR_ID) {
1204 return Py_BuildValue("IIIII",
1205 a->addrtype,
1206 a->addr.id.node,
1207 a->addr.id.ref,
1208 0,
1209 a->scope);
1210 } else {
1211 PyErr_SetString(PyExc_ValueError,
1212 "Invalid address type");
1213 return NULL;
1214 }
1215 }
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001216#endif
1217
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001218 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001219
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001220 default:
1221 /* If we don't know the address family, don't raise an
1222 exception -- return it as a tuple. */
1223 return Py_BuildValue("is#",
1224 addr->sa_family,
1225 addr->sa_data,
1226 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001227
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001228 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001229}
1230
Guido van Rossum30a685f1991-06-27 15:51:29 +00001231
1232/* Parse a socket address argument according to the socket object's
1233 address family. Return 1 if the address was in the proper format,
1234 0 of not. The address is returned through addr_ret, its length
1235 through len_ret. */
1236
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001237static int
Guido van Rossum48a680c2001-03-02 06:34:14 +00001238getsockaddrarg(PySocketSockObject *s, PyObject *args,
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001239 struct sockaddr *addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001240{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001241 switch (s->sock_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001242
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001243#if defined(AF_UNIX)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001244 case AF_UNIX:
1245 {
1246 struct sockaddr_un* addr;
1247 char *path;
1248 int len;
1249 if (!PyArg_Parse(args, "t#", &path, &len))
1250 return 0;
Martin v. Löwis046c4d12006-12-03 11:23:45 +00001251
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001252 addr = (struct sockaddr_un*)addr_ret;
Armin Rigoa9017c32006-04-19 11:50:27 +00001253#ifdef linux
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001254 if (len > 0 && path[0] == 0) {
1255 /* Linux abstract namespace extension */
1256 if (len > sizeof addr->sun_path) {
1257 PyErr_SetString(socket_error,
1258 "AF_UNIX path too long");
1259 return 0;
1260 }
1261 }
1262 else
Armin Rigoa9017c32006-04-19 11:50:27 +00001263#endif /* linux */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001264 {
1265 /* regular NULL-terminated string */
1266 if (len >= sizeof addr->sun_path) {
1267 PyErr_SetString(socket_error,
1268 "AF_UNIX path too long");
1269 return 0;
1270 }
1271 addr->sun_path[len] = 0;
1272 }
1273 addr->sun_family = s->sock_family;
1274 memcpy(addr->sun_path, path, len);
Andrew MacIntyredaedf212004-04-11 12:03:57 +00001275#if defined(PYOS_OS2)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001276 *len_ret = sizeof(*addr);
Andrew MacIntyredaedf212004-04-11 12:03:57 +00001277#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001278 *len_ret = len + offsetof(struct sockaddr_un, sun_path);
Andrew MacIntyredaedf212004-04-11 12:03:57 +00001279#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001280 return 1;
1281 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001282#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001283
Martin v. Löwis11017b12006-01-14 18:12:57 +00001284#if defined(AF_NETLINK)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001285 case AF_NETLINK:
1286 {
1287 struct sockaddr_nl* addr;
1288 int pid, groups;
1289 addr = (struct sockaddr_nl *)addr_ret;
1290 if (!PyTuple_Check(args)) {
1291 PyErr_Format(
1292 PyExc_TypeError,
1293 "getsockaddrarg: "
1294 "AF_NETLINK address must be tuple, not %.500s",
1295 Py_TYPE(args)->tp_name);
1296 return 0;
1297 }
1298 if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &pid, &groups))
1299 return 0;
1300 addr->nl_family = AF_NETLINK;
1301 addr->nl_pid = pid;
1302 addr->nl_groups = groups;
1303 *len_ret = sizeof(*addr);
1304 return 1;
1305 }
Martin v. Löwis11017b12006-01-14 18:12:57 +00001306#endif
1307
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001308 case AF_INET:
1309 {
1310 struct sockaddr_in* addr;
1311 char *host;
1312 int port, result;
1313 if (!PyTuple_Check(args)) {
1314 PyErr_Format(
1315 PyExc_TypeError,
1316 "getsockaddrarg: "
1317 "AF_INET address must be tuple, not %.500s",
1318 Py_TYPE(args)->tp_name);
1319 return 0;
1320 }
1321 if (!PyArg_ParseTuple(args, "eti:getsockaddrarg",
1322 "idna", &host, &port))
1323 return 0;
1324 addr=(struct sockaddr_in*)addr_ret;
1325 result = setipaddr(host, (struct sockaddr *)addr,
1326 sizeof(*addr), AF_INET);
1327 PyMem_Free(host);
1328 if (result < 0)
1329 return 0;
1330 if (port < 0 || port > 0xffff) {
1331 PyErr_SetString(
1332 PyExc_OverflowError,
1333 "getsockaddrarg: port must be 0-65535.");
1334 return 0;
1335 }
1336 addr->sin_family = AF_INET;
1337 addr->sin_port = htons((short)port);
1338 *len_ret = sizeof *addr;
1339 return 1;
1340 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001341
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001342#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001343 case AF_INET6:
1344 {
1345 struct sockaddr_in6* addr;
1346 char *host;
Charles-François Natali3aa59e32012-01-02 15:38:27 +01001347 int port, result;
1348 unsigned int flowinfo, scope_id;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001349 flowinfo = scope_id = 0;
1350 if (!PyTuple_Check(args)) {
1351 PyErr_Format(
1352 PyExc_TypeError,
1353 "getsockaddrarg: "
1354 "AF_INET6 address must be tuple, not %.500s",
1355 Py_TYPE(args)->tp_name);
1356 return 0;
1357 }
Charles-François Natali3aa59e32012-01-02 15:38:27 +01001358 if (!PyArg_ParseTuple(args, "eti|II",
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001359 "idna", &host, &port, &flowinfo,
1360 &scope_id)) {
1361 return 0;
1362 }
1363 addr = (struct sockaddr_in6*)addr_ret;
1364 result = setipaddr(host, (struct sockaddr *)addr,
1365 sizeof(*addr), AF_INET6);
1366 PyMem_Free(host);
1367 if (result < 0)
1368 return 0;
1369 if (port < 0 || port > 0xffff) {
1370 PyErr_SetString(
1371 PyExc_OverflowError,
1372 "getsockaddrarg: port must be 0-65535.");
1373 return 0;
1374 }
Charles-François Natali65dd7452012-06-23 10:06:56 +02001375 if (flowinfo > 0xfffff) {
Charles-François Natali3aa59e32012-01-02 15:38:27 +01001376 PyErr_SetString(
1377 PyExc_OverflowError,
1378 "getsockaddrarg: flowinfo must be 0-1048575.");
1379 return 0;
1380 }
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001381 addr->sin6_family = s->sock_family;
1382 addr->sin6_port = htons((short)port);
Charles-François Natali3aa59e32012-01-02 15:38:27 +01001383 addr->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001384 addr->sin6_scope_id = scope_id;
1385 *len_ret = sizeof *addr;
1386 return 1;
1387 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001388#endif
1389
Hye-Shik Chang81268602004-02-02 06:05:24 +00001390#ifdef USE_BLUETOOTH
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001391 case AF_BLUETOOTH:
1392 {
1393 switch (s->sock_proto) {
1394 case BTPROTO_L2CAP:
1395 {
1396 struct sockaddr_l2 *addr;
1397 char *straddr;
Martin v. Löwis12af0482004-01-31 12:34:17 +00001398
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001399 addr = (struct sockaddr_l2 *)addr_ret;
1400 memset(addr, 0, sizeof(struct sockaddr_l2));
1401 _BT_L2_MEMB(addr, family) = AF_BLUETOOTH;
1402 if (!PyArg_ParseTuple(args, "si", &straddr,
1403 &_BT_L2_MEMB(addr, psm))) {
1404 PyErr_SetString(socket_error, "getsockaddrarg: "
1405 "wrong format");
1406 return 0;
1407 }
1408 if (setbdaddr(straddr, &_BT_L2_MEMB(addr, bdaddr)) < 0)
1409 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001410
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001411 *len_ret = sizeof *addr;
1412 return 1;
1413 }
1414 case BTPROTO_RFCOMM:
1415 {
1416 struct sockaddr_rc *addr;
1417 char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001418
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001419 addr = (struct sockaddr_rc *)addr_ret;
1420 _BT_RC_MEMB(addr, family) = AF_BLUETOOTH;
1421 if (!PyArg_ParseTuple(args, "si", &straddr,
1422 &_BT_RC_MEMB(addr, channel))) {
1423 PyErr_SetString(socket_error, "getsockaddrarg: "
1424 "wrong format");
1425 return 0;
1426 }
1427 if (setbdaddr(straddr, &_BT_RC_MEMB(addr, bdaddr)) < 0)
1428 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001429
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001430 *len_ret = sizeof *addr;
1431 return 1;
1432 }
1433 case BTPROTO_HCI:
1434 {
1435 struct sockaddr_hci *addr = (struct sockaddr_hci *)addr_ret;
Gregory P. Smith886a1cd2010-10-17 04:28:14 +00001436#if defined(__NetBSD__) || defined(__DragonFly__)
1437 char *straddr = PyBytes_AS_STRING(args);
1438
1439 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
1440 if (straddr == NULL) {
1441 PyErr_SetString(socket_error, "getsockaddrarg: "
1442 "wrong format");
1443 return 0;
1444 }
1445 if (setbdaddr(straddr, &_BT_HCI_MEMB(addr, bdaddr)) < 0)
1446 return 0;
1447#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001448 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
1449 if (!PyArg_ParseTuple(args, "i", &_BT_HCI_MEMB(addr, dev))) {
1450 PyErr_SetString(socket_error, "getsockaddrarg: "
1451 "wrong format");
1452 return 0;
1453 }
Gregory P. Smith886a1cd2010-10-17 04:28:14 +00001454#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001455 *len_ret = sizeof *addr;
1456 return 1;
1457 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001458#if !defined(__FreeBSD__)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001459 case BTPROTO_SCO:
1460 {
1461 struct sockaddr_sco *addr;
1462 char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001463
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001464 addr = (struct sockaddr_sco *)addr_ret;
1465 _BT_SCO_MEMB(addr, family) = AF_BLUETOOTH;
1466 straddr = PyString_AsString(args);
1467 if (straddr == NULL) {
1468 PyErr_SetString(socket_error, "getsockaddrarg: "
1469 "wrong format");
1470 return 0;
1471 }
1472 if (setbdaddr(straddr, &_BT_SCO_MEMB(addr, bdaddr)) < 0)
1473 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001474
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001475 *len_ret = sizeof *addr;
1476 return 1;
1477 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001478#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001479 default:
1480 PyErr_SetString(socket_error, "getsockaddrarg: unknown Bluetooth protocol");
1481 return 0;
1482 }
1483 }
Martin v. Löwis12af0482004-01-31 12:34:17 +00001484#endif
1485
Antoine Pitroue0c5f3c2010-10-27 20:35:26 +00001486#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFINDEX)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001487 case AF_PACKET:
1488 {
1489 struct sockaddr_ll* addr;
1490 struct ifreq ifr;
1491 char *interfaceName;
1492 int protoNumber;
1493 int hatype = 0;
1494 int pkttype = 0;
1495 char *haddr = NULL;
1496 unsigned int halen = 0;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001497
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001498 if (!PyTuple_Check(args)) {
1499 PyErr_Format(
1500 PyExc_TypeError,
1501 "getsockaddrarg: "
1502 "AF_PACKET address must be tuple, not %.500s",
1503 Py_TYPE(args)->tp_name);
1504 return 0;
1505 }
1506 if (!PyArg_ParseTuple(args, "si|iis#", &interfaceName,
1507 &protoNumber, &pkttype, &hatype,
1508 &haddr, &halen))
1509 return 0;
1510 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
1511 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
1512 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1513 s->errorhandler();
1514 return 0;
1515 }
1516 if (halen > 8) {
1517 PyErr_SetString(PyExc_ValueError,
1518 "Hardware address must be 8 bytes or less");
1519 return 0;
1520 }
1521 if (protoNumber < 0 || protoNumber > 0xffff) {
1522 PyErr_SetString(
1523 PyExc_OverflowError,
1524 "getsockaddrarg: protoNumber must be 0-65535.");
1525 return 0;
1526 }
1527 addr = (struct sockaddr_ll*)addr_ret;
1528 addr->sll_family = AF_PACKET;
1529 addr->sll_protocol = htons((short)protoNumber);
1530 addr->sll_ifindex = ifr.ifr_ifindex;
1531 addr->sll_pkttype = pkttype;
1532 addr->sll_hatype = hatype;
1533 if (halen != 0) {
1534 memcpy(&addr->sll_addr, haddr, halen);
1535 }
1536 addr->sll_halen = halen;
1537 *len_ret = sizeof *addr;
1538 return 1;
1539 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00001540#endif
1541
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001542#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001543 case AF_TIPC:
1544 {
1545 unsigned int atype, v1, v2, v3;
1546 unsigned int scope = TIPC_CLUSTER_SCOPE;
1547 struct sockaddr_tipc *addr;
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001548
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001549 if (!PyTuple_Check(args)) {
1550 PyErr_Format(
1551 PyExc_TypeError,
1552 "getsockaddrarg: "
1553 "AF_TIPC address must be tuple, not %.500s",
1554 Py_TYPE(args)->tp_name);
1555 return 0;
1556 }
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001557
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001558 if (!PyArg_ParseTuple(args,
1559 "IIII|I;Invalid TIPC address format",
1560 &atype, &v1, &v2, &v3, &scope))
1561 return 0;
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001562
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001563 addr = (struct sockaddr_tipc *) addr_ret;
1564 memset(addr, 0, sizeof(struct sockaddr_tipc));
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001565
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001566 addr->family = AF_TIPC;
1567 addr->scope = scope;
1568 addr->addrtype = atype;
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001569
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001570 if (atype == TIPC_ADDR_NAMESEQ) {
1571 addr->addr.nameseq.type = v1;
1572 addr->addr.nameseq.lower = v2;
1573 addr->addr.nameseq.upper = v3;
1574 } else if (atype == TIPC_ADDR_NAME) {
1575 addr->addr.name.name.type = v1;
1576 addr->addr.name.name.instance = v2;
1577 } else if (atype == TIPC_ADDR_ID) {
1578 addr->addr.id.node = v1;
1579 addr->addr.id.ref = v2;
1580 } else {
1581 /* Shouldn't happen */
1582 PyErr_SetString(PyExc_TypeError, "Invalid address type");
1583 return 0;
1584 }
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001585
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001586 *len_ret = sizeof(*addr);
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001587
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001588 return 1;
1589 }
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001590#endif
1591
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001592 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001593
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001594 default:
1595 PyErr_SetString(socket_error, "getsockaddrarg: bad family");
1596 return 0;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001597
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001598 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001599}
1600
Guido van Rossum30a685f1991-06-27 15:51:29 +00001601
Guido van Rossum48a680c2001-03-02 06:34:14 +00001602/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +00001603 Return 1 if the family is known, 0 otherwise. The length is returned
1604 through len_ret. */
1605
1606static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +00001607getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +00001608{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001609 switch (s->sock_family) {
Guido van Rossum710e1df1992-06-12 10:39:36 +00001610
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001611#if defined(AF_UNIX)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001612 case AF_UNIX:
1613 {
1614 *len_ret = sizeof (struct sockaddr_un);
1615 return 1;
1616 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001617#endif /* AF_UNIX */
Martin v. Löwis11017b12006-01-14 18:12:57 +00001618#if defined(AF_NETLINK)
1619 case AF_NETLINK:
1620 {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001621 *len_ret = sizeof (struct sockaddr_nl);
1622 return 1;
Martin v. Löwis11017b12006-01-14 18:12:57 +00001623 }
1624#endif
Guido van Rossum710e1df1992-06-12 10:39:36 +00001625
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001626 case AF_INET:
1627 {
1628 *len_ret = sizeof (struct sockaddr_in);
1629 return 1;
1630 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00001631
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001632#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001633 case AF_INET6:
1634 {
1635 *len_ret = sizeof (struct sockaddr_in6);
1636 return 1;
1637 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001638#endif
1639
Hye-Shik Chang81268602004-02-02 06:05:24 +00001640#ifdef USE_BLUETOOTH
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001641 case AF_BLUETOOTH:
1642 {
1643 switch(s->sock_proto)
1644 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001645
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001646 case BTPROTO_L2CAP:
1647 *len_ret = sizeof (struct sockaddr_l2);
1648 return 1;
1649 case BTPROTO_RFCOMM:
1650 *len_ret = sizeof (struct sockaddr_rc);
1651 return 1;
1652 case BTPROTO_HCI:
1653 *len_ret = sizeof (struct sockaddr_hci);
1654 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00001655#if !defined(__FreeBSD__)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001656 case BTPROTO_SCO:
1657 *len_ret = sizeof (struct sockaddr_sco);
1658 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00001659#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001660 default:
1661 PyErr_SetString(socket_error, "getsockaddrlen: "
1662 "unknown BT protocol");
1663 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001664
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001665 }
1666 }
Martin v. Löwis12af0482004-01-31 12:34:17 +00001667#endif
1668
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00001669#ifdef HAVE_NETPACKET_PACKET_H
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001670 case AF_PACKET:
1671 {
1672 *len_ret = sizeof (struct sockaddr_ll);
1673 return 1;
1674 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001675#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001676
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001677#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001678 case AF_TIPC:
1679 {
1680 *len_ret = sizeof (struct sockaddr_tipc);
1681 return 1;
1682 }
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001683#endif
1684
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001685 /* More cases here... */
Guido van Rossum710e1df1992-06-12 10:39:36 +00001686
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001687 default:
1688 PyErr_SetString(socket_error, "getsockaddrlen: bad family");
1689 return 0;
Guido van Rossum710e1df1992-06-12 10:39:36 +00001690
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001691 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00001692}
1693
1694
Guido van Rossum30a685f1991-06-27 15:51:29 +00001695/* s.accept() method */
1696
Guido van Rossum73624e91994-10-10 17:59:00 +00001697static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001698sock_accept(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001699{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001700 sock_addr_t addrbuf;
1701 SOCKET_T newfd;
1702 socklen_t addrlen;
1703 PyObject *sock = NULL;
1704 PyObject *addr = NULL;
1705 PyObject *res = NULL;
1706 int timeout;
Barry Warsaw752300b1997-01-03 17:18:10 +00001707
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001708 if (!getsockaddrlen(s, &addrlen))
1709 return NULL;
1710 memset(&addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001711
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001712 newfd = INVALID_SOCKET;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001713
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
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001730 if (newfd == INVALID_SOCKET)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001731 return s->errorhandler();
Barry Warsaw752300b1997-01-03 17:18:10 +00001732
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001733 /* Create the new object with unspecified family,
1734 to avoid calls to bind() etc. on it. */
1735 sock = (PyObject *) new_sockobject(newfd,
1736 s->sock_family,
1737 s->sock_type,
1738 s->sock_proto);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001739
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001740 if (sock == NULL) {
1741 SOCKETCLOSE(newfd);
1742 goto finally;
1743 }
1744 addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
1745 addrlen, s->sock_proto);
1746 if (addr == NULL)
1747 goto finally;
Barry Warsaw752300b1997-01-03 17:18:10 +00001748
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001749 res = PyTuple_Pack(2, sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00001750
Guido van Rossum67f7a382002-06-06 21:08:16 +00001751finally:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001752 Py_XDECREF(sock);
1753 Py_XDECREF(addr);
1754 return res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001755}
1756
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001757PyDoc_STRVAR(accept_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001758"accept() -> (socket object, address info)\n\
1759\n\
1760Wait for an incoming connection. Return a new socket representing the\n\
1761connection, and the address of the client. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001762info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001763
Guido van Rossum11ba0942002-06-13 15:07:44 +00001764/* s.setblocking(flag) method. Argument:
1765 False -- non-blocking mode; same as settimeout(0)
1766 True -- blocking mode; same as settimeout(None)
1767*/
Guido van Rossume4485b01994-09-07 14:32:49 +00001768
Guido van Rossum73624e91994-10-10 17:59:00 +00001769static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001770sock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00001771{
Serhiy Storchaka74f49ab2013-01-19 12:55:39 +02001772 long block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001773
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001774 block = PyInt_AsLong(arg);
1775 if (block == -1 && PyErr_Occurred())
1776 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001777
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001778 s->sock_timeout = block ? -1.0 : 0.0;
1779 internal_setblocking(s, block);
Guido van Rossume4485b01994-09-07 14:32:49 +00001780
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001781 Py_INCREF(Py_None);
1782 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +00001783}
Guido van Rossume4485b01994-09-07 14:32:49 +00001784
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001785PyDoc_STRVAR(setblocking_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001786"setblocking(flag)\n\
1787\n\
1788Set the socket to blocking (flag is true) or non-blocking (false).\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00001789setblocking(True) is equivalent to settimeout(None);\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001790setblocking(False) is equivalent to settimeout(0.0).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001791
Guido van Rossum11ba0942002-06-13 15:07:44 +00001792/* s.settimeout(timeout) method. Argument:
1793 None -- no timeout, blocking mode; same as setblocking(True)
1794 0.0 -- non-blocking mode; same as setblocking(False)
1795 > 0 -- timeout mode; operations time out after timeout seconds
1796 < 0 -- illegal; raises an exception
1797*/
Guido van Rossum67f7a382002-06-06 21:08:16 +00001798static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001799sock_settimeout(PySocketSockObject *s, PyObject *arg)
Guido van Rossum67f7a382002-06-06 21:08:16 +00001800{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001801 double timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001802
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001803 if (arg == Py_None)
1804 timeout = -1.0;
1805 else {
1806 timeout = PyFloat_AsDouble(arg);
1807 if (timeout < 0.0) {
1808 if (!PyErr_Occurred())
1809 PyErr_SetString(PyExc_ValueError,
1810 "Timeout value out of range");
1811 return NULL;
1812 }
1813 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00001814
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001815 s->sock_timeout = timeout;
1816 internal_setblocking(s, timeout < 0.0);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001817
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001818 Py_INCREF(Py_None);
1819 return Py_None;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001820}
1821
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001822PyDoc_STRVAR(settimeout_doc,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001823"settimeout(timeout)\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00001824\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00001825Set a timeout on socket operations. 'timeout' can be a float,\n\
1826giving in seconds, or None. Setting a timeout of None disables\n\
1827the timeout feature and is equivalent to setblocking(1).\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001828Setting a timeout of zero is the same as setblocking(0).");
Guido van Rossum67f7a382002-06-06 21:08:16 +00001829
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001830/* s.gettimeout() method.
1831 Returns the timeout associated with a socket. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00001832static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001833sock_gettimeout(PySocketSockObject *s)
Guido van Rossum67f7a382002-06-06 21:08:16 +00001834{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001835 if (s->sock_timeout < 0.0) {
1836 Py_INCREF(Py_None);
1837 return Py_None;
1838 }
1839 else
1840 return PyFloat_FromDouble(s->sock_timeout);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001841}
1842
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001843PyDoc_STRVAR(gettimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00001844"gettimeout() -> timeout\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00001845\n\
Ezio Melottica5e9082011-08-14 08:27:36 +03001846Returns the timeout in seconds (float) associated with socket \n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00001847operations. A timeout of None indicates that timeouts on socket \n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001848operations are disabled.");
Guido van Rossume4485b01994-09-07 14:32:49 +00001849
Guido van Rossum48a680c2001-03-02 06:34:14 +00001850#ifdef RISCOS
1851/* s.sleeptaskw(1 | 0) method */
1852
1853static PyObject *
Martin v. Löwisa94568a2003-05-10 07:36:56 +00001854sock_sleeptaskw(PySocketSockObject *s,PyObject *arg)
Guido van Rossum48a680c2001-03-02 06:34:14 +00001855{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001856 int block;
1857 block = PyInt_AsLong(arg);
1858 if (block == -1 && PyErr_Occurred())
1859 return NULL;
1860 Py_BEGIN_ALLOW_THREADS
1861 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
1862 Py_END_ALLOW_THREADS
Guido van Rossum48a680c2001-03-02 06:34:14 +00001863
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001864 Py_INCREF(Py_None);
1865 return Py_None;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001866}
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001867PyDoc_STRVAR(sleeptaskw_doc,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001868"sleeptaskw(flag)\n\
1869\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001870Allow sleeps in taskwindows.");
Guido van Rossum48a680c2001-03-02 06:34:14 +00001871#endif
1872
1873
Guido van Rossumaee08791992-09-08 09:05:33 +00001874/* s.setsockopt() method.
1875 With an integer third argument, sets an integer option.
1876 With a string third argument, sets an option from a buffer;
1877 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001878
Guido van Rossum73624e91994-10-10 17:59:00 +00001879static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001880sock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001881{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001882 int level;
1883 int optname;
1884 int res;
1885 char *buf;
1886 int buflen;
1887 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001888
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001889 if (PyArg_ParseTuple(args, "iii:setsockopt",
1890 &level, &optname, &flag)) {
1891 buf = (char *) &flag;
1892 buflen = sizeof flag;
1893 }
1894 else {
1895 PyErr_Clear();
1896 if (!PyArg_ParseTuple(args, "iis#:setsockopt",
1897 &level, &optname, &buf, &buflen))
1898 return NULL;
1899 }
1900 res = setsockopt(s->sock_fd, level, optname, (void *)buf, buflen);
1901 if (res < 0)
1902 return s->errorhandler();
1903 Py_INCREF(Py_None);
1904 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001905}
1906
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001907PyDoc_STRVAR(setsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001908"setsockopt(level, option, value)\n\
1909\n\
1910Set a socket option. See the Unix manual for level and option.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001911The value argument can either be an integer or a string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001912
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001913
Guido van Rossumaee08791992-09-08 09:05:33 +00001914/* s.getsockopt() method.
1915 With two arguments, retrieves an integer option.
1916 With a third integer argument, retrieves a string buffer of that size;
1917 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001918
Guido van Rossum73624e91994-10-10 17:59:00 +00001919static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001920sock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001921{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001922 int level;
1923 int optname;
1924 int res;
1925 PyObject *buf;
1926 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001927
Guido van Rossumbcc20741998-08-04 22:53:56 +00001928#ifdef __BEOS__
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001929 /* We have incomplete socket support. */
1930 PyErr_SetString(socket_error, "getsockopt not supported");
1931 return NULL;
Guido van Rossumbcc20741998-08-04 22:53:56 +00001932#else
1933
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001934 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
1935 &level, &optname, &buflen))
1936 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001937
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001938 if (buflen == 0) {
1939 int flag = 0;
1940 socklen_t flagsize = sizeof flag;
1941 res = getsockopt(s->sock_fd, level, optname,
1942 (void *)&flag, &flagsize);
1943 if (res < 0)
1944 return s->errorhandler();
1945 return PyInt_FromLong(flag);
1946 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001947#ifdef __VMS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001948 /* socklen_t is unsigned so no negative test is needed,
1949 test buflen == 0 is previously done */
1950 if (buflen > 1024) {
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001951#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001952 if (buflen <= 0 || buflen > 1024) {
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001953#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001954 PyErr_SetString(socket_error,
1955 "getsockopt buflen out of range");
1956 return NULL;
1957 }
1958 buf = PyString_FromStringAndSize((char *)NULL, buflen);
1959 if (buf == NULL)
1960 return NULL;
1961 res = getsockopt(s->sock_fd, level, optname,
1962 (void *)PyString_AS_STRING(buf), &buflen);
1963 if (res < 0) {
1964 Py_DECREF(buf);
1965 return s->errorhandler();
1966 }
1967 _PyString_Resize(&buf, buflen);
1968 return buf;
Guido van Rossumbcc20741998-08-04 22:53:56 +00001969#endif /* __BEOS__ */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001970}
1971
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001972PyDoc_STRVAR(getsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001973"getsockopt(level, option[, buffersize]) -> value\n\
1974\n\
1975Get a socket option. See the Unix manual for level and option.\n\
1976If a nonzero buffersize argument is given, the return value is a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001977string of that length; otherwise it is an integer.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001978
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001979
Fred Drake728819a2000-07-01 03:40:12 +00001980/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001981
Guido van Rossum73624e91994-10-10 17:59:00 +00001982static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001983sock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001984{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001985 sock_addr_t addrbuf;
1986 int addrlen;
1987 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001988
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001989 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
1990 return NULL;
1991 Py_BEGIN_ALLOW_THREADS
1992 res = bind(s->sock_fd, SAS2SA(&addrbuf), addrlen);
1993 Py_END_ALLOW_THREADS
1994 if (res < 0)
1995 return s->errorhandler();
1996 Py_INCREF(Py_None);
1997 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001998}
1999
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002000PyDoc_STRVAR(bind_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002001"bind(address)\n\
2002\n\
2003Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00002004pair (host, port); the host must refer to the local host. For raw packet\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002005sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002006
Guido van Rossum30a685f1991-06-27 15:51:29 +00002007
2008/* s.close() method.
2009 Set the file descriptor to -1 so operations tried subsequently
2010 will surely fail. */
2011
Guido van Rossum73624e91994-10-10 17:59:00 +00002012static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002013sock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002014{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002015 SOCKET_T fd;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002016
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002017 if ((fd = s->sock_fd) != -1) {
2018 s->sock_fd = -1;
2019 Py_BEGIN_ALLOW_THREADS
2020 (void) SOCKETCLOSE(fd);
2021 Py_END_ALLOW_THREADS
2022 }
2023 Py_INCREF(Py_None);
2024 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002025}
2026
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002027PyDoc_STRVAR(close_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002028"close()\n\
2029\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002030Close the socket. It cannot be used after this call.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002031
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002032static int
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002033internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen,
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002034 int *timeoutp)
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002035{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002036 int res, timeout;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002037
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002038 timeout = 0;
2039 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002040
2041#ifdef MS_WINDOWS
2042
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002043 if (s->sock_timeout > 0.0) {
2044 if (res < 0 && WSAGetLastError() == WSAEWOULDBLOCK &&
2045 IS_SELECTABLE(s)) {
2046 /* This is a mess. Best solution: trust select */
2047 fd_set fds;
2048 fd_set fds_exc;
2049 struct timeval tv;
2050 tv.tv_sec = (int)s->sock_timeout;
2051 tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6);
2052 FD_ZERO(&fds);
2053 FD_SET(s->sock_fd, &fds);
2054 FD_ZERO(&fds_exc);
2055 FD_SET(s->sock_fd, &fds_exc);
2056 res = select(s->sock_fd+1, NULL, &fds, &fds_exc, &tv);
2057 if (res == 0) {
2058 res = WSAEWOULDBLOCK;
2059 timeout = 1;
2060 } else if (res > 0) {
2061 if (FD_ISSET(s->sock_fd, &fds))
2062 /* The socket is in the writeable set - this
2063 means connected */
2064 res = 0;
2065 else {
2066 /* As per MS docs, we need to call getsockopt()
2067 to get the underlying error */
2068 int res_size = sizeof res;
2069 /* It must be in the exception set */
2070 assert(FD_ISSET(s->sock_fd, &fds_exc));
2071 if (0 == getsockopt(s->sock_fd, SOL_SOCKET, SO_ERROR,
2072 (char *)&res, &res_size))
2073 /* getsockopt also clears WSAGetLastError,
2074 so reset it back. */
2075 WSASetLastError(res);
2076 else
2077 res = WSAGetLastError();
2078 }
2079 }
2080 /* else if (res < 0) an error occurred */
2081 }
2082 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002083
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002084 if (res < 0)
2085 res = WSAGetLastError();
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002086
2087#else
2088
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002089 if (s->sock_timeout > 0.0) {
2090 if (res < 0 && errno == EINPROGRESS && IS_SELECTABLE(s)) {
2091 timeout = internal_select(s, 1);
2092 if (timeout == 0) {
2093 /* Bug #1019808: in case of an EINPROGRESS,
2094 use getsockopt(SO_ERROR) to get the real
2095 error. */
2096 socklen_t res_size = sizeof res;
2097 (void)getsockopt(s->sock_fd, SOL_SOCKET,
2098 SO_ERROR, &res, &res_size);
2099 if (res == EISCONN)
2100 res = 0;
2101 errno = res;
2102 }
2103 else if (timeout == -1) {
2104 res = errno; /* had error */
2105 }
2106 else
2107 res = EWOULDBLOCK; /* timed out */
2108 }
2109 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002110
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002111 if (res < 0)
2112 res = errno;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002113
2114#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002115 *timeoutp = timeout;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002116
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002117 return res;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002118}
Guido van Rossum30a685f1991-06-27 15:51:29 +00002119
Fred Drake728819a2000-07-01 03:40:12 +00002120/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002121
Guido van Rossum73624e91994-10-10 17:59:00 +00002122static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002123sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002124{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002125 sock_addr_t addrbuf;
2126 int addrlen;
2127 int res;
2128 int timeout;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002129
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002130 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2131 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002132
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002133 Py_BEGIN_ALLOW_THREADS
2134 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, &timeout);
2135 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002136
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002137 if (timeout == 1) {
2138 PyErr_SetString(socket_timeout, "timed out");
2139 return NULL;
2140 }
2141 if (res != 0)
2142 return s->errorhandler();
2143 Py_INCREF(Py_None);
2144 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002145}
2146
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002147PyDoc_STRVAR(connect_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002148"connect(address)\n\
2149\n\
2150Connect the socket to a remote address. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002151is a pair (host, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002152
Guido van Rossum30a685f1991-06-27 15:51:29 +00002153
Fred Drake728819a2000-07-01 03:40:12 +00002154/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002155
2156static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002157sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002158{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002159 sock_addr_t addrbuf;
2160 int addrlen;
2161 int res;
2162 int timeout;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002163
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002164 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2165 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002166
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002167 Py_BEGIN_ALLOW_THREADS
2168 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, &timeout);
2169 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002170
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002171 /* Signals are not errors (though they may raise exceptions). Adapted
2172 from PyErr_SetFromErrnoWithFilenameObject(). */
Neal Norwitz9b0ca792006-08-02 06:46:21 +00002173#ifdef EINTR
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002174 if (res == EINTR && PyErr_CheckSignals())
2175 return NULL;
Neal Norwitz9b0ca792006-08-02 06:46:21 +00002176#endif
2177
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002178 return PyInt_FromLong((long) res);
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002179}
2180
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002181PyDoc_STRVAR(connect_ex_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002182"connect_ex(address) -> errno\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002183\n\
2184This is like connect(address), but returns an error code (the errno value)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002185instead of raising an exception when an error occurs.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002186
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002187
Guido van Rossumed233a51992-06-23 09:07:03 +00002188/* s.fileno() method */
2189
Guido van Rossum73624e91994-10-10 17:59:00 +00002190static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002191sock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00002192{
Fred Drakea04eaad2000-06-30 02:46:07 +00002193#if SIZEOF_SOCKET_T <= SIZEOF_LONG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002194 return PyInt_FromLong((long) s->sock_fd);
Fred Drakea04eaad2000-06-30 02:46:07 +00002195#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002196 return PyLong_FromLongLong((PY_LONG_LONG)s->sock_fd);
Fred Drakea04eaad2000-06-30 02:46:07 +00002197#endif
Guido van Rossumed233a51992-06-23 09:07:03 +00002198}
2199
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002200PyDoc_STRVAR(fileno_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002201"fileno() -> integer\n\
2202\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002203Return the integer file descriptor of the socket.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002204
Guido van Rossumed233a51992-06-23 09:07:03 +00002205
Guido van Rossumbe32c891996-06-20 16:25:29 +00002206#ifndef NO_DUP
2207/* s.dup() method */
2208
2209static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002210sock_dup(PySocketSockObject *s)
Guido van Rossumbe32c891996-06-20 16:25:29 +00002211{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002212 SOCKET_T newfd;
2213 PyObject *sock;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002214
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002215 newfd = dup(s->sock_fd);
2216 if (newfd < 0)
2217 return s->errorhandler();
2218 sock = (PyObject *) new_sockobject(newfd,
2219 s->sock_family,
2220 s->sock_type,
2221 s->sock_proto);
2222 if (sock == NULL)
2223 SOCKETCLOSE(newfd);
2224 return sock;
Guido van Rossumbe32c891996-06-20 16:25:29 +00002225}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002226
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002227PyDoc_STRVAR(dup_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002228"dup() -> socket object\n\
2229\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002230Return a new socket object connected to the same system resource.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002231
Guido van Rossumbe32c891996-06-20 16:25:29 +00002232#endif
2233
2234
Guido van Rossumc89705d1992-11-26 08:54:07 +00002235/* s.getsockname() method */
2236
Guido van Rossum73624e91994-10-10 17:59:00 +00002237static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002238sock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002239{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002240 sock_addr_t addrbuf;
2241 int res;
2242 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002243
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002244 if (!getsockaddrlen(s, &addrlen))
2245 return NULL;
2246 memset(&addrbuf, 0, addrlen);
2247 Py_BEGIN_ALLOW_THREADS
2248 res = getsockname(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2249 Py_END_ALLOW_THREADS
2250 if (res < 0)
2251 return s->errorhandler();
2252 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2253 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002254}
2255
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002256PyDoc_STRVAR(getsockname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002257"getsockname() -> address info\n\
2258\n\
2259Return the address of the local endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002260info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002261
Guido van Rossumc89705d1992-11-26 08:54:07 +00002262
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002263#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002264/* s.getpeername() method */
2265
Guido van Rossum73624e91994-10-10 17:59:00 +00002266static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002267sock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002268{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002269 sock_addr_t addrbuf;
2270 int res;
2271 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002272
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002273 if (!getsockaddrlen(s, &addrlen))
2274 return NULL;
2275 memset(&addrbuf, 0, addrlen);
2276 Py_BEGIN_ALLOW_THREADS
2277 res = getpeername(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2278 Py_END_ALLOW_THREADS
2279 if (res < 0)
2280 return s->errorhandler();
2281 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2282 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002283}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002284
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002285PyDoc_STRVAR(getpeername_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002286"getpeername() -> address info\n\
2287\n\
2288Return the address of the remote endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002289info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002290
Guido van Rossumb6775db1994-08-01 11:34:53 +00002291#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002292
2293
Guido van Rossum30a685f1991-06-27 15:51:29 +00002294/* s.listen(n) method */
2295
Guido van Rossum73624e91994-10-10 17:59:00 +00002296static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002297sock_listen(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002298{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002299 int backlog;
2300 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002301
Serhiy Storchaka74f49ab2013-01-19 12:55:39 +02002302 backlog = _PyInt_AsInt(arg);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002303 if (backlog == -1 && PyErr_Occurred())
2304 return NULL;
2305 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou47d1d0d2011-05-10 19:16:03 +02002306 /* To avoid problems on systems that don't allow a negative backlog
2307 * (which doesn't make sense anyway) we force a minimum value of 0. */
2308 if (backlog < 0)
2309 backlog = 0;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002310 res = listen(s->sock_fd, backlog);
2311 Py_END_ALLOW_THREADS
2312 if (res < 0)
2313 return s->errorhandler();
2314 Py_INCREF(Py_None);
2315 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002316}
2317
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002318PyDoc_STRVAR(listen_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002319"listen(backlog)\n\
2320\n\
2321Enable a server to accept connections. The backlog argument must be at\n\
Antoine Pitrou47d1d0d2011-05-10 19:16:03 +02002322least 0 (if it is lower, it is set to 0); it specifies the number of\n\
2323unaccepted connections that the system will allow before refusing new\n\
2324connections.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002325
2326
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002327#ifndef NO_DUP
Guido van Rossum30a685f1991-06-27 15:51:29 +00002328/* s.makefile(mode) method.
2329 Create a new open file object referring to a dupped version of
2330 the socket's file descriptor. (The dup() call is necessary so
2331 that the open file and socket objects may be closed independent
2332 of each other.)
2333 The mode argument specifies 'r' or 'w' passed to fdopen(). */
2334
Guido van Rossum73624e91994-10-10 17:59:00 +00002335static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002336sock_makefile(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002337{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002338 extern int fclose(FILE *);
2339 char *mode = "r";
2340 int bufsize = -1;
Fred Drakea04eaad2000-06-30 02:46:07 +00002341#ifdef MS_WIN32
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002342 Py_intptr_t fd;
Fred Drakea04eaad2000-06-30 02:46:07 +00002343#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002344 int fd;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002345#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002346 FILE *fp;
2347 PyObject *f;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002348#ifdef __VMS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002349 char *mode_r = "r";
2350 char *mode_w = "w";
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002351#endif
Guido van Rossum6b144911995-03-14 15:05:13 +00002352
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002353 if (!PyArg_ParseTuple(args, "|si:makefile", &mode, &bufsize))
2354 return NULL;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002355#ifdef __VMS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002356 if (strcmp(mode,"rb") == 0) {
2357 mode = mode_r;
2358 }
2359 else {
2360 if (strcmp(mode,"wb") == 0) {
2361 mode = mode_w;
2362 }
2363 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002364#endif
Guido van Rossum8d665e61996-06-26 18:22:49 +00002365#ifdef MS_WIN32
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002366 if (((fd = _open_osfhandle(s->sock_fd, _O_BINARY)) < 0) ||
2367 ((fd = dup(fd)) < 0) || ((fp = fdopen(fd, mode)) == NULL))
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00002368#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002369 if ((fd = dup(s->sock_fd)) < 0 || (fp = fdopen(fd, mode)) == NULL)
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00002370#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002371 {
2372 if (fd >= 0)
2373 SOCKETCLOSE(fd);
2374 return s->errorhandler();
2375 }
2376 f = PyFile_FromFile(fp, "<socket>", mode, fclose);
2377 if (f != NULL)
2378 PyFile_SetBufSize(f, bufsize);
2379 return f;
Guido van Rossum30a685f1991-06-27 15:51:29 +00002380}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002381
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002382PyDoc_STRVAR(makefile_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002383"makefile([mode[, buffersize]]) -> file object\n\
2384\n\
2385Return a regular file object corresponding to the socket.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002386The mode and buffersize arguments are as for the built-in open() function.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002387
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002388#endif /* NO_DUP */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002389
Martin Blais2856e5f2006-05-26 12:03:27 +00002390/*
Martin Blaisaf2ae722006-06-04 13:49:49 +00002391 * This is the guts of the recv() and recv_into() methods, which reads into a
Andrew M. Kuchling8d0baae2006-12-19 14:29:04 +00002392 * char buffer. If you have any inc/dec ref to do to the objects that contain
Martin Blais2856e5f2006-05-26 12:03:27 +00002393 * the buffer, do it in the caller. This function returns the number of bytes
Ezio Melottic2077b02011-03-16 12:34:31 +02002394 * successfully read. If there was an error, it returns -1. Note that it is
Martin Blais2856e5f2006-05-26 12:03:27 +00002395 * also possible that we return a number of bytes smaller than the request
2396 * bytes.
2397 */
Martin Blaisaf2ae722006-06-04 13:49:49 +00002398static ssize_t
Martin Blais2856e5f2006-05-26 12:03:27 +00002399sock_recv_guts(PySocketSockObject *s, char* cbuf, int len, int flags)
2400{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002401 ssize_t outlen = -1;
2402 int timeout;
Martin Blais2856e5f2006-05-26 12:03:27 +00002403#ifdef __VMS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002404 int remaining;
2405 char *read_buf;
Martin Blais2856e5f2006-05-26 12:03:27 +00002406#endif
2407
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002408 if (!IS_SELECTABLE(s)) {
2409 select_error();
2410 return -1;
2411 }
Martin Blais2856e5f2006-05-26 12:03:27 +00002412
2413#ifndef __VMS
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002414 BEGIN_SELECT_LOOP(s)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002415 Py_BEGIN_ALLOW_THREADS
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002416 timeout = internal_select_ex(s, 0, interval);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002417 if (!timeout)
2418 outlen = recv(s->sock_fd, cbuf, len, flags);
2419 Py_END_ALLOW_THREADS
Martin Blais2856e5f2006-05-26 12:03:27 +00002420
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002421 if (timeout == 1) {
2422 PyErr_SetString(socket_timeout, "timed out");
2423 return -1;
2424 }
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002425 END_SELECT_LOOP(s)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002426 if (outlen < 0) {
2427 /* Note: the call to errorhandler() ALWAYS indirectly returned
2428 NULL, so ignore its return value */
2429 s->errorhandler();
2430 return -1;
2431 }
Martin Blais2856e5f2006-05-26 12:03:27 +00002432#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002433 read_buf = cbuf;
2434 remaining = len;
2435 while (remaining != 0) {
2436 unsigned int segment;
2437 int nread = -1;
Martin Blais2856e5f2006-05-26 12:03:27 +00002438
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002439 segment = remaining /SEGMENT_SIZE;
2440 if (segment != 0) {
2441 segment = SEGMENT_SIZE;
2442 }
2443 else {
2444 segment = remaining;
2445 }
Martin Blais2856e5f2006-05-26 12:03:27 +00002446
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002447 BEGIN_SELECT_LOOP(s)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002448 Py_BEGIN_ALLOW_THREADS
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002449 timeout = internal_select_ex(s, 0, interval);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002450 if (!timeout)
2451 nread = recv(s->sock_fd, read_buf, segment, flags);
2452 Py_END_ALLOW_THREADS
Martin Blais2856e5f2006-05-26 12:03:27 +00002453
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002454 if (timeout == 1) {
2455 PyErr_SetString(socket_timeout, "timed out");
2456 return -1;
2457 }
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002458 END_SELECT_LOOP(s)
2459
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002460 if (nread < 0) {
2461 s->errorhandler();
2462 return -1;
2463 }
2464 if (nread != remaining) {
2465 read_buf += nread;
2466 break;
2467 }
Martin Blais2856e5f2006-05-26 12:03:27 +00002468
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002469 remaining -= segment;
2470 read_buf += segment;
2471 }
2472 outlen = read_buf - cbuf;
Martin Blais2856e5f2006-05-26 12:03:27 +00002473#endif /* !__VMS */
2474
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002475 return outlen;
Martin Blais2856e5f2006-05-26 12:03:27 +00002476}
2477
Guido van Rossum48a680c2001-03-02 06:34:14 +00002478
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002479/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002480
Guido van Rossum73624e91994-10-10 17:59:00 +00002481static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002482sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002483{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002484 int recvlen, flags = 0;
2485 ssize_t outlen;
2486 PyObject *buf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002487
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002488 if (!PyArg_ParseTuple(args, "i|i:recv", &recvlen, &flags))
2489 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002490
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002491 if (recvlen < 0) {
2492 PyErr_SetString(PyExc_ValueError,
2493 "negative buffersize in recv");
2494 return NULL;
2495 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002496
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002497 /* Allocate a new string. */
2498 buf = PyString_FromStringAndSize((char *) 0, recvlen);
2499 if (buf == NULL)
2500 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002501
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002502 /* Call the guts */
2503 outlen = sock_recv_guts(s, PyString_AS_STRING(buf), recvlen, flags);
2504 if (outlen < 0) {
2505 /* An error occurred, release the string and return an
2506 error. */
2507 Py_DECREF(buf);
2508 return NULL;
2509 }
2510 if (outlen != recvlen) {
2511 /* We did not read as many bytes as we anticipated, resize the
Ezio Melottic2077b02011-03-16 12:34:31 +02002512 string if possible and be successful. */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002513 if (_PyString_Resize(&buf, outlen) < 0)
Ezio Melottic2077b02011-03-16 12:34:31 +02002514 /* Oopsy, not so successful after all. */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002515 return NULL;
2516 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002517
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002518 return buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002519}
2520
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002521PyDoc_STRVAR(recv_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002522"recv(buffersize[, flags]) -> data\n\
2523\n\
2524Receive up to buffersize bytes from the socket. For the optional flags\n\
2525argument, see the Unix manual. When no data is available, block until\n\
2526at least one byte is available or until the remote end is closed. When\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002527the remote end is closed and all data is read, return the empty string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002528
Guido van Rossum30a685f1991-06-27 15:51:29 +00002529
Martin Blaisaf2ae722006-06-04 13:49:49 +00002530/* s.recv_into(buffer, [nbytes [,flags]]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002531
Martin Blais2856e5f2006-05-26 12:03:27 +00002532static PyObject*
Martin Blaisaf2ae722006-06-04 13:49:49 +00002533sock_recv_into(PySocketSockObject *s, PyObject *args, PyObject *kwds)
Martin Blais2856e5f2006-05-26 12:03:27 +00002534{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002535 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Martin Blais2856e5f2006-05-26 12:03:27 +00002536
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002537 int recvlen = 0, flags = 0;
2538 ssize_t readlen;
2539 Py_buffer buf;
2540 Py_ssize_t buflen;
Martin Blais2856e5f2006-05-26 12:03:27 +00002541
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002542 /* Get the buffer's memory */
2543 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ii:recv_into", kwlist,
2544 &buf, &recvlen, &flags))
2545 return NULL;
2546 buflen = buf.len;
2547 assert(buf.buf != 0 && buflen > 0);
Martin Blais2856e5f2006-05-26 12:03:27 +00002548
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002549 if (recvlen < 0) {
2550 PyErr_SetString(PyExc_ValueError,
2551 "negative buffersize in recv_into");
2552 goto error;
2553 }
2554 if (recvlen == 0) {
2555 /* If nbytes was not specified, use the buffer's length */
2556 recvlen = buflen;
2557 }
Martin Blais2856e5f2006-05-26 12:03:27 +00002558
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002559 /* Check if the buffer is large enough */
2560 if (buflen < recvlen) {
2561 PyErr_SetString(PyExc_ValueError,
2562 "buffer too small for requested bytes");
2563 goto error;
2564 }
Martin Blais2856e5f2006-05-26 12:03:27 +00002565
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002566 /* Call the guts */
2567 readlen = sock_recv_guts(s, buf.buf, recvlen, flags);
2568 if (readlen < 0) {
2569 /* Return an error. */
2570 goto error;
2571 }
Martin Blais2856e5f2006-05-26 12:03:27 +00002572
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002573 PyBuffer_Release(&buf);
2574 /* Return the number of bytes read. Note that we do not do anything
2575 special here in the case that readlen < recvlen. */
2576 return PyInt_FromSsize_t(readlen);
Antoine Pitroud7b731d2010-03-17 22:45:39 +00002577
2578error:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002579 PyBuffer_Release(&buf);
2580 return NULL;
Martin Blais2856e5f2006-05-26 12:03:27 +00002581}
2582
Martin Blaisaf2ae722006-06-04 13:49:49 +00002583PyDoc_STRVAR(recv_into_doc,
2584"recv_into(buffer, [nbytes[, flags]]) -> nbytes_read\n\
Martin Blais2856e5f2006-05-26 12:03:27 +00002585\n\
2586A version of recv() that stores its data into a buffer rather than creating \n\
2587a new string. Receive up to buffersize bytes from the socket. If buffersize \n\
2588is not specified (or 0), receive up to the size available in the given buffer.\n\
2589\n\
2590See recv() for documentation about the flags.");
2591
2592
2593/*
Guido van Rossum3c887b22007-12-18 20:10:42 +00002594 * This is the guts of the recvfrom() and recvfrom_into() methods, which reads
2595 * into a char buffer. If you have any inc/def ref to do to the objects that
2596 * contain the buffer, do it in the caller. This function returns the number
Ezio Melottic2077b02011-03-16 12:34:31 +02002597 * of bytes successfully read. If there was an error, it returns -1. Note
Guido van Rossum3c887b22007-12-18 20:10:42 +00002598 * that it is also possible that we return a number of bytes smaller than the
2599 * request bytes.
Martin Blais2856e5f2006-05-26 12:03:27 +00002600 *
2601 * 'addr' is a return value for the address object. Note that you must decref
2602 * it yourself.
2603 */
Martin Blaisaf2ae722006-06-04 13:49:49 +00002604static ssize_t
Martin Blais2856e5f2006-05-26 12:03:27 +00002605sock_recvfrom_guts(PySocketSockObject *s, char* cbuf, int len, int flags,
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002606 PyObject** addr)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002607{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002608 sock_addr_t addrbuf;
2609 int timeout;
2610 ssize_t n = -1;
2611 socklen_t addrlen;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002612
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002613 *addr = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002614
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002615 if (!getsockaddrlen(s, &addrlen))
2616 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002617
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002618 if (!IS_SELECTABLE(s)) {
2619 select_error();
2620 return -1;
2621 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00002622
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002623 BEGIN_SELECT_LOOP(s)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002624 Py_BEGIN_ALLOW_THREADS
2625 memset(&addrbuf, 0, addrlen);
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002626 timeout = internal_select_ex(s, 0, interval);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002627 if (!timeout) {
Guido van Rossum8d665e61996-06-26 18:22:49 +00002628#ifndef MS_WINDOWS
Andrew MacIntyreba43e872002-03-03 03:03:52 +00002629#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002630 n = recvfrom(s->sock_fd, cbuf, len, flags,
2631 SAS2SA(&addrbuf), &addrlen);
Guido van Rossum32c575d1997-12-02 20:37:32 +00002632#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002633 n = recvfrom(s->sock_fd, cbuf, len, flags,
2634 (void *) &addrbuf, &addrlen);
Guido van Rossum32c575d1997-12-02 20:37:32 +00002635#endif
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002636#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002637 n = recvfrom(s->sock_fd, cbuf, len, flags,
2638 SAS2SA(&addrbuf), &addrlen);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002639#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002640 }
2641 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002642
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002643 if (timeout == 1) {
2644 PyErr_SetString(socket_timeout, "timed out");
2645 return -1;
2646 }
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002647 END_SELECT_LOOP(s)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002648 if (n < 0) {
2649 s->errorhandler();
2650 return -1;
2651 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002652
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002653 if (!(*addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
2654 addrlen, s->sock_proto)))
2655 return -1;
Martin Blais2856e5f2006-05-26 12:03:27 +00002656
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002657 return n;
Martin Blais2856e5f2006-05-26 12:03:27 +00002658}
2659
2660/* s.recvfrom(nbytes [,flags]) method */
2661
2662static PyObject *
2663sock_recvfrom(PySocketSockObject *s, PyObject *args)
2664{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002665 PyObject *buf = NULL;
2666 PyObject *addr = NULL;
2667 PyObject *ret = NULL;
2668 int recvlen, flags = 0;
2669 ssize_t outlen;
Martin Blais2856e5f2006-05-26 12:03:27 +00002670
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002671 if (!PyArg_ParseTuple(args, "i|i:recvfrom", &recvlen, &flags))
2672 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002673
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002674 if (recvlen < 0) {
2675 PyErr_SetString(PyExc_ValueError,
2676 "negative buffersize in recvfrom");
2677 return NULL;
2678 }
Facundo Batista1fe9f962007-03-28 03:45:20 +00002679
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002680 buf = PyString_FromStringAndSize((char *) 0, recvlen);
2681 if (buf == NULL)
2682 return NULL;
Martin Blais2856e5f2006-05-26 12:03:27 +00002683
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002684 outlen = sock_recvfrom_guts(s, PyString_AS_STRING(buf),
2685 recvlen, flags, &addr);
2686 if (outlen < 0) {
2687 goto finally;
2688 }
Martin Blais2856e5f2006-05-26 12:03:27 +00002689
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002690 if (outlen != recvlen) {
2691 /* We did not read as many bytes as we anticipated, resize the
Ezio Melottic2077b02011-03-16 12:34:31 +02002692 string if possible and be successful. */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002693 if (_PyString_Resize(&buf, outlen) < 0)
Ezio Melottic2077b02011-03-16 12:34:31 +02002694 /* Oopsy, not so successful after all. */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002695 goto finally;
2696 }
Barry Warsaw752300b1997-01-03 17:18:10 +00002697
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002698 ret = PyTuple_Pack(2, buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002699
2700finally:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002701 Py_XDECREF(buf);
2702 Py_XDECREF(addr);
2703 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002704}
2705
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002706PyDoc_STRVAR(recvfrom_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002707"recvfrom(buffersize[, flags]) -> (data, address info)\n\
2708\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002709Like recv(buffersize, flags) but also return the sender's address info.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002710
Martin Blais2856e5f2006-05-26 12:03:27 +00002711
Martin Blaisaf2ae722006-06-04 13:49:49 +00002712/* s.recvfrom_into(buffer[, nbytes [,flags]]) method */
Martin Blais2856e5f2006-05-26 12:03:27 +00002713
2714static PyObject *
Martin Blaisaf2ae722006-06-04 13:49:49 +00002715sock_recvfrom_into(PySocketSockObject *s, PyObject *args, PyObject* kwds)
Martin Blais2856e5f2006-05-26 12:03:27 +00002716{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002717 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Martin Blais2856e5f2006-05-26 12:03:27 +00002718
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002719 int recvlen = 0, flags = 0;
2720 ssize_t readlen;
2721 Py_buffer buf;
2722 int buflen;
Martin Blais2856e5f2006-05-26 12:03:27 +00002723
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002724 PyObject *addr = NULL;
Martin Blais2856e5f2006-05-26 12:03:27 +00002725
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002726 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ii:recvfrom_into",
2727 kwlist, &buf,
2728 &recvlen, &flags))
2729 return NULL;
2730 buflen = buf.len;
Martin Blais2856e5f2006-05-26 12:03:27 +00002731
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002732 if (recvlen < 0) {
2733 PyErr_SetString(PyExc_ValueError,
2734 "negative buffersize in recvfrom_into");
2735 goto error;
2736 }
2737 if (recvlen == 0) {
2738 /* If nbytes was not specified, use the buffer's length */
2739 recvlen = buflen;
Benjamin Peterson28cf3682014-01-13 22:59:38 -05002740 } else if (recvlen > buflen) {
2741 PyErr_SetString(PyExc_ValueError,
2742 "nbytes is greater than the length of the buffer");
2743 goto error;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002744 }
Martin Blais2856e5f2006-05-26 12:03:27 +00002745
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002746 readlen = sock_recvfrom_guts(s, buf.buf, recvlen, flags, &addr);
2747 if (readlen < 0) {
2748 /* Return an error */
2749 goto error;
2750 }
Martin Blais2856e5f2006-05-26 12:03:27 +00002751
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002752 PyBuffer_Release(&buf);
2753 /* Return the number of bytes read and the address. Note that we do
2754 not do anything special here in the case that readlen < recvlen. */
2755 return Py_BuildValue("lN", readlen, addr);
Antoine Pitroud7b731d2010-03-17 22:45:39 +00002756
2757error:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002758 Py_XDECREF(addr);
2759 PyBuffer_Release(&buf);
2760 return NULL;
Martin Blais2856e5f2006-05-26 12:03:27 +00002761}
2762
Martin Blaisaf2ae722006-06-04 13:49:49 +00002763PyDoc_STRVAR(recvfrom_into_doc,
2764"recvfrom_into(buffer[, nbytes[, flags]]) -> (nbytes, address info)\n\
Martin Blais2856e5f2006-05-26 12:03:27 +00002765\n\
Martin Blaisaf2ae722006-06-04 13:49:49 +00002766Like recv_into(buffer[, nbytes[, flags]]) but also return the sender's address info.");
Martin Blais2856e5f2006-05-26 12:03:27 +00002767
2768
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002769/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002770
Guido van Rossum73624e91994-10-10 17:59:00 +00002771static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002772sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002773{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002774 char *buf;
2775 int len, n = -1, flags = 0, timeout;
2776 Py_buffer pbuf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002777
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002778 if (!PyArg_ParseTuple(args, "s*|i:send", &pbuf, &flags))
2779 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002780
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002781 if (!IS_SELECTABLE(s)) {
2782 PyBuffer_Release(&pbuf);
2783 return select_error();
2784 }
2785 buf = pbuf.buf;
2786 len = pbuf.len;
Neal Norwitz082b2df2006-02-07 07:04:46 +00002787
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002788 BEGIN_SELECT_LOOP(s)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002789 Py_BEGIN_ALLOW_THREADS
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002790 timeout = internal_select_ex(s, 1, interval);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002791 if (!timeout)
Neal Norwitz2a30cd02006-07-10 01:18:57 +00002792#ifdef __VMS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002793 n = sendsegmented(s->sock_fd, buf, len, flags);
Neal Norwitz2a30cd02006-07-10 01:18:57 +00002794#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002795 n = send(s->sock_fd, buf, len, flags);
Neal Norwitz2a30cd02006-07-10 01:18:57 +00002796#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002797 Py_END_ALLOW_THREADS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002798 if (timeout == 1) {
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002799 PyBuffer_Release(&pbuf);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002800 PyErr_SetString(socket_timeout, "timed out");
2801 return NULL;
2802 }
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002803 END_SELECT_LOOP(s)
2804
2805 PyBuffer_Release(&pbuf);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002806 if (n < 0)
2807 return s->errorhandler();
2808 return PyInt_FromLong((long)n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00002809}
2810
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002811PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002812"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002813\n\
2814Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002815argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002816sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002817
2818
2819/* s.sendall(data [,flags]) method */
2820
2821static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002822sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002823{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002824 char *buf;
Antoine Pitrou66b5df62010-09-27 18:16:46 +00002825 int len, n = -1, flags = 0, timeout, saved_errno;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002826 Py_buffer pbuf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002827
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002828 if (!PyArg_ParseTuple(args, "s*|i:sendall", &pbuf, &flags))
2829 return NULL;
2830 buf = pbuf.buf;
2831 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002832
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002833 if (!IS_SELECTABLE(s)) {
2834 PyBuffer_Release(&pbuf);
2835 return select_error();
2836 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00002837
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002838 do {
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002839 BEGIN_SELECT_LOOP(s)
Antoine Pitrou66b5df62010-09-27 18:16:46 +00002840 Py_BEGIN_ALLOW_THREADS
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002841 timeout = internal_select_ex(s, 1, interval);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002842 n = -1;
Antoine Pitrou66b5df62010-09-27 18:16:46 +00002843 if (!timeout) {
Neal Norwitz2a30cd02006-07-10 01:18:57 +00002844#ifdef __VMS
Antoine Pitrou66b5df62010-09-27 18:16:46 +00002845 n = sendsegmented(s->sock_fd, buf, len, flags);
Neal Norwitz2a30cd02006-07-10 01:18:57 +00002846#else
Antoine Pitrou66b5df62010-09-27 18:16:46 +00002847 n = send(s->sock_fd, buf, len, flags);
Neal Norwitz2a30cd02006-07-10 01:18:57 +00002848#endif
Antoine Pitrou66b5df62010-09-27 18:16:46 +00002849 }
2850 Py_END_ALLOW_THREADS
2851 if (timeout == 1) {
2852 PyBuffer_Release(&pbuf);
2853 PyErr_SetString(socket_timeout, "timed out");
2854 return NULL;
2855 }
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002856 END_SELECT_LOOP(s)
Antoine Pitrou66b5df62010-09-27 18:16:46 +00002857 /* PyErr_CheckSignals() might change errno */
2858 saved_errno = errno;
2859 /* We must run our signal handlers before looping again.
2860 send() can return a successful partial write when it is
2861 interrupted, so we can't restrict ourselves to EINTR. */
2862 if (PyErr_CheckSignals()) {
2863 PyBuffer_Release(&pbuf);
2864 return NULL;
2865 }
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002866 if (n < 0) {
Antoine Pitrou66b5df62010-09-27 18:16:46 +00002867 /* If interrupted, try again */
2868 if (saved_errno == EINTR)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002869 continue;
Antoine Pitrou66b5df62010-09-27 18:16:46 +00002870 else
2871 break;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002872 }
2873 buf += n;
2874 len -= n;
2875 } while (len > 0);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002876 PyBuffer_Release(&pbuf);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002877
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002878 if (n < 0)
2879 return s->errorhandler();
Guido van Rossum67f7a382002-06-06 21:08:16 +00002880
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002881 Py_INCREF(Py_None);
2882 return Py_None;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002883}
2884
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002885PyDoc_STRVAR(sendall_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002886"sendall(data[, flags])\n\
2887\n\
2888Send a data string to the socket. For the optional flags\n\
2889argument, see the Unix manual. This calls send() repeatedly\n\
2890until all data is sent. If an error occurs, it's impossible\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002891to tell how much data has been sent.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002892
Guido van Rossum30a685f1991-06-27 15:51:29 +00002893
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002894/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002895
Guido van Rossum73624e91994-10-10 17:59:00 +00002896static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002897sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002898{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002899 Py_buffer pbuf;
2900 PyObject *addro;
2901 char *buf;
2902 Py_ssize_t len;
2903 sock_addr_t addrbuf;
2904 int addrlen, n = -1, flags, timeout;
Ezio Melotti0639be62011-05-07 19:21:22 +03002905 int arglen;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002906
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002907 flags = 0;
Ezio Melotti0639be62011-05-07 19:21:22 +03002908 arglen = PyTuple_Size(args);
2909 switch(arglen) {
2910 case 2:
2911 PyArg_ParseTuple(args, "s*O:sendto", &pbuf, &addro);
2912 break;
2913 case 3:
2914 PyArg_ParseTuple(args, "s*iO:sendto", &pbuf, &flags, &addro);
2915 break;
2916 default:
2917 PyErr_Format(PyExc_TypeError, "sendto() takes 2 or 3"
2918 " arguments (%d given)", arglen);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002919 }
Ezio Melotti0639be62011-05-07 19:21:22 +03002920 if (PyErr_Occurred())
2921 return NULL;
2922
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002923 buf = pbuf.buf;
2924 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002925
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002926 if (!IS_SELECTABLE(s)) {
2927 PyBuffer_Release(&pbuf);
2928 return select_error();
2929 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00002930
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002931 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen)) {
2932 PyBuffer_Release(&pbuf);
2933 return NULL;
2934 }
Martin v. Löwis046c4d12006-12-03 11:23:45 +00002935
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002936 BEGIN_SELECT_LOOP(s)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002937 Py_BEGIN_ALLOW_THREADS
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002938 timeout = internal_select_ex(s, 1, interval);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002939 if (!timeout)
2940 n = sendto(s->sock_fd, buf, len, flags, SAS2SA(&addrbuf), addrlen);
2941 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002942
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002943 if (timeout == 1) {
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002944 PyBuffer_Release(&pbuf);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002945 PyErr_SetString(socket_timeout, "timed out");
2946 return NULL;
2947 }
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002948 END_SELECT_LOOP(s)
2949 PyBuffer_Release(&pbuf);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002950 if (n < 0)
2951 return s->errorhandler();
2952 return PyInt_FromLong((long)n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002953}
2954
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002955PyDoc_STRVAR(sendto_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002956"sendto(data[, flags], address) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002957\n\
2958Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002959For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002960
Guido van Rossum30a685f1991-06-27 15:51:29 +00002961
2962/* s.shutdown(how) method */
2963
Guido van Rossum73624e91994-10-10 17:59:00 +00002964static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002965sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002966{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002967 int how;
2968 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002969
Serhiy Storchaka74f49ab2013-01-19 12:55:39 +02002970 how = _PyInt_AsInt(arg);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002971 if (how == -1 && PyErr_Occurred())
2972 return NULL;
2973 Py_BEGIN_ALLOW_THREADS
2974 res = shutdown(s->sock_fd, how);
2975 Py_END_ALLOW_THREADS
2976 if (res < 0)
2977 return s->errorhandler();
2978 Py_INCREF(Py_None);
2979 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002980}
2981
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002982PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002983"shutdown(flag)\n\
2984\n\
Martin v. Löwis94681fc2003-11-27 19:40:22 +00002985Shut down the reading side of the socket (flag == SHUT_RD), the writing side\n\
2986of the socket (flag == SHUT_WR), or both ends (flag == SHUT_RDWR).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002987
Amaury Forgeot d'Arca4dd2e22008-06-13 00:42:22 +00002988#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Christian Heimes04ae9162008-01-04 15:23:30 +00002989static PyObject*
2990sock_ioctl(PySocketSockObject *s, PyObject *arg)
2991{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002992 unsigned long cmd = SIO_RCVALL;
2993 PyObject *argO;
2994 DWORD recv;
Christian Heimes04ae9162008-01-04 15:23:30 +00002995
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002996 if (!PyArg_ParseTuple(arg, "kO:ioctl", &cmd, &argO))
2997 return NULL;
Christian Heimes04ae9162008-01-04 15:23:30 +00002998
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002999 switch (cmd) {
3000 case SIO_RCVALL: {
3001 unsigned int option = RCVALL_ON;
3002 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
3003 return NULL;
3004 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
3005 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
3006 return set_error();
3007 }
3008 return PyLong_FromUnsignedLong(recv); }
3009 case SIO_KEEPALIVE_VALS: {
3010 struct tcp_keepalive ka;
3011 if (!PyArg_ParseTuple(arg, "k(kkk):ioctl", &cmd,
3012 &ka.onoff, &ka.keepalivetime, &ka.keepaliveinterval))
3013 return NULL;
3014 if (WSAIoctl(s->sock_fd, cmd, &ka, sizeof(ka),
3015 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
3016 return set_error();
3017 }
3018 return PyLong_FromUnsignedLong(recv); }
3019 default:
3020 PyErr_Format(PyExc_ValueError, "invalid ioctl command %d", cmd);
3021 return NULL;
3022 }
Christian Heimes04ae9162008-01-04 15:23:30 +00003023}
3024PyDoc_STRVAR(sock_ioctl_doc,
3025"ioctl(cmd, option) -> long\n\
3026\n\
Kristján Valur Jónsson2fcd03b2009-09-25 15:19:51 +00003027Control the socket with WSAIoctl syscall. Currently supported 'cmd' values are\n\
3028SIO_RCVALL: 'option' must be one of the socket.RCVALL_* constants.\n\
3029SIO_KEEPALIVE_VALS: 'option' is a tuple of (onoff, timeout, interval).");
Christian Heimes04ae9162008-01-04 15:23:30 +00003030
3031#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00003032
3033/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003034
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003035static PyMethodDef sock_methods[] = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003036 {"accept", (PyCFunction)sock_accept, METH_NOARGS,
3037 accept_doc},
3038 {"bind", (PyCFunction)sock_bind, METH_O,
3039 bind_doc},
3040 {"close", (PyCFunction)sock_close, METH_NOARGS,
3041 close_doc},
3042 {"connect", (PyCFunction)sock_connect, METH_O,
3043 connect_doc},
3044 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
3045 connect_ex_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00003046#ifndef NO_DUP
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003047 {"dup", (PyCFunction)sock_dup, METH_NOARGS,
3048 dup_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00003049#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003050 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
3051 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00003052#ifdef HAVE_GETPEERNAME
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003053 {"getpeername", (PyCFunction)sock_getpeername,
3054 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00003055#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003056 {"getsockname", (PyCFunction)sock_getsockname,
3057 METH_NOARGS, getsockname_doc},
3058 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
3059 getsockopt_doc},
Amaury Forgeot d'Arca4dd2e22008-06-13 00:42:22 +00003060#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003061 {"ioctl", (PyCFunction)sock_ioctl, METH_VARARGS,
3062 sock_ioctl_doc},
Christian Heimes04ae9162008-01-04 15:23:30 +00003063#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003064 {"listen", (PyCFunction)sock_listen, METH_O,
3065 listen_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00003066#ifndef NO_DUP
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003067 {"makefile", (PyCFunction)sock_makefile, METH_VARARGS,
3068 makefile_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00003069#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003070 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
3071 recv_doc},
3072 {"recv_into", (PyCFunction)sock_recv_into, METH_VARARGS | METH_KEYWORDS,
3073 recv_into_doc},
3074 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
3075 recvfrom_doc},
3076 {"recvfrom_into", (PyCFunction)sock_recvfrom_into, METH_VARARGS | METH_KEYWORDS,
3077 recvfrom_into_doc},
3078 {"send", (PyCFunction)sock_send, METH_VARARGS,
3079 send_doc},
3080 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
3081 sendall_doc},
3082 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
3083 sendto_doc},
3084 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
3085 setblocking_doc},
3086 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
3087 settimeout_doc},
3088 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
3089 gettimeout_doc},
3090 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
3091 setsockopt_doc},
3092 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
3093 shutdown_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00003094#ifdef RISCOS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003095 {"sleeptaskw", (PyCFunction)sock_sleeptaskw, METH_O,
3096 sleeptaskw_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00003097#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003098 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003099};
3100
Georg Brandlbc45a3f2006-03-17 19:17:34 +00003101/* SockObject members */
3102static PyMemberDef sock_memberlist[] = {
3103 {"family", T_INT, offsetof(PySocketSockObject, sock_family), READONLY, "the socket family"},
3104 {"type", T_INT, offsetof(PySocketSockObject, sock_type), READONLY, "the socket type"},
3105 {"proto", T_INT, offsetof(PySocketSockObject, sock_proto), READONLY, "the socket protocol"},
3106 {"timeout", T_DOUBLE, offsetof(PySocketSockObject, sock_timeout), READONLY, "the socket timeout"},
3107 {0},
3108};
Guido van Rossum30a685f1991-06-27 15:51:29 +00003109
Guido van Rossum73624e91994-10-10 17:59:00 +00003110/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00003111 First close the file description. */
3112
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003113static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003114sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003115{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003116 if (s->sock_fd != -1)
3117 (void) SOCKETCLOSE(s->sock_fd);
Benjamin Peterson3d1f2d32014-10-06 14:38:20 -04003118 if (s->weakreflist != NULL)
3119 PyObject_ClearWeakRefs((PyObject *)s);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003120 Py_TYPE(s)->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003121}
3122
Guido van Rossum30a685f1991-06-27 15:51:29 +00003123
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003124static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003125sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003126{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003127 char buf[512];
Victor Stinner0a649c72014-07-26 14:52:55 +02003128 long sock_fd;
3129 /* On Windows, this test is needed because SOCKET_T is unsigned */
3130 if (s->sock_fd == INVALID_SOCKET) {
3131 sock_fd = -1;
3132 }
Fred Drakea04eaad2000-06-30 02:46:07 +00003133#if SIZEOF_SOCKET_T > SIZEOF_LONG
Victor Stinner0a649c72014-07-26 14:52:55 +02003134 else if (s->sock_fd > LONG_MAX) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003135 /* this can occur on Win64, and actually there is a special
3136 ugly printf formatter for decimal pointer length integer
3137 printing, only bother if necessary*/
3138 PyErr_SetString(PyExc_OverflowError,
3139 "no printf formatter to display "
3140 "the socket descriptor in decimal");
3141 return NULL;
3142 }
Fred Drakea04eaad2000-06-30 02:46:07 +00003143#endif
Victor Stinner0a649c72014-07-26 14:52:55 +02003144 else
3145 sock_fd = (long)s->sock_fd;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003146 PyOS_snprintf(
3147 buf, sizeof(buf),
3148 "<socket object, fd=%ld, family=%d, type=%d, protocol=%d>",
Victor Stinner0a649c72014-07-26 14:52:55 +02003149 sock_fd, s->sock_family,
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003150 s->sock_type,
3151 s->sock_proto);
3152 return PyString_FromString(buf);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003153}
3154
3155
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003156/* Create a new, uninitialized socket object. */
3157
3158static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003159sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003160{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003161 PyObject *new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003162
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003163 new = type->tp_alloc(type, 0);
3164 if (new != NULL) {
3165 ((PySocketSockObject *)new)->sock_fd = -1;
3166 ((PySocketSockObject *)new)->sock_timeout = -1.0;
3167 ((PySocketSockObject *)new)->errorhandler = &set_error;
Benjamin Peterson3d1f2d32014-10-06 14:38:20 -04003168 ((PySocketSockObject *)new)->weakreflist = NULL;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003169 }
3170 return new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003171}
3172
3173
3174/* Initialize a new socket object. */
3175
3176/*ARGSUSED*/
3177static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00003178sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003179{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003180 PySocketSockObject *s = (PySocketSockObject *)self;
3181 SOCKET_T fd;
3182 int family = AF_INET, type = SOCK_STREAM, proto = 0;
3183 static char *keywords[] = {"family", "type", "proto", 0};
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003184
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003185 if (!PyArg_ParseTupleAndKeywords(args, kwds,
3186 "|iii:socket", keywords,
3187 &family, &type, &proto))
3188 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003189
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003190 Py_BEGIN_ALLOW_THREADS
3191 fd = socket(family, type, proto);
3192 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00003193
Victor Stinner465db3c2014-07-26 14:47:56 +02003194 if (fd == INVALID_SOCKET) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003195 set_error();
3196 return -1;
3197 }
3198 init_sockobject(s, fd, family, type, proto);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003199
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003200 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003201
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003202}
3203
3204
Guido van Rossumb6775db1994-08-01 11:34:53 +00003205/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003206
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003207static PyTypeObject sock_type = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003208 PyVarObject_HEAD_INIT(0, 0) /* Must fill in type value later */
3209 "_socket.socket", /* tp_name */
3210 sizeof(PySocketSockObject), /* tp_basicsize */
3211 0, /* tp_itemsize */
3212 (destructor)sock_dealloc, /* tp_dealloc */
3213 0, /* tp_print */
3214 0, /* tp_getattr */
3215 0, /* tp_setattr */
3216 0, /* tp_compare */
3217 (reprfunc)sock_repr, /* tp_repr */
3218 0, /* tp_as_number */
3219 0, /* tp_as_sequence */
3220 0, /* tp_as_mapping */
3221 0, /* tp_hash */
3222 0, /* tp_call */
3223 0, /* tp_str */
3224 PyObject_GenericGetAttr, /* tp_getattro */
3225 0, /* tp_setattro */
3226 0, /* tp_as_buffer */
3227 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
3228 sock_doc, /* tp_doc */
3229 0, /* tp_traverse */
3230 0, /* tp_clear */
3231 0, /* tp_richcompare */
Benjamin Peterson3d1f2d32014-10-06 14:38:20 -04003232 offsetof(PySocketSockObject, weakreflist), /* tp_weaklistoffset */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003233 0, /* tp_iter */
3234 0, /* tp_iternext */
3235 sock_methods, /* tp_methods */
3236 sock_memberlist, /* tp_members */
3237 0, /* tp_getset */
3238 0, /* tp_base */
3239 0, /* tp_dict */
3240 0, /* tp_descr_get */
3241 0, /* tp_descr_set */
3242 0, /* tp_dictoffset */
3243 sock_initobj, /* tp_init */
3244 PyType_GenericAlloc, /* tp_alloc */
3245 sock_new, /* tp_new */
3246 PyObject_Del, /* tp_free */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003247};
3248
Guido van Rossum30a685f1991-06-27 15:51:29 +00003249
Guido van Rossum81194471991-07-27 21:42:02 +00003250/* Python interface to gethostname(). */
3251
3252/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00003253static PyObject *
Georg Brandl96a8c392006-05-29 21:04:52 +00003254socket_gethostname(PyObject *self, PyObject *unused)
Guido van Rossum81194471991-07-27 21:42:02 +00003255{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003256 char buf[1024];
3257 int res;
3258 Py_BEGIN_ALLOW_THREADS
3259 res = gethostname(buf, (int) sizeof buf - 1);
3260 Py_END_ALLOW_THREADS
3261 if (res < 0)
3262 return set_error();
3263 buf[sizeof buf - 1] = '\0';
3264 return PyString_FromString(buf);
Guido van Rossum81194471991-07-27 21:42:02 +00003265}
Guido van Rossumff4949e1992-08-05 19:58:53 +00003266
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003267PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003268"gethostname() -> string\n\
3269\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003270Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003271
Guido van Rossumff4949e1992-08-05 19:58:53 +00003272
Guido van Rossum30a685f1991-06-27 15:51:29 +00003273/* Python interface to gethostbyname(name). */
3274
3275/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00003276static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003277socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003278{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003279 char *name;
3280 sock_addr_t addrbuf;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003281
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003282 if (!PyArg_ParseTuple(args, "s:gethostbyname", &name))
3283 return NULL;
3284 if (setipaddr(name, SAS2SA(&addrbuf), sizeof(addrbuf), AF_INET) < 0)
3285 return NULL;
3286 return makeipaddr(SAS2SA(&addrbuf), sizeof(struct sockaddr_in));
Guido van Rossum30a685f1991-06-27 15:51:29 +00003287}
3288
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003289PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003290"gethostbyname(host) -> address\n\
3291\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003292Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003293
3294
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003295/* Convenience function common to gethostbyname_ex and gethostbyaddr */
3296
3297static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003298gethost_common(struct hostent *h, struct sockaddr *addr, int alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003299{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003300 char **pch;
3301 PyObject *rtn_tuple = (PyObject *)NULL;
3302 PyObject *name_list = (PyObject *)NULL;
3303 PyObject *addr_list = (PyObject *)NULL;
3304 PyObject *tmp;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003305
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003306 if (h == NULL) {
3307 /* Let's get real error message to return */
Guido van Rossume2ae77b2001-10-24 20:42:55 +00003308#ifndef RISCOS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003309 set_herror(h_errno);
Guido van Rossume2ae77b2001-10-24 20:42:55 +00003310#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003311 PyErr_SetString(socket_error, "host not found");
Guido van Rossume2ae77b2001-10-24 20:42:55 +00003312#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003313 return NULL;
3314 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003315
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003316 if (h->h_addrtype != af) {
3317 /* Let's get real error message to return */
3318 PyErr_SetString(socket_error,
3319 (char *)strerror(EAFNOSUPPORT));
Brett Cannon10ed0f52008-03-18 15:35:58 +00003320
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003321 return NULL;
3322 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003323
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003324 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00003325
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003326 case AF_INET:
3327 if (alen < sizeof(struct sockaddr_in))
3328 return NULL;
3329 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003330
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00003331#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003332 case AF_INET6:
3333 if (alen < sizeof(struct sockaddr_in6))
3334 return NULL;
3335 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003336#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00003337
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003338 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003339
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003340 if ((name_list = PyList_New(0)) == NULL)
3341 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003342
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003343 if ((addr_list = PyList_New(0)) == NULL)
3344 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003345
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003346 /* SF #1511317: h_aliases can be NULL */
3347 if (h->h_aliases) {
3348 for (pch = h->h_aliases; *pch != NULL; pch++) {
3349 int status;
3350 tmp = PyString_FromString(*pch);
3351 if (tmp == NULL)
3352 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003353
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003354 status = PyList_Append(name_list, tmp);
3355 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003356
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003357 if (status)
3358 goto err;
3359 }
3360 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003361
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003362 for (pch = h->h_addr_list; *pch != NULL; pch++) {
3363 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003364
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003365 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00003366
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003367 case AF_INET:
3368 {
3369 struct sockaddr_in sin;
3370 memset(&sin, 0, sizeof(sin));
3371 sin.sin_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003372#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003373 sin.sin_len = sizeof(sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003374#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003375 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
3376 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
Guido van Rossum67f7a382002-06-06 21:08:16 +00003377
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003378 if (pch == h->h_addr_list && alen >= sizeof(sin))
3379 memcpy((char *) addr, &sin, sizeof(sin));
3380 break;
3381 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003382
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00003383#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003384 case AF_INET6:
3385 {
3386 struct sockaddr_in6 sin6;
3387 memset(&sin6, 0, sizeof(sin6));
3388 sin6.sin6_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003389#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003390 sin6.sin6_len = sizeof(sin6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003391#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003392 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
3393 tmp = makeipaddr((struct sockaddr *)&sin6,
3394 sizeof(sin6));
Guido van Rossum67f7a382002-06-06 21:08:16 +00003395
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003396 if (pch == h->h_addr_list && alen >= sizeof(sin6))
3397 memcpy((char *) addr, &sin6, sizeof(sin6));
3398 break;
3399 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003400#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00003401
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003402 default: /* can't happen */
3403 PyErr_SetString(socket_error,
3404 "unsupported address family");
3405 return NULL;
3406 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003407
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003408 if (tmp == NULL)
3409 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003410
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003411 status = PyList_Append(addr_list, tmp);
3412 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003413
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003414 if (status)
3415 goto err;
3416 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003417
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003418 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003419
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003420 err:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003421 Py_XDECREF(name_list);
3422 Py_XDECREF(addr_list);
3423 return rtn_tuple;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003424}
3425
3426
3427/* Python interface to gethostbyname_ex(name). */
3428
3429/*ARGSUSED*/
3430static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003431socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003432{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003433 char *name;
3434 struct hostent *h;
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00003435#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003436 struct sockaddr_storage addr;
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00003437#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003438 struct sockaddr_in addr;
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00003439#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003440 struct sockaddr *sa;
3441 PyObject *ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003442#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003443 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003444#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003445 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003446#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003447 char buf[16384];
3448 int buf_len = (sizeof buf) - 1;
3449 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003450#endif
3451#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003452 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00003453#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003454#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003455
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003456 if (!PyArg_ParseTuple(args, "s:gethostbyname_ex", &name))
3457 return NULL;
3458 if (setipaddr(name, (struct sockaddr *)&addr, sizeof(addr), AF_INET) < 0)
3459 return NULL;
3460 Py_BEGIN_ALLOW_THREADS
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003461#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003462#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003463 result = gethostbyname_r(name, &hp_allocated, buf, buf_len,
3464 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003465#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003466 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003467#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003468 memset((void *) &data, '\0', sizeof(data));
3469 result = gethostbyname_r(name, &hp_allocated, &data);
3470 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00003471#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003472#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00003473#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003474 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003475#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003476 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003477#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003478 Py_END_ALLOW_THREADS
3479 /* Some C libraries would require addr.__ss_family instead of
3480 addr.ss_family.
3481 Therefore, we cast the sockaddr_storage into sockaddr to
3482 access sa_family. */
3483 sa = (struct sockaddr*)&addr;
3484 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr),
3485 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00003486#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003487 PyThread_release_lock(netdb_lock);
Guido van Rossum955becc1999-03-22 20:14:53 +00003488#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003489 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003490}
3491
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003492PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003493"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
3494\n\
3495Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003496for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003497
3498
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003499/* Python interface to gethostbyaddr(IP). */
3500
3501/*ARGSUSED*/
3502static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003503socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003504{
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00003505#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003506 struct sockaddr_storage addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003507#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003508 struct sockaddr_in addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003509#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003510 struct sockaddr *sa = (struct sockaddr *)&addr;
3511 char *ip_num;
3512 struct hostent *h;
3513 PyObject *ret;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003514#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003515 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003516#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003517 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003518#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003519 /* glibcs up to 2.10 assume that the buf argument to
3520 gethostbyaddr_r is 8-byte aligned, which at least llvm-gcc
3521 does not ensure. The attribute below instructs the compiler
3522 to maintain this alignment. */
3523 char buf[16384] Py_ALIGNED(8);
3524 int buf_len = (sizeof buf) - 1;
3525 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003526#endif
3527#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003528 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00003529#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003530#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003531 char *ap;
3532 int al;
3533 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003534
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003535 if (!PyArg_ParseTuple(args, "s:gethostbyaddr", &ip_num))
3536 return NULL;
3537 af = AF_UNSPEC;
3538 if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
3539 return NULL;
3540 af = sa->sa_family;
3541 ap = NULL;
3542 switch (af) {
3543 case AF_INET:
3544 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
3545 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
3546 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00003547#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003548 case AF_INET6:
3549 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
3550 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
3551 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003552#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003553 default:
3554 PyErr_SetString(socket_error, "unsupported address family");
3555 return NULL;
3556 }
3557 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003558#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003559#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003560 result = gethostbyaddr_r(ap, al, af,
3561 &hp_allocated, buf, buf_len,
3562 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003563#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003564 h = gethostbyaddr_r(ap, al, af,
3565 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003566#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003567 memset((void *) &data, '\0', sizeof(data));
3568 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
3569 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00003570#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003571#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00003572#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003573 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003574#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003575 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003576#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003577 Py_END_ALLOW_THREADS
3578 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00003579#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003580 PyThread_release_lock(netdb_lock);
Guido van Rossum3baaa131999-03-22 21:44:51 +00003581#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003582 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003583}
3584
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003585PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003586"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
3587\n\
3588Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003589for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003590
Guido van Rossum30a685f1991-06-27 15:51:29 +00003591
3592/* Python interface to getservbyname(name).
3593 This only returns the port number, since the other info is already
3594 known or not useful (like the list of aliases). */
3595
3596/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00003597static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003598socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003599{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003600 char *name, *proto=NULL;
3601 struct servent *sp;
3602 if (!PyArg_ParseTuple(args, "s|s:getservbyname", &name, &proto))
3603 return NULL;
3604 Py_BEGIN_ALLOW_THREADS
3605 sp = getservbyname(name, proto);
3606 Py_END_ALLOW_THREADS
3607 if (sp == NULL) {
3608 PyErr_SetString(socket_error, "service/proto not found");
3609 return NULL;
3610 }
3611 return PyInt_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00003612}
3613
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003614PyDoc_STRVAR(getservbyname_doc,
Barry Warsaw11b91a02004-06-28 00:50:43 +00003615"getservbyname(servicename[, protocolname]) -> integer\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003616\n\
3617Return a port number from a service name and protocol name.\n\
Barry Warsaw11b91a02004-06-28 00:50:43 +00003618The optional protocol name, if given, should be 'tcp' or 'udp',\n\
3619otherwise any protocol will match.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003620
Guido van Rossum30a685f1991-06-27 15:51:29 +00003621
Barry Warsaw11b91a02004-06-28 00:50:43 +00003622/* Python interface to getservbyport(port).
3623 This only returns the service name, since the other info is already
3624 known or not useful (like the list of aliases). */
3625
3626/*ARGSUSED*/
3627static PyObject *
3628socket_getservbyport(PyObject *self, PyObject *args)
3629{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003630 int port;
3631 char *proto=NULL;
3632 struct servent *sp;
3633 if (!PyArg_ParseTuple(args, "i|s:getservbyport", &port, &proto))
3634 return NULL;
3635 if (port < 0 || port > 0xffff) {
3636 PyErr_SetString(
3637 PyExc_OverflowError,
3638 "getservbyport: port must be 0-65535.");
3639 return NULL;
3640 }
3641 Py_BEGIN_ALLOW_THREADS
3642 sp = getservbyport(htons((short)port), proto);
3643 Py_END_ALLOW_THREADS
3644 if (sp == NULL) {
3645 PyErr_SetString(socket_error, "port/proto not found");
3646 return NULL;
3647 }
3648 return PyString_FromString(sp->s_name);
Barry Warsaw11b91a02004-06-28 00:50:43 +00003649}
3650
3651PyDoc_STRVAR(getservbyport_doc,
3652"getservbyport(port[, protocolname]) -> string\n\
3653\n\
3654Return the service name from a port number and protocol name.\n\
3655The optional protocol name, if given, should be 'tcp' or 'udp',\n\
3656otherwise any protocol will match.");
3657
Guido van Rossum3901d851996-12-19 16:35:04 +00003658/* Python interface to getprotobyname(name).
3659 This only returns the protocol number, since the other info is
3660 already known or not useful (like the list of aliases). */
3661
3662/*ARGSUSED*/
3663static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003664socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00003665{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003666 char *name;
3667 struct protoent *sp;
Guido van Rossumbcc20741998-08-04 22:53:56 +00003668#ifdef __BEOS__
3669/* Not available in BeOS yet. - [cjh] */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003670 PyErr_SetString(socket_error, "getprotobyname not supported");
3671 return NULL;
Guido van Rossumbcc20741998-08-04 22:53:56 +00003672#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003673 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
3674 return NULL;
3675 Py_BEGIN_ALLOW_THREADS
3676 sp = getprotobyname(name);
3677 Py_END_ALLOW_THREADS
3678 if (sp == NULL) {
3679 PyErr_SetString(socket_error, "protocol not found");
3680 return NULL;
3681 }
3682 return PyInt_FromLong((long) sp->p_proto);
Guido van Rossumbcc20741998-08-04 22:53:56 +00003683#endif
Guido van Rossum3901d851996-12-19 16:35:04 +00003684}
3685
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003686PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003687"getprotobyname(name) -> integer\n\
3688\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003689Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003690
Guido van Rossum3901d851996-12-19 16:35:04 +00003691
Dave Cole331708b2004-08-09 04:51:41 +00003692#ifdef HAVE_SOCKETPAIR
3693/* Create a pair of sockets using the socketpair() function.
Dave Cole07fda7e2004-08-23 05:16:23 +00003694 Arguments as for socket() except the default family is AF_UNIX if
Dave Colee8bbfe42004-08-26 00:51:16 +00003695 defined on the platform; otherwise, the default is AF_INET. */
Dave Cole331708b2004-08-09 04:51:41 +00003696
3697/*ARGSUSED*/
3698static PyObject *
3699socket_socketpair(PyObject *self, PyObject *args)
3700{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003701 PySocketSockObject *s0 = NULL, *s1 = NULL;
3702 SOCKET_T sv[2];
3703 int family, type = SOCK_STREAM, proto = 0;
3704 PyObject *res = NULL;
Dave Cole331708b2004-08-09 04:51:41 +00003705
3706#if defined(AF_UNIX)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003707 family = AF_UNIX;
Dave Cole331708b2004-08-09 04:51:41 +00003708#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003709 family = AF_INET;
Dave Cole331708b2004-08-09 04:51:41 +00003710#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003711 if (!PyArg_ParseTuple(args, "|iii:socketpair",
3712 &family, &type, &proto))
3713 return NULL;
3714 /* Create a pair of socket fds */
3715 if (socketpair(family, type, proto, sv) < 0)
3716 return set_error();
3717 s0 = new_sockobject(sv[0], family, type, proto);
3718 if (s0 == NULL)
3719 goto finally;
3720 s1 = new_sockobject(sv[1], family, type, proto);
3721 if (s1 == NULL)
3722 goto finally;
3723 res = PyTuple_Pack(2, s0, s1);
Dave Cole331708b2004-08-09 04:51:41 +00003724
3725finally:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003726 if (res == NULL) {
3727 if (s0 == NULL)
3728 SOCKETCLOSE(sv[0]);
3729 if (s1 == NULL)
3730 SOCKETCLOSE(sv[1]);
3731 }
3732 Py_XDECREF(s0);
3733 Py_XDECREF(s1);
3734 return res;
Dave Cole331708b2004-08-09 04:51:41 +00003735}
3736
3737PyDoc_STRVAR(socketpair_doc,
3738"socketpair([family[, type[, proto]]]) -> (socket object, socket object)\n\
3739\n\
3740Create a pair of socket objects from the sockets returned by the platform\n\
3741socketpair() function.\n\
Dave Cole07fda7e2004-08-23 05:16:23 +00003742The arguments are the same as for socket() except the default family is\n\
Dave Colee8bbfe42004-08-26 00:51:16 +00003743AF_UNIX if defined on the platform; otherwise, the default is AF_INET.");
Dave Cole331708b2004-08-09 04:51:41 +00003744
3745#endif /* HAVE_SOCKETPAIR */
3746
3747
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00003748#ifndef NO_DUP
Guido van Rossum2a7178e1992-12-08 13:38:24 +00003749/* Create a socket object from a numeric file description.
3750 Useful e.g. if stdin is a socket.
3751 Additional arguments as for socket(). */
3752
3753/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00003754static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003755socket_fromfd(PyObject *self, PyObject *args)
Guido van Rossum2a7178e1992-12-08 13:38:24 +00003756{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003757 PySocketSockObject *s;
3758 SOCKET_T fd;
3759 int family, type, proto = 0;
3760 if (!PyArg_ParseTuple(args, "iii|i:fromfd",
3761 &fd, &family, &type, &proto))
3762 return NULL;
3763 /* Dup the fd so it and the socket can be closed independently */
3764 fd = dup(fd);
3765 if (fd < 0)
3766 return set_error();
3767 s = new_sockobject(fd, family, type, proto);
3768 return (PyObject *) s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00003769}
Guido van Rossum82a5c661998-07-07 20:45:43 +00003770
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003771PyDoc_STRVAR(fromfd_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003772"fromfd(fd, family, type[, proto]) -> socket object\n\
3773\n\
Georg Brandldcfdae72006-04-01 07:33:08 +00003774Create a socket object from a duplicate of the given\n\
3775file descriptor.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003776The remaining arguments are the same as for socket().");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003777
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00003778#endif /* NO_DUP */
Guido van Rossum2a7178e1992-12-08 13:38:24 +00003779
Guido van Rossum82a5c661998-07-07 20:45:43 +00003780
Guido van Rossum006bf911996-06-12 04:04:55 +00003781static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003782socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00003783{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003784 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00003785
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003786 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
3787 return NULL;
3788 }
3789 if (x1 < 0) {
3790 PyErr_SetString(PyExc_OverflowError,
3791 "can't convert negative number to unsigned long");
3792 return NULL;
3793 }
3794 x2 = (unsigned int)ntohs((unsigned short)x1);
3795 return PyInt_FromLong(x2);
Guido van Rossum006bf911996-06-12 04:04:55 +00003796}
3797
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003798PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003799"ntohs(integer) -> integer\n\
3800\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003801Convert a 16-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003802
3803
Guido van Rossum006bf911996-06-12 04:04:55 +00003804static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003805socket_ntohl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00003806{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003807 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00003808
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003809 if (PyInt_Check(arg)) {
3810 x = PyInt_AS_LONG(arg);
3811 if (x == (unsigned long) -1 && PyErr_Occurred())
3812 return NULL;
3813 if ((long)x < 0) {
3814 PyErr_SetString(PyExc_OverflowError,
3815 "can't convert negative number to unsigned long");
3816 return NULL;
3817 }
3818 }
3819 else if (PyLong_Check(arg)) {
3820 x = PyLong_AsUnsignedLong(arg);
3821 if (x == (unsigned long) -1 && PyErr_Occurred())
3822 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003823#if SIZEOF_LONG > 4
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003824 {
3825 unsigned long y;
3826 /* only want the trailing 32 bits */
3827 y = x & 0xFFFFFFFFUL;
3828 if (y ^ x)
3829 return PyErr_Format(PyExc_OverflowError,
3830 "long int larger than 32 bits");
3831 x = y;
3832 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003833#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003834 }
3835 else
3836 return PyErr_Format(PyExc_TypeError,
3837 "expected int/long, %s found",
3838 Py_TYPE(arg)->tp_name);
3839 if (x == (unsigned long) -1 && PyErr_Occurred())
3840 return NULL;
3841 return PyLong_FromUnsignedLong(ntohl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00003842}
3843
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003844PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003845"ntohl(integer) -> integer\n\
3846\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003847Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003848
3849
Guido van Rossum006bf911996-06-12 04:04:55 +00003850static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003851socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00003852{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003853 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00003854
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003855 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
3856 return NULL;
3857 }
3858 if (x1 < 0) {
3859 PyErr_SetString(PyExc_OverflowError,
3860 "can't convert negative number to unsigned long");
3861 return NULL;
3862 }
3863 x2 = (unsigned int)htons((unsigned short)x1);
3864 return PyInt_FromLong(x2);
Guido van Rossum006bf911996-06-12 04:04:55 +00003865}
3866
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003867PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003868"htons(integer) -> integer\n\
3869\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003870Convert a 16-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003871
3872
Guido van Rossum006bf911996-06-12 04:04:55 +00003873static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003874socket_htonl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00003875{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003876 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00003877
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003878 if (PyInt_Check(arg)) {
3879 x = PyInt_AS_LONG(arg);
3880 if (x == (unsigned long) -1 && PyErr_Occurred())
3881 return NULL;
3882 if ((long)x < 0) {
3883 PyErr_SetString(PyExc_OverflowError,
3884 "can't convert negative number to unsigned long");
3885 return NULL;
3886 }
3887 }
3888 else if (PyLong_Check(arg)) {
3889 x = PyLong_AsUnsignedLong(arg);
3890 if (x == (unsigned long) -1 && PyErr_Occurred())
3891 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003892#if SIZEOF_LONG > 4
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003893 {
3894 unsigned long y;
3895 /* only want the trailing 32 bits */
3896 y = x & 0xFFFFFFFFUL;
3897 if (y ^ x)
3898 return PyErr_Format(PyExc_OverflowError,
3899 "long int larger than 32 bits");
3900 x = y;
3901 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003902#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003903 }
3904 else
3905 return PyErr_Format(PyExc_TypeError,
3906 "expected int/long, %s found",
3907 Py_TYPE(arg)->tp_name);
3908 return PyLong_FromUnsignedLong(htonl((unsigned long)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00003909}
3910
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003911PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003912"htonl(integer) -> integer\n\
3913\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003914Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003915
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003916/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003917
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003918PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003919"inet_aton(string) -> packed 32-bit IP representation\n\
3920\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003921Convert 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 +00003922binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003923
3924static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003925socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003926{
Guido van Rossuma2e48551999-09-09 15:42:59 +00003927#ifndef INADDR_NONE
3928#define INADDR_NONE (-1)
3929#endif
Neal Norwitz88f115b2003-02-13 02:15:42 +00003930#ifdef HAVE_INET_ATON
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003931 struct in_addr buf;
Ronald Oussorend06b6f22006-04-23 11:59:25 +00003932#endif
3933
3934#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
Gregory P. Smith3605b5c2009-02-11 23:45:25 +00003935#if (SIZEOF_INT != 4)
3936#error "Not sure if in_addr_t exists and int is not 32-bits."
3937#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003938 /* Have to use inet_addr() instead */
3939 unsigned int packed_addr;
Tim Peters1df9fdd2003-02-13 03:13:40 +00003940#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003941 char *ip_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003942
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003943 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))
3944 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003945
Tim Peters1df9fdd2003-02-13 03:13:40 +00003946
3947#ifdef HAVE_INET_ATON
Ronald Oussorend06b6f22006-04-23 11:59:25 +00003948
3949#ifdef USE_INET_ATON_WEAKLINK
3950 if (inet_aton != NULL) {
3951#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003952 if (inet_aton(ip_addr, &buf))
3953 return PyString_FromStringAndSize((char *)(&buf),
3954 sizeof(buf));
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003955
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003956 PyErr_SetString(socket_error,
3957 "illegal IP address string passed to inet_aton");
3958 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003959
Ronald Oussorend06b6f22006-04-23 11:59:25 +00003960#ifdef USE_INET_ATON_WEAKLINK
3961 } else {
3962#endif
3963
3964#endif
3965
3966#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
3967
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003968 /* special-case this address as inet_addr might return INADDR_NONE
3969 * for this */
3970 if (strcmp(ip_addr, "255.255.255.255") == 0) {
3971 packed_addr = 0xFFFFFFFF;
3972 } else {
Martin Blais2856e5f2006-05-26 12:03:27 +00003973
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003974 packed_addr = inet_addr(ip_addr);
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003975
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003976 if (packed_addr == INADDR_NONE) { /* invalid address */
3977 PyErr_SetString(socket_error,
3978 "illegal IP address string passed to inet_aton");
3979 return NULL;
3980 }
3981 }
3982 return PyString_FromStringAndSize((char *) &packed_addr,
3983 sizeof(packed_addr));
Ronald Oussorend06b6f22006-04-23 11:59:25 +00003984
3985#ifdef USE_INET_ATON_WEAKLINK
3986 }
3987#endif
3988
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003989#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003990}
3991
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003992PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00003993"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003994\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003995Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003996
3997static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003998socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003999{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004000 char *packed_str;
4001 int addr_len;
4002 struct in_addr packed_addr;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004003
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004004 if (!PyArg_ParseTuple(args, "s#:inet_ntoa", &packed_str, &addr_len)) {
4005 return NULL;
4006 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00004007
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004008 if (addr_len != sizeof(packed_addr)) {
4009 PyErr_SetString(socket_error,
4010 "packed IP wrong length for inet_ntoa");
4011 return NULL;
4012 }
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004013
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004014 memcpy(&packed_addr, packed_str, addr_len);
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004015
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004016 return PyString_FromString(inet_ntoa(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004017}
Guido van Rossum82a5c661998-07-07 20:45:43 +00004018
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004019#ifdef HAVE_INET_PTON
4020
4021PyDoc_STRVAR(inet_pton_doc,
4022"inet_pton(af, ip) -> packed IP address string\n\
4023\n\
4024Convert an IP address from string format to a packed string suitable\n\
4025for use with low-level network functions.");
4026
4027static PyObject *
4028socket_inet_pton(PyObject *self, PyObject *args)
4029{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004030 int af;
4031 char* ip;
4032 int retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004033#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004034 char packed[MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004035#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004036 char packed[sizeof(struct in_addr)];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004037#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004038 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
4039 return NULL;
4040 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004041
Martin v. Löwis04697e82004-06-02 12:35:29 +00004042#if !defined(ENABLE_IPV6) && defined(AF_INET6)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004043 if(af == AF_INET6) {
4044 PyErr_SetString(socket_error,
4045 "can't use AF_INET6, IPv6 is disabled");
4046 return NULL;
4047 }
Martin Blais2856e5f2006-05-26 12:03:27 +00004048#endif
Martin v. Löwis10649092003-08-05 06:25:06 +00004049
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004050 retval = inet_pton(af, ip, packed);
4051 if (retval < 0) {
4052 PyErr_SetFromErrno(socket_error);
4053 return NULL;
4054 } else if (retval == 0) {
4055 PyErr_SetString(socket_error,
4056 "illegal IP address string passed to inet_pton");
4057 return NULL;
4058 } else if (af == AF_INET) {
4059 return PyString_FromStringAndSize(packed,
4060 sizeof(struct in_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004061#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004062 } else if (af == AF_INET6) {
4063 return PyString_FromStringAndSize(packed,
4064 sizeof(struct in6_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004065#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004066 } else {
4067 PyErr_SetString(socket_error, "unknown address family");
4068 return NULL;
4069 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004070}
Martin Blais2856e5f2006-05-26 12:03:27 +00004071
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004072PyDoc_STRVAR(inet_ntop_doc,
4073"inet_ntop(af, packed_ip) -> string formatted IP address\n\
4074\n\
4075Convert a packed IP address of the given family to string format.");
4076
4077static PyObject *
4078socket_inet_ntop(PyObject *self, PyObject *args)
4079{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004080 int af;
4081 char* packed;
4082 int len;
4083 const char* retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004084#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004085 char ip[MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004086#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004087 char ip[INET_ADDRSTRLEN + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004088#endif
Martin Blais2856e5f2006-05-26 12:03:27 +00004089
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004090 /* Guarantee NUL-termination for PyString_FromString() below */
4091 memset((void *) &ip[0], '\0', sizeof(ip));
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004092
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004093 if (!PyArg_ParseTuple(args, "is#:inet_ntop", &af, &packed, &len)) {
4094 return NULL;
4095 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004096
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004097 if (af == AF_INET) {
4098 if (len != sizeof(struct in_addr)) {
4099 PyErr_SetString(PyExc_ValueError,
4100 "invalid length of packed IP address string");
4101 return NULL;
4102 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004103#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004104 } else if (af == AF_INET6) {
4105 if (len != sizeof(struct in6_addr)) {
4106 PyErr_SetString(PyExc_ValueError,
4107 "invalid length of packed IP address string");
4108 return NULL;
4109 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004110#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004111 } else {
4112 PyErr_Format(PyExc_ValueError,
4113 "unknown address family %d", af);
4114 return NULL;
4115 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004116
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004117 retval = inet_ntop(af, packed, ip, sizeof(ip));
4118 if (!retval) {
4119 PyErr_SetFromErrno(socket_error);
4120 return NULL;
4121 } else {
4122 return PyString_FromString(retval);
4123 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004124
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004125 /* NOTREACHED */
4126 PyErr_SetString(PyExc_RuntimeError, "invalid handling of inet_ntop");
4127 return NULL;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004128}
4129
4130#endif /* HAVE_INET_PTON */
4131
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004132/* Python interface to getaddrinfo(host, port). */
4133
4134/*ARGSUSED*/
4135static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004136socket_getaddrinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004137{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004138 struct addrinfo hints, *res;
4139 struct addrinfo *res0 = NULL;
4140 PyObject *hobj = NULL;
4141 PyObject *pobj = (PyObject *)NULL;
4142 char pbuf[30];
4143 char *hptr, *pptr;
4144 int family, socktype, protocol, flags;
4145 int error;
4146 PyObject *all = (PyObject *)NULL;
4147 PyObject *single = (PyObject *)NULL;
4148 PyObject *idna = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004149
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004150 family = socktype = protocol = flags = 0;
4151 family = AF_UNSPEC;
4152 if (!PyArg_ParseTuple(args, "OO|iiii:getaddrinfo",
4153 &hobj, &pobj, &family, &socktype,
4154 &protocol, &flags)) {
4155 return NULL;
4156 }
4157 if (hobj == Py_None) {
4158 hptr = NULL;
4159 } else if (PyUnicode_Check(hobj)) {
4160 idna = PyObject_CallMethod(hobj, "encode", "s", "idna");
4161 if (!idna)
4162 return NULL;
4163 hptr = PyString_AsString(idna);
4164 } else if (PyString_Check(hobj)) {
4165 hptr = PyString_AsString(hobj);
4166 } else {
4167 PyErr_SetString(PyExc_TypeError,
4168 "getaddrinfo() argument 1 must be string or None");
4169 return NULL;
4170 }
Petri Lehtinenab7dd182012-12-20 21:06:14 +02004171 if (PyInt_Check(pobj) || PyLong_Check(pobj)) {
4172 long value = PyLong_AsLong(pobj);
4173 if (value == -1 && PyErr_Occurred())
4174 return NULL;
4175 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", value);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004176 pptr = pbuf;
4177 } else if (PyString_Check(pobj)) {
4178 pptr = PyString_AsString(pobj);
4179 } else if (pobj == Py_None) {
4180 pptr = (char *)NULL;
4181 } else {
Petri Lehtinenab7dd182012-12-20 21:06:14 +02004182 PyErr_SetString(socket_error,
4183 "getaddrinfo() argument 2 must be integer or string");
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004184 goto err;
4185 }
Ronald Oussoren0e6283e2013-06-10 10:35:36 +02004186#if defined(__APPLE__) && defined(AI_NUMERICSERV)
Ronald Oussoren16c52a32013-05-24 13:45:27 +02004187 if ((flags & AI_NUMERICSERV) && (pptr == NULL || (pptr[0] == '0' && pptr[1] == 0))) {
4188 /* On OSX upto at least OSX 10.8 getaddrinfo crashes
4189 * if AI_NUMERICSERV is set and the servname is NULL or "0".
4190 * This workaround avoids a segfault in libsystem.
4191 */
4192 pptr = "00";
4193 }
4194#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004195 memset(&hints, 0, sizeof(hints));
4196 hints.ai_family = family;
4197 hints.ai_socktype = socktype;
4198 hints.ai_protocol = protocol;
4199 hints.ai_flags = flags;
4200 Py_BEGIN_ALLOW_THREADS
4201 ACQUIRE_GETADDRINFO_LOCK
4202 error = getaddrinfo(hptr, pptr, &hints, &res0);
4203 Py_END_ALLOW_THREADS
4204 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
4205 if (error) {
4206 set_gaierror(error);
4207 goto err;
4208 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004209
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004210 if ((all = PyList_New(0)) == NULL)
4211 goto err;
4212 for (res = res0; res; res = res->ai_next) {
4213 PyObject *addr =
4214 makesockaddr(-1, res->ai_addr, res->ai_addrlen, protocol);
4215 if (addr == NULL)
4216 goto err;
4217 single = Py_BuildValue("iiisO", res->ai_family,
4218 res->ai_socktype, res->ai_protocol,
4219 res->ai_canonname ? res->ai_canonname : "",
4220 addr);
4221 Py_DECREF(addr);
4222 if (single == NULL)
4223 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004224
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004225 if (PyList_Append(all, single))
4226 goto err;
4227 Py_XDECREF(single);
4228 }
4229 Py_XDECREF(idna);
4230 if (res0)
4231 freeaddrinfo(res0);
4232 return all;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004233 err:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004234 Py_XDECREF(single);
4235 Py_XDECREF(all);
4236 Py_XDECREF(idna);
4237 if (res0)
4238 freeaddrinfo(res0);
4239 return (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004240}
4241
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004242PyDoc_STRVAR(getaddrinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004243"getaddrinfo(host, port [, family, socktype, proto, flags])\n\
4244 -> list of (family, socktype, proto, canonname, sockaddr)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004245\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004246Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004247
4248/* Python interface to getnameinfo(sa, flags). */
4249
4250/*ARGSUSED*/
4251static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004252socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004253{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004254 PyObject *sa = (PyObject *)NULL;
4255 int flags;
4256 char *hostp;
Charles-François Natali3aa59e32012-01-02 15:38:27 +01004257 int port;
4258 unsigned int flowinfo, scope_id;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004259 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
4260 struct addrinfo hints, *res = NULL;
4261 int error;
4262 PyObject *ret = (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004263
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004264 flags = flowinfo = scope_id = 0;
4265 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
4266 return NULL;
4267 if (!PyTuple_Check(sa)) {
4268 PyErr_SetString(PyExc_TypeError,
4269 "getnameinfo() argument 1 must be a tuple");
4270 return NULL;
4271 }
Charles-François Natali3aa59e32012-01-02 15:38:27 +01004272 if (!PyArg_ParseTuple(sa, "si|II",
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004273 &hostp, &port, &flowinfo, &scope_id))
4274 return NULL;
Charles-François Natali65dd7452012-06-23 10:06:56 +02004275 if (flowinfo > 0xfffff) {
Charles-François Natali3aa59e32012-01-02 15:38:27 +01004276 PyErr_SetString(PyExc_OverflowError,
4277 "getsockaddrarg: flowinfo must be 0-1048575.");
4278 return NULL;
4279 }
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004280 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
4281 memset(&hints, 0, sizeof(hints));
4282 hints.ai_family = AF_UNSPEC;
4283 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
4284 Py_BEGIN_ALLOW_THREADS
4285 ACQUIRE_GETADDRINFO_LOCK
4286 error = getaddrinfo(hostp, pbuf, &hints, &res);
4287 Py_END_ALLOW_THREADS
4288 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
4289 if (error) {
4290 set_gaierror(error);
4291 goto fail;
4292 }
4293 if (res->ai_next) {
4294 PyErr_SetString(socket_error,
4295 "sockaddr resolved to multiple addresses");
4296 goto fail;
4297 }
4298 switch (res->ai_family) {
4299 case AF_INET:
4300 {
4301 if (PyTuple_GET_SIZE(sa) != 2) {
4302 PyErr_SetString(socket_error,
4303 "IPv4 sockaddr must be 2 tuple");
4304 goto fail;
4305 }
4306 break;
4307 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004308#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004309 case AF_INET6:
4310 {
4311 struct sockaddr_in6 *sin6;
4312 sin6 = (struct sockaddr_in6 *)res->ai_addr;
Charles-François Natali3aa59e32012-01-02 15:38:27 +01004313 sin6->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004314 sin6->sin6_scope_id = scope_id;
4315 break;
4316 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004317#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004318 }
4319 error = getnameinfo(res->ai_addr, res->ai_addrlen,
4320 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
4321 if (error) {
4322 set_gaierror(error);
4323 goto fail;
4324 }
4325 ret = Py_BuildValue("ss", hbuf, pbuf);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004326
4327fail:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004328 if (res)
4329 freeaddrinfo(res);
4330 return ret;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004331}
4332
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004333PyDoc_STRVAR(getnameinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004334"getnameinfo(sockaddr, flags) --> (host, port)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004335\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004336Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004337
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004338
4339/* Python API to getting and setting the default timeout value. */
4340
4341static PyObject *
4342socket_getdefaulttimeout(PyObject *self)
4343{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004344 if (defaulttimeout < 0.0) {
4345 Py_INCREF(Py_None);
4346 return Py_None;
4347 }
4348 else
4349 return PyFloat_FromDouble(defaulttimeout);
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004350}
4351
4352PyDoc_STRVAR(getdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004353"getdefaulttimeout() -> timeout\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004354\n\
Ezio Melottica5e9082011-08-14 08:27:36 +03004355Returns the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004356A value of None indicates that new socket objects have no timeout.\n\
4357When the socket module is first imported, the default is None.");
4358
4359static PyObject *
4360socket_setdefaulttimeout(PyObject *self, PyObject *arg)
4361{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004362 double timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004363
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004364 if (arg == Py_None)
4365 timeout = -1.0;
4366 else {
4367 timeout = PyFloat_AsDouble(arg);
4368 if (timeout < 0.0) {
4369 if (!PyErr_Occurred())
4370 PyErr_SetString(PyExc_ValueError,
4371 "Timeout value out of range");
4372 return NULL;
4373 }
4374 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004375
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004376 defaulttimeout = timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004377
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004378 Py_INCREF(Py_None);
4379 return Py_None;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004380}
4381
4382PyDoc_STRVAR(setdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004383"setdefaulttimeout(timeout)\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004384\n\
Ezio Melottica5e9082011-08-14 08:27:36 +03004385Set the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004386A value of None indicates that new socket objects have no timeout.\n\
4387When the socket module is first imported, the default is None.");
4388
4389
Guido van Rossum30a685f1991-06-27 15:51:29 +00004390/* List of functions exported by this module. */
4391
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004392static PyMethodDef socket_methods[] = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004393 {"gethostbyname", socket_gethostbyname,
4394 METH_VARARGS, gethostbyname_doc},
4395 {"gethostbyname_ex", socket_gethostbyname_ex,
4396 METH_VARARGS, ghbn_ex_doc},
4397 {"gethostbyaddr", socket_gethostbyaddr,
4398 METH_VARARGS, gethostbyaddr_doc},
4399 {"gethostname", socket_gethostname,
4400 METH_NOARGS, gethostname_doc},
4401 {"getservbyname", socket_getservbyname,
4402 METH_VARARGS, getservbyname_doc},
4403 {"getservbyport", socket_getservbyport,
4404 METH_VARARGS, getservbyport_doc},
4405 {"getprotobyname", socket_getprotobyname,
4406 METH_VARARGS, getprotobyname_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004407#ifndef NO_DUP
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004408 {"fromfd", socket_fromfd,
4409 METH_VARARGS, fromfd_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004410#endif
Dave Cole331708b2004-08-09 04:51:41 +00004411#ifdef HAVE_SOCKETPAIR
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004412 {"socketpair", socket_socketpair,
4413 METH_VARARGS, socketpair_doc},
Dave Cole331708b2004-08-09 04:51:41 +00004414#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004415 {"ntohs", socket_ntohs,
4416 METH_VARARGS, ntohs_doc},
4417 {"ntohl", socket_ntohl,
4418 METH_O, ntohl_doc},
4419 {"htons", socket_htons,
4420 METH_VARARGS, htons_doc},
4421 {"htonl", socket_htonl,
4422 METH_O, htonl_doc},
4423 {"inet_aton", socket_inet_aton,
4424 METH_VARARGS, inet_aton_doc},
4425 {"inet_ntoa", socket_inet_ntoa,
4426 METH_VARARGS, inet_ntoa_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004427#ifdef HAVE_INET_PTON
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004428 {"inet_pton", socket_inet_pton,
4429 METH_VARARGS, inet_pton_doc},
4430 {"inet_ntop", socket_inet_ntop,
4431 METH_VARARGS, inet_ntop_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004432#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004433 {"getaddrinfo", socket_getaddrinfo,
4434 METH_VARARGS, getaddrinfo_doc},
4435 {"getnameinfo", socket_getnameinfo,
4436 METH_VARARGS, getnameinfo_doc},
4437 {"getdefaulttimeout", (PyCFunction)socket_getdefaulttimeout,
4438 METH_NOARGS, getdefaulttimeout_doc},
4439 {"setdefaulttimeout", socket_setdefaulttimeout,
4440 METH_O, setdefaulttimeout_doc},
4441 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004442};
4443
Guido van Rossum30a685f1991-06-27 15:51:29 +00004444
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004445#ifdef RISCOS
4446#define OS_INIT_DEFINED
Guido van Rossumbe32c891996-06-20 16:25:29 +00004447
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004448static int
4449os_init(void)
4450{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004451 _kernel_swi_regs r;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004452
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004453 r.r[0] = 0;
4454 _kernel_swi(0x43380, &r, &r);
4455 taskwindow = r.r[0];
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004456
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004457 return 1;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004458}
4459
4460#endif /* RISCOS */
4461
4462
4463#ifdef MS_WINDOWS
4464#define OS_INIT_DEFINED
4465
4466/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00004467
4468static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004469os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00004470{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004471 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00004472}
4473
4474static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004475os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00004476{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004477 WSADATA WSAData;
4478 int ret;
4479 char buf[100];
4480 ret = WSAStartup(0x0101, &WSAData);
4481 switch (ret) {
4482 case 0: /* No error */
4483 Py_AtExit(os_cleanup);
4484 return 1; /* Success */
4485 case WSASYSNOTREADY:
4486 PyErr_SetString(PyExc_ImportError,
4487 "WSAStartup failed: network not ready");
4488 break;
4489 case WSAVERNOTSUPPORTED:
4490 case WSAEINVAL:
4491 PyErr_SetString(
4492 PyExc_ImportError,
4493 "WSAStartup failed: requested version not supported");
4494 break;
4495 default:
4496 PyOS_snprintf(buf, sizeof(buf),
4497 "WSAStartup failed: error code %d", ret);
4498 PyErr_SetString(PyExc_ImportError, buf);
4499 break;
4500 }
4501 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00004502}
4503
Guido van Rossum8d665e61996-06-26 18:22:49 +00004504#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00004505
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004506
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004507#ifdef PYOS_OS2
4508#define OS_INIT_DEFINED
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004509
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004510/* Additional initialization for OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004511
4512static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004513os_init(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004514{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004515#ifndef PYCC_GCC
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004516 char reason[64];
4517 int rc = sock_init();
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004518
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004519 if (rc == 0) {
4520 return 1; /* Success */
4521 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004522
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004523 PyOS_snprintf(reason, sizeof(reason),
4524 "OS/2 TCP/IP Error# %d", sock_errno());
4525 PyErr_SetString(PyExc_ImportError, reason);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004526
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004527 return 0; /* Failure */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00004528#else
Ezio Melottic2077b02011-03-16 12:34:31 +02004529 /* No need to initialize sockets with GCC/EMX */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004530 return 1; /* Success */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00004531#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004532}
4533
4534#endif /* PYOS_OS2 */
4535
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004536
4537#ifndef OS_INIT_DEFINED
4538static int
4539os_init(void)
4540{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004541 return 1; /* Success */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004542}
4543#endif
4544
4545
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00004546/* C API table - always add new things to the end for binary
4547 compatibility. */
4548static
4549PySocketModule_APIObject PySocketModuleAPI =
4550{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004551 &sock_type,
4552 NULL
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00004553};
4554
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004555
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004556/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004557
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004558 This module is actually called "_socket", and there's a wrapper
4559 "socket.py" which implements some additional functionality. On some
4560 platforms (e.g. Windows and OS/2), socket.py also implements a
4561 wrapper for the socket type that provides missing functionality such
4562 as makefile(), dup() and fromfd(). The import of "_socket" may fail
4563 with an ImportError exception if os-specific initialization fails.
4564 On Windows, this does WINSOCK initialization. When WINSOCK is
Ezio Melottic2077b02011-03-16 12:34:31 +02004565 initialized successfully, a call to WSACleanup() is scheduled to be
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004566 made at exit time.
4567*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004568
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004569PyDoc_STRVAR(socket_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004570"Implementation module for socket operations.\n\
4571\n\
4572See the socket module for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004573
Mark Hammondfe51c6d2002-08-02 02:27:13 +00004574PyMODINIT_FUNC
Thomas Wouters1e0c2f42000-07-24 16:06:23 +00004575init_socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004576{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004577 PyObject *m, *has_ipv6;
Fred Drake4baedc12002-04-01 14:53:37 +00004578
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004579 if (!os_init())
4580 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004581
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004582 Py_TYPE(&sock_type) = &PyType_Type;
4583 m = Py_InitModule3(PySocket_MODULE_NAME,
4584 socket_methods,
4585 socket_doc);
4586 if (m == NULL)
4587 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004588
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004589 socket_error = PyErr_NewException("socket.error",
4590 PyExc_IOError, NULL);
4591 if (socket_error == NULL)
4592 return;
4593 PySocketModuleAPI.error = socket_error;
4594 Py_INCREF(socket_error);
4595 PyModule_AddObject(m, "error", socket_error);
4596 socket_herror = PyErr_NewException("socket.herror",
4597 socket_error, NULL);
4598 if (socket_herror == NULL)
4599 return;
4600 Py_INCREF(socket_herror);
4601 PyModule_AddObject(m, "herror", socket_herror);
4602 socket_gaierror = PyErr_NewException("socket.gaierror", socket_error,
4603 NULL);
4604 if (socket_gaierror == NULL)
4605 return;
4606 Py_INCREF(socket_gaierror);
4607 PyModule_AddObject(m, "gaierror", socket_gaierror);
4608 socket_timeout = PyErr_NewException("socket.timeout",
4609 socket_error, NULL);
4610 if (socket_timeout == NULL)
4611 return;
4612 Py_INCREF(socket_timeout);
4613 PyModule_AddObject(m, "timeout", socket_timeout);
4614 Py_INCREF((PyObject *)&sock_type);
4615 if (PyModule_AddObject(m, "SocketType",
4616 (PyObject *)&sock_type) != 0)
4617 return;
4618 Py_INCREF((PyObject *)&sock_type);
4619 if (PyModule_AddObject(m, "socket",
4620 (PyObject *)&sock_type) != 0)
4621 return;
Guido van Rossum09be4091999-08-09 14:40:40 +00004622
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004623#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004624 has_ipv6 = Py_True;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004625#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004626 has_ipv6 = Py_False;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004627#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004628 Py_INCREF(has_ipv6);
4629 PyModule_AddObject(m, "has_ipv6", has_ipv6);
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004630
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004631 /* Export C API */
4632 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
4633 PyCapsule_New(&PySocketModuleAPI, PySocket_CAPSULE_NAME, NULL)
4634 ) != 0)
4635 return;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00004636
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004637 /* Address families (we only support AF_INET and AF_UNIX) */
Guido van Rossum09be4091999-08-09 14:40:40 +00004638#ifdef AF_UNSPEC
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004639 PyModule_AddIntConstant(m, "AF_UNSPEC", AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00004640#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004641 PyModule_AddIntConstant(m, "AF_INET", AF_INET);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004642#ifdef AF_INET6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004643 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004644#endif /* AF_INET6 */
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00004645#if defined(AF_UNIX)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004646 PyModule_AddIntConstant(m, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00004647#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00004648#ifdef AF_AX25
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004649 /* Amateur Radio AX.25 */
4650 PyModule_AddIntConstant(m, "AF_AX25", AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00004651#endif
4652#ifdef AF_IPX
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004653 PyModule_AddIntConstant(m, "AF_IPX", AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00004654#endif
4655#ifdef AF_APPLETALK
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004656 /* Appletalk DDP */
4657 PyModule_AddIntConstant(m, "AF_APPLETALK", AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00004658#endif
4659#ifdef AF_NETROM
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004660 /* Amateur radio NetROM */
4661 PyModule_AddIntConstant(m, "AF_NETROM", AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00004662#endif
4663#ifdef AF_BRIDGE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004664 /* Multiprotocol bridge */
4665 PyModule_AddIntConstant(m, "AF_BRIDGE", AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00004666#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004667#ifdef AF_ATMPVC
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004668 /* ATM PVCs */
4669 PyModule_AddIntConstant(m, "AF_ATMPVC", AF_ATMPVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004670#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00004671#ifdef AF_AAL5
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004672 /* Reserved for Werner's ATM */
4673 PyModule_AddIntConstant(m, "AF_AAL5", AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00004674#endif
4675#ifdef AF_X25
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004676 /* Reserved for X.25 project */
4677 PyModule_AddIntConstant(m, "AF_X25", AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00004678#endif
4679#ifdef AF_INET6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004680 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00004681#endif
4682#ifdef AF_ROSE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004683 /* Amateur Radio X.25 PLP */
4684 PyModule_AddIntConstant(m, "AF_ROSE", AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00004685#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004686#ifdef AF_DECnet
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004687 /* Reserved for DECnet project */
4688 PyModule_AddIntConstant(m, "AF_DECnet", AF_DECnet);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004689#endif
4690#ifdef AF_NETBEUI
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004691 /* Reserved for 802.2LLC project */
4692 PyModule_AddIntConstant(m, "AF_NETBEUI", AF_NETBEUI);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004693#endif
4694#ifdef AF_SECURITY
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004695 /* Security callback pseudo AF */
4696 PyModule_AddIntConstant(m, "AF_SECURITY", AF_SECURITY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004697#endif
4698#ifdef AF_KEY
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004699 /* PF_KEY key management API */
4700 PyModule_AddIntConstant(m, "AF_KEY", AF_KEY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004701#endif
4702#ifdef AF_NETLINK
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004703 /* */
4704 PyModule_AddIntConstant(m, "AF_NETLINK", AF_NETLINK);
4705 PyModule_AddIntConstant(m, "NETLINK_ROUTE", NETLINK_ROUTE);
Martin v. Löwis5fe60e72006-04-06 22:29:33 +00004706#ifdef NETLINK_SKIP
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004707 PyModule_AddIntConstant(m, "NETLINK_SKIP", NETLINK_SKIP);
Martin v. Löwis5fe60e72006-04-06 22:29:33 +00004708#endif
4709#ifdef NETLINK_W1
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004710 PyModule_AddIntConstant(m, "NETLINK_W1", NETLINK_W1);
Martin v. Löwis5fe60e72006-04-06 22:29:33 +00004711#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004712 PyModule_AddIntConstant(m, "NETLINK_USERSOCK", NETLINK_USERSOCK);
4713 PyModule_AddIntConstant(m, "NETLINK_FIREWALL", NETLINK_FIREWALL);
Guido van Rossum668a94a2006-02-21 01:07:27 +00004714#ifdef NETLINK_TCPDIAG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004715 PyModule_AddIntConstant(m, "NETLINK_TCPDIAG", NETLINK_TCPDIAG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00004716#endif
4717#ifdef NETLINK_NFLOG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004718 PyModule_AddIntConstant(m, "NETLINK_NFLOG", NETLINK_NFLOG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00004719#endif
Neal Norwitz65851662006-01-16 04:31:40 +00004720#ifdef NETLINK_XFRM
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004721 PyModule_AddIntConstant(m, "NETLINK_XFRM", NETLINK_XFRM);
Neal Norwitz65851662006-01-16 04:31:40 +00004722#endif
Martin v. Löwis5fe60e72006-04-06 22:29:33 +00004723#ifdef NETLINK_ARPD
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004724 PyModule_AddIntConstant(m, "NETLINK_ARPD", NETLINK_ARPD);
Martin v. Löwis5fe60e72006-04-06 22:29:33 +00004725#endif
4726#ifdef NETLINK_ROUTE6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004727 PyModule_AddIntConstant(m, "NETLINK_ROUTE6", NETLINK_ROUTE6);
Martin v. Löwis5fe60e72006-04-06 22:29:33 +00004728#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004729 PyModule_AddIntConstant(m, "NETLINK_IP6_FW", NETLINK_IP6_FW);
Martin v. Löwisb1cc1d42007-02-13 12:14:19 +00004730#ifdef NETLINK_DNRTMSG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004731 PyModule_AddIntConstant(m, "NETLINK_DNRTMSG", NETLINK_DNRTMSG);
4732#endif
Martin v. Löwis5fe60e72006-04-06 22:29:33 +00004733#ifdef NETLINK_TAPBASE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004734 PyModule_AddIntConstant(m, "NETLINK_TAPBASE", NETLINK_TAPBASE);
Martin v. Löwis5fe60e72006-04-06 22:29:33 +00004735#endif
Georg Brandldcfdae72006-04-01 07:33:08 +00004736#endif /* AF_NETLINK */
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004737#ifdef AF_ROUTE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004738 /* Alias to emulate 4.4BSD */
4739 PyModule_AddIntConstant(m, "AF_ROUTE", AF_ROUTE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004740#endif
4741#ifdef AF_ASH
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004742 /* Ash */
4743 PyModule_AddIntConstant(m, "AF_ASH", AF_ASH);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004744#endif
4745#ifdef AF_ECONET
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004746 /* Acorn Econet */
4747 PyModule_AddIntConstant(m, "AF_ECONET", AF_ECONET);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004748#endif
4749#ifdef AF_ATMSVC
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004750 /* ATM SVCs */
4751 PyModule_AddIntConstant(m, "AF_ATMSVC", AF_ATMSVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004752#endif
4753#ifdef AF_SNA
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004754 /* Linux SNA Project (nutters!) */
4755 PyModule_AddIntConstant(m, "AF_SNA", AF_SNA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004756#endif
4757#ifdef AF_IRDA
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004758 /* IRDA sockets */
4759 PyModule_AddIntConstant(m, "AF_IRDA", AF_IRDA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004760#endif
4761#ifdef AF_PPPOX
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004762 /* PPPoX sockets */
4763 PyModule_AddIntConstant(m, "AF_PPPOX", AF_PPPOX);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004764#endif
4765#ifdef AF_WANPIPE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004766 /* Wanpipe API Sockets */
4767 PyModule_AddIntConstant(m, "AF_WANPIPE", AF_WANPIPE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004768#endif
4769#ifdef AF_LLC
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004770 /* Linux LLC */
4771 PyModule_AddIntConstant(m, "AF_LLC", AF_LLC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004772#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00004773
Hye-Shik Chang81268602004-02-02 06:05:24 +00004774#ifdef USE_BLUETOOTH
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004775 PyModule_AddIntConstant(m, "AF_BLUETOOTH", AF_BLUETOOTH);
4776 PyModule_AddIntConstant(m, "BTPROTO_L2CAP", BTPROTO_L2CAP);
4777 PyModule_AddIntConstant(m, "BTPROTO_HCI", BTPROTO_HCI);
4778 PyModule_AddIntConstant(m, "SOL_HCI", SOL_HCI);
Gregory P. Smith886a1cd2010-10-17 04:28:14 +00004779#if !defined(__NetBSD__) && !defined(__DragonFly__)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004780 PyModule_AddIntConstant(m, "HCI_FILTER", HCI_FILTER);
Gregory P. Smith886a1cd2010-10-17 04:28:14 +00004781#endif
Hye-Shik Chang81268602004-02-02 06:05:24 +00004782#if !defined(__FreeBSD__)
Gregory P. Smith886a1cd2010-10-17 04:28:14 +00004783#if !defined(__NetBSD__) && !defined(__DragonFly__)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004784 PyModule_AddIntConstant(m, "HCI_TIME_STAMP", HCI_TIME_STAMP);
Gregory P. Smith886a1cd2010-10-17 04:28:14 +00004785#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004786 PyModule_AddIntConstant(m, "HCI_DATA_DIR", HCI_DATA_DIR);
4787 PyModule_AddIntConstant(m, "BTPROTO_SCO", BTPROTO_SCO);
Hye-Shik Chang81268602004-02-02 06:05:24 +00004788#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004789 PyModule_AddIntConstant(m, "BTPROTO_RFCOMM", BTPROTO_RFCOMM);
4790 PyModule_AddStringConstant(m, "BDADDR_ANY", "00:00:00:00:00:00");
4791 PyModule_AddStringConstant(m, "BDADDR_LOCAL", "00:00:00:FF:FF:FF");
Martin v. Löwis12af0482004-01-31 12:34:17 +00004792#endif
4793
Antoine Pitroue0c5f3c2010-10-27 20:35:26 +00004794#ifdef AF_PACKET
4795 PyModule_AddIntMacro(m, AF_PACKET);
4796#endif
4797#ifdef PF_PACKET
4798 PyModule_AddIntMacro(m, PF_PACKET);
4799#endif
4800#ifdef PACKET_HOST
4801 PyModule_AddIntMacro(m, PACKET_HOST);
4802#endif
4803#ifdef PACKET_BROADCAST
4804 PyModule_AddIntMacro(m, PACKET_BROADCAST);
4805#endif
4806#ifdef PACKET_MULTICAST
4807 PyModule_AddIntMacro(m, PACKET_MULTICAST);
4808#endif
4809#ifdef PACKET_OTHERHOST
4810 PyModule_AddIntMacro(m, PACKET_OTHERHOST);
4811#endif
4812#ifdef PACKET_OUTGOING
4813 PyModule_AddIntMacro(m, PACKET_OUTGOING);
4814#endif
4815#ifdef PACKET_LOOPBACK
4816 PyModule_AddIntMacro(m, PACKET_LOOPBACK);
4817#endif
4818#ifdef PACKET_FASTROUTE
4819 PyModule_AddIntMacro(m, PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00004820#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00004821
Christian Heimesfb2d25a2008-01-07 16:12:44 +00004822#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004823 PyModule_AddIntConstant(m, "AF_TIPC", AF_TIPC);
Christian Heimesfb2d25a2008-01-07 16:12:44 +00004824
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004825 /* for addresses */
4826 PyModule_AddIntConstant(m, "TIPC_ADDR_NAMESEQ", TIPC_ADDR_NAMESEQ);
4827 PyModule_AddIntConstant(m, "TIPC_ADDR_NAME", TIPC_ADDR_NAME);
4828 PyModule_AddIntConstant(m, "TIPC_ADDR_ID", TIPC_ADDR_ID);
Christian Heimesfb2d25a2008-01-07 16:12:44 +00004829
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004830 PyModule_AddIntConstant(m, "TIPC_ZONE_SCOPE", TIPC_ZONE_SCOPE);
4831 PyModule_AddIntConstant(m, "TIPC_CLUSTER_SCOPE", TIPC_CLUSTER_SCOPE);
4832 PyModule_AddIntConstant(m, "TIPC_NODE_SCOPE", TIPC_NODE_SCOPE);
Christian Heimesfb2d25a2008-01-07 16:12:44 +00004833
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004834 /* for setsockopt() */
4835 PyModule_AddIntConstant(m, "SOL_TIPC", SOL_TIPC);
4836 PyModule_AddIntConstant(m, "TIPC_IMPORTANCE", TIPC_IMPORTANCE);
4837 PyModule_AddIntConstant(m, "TIPC_SRC_DROPPABLE", TIPC_SRC_DROPPABLE);
4838 PyModule_AddIntConstant(m, "TIPC_DEST_DROPPABLE",
4839 TIPC_DEST_DROPPABLE);
4840 PyModule_AddIntConstant(m, "TIPC_CONN_TIMEOUT", TIPC_CONN_TIMEOUT);
Christian Heimesfb2d25a2008-01-07 16:12:44 +00004841
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004842 PyModule_AddIntConstant(m, "TIPC_LOW_IMPORTANCE",
4843 TIPC_LOW_IMPORTANCE);
4844 PyModule_AddIntConstant(m, "TIPC_MEDIUM_IMPORTANCE",
4845 TIPC_MEDIUM_IMPORTANCE);
4846 PyModule_AddIntConstant(m, "TIPC_HIGH_IMPORTANCE",
4847 TIPC_HIGH_IMPORTANCE);
4848 PyModule_AddIntConstant(m, "TIPC_CRITICAL_IMPORTANCE",
4849 TIPC_CRITICAL_IMPORTANCE);
Christian Heimesfb2d25a2008-01-07 16:12:44 +00004850
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004851 /* for subscriptions */
4852 PyModule_AddIntConstant(m, "TIPC_SUB_PORTS", TIPC_SUB_PORTS);
4853 PyModule_AddIntConstant(m, "TIPC_SUB_SERVICE", TIPC_SUB_SERVICE);
Georg Brandlff15c862008-01-11 09:19:11 +00004854#ifdef TIPC_SUB_CANCEL
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004855 /* doesn't seem to be available everywhere */
4856 PyModule_AddIntConstant(m, "TIPC_SUB_CANCEL", TIPC_SUB_CANCEL);
Georg Brandlff15c862008-01-11 09:19:11 +00004857#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004858 PyModule_AddIntConstant(m, "TIPC_WAIT_FOREVER", TIPC_WAIT_FOREVER);
4859 PyModule_AddIntConstant(m, "TIPC_PUBLISHED", TIPC_PUBLISHED);
4860 PyModule_AddIntConstant(m, "TIPC_WITHDRAWN", TIPC_WITHDRAWN);
4861 PyModule_AddIntConstant(m, "TIPC_SUBSCR_TIMEOUT", TIPC_SUBSCR_TIMEOUT);
4862 PyModule_AddIntConstant(m, "TIPC_CFG_SRV", TIPC_CFG_SRV);
4863 PyModule_AddIntConstant(m, "TIPC_TOP_SRV", TIPC_TOP_SRV);
Christian Heimesfb2d25a2008-01-07 16:12:44 +00004864#endif
4865
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004866 /* Socket types */
4867 PyModule_AddIntConstant(m, "SOCK_STREAM", SOCK_STREAM);
4868 PyModule_AddIntConstant(m, "SOCK_DGRAM", SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00004869#ifndef __BEOS__
4870/* We have incomplete socket support. */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004871 PyModule_AddIntConstant(m, "SOCK_RAW", SOCK_RAW);
4872 PyModule_AddIntConstant(m, "SOCK_SEQPACKET", SOCK_SEQPACKET);
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00004873#if defined(SOCK_RDM)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004874 PyModule_AddIntConstant(m, "SOCK_RDM", SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00004875#endif
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00004876#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004877
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004878#ifdef SO_DEBUG
4879 PyModule_AddIntConstant(m, "SO_DEBUG", SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004880#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004881#ifdef SO_ACCEPTCONN
4882 PyModule_AddIntConstant(m, "SO_ACCEPTCONN", SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004883#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004884#ifdef SO_REUSEADDR
4885 PyModule_AddIntConstant(m, "SO_REUSEADDR", SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004886#endif
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00004887#ifdef SO_EXCLUSIVEADDRUSE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004888 PyModule_AddIntConstant(m, "SO_EXCLUSIVEADDRUSE", SO_EXCLUSIVEADDRUSE);
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00004889#endif
4890
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004891#ifdef SO_KEEPALIVE
4892 PyModule_AddIntConstant(m, "SO_KEEPALIVE", SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004893#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004894#ifdef SO_DONTROUTE
4895 PyModule_AddIntConstant(m, "SO_DONTROUTE", SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004896#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004897#ifdef SO_BROADCAST
4898 PyModule_AddIntConstant(m, "SO_BROADCAST", SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004899#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004900#ifdef SO_USELOOPBACK
4901 PyModule_AddIntConstant(m, "SO_USELOOPBACK", SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004902#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004903#ifdef SO_LINGER
4904 PyModule_AddIntConstant(m, "SO_LINGER", SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004905#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004906#ifdef SO_OOBINLINE
4907 PyModule_AddIntConstant(m, "SO_OOBINLINE", SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004908#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004909#ifdef SO_REUSEPORT
4910 PyModule_AddIntConstant(m, "SO_REUSEPORT", SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004911#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004912#ifdef SO_SNDBUF
4913 PyModule_AddIntConstant(m, "SO_SNDBUF", SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004914#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004915#ifdef SO_RCVBUF
4916 PyModule_AddIntConstant(m, "SO_RCVBUF", SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004917#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004918#ifdef SO_SNDLOWAT
4919 PyModule_AddIntConstant(m, "SO_SNDLOWAT", SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004920#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004921#ifdef SO_RCVLOWAT
4922 PyModule_AddIntConstant(m, "SO_RCVLOWAT", SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004923#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004924#ifdef SO_SNDTIMEO
4925 PyModule_AddIntConstant(m, "SO_SNDTIMEO", SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004926#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004927#ifdef SO_RCVTIMEO
4928 PyModule_AddIntConstant(m, "SO_RCVTIMEO", SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004929#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004930#ifdef SO_ERROR
4931 PyModule_AddIntConstant(m, "SO_ERROR", SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004932#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004933#ifdef SO_TYPE
4934 PyModule_AddIntConstant(m, "SO_TYPE", SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004935#endif
Larry Hastings3b958e32010-04-02 11:18:17 +00004936#ifdef SO_SETFIB
4937 PyModule_AddIntConstant(m, "SO_SETFIB", SO_SETFIB);
4938#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004939
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004940 /* Maximum number of connections for "listen" */
4941#ifdef SOMAXCONN
4942 PyModule_AddIntConstant(m, "SOMAXCONN", SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004943#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004944 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004945#endif
4946
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004947 /* Flags for send, recv */
4948#ifdef MSG_OOB
4949 PyModule_AddIntConstant(m, "MSG_OOB", MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004950#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004951#ifdef MSG_PEEK
4952 PyModule_AddIntConstant(m, "MSG_PEEK", MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004953#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004954#ifdef MSG_DONTROUTE
4955 PyModule_AddIntConstant(m, "MSG_DONTROUTE", MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004956#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004957#ifdef MSG_DONTWAIT
4958 PyModule_AddIntConstant(m, "MSG_DONTWAIT", MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00004959#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004960#ifdef MSG_EOR
4961 PyModule_AddIntConstant(m, "MSG_EOR", MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004962#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004963#ifdef MSG_TRUNC
4964 PyModule_AddIntConstant(m, "MSG_TRUNC", MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004965#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004966#ifdef MSG_CTRUNC
4967 PyModule_AddIntConstant(m, "MSG_CTRUNC", MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004968#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004969#ifdef MSG_WAITALL
4970 PyModule_AddIntConstant(m, "MSG_WAITALL", MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004971#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004972#ifdef MSG_BTAG
4973 PyModule_AddIntConstant(m, "MSG_BTAG", MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004974#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004975#ifdef MSG_ETAG
4976 PyModule_AddIntConstant(m, "MSG_ETAG", MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004977#endif
4978
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004979 /* Protocol level and numbers, usable for [gs]etsockopt */
4980#ifdef SOL_SOCKET
4981 PyModule_AddIntConstant(m, "SOL_SOCKET", SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004982#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004983#ifdef SOL_IP
4984 PyModule_AddIntConstant(m, "SOL_IP", SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00004985#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004986 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00004987#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004988#ifdef SOL_IPX
4989 PyModule_AddIntConstant(m, "SOL_IPX", SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00004990#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004991#ifdef SOL_AX25
4992 PyModule_AddIntConstant(m, "SOL_AX25", SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00004993#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004994#ifdef SOL_ATALK
4995 PyModule_AddIntConstant(m, "SOL_ATALK", SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00004996#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004997#ifdef SOL_NETROM
4998 PyModule_AddIntConstant(m, "SOL_NETROM", SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00004999#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005000#ifdef SOL_ROSE
5001 PyModule_AddIntConstant(m, "SOL_ROSE", SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00005002#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005003#ifdef SOL_TCP
5004 PyModule_AddIntConstant(m, "SOL_TCP", SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00005005#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005006 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00005007#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005008#ifdef SOL_UDP
5009 PyModule_AddIntConstant(m, "SOL_UDP", SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00005010#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005011 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00005012#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005013#ifdef IPPROTO_IP
5014 PyModule_AddIntConstant(m, "IPPROTO_IP", IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00005015#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005016 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005017#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005018#ifdef IPPROTO_HOPOPTS
5019 PyModule_AddIntConstant(m, "IPPROTO_HOPOPTS", IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005020#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005021#ifdef IPPROTO_ICMP
5022 PyModule_AddIntConstant(m, "IPPROTO_ICMP", IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00005023#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005024 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005025#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005026#ifdef IPPROTO_IGMP
5027 PyModule_AddIntConstant(m, "IPPROTO_IGMP", IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005028#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005029#ifdef IPPROTO_GGP
5030 PyModule_AddIntConstant(m, "IPPROTO_GGP", IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005031#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005032#ifdef IPPROTO_IPV4
5033 PyModule_AddIntConstant(m, "IPPROTO_IPV4", IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005034#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005035#ifdef IPPROTO_IPV6
5036 PyModule_AddIntConstant(m, "IPPROTO_IPV6", IPPROTO_IPV6);
Martin v. Löwisa0f17342003-10-03 13:56:20 +00005037#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005038#ifdef IPPROTO_IPIP
5039 PyModule_AddIntConstant(m, "IPPROTO_IPIP", IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005040#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005041#ifdef IPPROTO_TCP
5042 PyModule_AddIntConstant(m, "IPPROTO_TCP", IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00005043#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005044 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005045#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005046#ifdef IPPROTO_EGP
5047 PyModule_AddIntConstant(m, "IPPROTO_EGP", IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005048#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005049#ifdef IPPROTO_PUP
5050 PyModule_AddIntConstant(m, "IPPROTO_PUP", IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005051#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005052#ifdef IPPROTO_UDP
5053 PyModule_AddIntConstant(m, "IPPROTO_UDP", IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00005054#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005055 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005056#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005057#ifdef IPPROTO_IDP
5058 PyModule_AddIntConstant(m, "IPPROTO_IDP", IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005059#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005060#ifdef IPPROTO_HELLO
5061 PyModule_AddIntConstant(m, "IPPROTO_HELLO", IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005062#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005063#ifdef IPPROTO_ND
5064 PyModule_AddIntConstant(m, "IPPROTO_ND", IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005065#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005066#ifdef IPPROTO_TP
5067 PyModule_AddIntConstant(m, "IPPROTO_TP", IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005068#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005069#ifdef IPPROTO_IPV6
5070 PyModule_AddIntConstant(m, "IPPROTO_IPV6", IPPROTO_IPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005071#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005072#ifdef IPPROTO_ROUTING
5073 PyModule_AddIntConstant(m, "IPPROTO_ROUTING", IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005074#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005075#ifdef IPPROTO_FRAGMENT
5076 PyModule_AddIntConstant(m, "IPPROTO_FRAGMENT", IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005077#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005078#ifdef IPPROTO_RSVP
5079 PyModule_AddIntConstant(m, "IPPROTO_RSVP", IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005080#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005081#ifdef IPPROTO_GRE
5082 PyModule_AddIntConstant(m, "IPPROTO_GRE", IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005083#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005084#ifdef IPPROTO_ESP
5085 PyModule_AddIntConstant(m, "IPPROTO_ESP", IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005086#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005087#ifdef IPPROTO_AH
5088 PyModule_AddIntConstant(m, "IPPROTO_AH", IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005089#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005090#ifdef IPPROTO_MOBILE
5091 PyModule_AddIntConstant(m, "IPPROTO_MOBILE", IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005092#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005093#ifdef IPPROTO_ICMPV6
5094 PyModule_AddIntConstant(m, "IPPROTO_ICMPV6", IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005095#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005096#ifdef IPPROTO_NONE
5097 PyModule_AddIntConstant(m, "IPPROTO_NONE", IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005098#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005099#ifdef IPPROTO_DSTOPTS
5100 PyModule_AddIntConstant(m, "IPPROTO_DSTOPTS", IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005101#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005102#ifdef IPPROTO_XTP
5103 PyModule_AddIntConstant(m, "IPPROTO_XTP", IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005104#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005105#ifdef IPPROTO_EON
5106 PyModule_AddIntConstant(m, "IPPROTO_EON", IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005107#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005108#ifdef IPPROTO_PIM
5109 PyModule_AddIntConstant(m, "IPPROTO_PIM", IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005110#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005111#ifdef IPPROTO_IPCOMP
5112 PyModule_AddIntConstant(m, "IPPROTO_IPCOMP", IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005113#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005114#ifdef IPPROTO_VRRP
5115 PyModule_AddIntConstant(m, "IPPROTO_VRRP", IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005116#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005117#ifdef IPPROTO_BIP
5118 PyModule_AddIntConstant(m, "IPPROTO_BIP", IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005119#endif
5120/**/
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005121#ifdef IPPROTO_RAW
5122 PyModule_AddIntConstant(m, "IPPROTO_RAW", IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00005123#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005124 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005125#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005126#ifdef IPPROTO_MAX
5127 PyModule_AddIntConstant(m, "IPPROTO_MAX", IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005128#endif
5129
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005130 /* Some port configuration */
5131#ifdef IPPORT_RESERVED
5132 PyModule_AddIntConstant(m, "IPPORT_RESERVED", IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005133#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005134 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005135#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005136#ifdef IPPORT_USERRESERVED
5137 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005138#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005139 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005140#endif
5141
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005142 /* Some reserved IP v.4 addresses */
5143#ifdef INADDR_ANY
5144 PyModule_AddIntConstant(m, "INADDR_ANY", INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005145#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005146 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005147#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005148#ifdef INADDR_BROADCAST
5149 PyModule_AddIntConstant(m, "INADDR_BROADCAST", INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005150#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005151 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005152#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005153#ifdef INADDR_LOOPBACK
5154 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005155#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005156 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005157#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005158#ifdef INADDR_UNSPEC_GROUP
5159 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005160#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005161 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005162#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005163#ifdef INADDR_ALLHOSTS_GROUP
5164 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
5165 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005166#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005167 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005168#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005169#ifdef INADDR_MAX_LOCAL_GROUP
5170 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP",
5171 INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005172#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005173 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005174#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005175#ifdef INADDR_NONE
5176 PyModule_AddIntConstant(m, "INADDR_NONE", INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005177#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005178 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005179#endif
5180
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005181 /* IPv4 [gs]etsockopt options */
5182#ifdef IP_OPTIONS
5183 PyModule_AddIntConstant(m, "IP_OPTIONS", IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005184#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005185#ifdef IP_HDRINCL
5186 PyModule_AddIntConstant(m, "IP_HDRINCL", IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005187#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005188#ifdef IP_TOS
5189 PyModule_AddIntConstant(m, "IP_TOS", IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005190#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005191#ifdef IP_TTL
5192 PyModule_AddIntConstant(m, "IP_TTL", IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005193#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005194#ifdef IP_RECVOPTS
5195 PyModule_AddIntConstant(m, "IP_RECVOPTS", IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005196#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005197#ifdef IP_RECVRETOPTS
5198 PyModule_AddIntConstant(m, "IP_RECVRETOPTS", IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005199#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005200#ifdef IP_RECVDSTADDR
5201 PyModule_AddIntConstant(m, "IP_RECVDSTADDR", IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005202#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005203#ifdef IP_RETOPTS
5204 PyModule_AddIntConstant(m, "IP_RETOPTS", IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005205#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005206#ifdef IP_MULTICAST_IF
5207 PyModule_AddIntConstant(m, "IP_MULTICAST_IF", IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005208#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005209#ifdef IP_MULTICAST_TTL
5210 PyModule_AddIntConstant(m, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005211#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005212#ifdef IP_MULTICAST_LOOP
5213 PyModule_AddIntConstant(m, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005214#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005215#ifdef IP_ADD_MEMBERSHIP
5216 PyModule_AddIntConstant(m, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005217#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005218#ifdef IP_DROP_MEMBERSHIP
5219 PyModule_AddIntConstant(m, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005220#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005221#ifdef IP_DEFAULT_MULTICAST_TTL
5222 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_TTL",
5223 IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00005224#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005225#ifdef IP_DEFAULT_MULTICAST_LOOP
5226 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_LOOP",
5227 IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00005228#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005229#ifdef IP_MAX_MEMBERSHIPS
5230 PyModule_AddIntConstant(m, "IP_MAX_MEMBERSHIPS", IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00005231#endif
5232
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005233 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
5234#ifdef IPV6_JOIN_GROUP
5235 PyModule_AddIntConstant(m, "IPV6_JOIN_GROUP", IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005236#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005237#ifdef IPV6_LEAVE_GROUP
5238 PyModule_AddIntConstant(m, "IPV6_LEAVE_GROUP", IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005239#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005240#ifdef IPV6_MULTICAST_HOPS
5241 PyModule_AddIntConstant(m, "IPV6_MULTICAST_HOPS", IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005242#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005243#ifdef IPV6_MULTICAST_IF
5244 PyModule_AddIntConstant(m, "IPV6_MULTICAST_IF", IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005245#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005246#ifdef IPV6_MULTICAST_LOOP
5247 PyModule_AddIntConstant(m, "IPV6_MULTICAST_LOOP", IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005248#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005249#ifdef IPV6_UNICAST_HOPS
5250 PyModule_AddIntConstant(m, "IPV6_UNICAST_HOPS", IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005251#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005252 /* Additional IPV6 socket options, defined in RFC 3493 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00005253#ifdef IPV6_V6ONLY
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005254 PyModule_AddIntConstant(m, "IPV6_V6ONLY", IPV6_V6ONLY);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005255#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005256 /* Advanced IPV6 socket options, from RFC 3542 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00005257#ifdef IPV6_CHECKSUM
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005258 PyModule_AddIntConstant(m, "IPV6_CHECKSUM", IPV6_CHECKSUM);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005259#endif
5260#ifdef IPV6_DONTFRAG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005261 PyModule_AddIntConstant(m, "IPV6_DONTFRAG", IPV6_DONTFRAG);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005262#endif
5263#ifdef IPV6_DSTOPTS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005264 PyModule_AddIntConstant(m, "IPV6_DSTOPTS", IPV6_DSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005265#endif
5266#ifdef IPV6_HOPLIMIT
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005267 PyModule_AddIntConstant(m, "IPV6_HOPLIMIT", IPV6_HOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005268#endif
5269#ifdef IPV6_HOPOPTS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005270 PyModule_AddIntConstant(m, "IPV6_HOPOPTS", IPV6_HOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005271#endif
5272#ifdef IPV6_NEXTHOP
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005273 PyModule_AddIntConstant(m, "IPV6_NEXTHOP", IPV6_NEXTHOP);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005274#endif
5275#ifdef IPV6_PATHMTU
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005276 PyModule_AddIntConstant(m, "IPV6_PATHMTU", IPV6_PATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005277#endif
5278#ifdef IPV6_PKTINFO
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005279 PyModule_AddIntConstant(m, "IPV6_PKTINFO", IPV6_PKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005280#endif
5281#ifdef IPV6_RECVDSTOPTS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005282 PyModule_AddIntConstant(m, "IPV6_RECVDSTOPTS", IPV6_RECVDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005283#endif
5284#ifdef IPV6_RECVHOPLIMIT
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005285 PyModule_AddIntConstant(m, "IPV6_RECVHOPLIMIT", IPV6_RECVHOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005286#endif
5287#ifdef IPV6_RECVHOPOPTS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005288 PyModule_AddIntConstant(m, "IPV6_RECVHOPOPTS", IPV6_RECVHOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005289#endif
5290#ifdef IPV6_RECVPKTINFO
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005291 PyModule_AddIntConstant(m, "IPV6_RECVPKTINFO", IPV6_RECVPKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005292#endif
5293#ifdef IPV6_RECVRTHDR
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005294 PyModule_AddIntConstant(m, "IPV6_RECVRTHDR", IPV6_RECVRTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005295#endif
5296#ifdef IPV6_RECVTCLASS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005297 PyModule_AddIntConstant(m, "IPV6_RECVTCLASS", IPV6_RECVTCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005298#endif
5299#ifdef IPV6_RTHDR
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005300 PyModule_AddIntConstant(m, "IPV6_RTHDR", IPV6_RTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005301#endif
5302#ifdef IPV6_RTHDRDSTOPTS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005303 PyModule_AddIntConstant(m, "IPV6_RTHDRDSTOPTS", IPV6_RTHDRDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005304#endif
5305#ifdef IPV6_RTHDR_TYPE_0
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005306 PyModule_AddIntConstant(m, "IPV6_RTHDR_TYPE_0", IPV6_RTHDR_TYPE_0);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005307#endif
5308#ifdef IPV6_RECVPATHMTU
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005309 PyModule_AddIntConstant(m, "IPV6_RECVPATHMTU", IPV6_RECVPATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005310#endif
5311#ifdef IPV6_TCLASS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005312 PyModule_AddIntConstant(m, "IPV6_TCLASS", IPV6_TCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005313#endif
5314#ifdef IPV6_USE_MIN_MTU
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005315 PyModule_AddIntConstant(m, "IPV6_USE_MIN_MTU", IPV6_USE_MIN_MTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005316#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005317
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005318 /* TCP options */
5319#ifdef TCP_NODELAY
5320 PyModule_AddIntConstant(m, "TCP_NODELAY", TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00005321#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005322#ifdef TCP_MAXSEG
5323 PyModule_AddIntConstant(m, "TCP_MAXSEG", TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00005324#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005325#ifdef TCP_CORK
5326 PyModule_AddIntConstant(m, "TCP_CORK", TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005327#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005328#ifdef TCP_KEEPIDLE
5329 PyModule_AddIntConstant(m, "TCP_KEEPIDLE", TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005330#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005331#ifdef TCP_KEEPINTVL
5332 PyModule_AddIntConstant(m, "TCP_KEEPINTVL", TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005333#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005334#ifdef TCP_KEEPCNT
5335 PyModule_AddIntConstant(m, "TCP_KEEPCNT", TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005336#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005337#ifdef TCP_SYNCNT
5338 PyModule_AddIntConstant(m, "TCP_SYNCNT", TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005339#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005340#ifdef TCP_LINGER2
5341 PyModule_AddIntConstant(m, "TCP_LINGER2", TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005342#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005343#ifdef TCP_DEFER_ACCEPT
5344 PyModule_AddIntConstant(m, "TCP_DEFER_ACCEPT", TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005345#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005346#ifdef TCP_WINDOW_CLAMP
5347 PyModule_AddIntConstant(m, "TCP_WINDOW_CLAMP", TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005348#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005349#ifdef TCP_INFO
5350 PyModule_AddIntConstant(m, "TCP_INFO", TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005351#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005352#ifdef TCP_QUICKACK
5353 PyModule_AddIntConstant(m, "TCP_QUICKACK", TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005354#endif
5355
Guido van Rossum09be4091999-08-09 14:40:40 +00005356
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005357 /* IPX options */
5358#ifdef IPX_TYPE
5359 PyModule_AddIntConstant(m, "IPX_TYPE", IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00005360#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005361
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005362 /* get{addr,name}info parameters */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005363#ifdef EAI_ADDRFAMILY
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005364 PyModule_AddIntConstant(m, "EAI_ADDRFAMILY", EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005365#endif
5366#ifdef EAI_AGAIN
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005367 PyModule_AddIntConstant(m, "EAI_AGAIN", EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005368#endif
5369#ifdef EAI_BADFLAGS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005370 PyModule_AddIntConstant(m, "EAI_BADFLAGS", EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005371#endif
5372#ifdef EAI_FAIL
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005373 PyModule_AddIntConstant(m, "EAI_FAIL", EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005374#endif
5375#ifdef EAI_FAMILY
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005376 PyModule_AddIntConstant(m, "EAI_FAMILY", EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005377#endif
5378#ifdef EAI_MEMORY
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005379 PyModule_AddIntConstant(m, "EAI_MEMORY", EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005380#endif
5381#ifdef EAI_NODATA
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005382 PyModule_AddIntConstant(m, "EAI_NODATA", EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005383#endif
5384#ifdef EAI_NONAME
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005385 PyModule_AddIntConstant(m, "EAI_NONAME", EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005386#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00005387#ifdef EAI_OVERFLOW
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005388 PyModule_AddIntConstant(m, "EAI_OVERFLOW", EAI_OVERFLOW);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005389#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005390#ifdef EAI_SERVICE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005391 PyModule_AddIntConstant(m, "EAI_SERVICE", EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005392#endif
5393#ifdef EAI_SOCKTYPE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005394 PyModule_AddIntConstant(m, "EAI_SOCKTYPE", EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005395#endif
5396#ifdef EAI_SYSTEM
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005397 PyModule_AddIntConstant(m, "EAI_SYSTEM", EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005398#endif
5399#ifdef EAI_BADHINTS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005400 PyModule_AddIntConstant(m, "EAI_BADHINTS", EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005401#endif
5402#ifdef EAI_PROTOCOL
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005403 PyModule_AddIntConstant(m, "EAI_PROTOCOL", EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005404#endif
5405#ifdef EAI_MAX
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005406 PyModule_AddIntConstant(m, "EAI_MAX", EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005407#endif
5408#ifdef AI_PASSIVE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005409 PyModule_AddIntConstant(m, "AI_PASSIVE", AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005410#endif
5411#ifdef AI_CANONNAME
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005412 PyModule_AddIntConstant(m, "AI_CANONNAME", AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005413#endif
5414#ifdef AI_NUMERICHOST
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005415 PyModule_AddIntConstant(m, "AI_NUMERICHOST", AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005416#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00005417#ifdef AI_NUMERICSERV
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005418 PyModule_AddIntConstant(m, "AI_NUMERICSERV", AI_NUMERICSERV);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005419#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005420#ifdef AI_MASK
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005421 PyModule_AddIntConstant(m, "AI_MASK", AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005422#endif
5423#ifdef AI_ALL
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005424 PyModule_AddIntConstant(m, "AI_ALL", AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005425#endif
5426#ifdef AI_V4MAPPED_CFG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005427 PyModule_AddIntConstant(m, "AI_V4MAPPED_CFG", AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005428#endif
5429#ifdef AI_ADDRCONFIG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005430 PyModule_AddIntConstant(m, "AI_ADDRCONFIG", AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005431#endif
5432#ifdef AI_V4MAPPED
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005433 PyModule_AddIntConstant(m, "AI_V4MAPPED", AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005434#endif
5435#ifdef AI_DEFAULT
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005436 PyModule_AddIntConstant(m, "AI_DEFAULT", AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005437#endif
5438#ifdef NI_MAXHOST
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005439 PyModule_AddIntConstant(m, "NI_MAXHOST", NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005440#endif
5441#ifdef NI_MAXSERV
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005442 PyModule_AddIntConstant(m, "NI_MAXSERV", NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005443#endif
5444#ifdef NI_NOFQDN
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005445 PyModule_AddIntConstant(m, "NI_NOFQDN", NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005446#endif
5447#ifdef NI_NUMERICHOST
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005448 PyModule_AddIntConstant(m, "NI_NUMERICHOST", NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005449#endif
5450#ifdef NI_NAMEREQD
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005451 PyModule_AddIntConstant(m, "NI_NAMEREQD", NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005452#endif
5453#ifdef NI_NUMERICSERV
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005454 PyModule_AddIntConstant(m, "NI_NUMERICSERV", NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005455#endif
5456#ifdef NI_DGRAM
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005457 PyModule_AddIntConstant(m, "NI_DGRAM", NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005458#endif
5459
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005460 /* shutdown() parameters */
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005461#ifdef SHUT_RD
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005462 PyModule_AddIntConstant(m, "SHUT_RD", SHUT_RD);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005463#elif defined(SD_RECEIVE)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005464 PyModule_AddIntConstant(m, "SHUT_RD", SD_RECEIVE);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005465#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005466 PyModule_AddIntConstant(m, "SHUT_RD", 0);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005467#endif
5468#ifdef SHUT_WR
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005469 PyModule_AddIntConstant(m, "SHUT_WR", SHUT_WR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005470#elif defined(SD_SEND)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005471 PyModule_AddIntConstant(m, "SHUT_WR", SD_SEND);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005472#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005473 PyModule_AddIntConstant(m, "SHUT_WR", 1);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005474#endif
5475#ifdef SHUT_RDWR
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005476 PyModule_AddIntConstant(m, "SHUT_RDWR", SHUT_RDWR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005477#elif defined(SD_BOTH)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005478 PyModule_AddIntConstant(m, "SHUT_RDWR", SD_BOTH);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005479#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005480 PyModule_AddIntConstant(m, "SHUT_RDWR", 2);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005481#endif
5482
Christian Heimes04ae9162008-01-04 15:23:30 +00005483#ifdef SIO_RCVALL
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005484 {
5485 DWORD codes[] = {SIO_RCVALL, SIO_KEEPALIVE_VALS};
5486 const char *names[] = {"SIO_RCVALL", "SIO_KEEPALIVE_VALS"};
5487 int i;
5488 for(i = 0; i<sizeof(codes)/sizeof(*codes); ++i) {
5489 PyObject *tmp;
5490 tmp = PyLong_FromUnsignedLong(codes[i]);
5491 if (tmp == NULL)
5492 return;
5493 PyModule_AddObject(m, names[i], tmp);
5494 }
5495 }
5496 PyModule_AddIntConstant(m, "RCVALL_OFF", RCVALL_OFF);
5497 PyModule_AddIntConstant(m, "RCVALL_ON", RCVALL_ON);
5498 PyModule_AddIntConstant(m, "RCVALL_SOCKETLEVELONLY", RCVALL_SOCKETLEVELONLY);
Amaury Forgeot d'Arc94eba712008-03-28 21:55:29 +00005499#ifdef RCVALL_IPLEVEL
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005500 PyModule_AddIntConstant(m, "RCVALL_IPLEVEL", RCVALL_IPLEVEL);
Amaury Forgeot d'Arc94eba712008-03-28 21:55:29 +00005501#endif
5502#ifdef RCVALL_MAX
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005503 PyModule_AddIntConstant(m, "RCVALL_MAX", RCVALL_MAX);
Amaury Forgeot d'Arc94eba712008-03-28 21:55:29 +00005504#endif
Christian Heimes04ae9162008-01-04 15:23:30 +00005505#endif /* _MSTCPIP_ */
5506
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005507 /* Initialize gethostbyname lock */
Just van Rossum1040d2c2003-05-09 07:53:18 +00005508#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005509 netdb_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005510#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005511}
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005512
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005513
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005514#ifndef HAVE_INET_PTON
Christian Heimese8954f82007-11-22 11:21:16 +00005515#if !defined(NTDDI_VERSION) || (NTDDI_VERSION < NTDDI_LONGHORN)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005516
5517/* Simplistic emulation code for inet_pton that only works for IPv4 */
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005518/* These are not exposed because they do not set errno properly */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005519
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005520int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005521inet_pton(int af, const char *src, void *dst)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005522{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005523 if (af == AF_INET) {
Gregory P. Smith3605b5c2009-02-11 23:45:25 +00005524#if (SIZEOF_INT != 4)
5525#error "Not sure if in_addr_t exists and int is not 32-bits."
5526#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005527 unsigned int packed_addr;
5528 packed_addr = inet_addr(src);
5529 if (packed_addr == INADDR_NONE)
5530 return 0;
5531 memcpy(dst, &packed_addr, 4);
5532 return 1;
5533 }
5534 /* Should set errno to EAFNOSUPPORT */
5535 return -1;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005536}
5537
Martin v. Löwisc925b1532001-07-21 09:42:15 +00005538const char *
5539inet_ntop(int af, const void *src, char *dst, socklen_t size)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005540{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005541 if (af == AF_INET) {
5542 struct in_addr packed_addr;
5543 if (size < 16)
5544 /* Should set errno to ENOSPC. */
5545 return NULL;
5546 memcpy(&packed_addr, src, sizeof(packed_addr));
5547 return strncpy(dst, inet_ntoa(packed_addr), size);
5548 }
5549 /* Should set errno to EAFNOSUPPORT */
5550 return NULL;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005551}
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005552
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005553#endif
Christian Heimese8954f82007-11-22 11:21:16 +00005554#endif