blob: c02c5d97880e26bded161fd333d6f720a4c34e4f [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__
Ned Deily1c2a7b52016-02-15 16:51:24 +110085#include <AvailabilityMacros.h>
86/* for getaddrinfo thread safety test on old versions of OS X */
87#ifndef MAC_OS_X_VERSION_10_5
88#define MAC_OS_X_VERSION_10_5 1050
89#endif
Ronald Oussorend06b6f22006-04-23 11:59:25 +000090 /*
91 * inet_aton is not available on OSX 10.3, yet we want to use a binary
92 * that was build on 10.4 or later to work on that release, weak linking
93 * comes to the rescue.
94 */
95# pragma weak inet_aton
96#endif
97
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000098#include "Python.h"
Georg Brandlbc45a3f2006-03-17 19:17:34 +000099#include "structmember.h"
Kristján Valur Jónsson868f0aa2013-03-19 13:53:56 -0700100#include "timefuncs.h"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000101
Victor Stinner465db3c2014-07-26 14:47:56 +0200102#ifndef INVALID_SOCKET /* MS defines this */
103#define INVALID_SOCKET (-1)
104#endif
105
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000106#undef MAX
107#define MAX(x, y) ((x) < (y) ? (y) : (x))
108
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000109/* Socket object documentation */
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000110PyDoc_STRVAR(sock_doc,
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000111"socket([family[, type[, proto]]]) -> socket object\n\
112\n\
113Open a socket of the given type. The family argument specifies the\n\
114address family; it defaults to AF_INET. The type argument specifies\n\
115whether this is a stream (SOCK_STREAM, this is the default)\n\
116or datagram (SOCK_DGRAM) socket. The protocol argument defaults to 0,\n\
117specifying the default protocol. Keyword arguments are accepted.\n\
118\n\
119A socket object represents one endpoint of a network connection.\n\
120\n\
121Methods of socket objects (keyword arguments not allowed):\n\
122\n\
123accept() -- accept a connection, returning new socket and client address\n\
124bind(addr) -- bind the socket to a local address\n\
125close() -- close the socket\n\
126connect(addr) -- connect the socket to a remote address\n\
127connect_ex(addr) -- connect, return an error code instead of an exception\n\
128dup() -- return a new socket object identical to the current one [*]\n\
129fileno() -- return underlying file descriptor\n\
130getpeername() -- return remote address [*]\n\
131getsockname() -- return local address\n\
132getsockopt(level, optname[, buflen]) -- get socket options\n\
133gettimeout() -- return timeout or None\n\
134listen(n) -- start listening for incoming connections\n\
135makefile([mode, [bufsize]]) -- return a file object for the socket [*]\n\
136recv(buflen[, flags]) -- receive data\n\
Martin Blaisaf2ae722006-06-04 13:49:49 +0000137recv_into(buffer[, nbytes[, flags]]) -- receive data (into a buffer)\n\
Martin Blais2856e5f2006-05-26 12:03:27 +0000138recvfrom(buflen[, flags]) -- receive data and sender\'s address\n\
Martin Blaisaf2ae722006-06-04 13:49:49 +0000139recvfrom_into(buffer[, nbytes, [, flags])\n\
Martin Blais2856e5f2006-05-26 12:03:27 +0000140 -- receive data and sender\'s address (into a buffer)\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000141sendall(data[, flags]) -- send all data\n\
142send(data[, flags]) -- send data, may not send all of it\n\
143sendto(data[, flags], addr) -- send data to a given address\n\
144setblocking(0 | 1) -- set or clear the blocking I/O flag\n\
145setsockopt(level, optname, value) -- set socket options\n\
146settimeout(None | float) -- set or clear the timeout\n\
147shutdown(how) -- shut down traffic in one or both directions\n\
148\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000149 [*] not available on all platforms!");
Guido van Rossum3baaa131999-03-22 21:44:51 +0000150
Walter Dörwaldf0dfc7a2003-10-20 14:01:56 +0000151/* XXX This is a terrible mess of platform-dependent preprocessor hacks.
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000152 I hope some day someone can clean this up please... */
153
Guido van Rossum9376b741999-09-15 22:01:40 +0000154/* Hacks for gethostbyname_r(). On some non-Linux platforms, the configure
155 script doesn't get this right, so we hardcode some platform checks below.
156 On the other hand, not all Linux versions agree, so there the settings
157 computed by the configure script are needed! */
158
159#ifndef linux
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000160# undef HAVE_GETHOSTBYNAME_R_3_ARG
161# undef HAVE_GETHOSTBYNAME_R_5_ARG
162# undef HAVE_GETHOSTBYNAME_R_6_ARG
Guido van Rossum9376b741999-09-15 22:01:40 +0000163#endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000164
Guido van Rossum7a122991999-04-13 04:07:32 +0000165#ifndef WITH_THREAD
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000166# undef HAVE_GETHOSTBYNAME_R
Guido van Rossum7a122991999-04-13 04:07:32 +0000167#endif
168
Guido van Rossume7de2061999-03-24 17:24:33 +0000169#ifdef HAVE_GETHOSTBYNAME_R
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000170# if defined(_AIX) || defined(__osf__)
171# define HAVE_GETHOSTBYNAME_R_3_ARG
172# elif defined(__sun) || defined(__sgi)
173# define HAVE_GETHOSTBYNAME_R_5_ARG
174# elif defined(linux)
Guido van Rossum9376b741999-09-15 22:01:40 +0000175/* Rely on the configure script */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000176# else
177# undef HAVE_GETHOSTBYNAME_R
178# endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000179#endif
180
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000181#if !defined(HAVE_GETHOSTBYNAME_R) && defined(WITH_THREAD) && \
182 !defined(MS_WINDOWS)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000183# define USE_GETHOSTBYNAME_LOCK
Guido van Rossum3baaa131999-03-22 21:44:51 +0000184#endif
185
Hye-Shik Chang9ceebd52005-09-24 14:58:47 +0000186/* To use __FreeBSD_version */
187#ifdef HAVE_SYS_PARAM_H
188#include <sys/param.h>
189#endif
Just van Rossum1040d2c2003-05-09 07:53:18 +0000190/* On systems on which getaddrinfo() is believed to not be thread-safe,
Ned Deily1c2a7b52016-02-15 16:51:24 +1100191 (this includes the getaddrinfo emulation) protect access with a lock.
192
193 getaddrinfo is thread-safe on Mac OS X 10.5 and later. Originally it was
194 a mix of code including an unsafe implementation from an old BSD's
195 libresolv. In 10.5 Apple reimplemented it as a safe IPC call to the
196 mDNSResponder process. 10.5 is the first be UNIX '03 certified, which
197 includes the requirement that getaddrinfo be thread-safe.
198
199 See issue #25924 for details.
200 */
201#if defined(WITH_THREAD) && ( \
202 (defined(__APPLE__) && \
203 MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5) || \
Hye-Shik Chang9ceebd52005-09-24 14:58:47 +0000204 (defined(__FreeBSD__) && __FreeBSD_version+0 < 503000) || \
Neal Norwitz2a30cd02006-07-10 01:18:57 +0000205 defined(__OpenBSD__) || defined(__NetBSD__) || \
206 defined(__VMS) || !defined(HAVE_GETADDRINFO))
Just van Rossum1040d2c2003-05-09 07:53:18 +0000207#define USE_GETADDRINFO_LOCK
208#endif
209
210#ifdef USE_GETADDRINFO_LOCK
211#define ACQUIRE_GETADDRINFO_LOCK PyThread_acquire_lock(netdb_lock, 1);
212#define RELEASE_GETADDRINFO_LOCK PyThread_release_lock(netdb_lock);
213#else
214#define ACQUIRE_GETADDRINFO_LOCK
215#define RELEASE_GETADDRINFO_LOCK
216#endif
217
218#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000219# include "pythread.h"
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000220#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000221
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000222#if defined(PYCC_VACPP)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000223# include <types.h>
224# include <io.h>
225# include <sys/ioctl.h>
226# include <utils.h>
227# include <ctype.h>
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000228#endif
229
Martin v. Löwis9e437302002-12-06 12:57:26 +0000230#if defined(__VMS)
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000231# include <ioctl.h>
232#endif
233
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000234#if defined(PYOS_OS2)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000235# define INCL_DOS
236# define INCL_DOSERRORS
237# define INCL_NOPMAPI
238# include <os2.h>
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000239#endif
240
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000241#if defined(__sgi) && _COMPILER_VERSION>700 && !_SGIAPI
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000242/* make sure that the reentrant (gethostbyaddr_r etc)
243 functions are declared correctly if compiling with
244 MIPSPro 7.x in ANSI C mode (default) */
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000245
Martin Blais2856e5f2006-05-26 12:03:27 +0000246/* XXX Using _SGIAPI is the wrong thing,
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000247 but I don't know what the right thing is. */
Trent Mick8ea5bdf2004-09-13 17:48:41 +0000248#undef _SGIAPI /* to avoid warning */
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000249#define _SGIAPI 1
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000250
Trent Mick8ea5bdf2004-09-13 17:48:41 +0000251#undef _XOPEN_SOURCE
252#include <sys/socket.h>
253#include <sys/types.h>
254#include <netinet/in.h>
255#ifdef _SS_ALIGNSIZE
256#define HAVE_GETADDRINFO 1
257#define HAVE_GETNAMEINFO 1
258#endif
259
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000260#define HAVE_INET_PTON
261#include <netdb.h>
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000262#endif
263
Martin Blais2856e5f2006-05-26 12:03:27 +0000264/* Irix 6.5 fails to define this variable at all. This is needed
265 for both GCC and SGI's compiler. I'd say that the SGI headers
Georg Brandldbd83392006-02-20 09:42:33 +0000266 are just busted. Same thing for Solaris. */
267#if (defined(__sgi) || defined(sun)) && !defined(INET_ADDRSTRLEN)
Anthony Baxterbab23cf2003-10-04 08:00:49 +0000268#define INET_ADDRSTRLEN 16
269#endif
270
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000271/* Generic includes */
Martin v. Löwis0e8bd7e2006-06-10 12:23:46 +0000272#ifdef HAVE_SYS_TYPES_H
Guido van Rossumb6775db1994-08-01 11:34:53 +0000273#include <sys/types.h>
Martin v. Löwis0e8bd7e2006-06-10 12:23:46 +0000274#endif
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000275
Marc-André Lemburg976ade62002-02-16 18:47:07 +0000276/* Generic socket object definitions and includes */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000277#define PySocket_BUILDING_SOCKET
Marc-André Lemburgbb8b78b2002-02-16 18:44:52 +0000278#include "socketmodule.h"
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000279
280/* Addressing includes */
281
Guido van Rossum6f489d91996-06-28 20:15:15 +0000282#ifndef MS_WINDOWS
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000283
284/* Non-MS WINDOWS includes */
285# include <netdb.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000286
Guido van Rossum9376b741999-09-15 22:01:40 +0000287/* Headers needed for inet_ntoa() and inet_addr() */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000288# ifdef __BEOS__
289# include <net/netdb.h>
290# elif defined(PYOS_OS2) && defined(PYCC_VACPP)
291# include <netdb.h>
Tim Peters603c6832001-11-05 02:45:59 +0000292typedef size_t socklen_t;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000293# else
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000294# include <arpa/inet.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000295# endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000296
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000297# ifndef RISCOS
298# include <fcntl.h>
299# else
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000300# include <sys/ioctl.h>
301# include <socklib.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000302# define NO_DUP
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000303int h_errno; /* not used */
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000304# define INET_ADDRSTRLEN 16
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000305# endif
306
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000307#else
Guido van Rossum48a680c2001-03-02 06:34:14 +0000308
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000309/* MS_WINDOWS includes */
Martin v. Löwis0e8bd7e2006-06-10 12:23:46 +0000310# ifdef HAVE_FCNTL_H
311# include <fcntl.h>
312# endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000313
Jeremy Hylton22308652001-02-02 03:23:09 +0000314#endif
315
Skip Montanaro7befb992004-02-10 16:50:21 +0000316#include <stddef.h>
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000317
318#ifndef offsetof
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000319# define offsetof(type, member) ((size_t)(&((type *)0)->member))
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000320#endif
321
Neal Norwitz39d22e52002-11-02 19:55:21 +0000322#ifndef O_NONBLOCK
323# define O_NONBLOCK O_NDELAY
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000324#endif
325
Trent Micka708d6e2004-09-07 17:48:26 +0000326/* include Python's addrinfo.h unless it causes trouble */
327#if defined(__sgi) && _COMPILER_VERSION>700 && defined(_SS_ALIGNSIZE)
328 /* Do not include addinfo.h on some newer IRIX versions.
329 * _SS_ALIGNSIZE is defined in sys/socket.h by 6.5.21,
330 * for example, but not by 6.5.10.
331 */
Martin v. Löwis0e8bd7e2006-06-10 12:23:46 +0000332#elif defined(_MSC_VER) && _MSC_VER>1201
Trent Micka708d6e2004-09-07 17:48:26 +0000333 /* Do not include addrinfo.h for MSVC7 or greater. 'addrinfo' and
334 * EAI_* constants are defined in (the already included) ws2tcpip.h.
335 */
336#else
337# include "addrinfo.h"
338#endif
Jason Tishlerc246cb72004-08-09 13:25:59 +0000339
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000340#ifndef HAVE_INET_PTON
Christian Heimese8954f82007-11-22 11:21:16 +0000341#if !defined(NTDDI_VERSION) || (NTDDI_VERSION < NTDDI_LONGHORN)
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000342int inet_pton(int af, const char *src, void *dst);
Martin v. Löwisc925b1532001-07-21 09:42:15 +0000343const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000344#endif
Christian Heimese8954f82007-11-22 11:21:16 +0000345#endif
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000346
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000347#ifdef __APPLE__
348/* On OS X, getaddrinfo returns no error indication of lookup
349 failure, so we must use the emulation instead of the libinfo
350 implementation. Unfortunately, performing an autoconf test
351 for this bug would require DNS access for the machine performing
352 the configuration, which is not acceptable. Therefore, we
353 determine the bug just by checking for __APPLE__. If this bug
354 gets ever fixed, perhaps checking for sys/version.h would be
355 appropriate, which is 10/0 on the system with the bug. */
Jack Jansen84262fb2002-07-02 14:40:42 +0000356#ifndef HAVE_GETNAMEINFO
357/* This bug seems to be fixed in Jaguar. Ths easiest way I could
358 Find to check for Jaguar is that it has getnameinfo(), which
359 older releases don't have */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000360#undef HAVE_GETADDRINFO
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000361#endif
Ronald Oussorend06b6f22006-04-23 11:59:25 +0000362
363#ifdef HAVE_INET_ATON
364#define USE_INET_ATON_WEAKLINK
365#endif
366
Jack Jansen84262fb2002-07-02 14:40:42 +0000367#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000368
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000369/* I know this is a bad practice, but it is the easiest... */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000370#if !defined(HAVE_GETADDRINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000371/* avoid clashes with the C library definition of the symbol. */
372#define getaddrinfo fake_getaddrinfo
373#define gai_strerror fake_gai_strerror
374#define freeaddrinfo fake_freeaddrinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000375#include "getaddrinfo.c"
376#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000377#if !defined(HAVE_GETNAMEINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000378#define getnameinfo fake_getnameinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000379#include "getnameinfo.c"
380#endif
381
Guido van Rossumbcc20741998-08-04 22:53:56 +0000382#if defined(MS_WINDOWS) || defined(__BEOS__)
383/* BeOS suffers from the same socket dichotomy as Win32... - [cjh] */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000384/* seem to be a few differences in the API */
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000385#define SOCKETCLOSE closesocket
Guido van Rossumbe32c891996-06-20 16:25:29 +0000386#define NO_DUP /* Actually it exists on NT 3.5, but what the heck... */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000387#endif
388
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000389#ifdef MS_WIN32
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000390#define EAFNOSUPPORT WSAEAFNOSUPPORT
391#define snprintf _snprintf
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000392#endif
Fred Drakea04eaad2000-06-30 02:46:07 +0000393
Andrew MacIntyreba43e872002-03-03 03:03:52 +0000394#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000395#define SOCKETCLOSE soclose
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000396#define NO_DUP /* Sockets are Not Actual File Handles under OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000397#endif
398
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000399#ifndef SOCKETCLOSE
400#define SOCKETCLOSE close
401#endif
402
Gregory P. Smith886a1cd2010-10-17 04:28:14 +0000403#if (defined(HAVE_BLUETOOTH_H) || defined(HAVE_BLUETOOTH_BLUETOOTH_H)) && !defined(__NetBSD__) && !defined(__DragonFly__)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000404#define USE_BLUETOOTH 1
405#if defined(__FreeBSD__)
406#define BTPROTO_L2CAP BLUETOOTH_PROTO_L2CAP
407#define BTPROTO_RFCOMM BLUETOOTH_PROTO_RFCOMM
Martin v. Löwis45423a72007-02-14 10:07:37 +0000408#define BTPROTO_HCI BLUETOOTH_PROTO_HCI
Hye-Shik Chang82958f02007-06-05 18:16:52 +0000409#define SOL_HCI SOL_HCI_RAW
410#define HCI_FILTER SO_HCI_RAW_FILTER
Hye-Shik Chang81268602004-02-02 06:05:24 +0000411#define sockaddr_l2 sockaddr_l2cap
412#define sockaddr_rc sockaddr_rfcomm
Hye-Shik Chang82958f02007-06-05 18:16:52 +0000413#define hci_dev hci_node
Hye-Shik Chang81268602004-02-02 06:05:24 +0000414#define _BT_L2_MEMB(sa, memb) ((sa)->l2cap_##memb)
415#define _BT_RC_MEMB(sa, memb) ((sa)->rfcomm_##memb)
Martin v. Löwis45423a72007-02-14 10:07:37 +0000416#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Gregory P. Smith886a1cd2010-10-17 04:28:14 +0000417#elif defined(__NetBSD__) || defined(__DragonFly__)
Matt Flemingec926502006-07-28 11:27:27 +0000418#define sockaddr_l2 sockaddr_bt
419#define sockaddr_rc sockaddr_bt
Martin v. Löwis45423a72007-02-14 10:07:37 +0000420#define sockaddr_hci sockaddr_bt
Matt Flemingec926502006-07-28 11:27:27 +0000421#define sockaddr_sco sockaddr_bt
Gregory P. Smith886a1cd2010-10-17 04:28:14 +0000422#define SOL_HCI BTPROTO_HCI
423#define HCI_DATA_DIR SO_HCI_DIRECTION
Matt Flemingec926502006-07-28 11:27:27 +0000424#define _BT_L2_MEMB(sa, memb) ((sa)->bt_##memb)
425#define _BT_RC_MEMB(sa, memb) ((sa)->bt_##memb)
Martin v. Löwis45423a72007-02-14 10:07:37 +0000426#define _BT_HCI_MEMB(sa, memb) ((sa)->bt_##memb)
Matt Flemingec926502006-07-28 11:27:27 +0000427#define _BT_SCO_MEMB(sa, memb) ((sa)->bt_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000428#else
Hye-Shik Chang81268602004-02-02 06:05:24 +0000429#define _BT_L2_MEMB(sa, memb) ((sa)->l2_##memb)
430#define _BT_RC_MEMB(sa, memb) ((sa)->rc_##memb)
Martin v. Löwis45423a72007-02-14 10:07:37 +0000431#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000432#define _BT_SCO_MEMB(sa, memb) ((sa)->sco_##memb)
433#endif
434#endif
435
Neal Norwitz2a30cd02006-07-10 01:18:57 +0000436#ifdef __VMS
437/* TCP/IP Services for VMS uses a maximum send/recv buffer length */
438#define SEGMENT_SIZE (32 * 1024 -1)
439#endif
440
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000441#define SAS2SA(x) ((struct sockaddr *)(x))
Martin v. Löwis046c4d12006-12-03 11:23:45 +0000442
Martin v. Löwise9416172003-05-03 10:12:45 +0000443/*
444 * Constants for getnameinfo()
445 */
446#if !defined(NI_MAXHOST)
447#define NI_MAXHOST 1025
448#endif
449#if !defined(NI_MAXSERV)
450#define NI_MAXSERV 32
451#endif
452
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000453/* XXX There's a problem here: *static* functions are not supposed to have
454 a Py prefix (or use CapitalizedWords). Later... */
455
Guido van Rossum30a685f1991-06-27 15:51:29 +0000456/* Global variable holding the exception type for errors detected
457 by this module (but not argument type or memory errors, etc.). */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000458static PyObject *socket_error;
459static PyObject *socket_herror;
460static PyObject *socket_gaierror;
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000461static PyObject *socket_timeout;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000462
Guido van Rossum48a680c2001-03-02 06:34:14 +0000463#ifdef RISCOS
464/* Global variable which is !=0 if Python is running in a RISC OS taskwindow */
465static int taskwindow;
466#endif
467
Tim Peters643a7fc2002-02-17 04:13:21 +0000468/* A forward reference to the socket type object.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000469 The sock_type variable contains pointers to various functions,
470 some of which call new_sockobject(), which uses sock_type, so
Tim Peters643a7fc2002-02-17 04:13:21 +0000471 there has to be a circular reference. */
Jeremy Hylton938ace62002-07-17 16:30:39 +0000472static PyTypeObject sock_type;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000473
Anthony Baxter93ab5fa2006-07-11 02:04:09 +0000474#if defined(HAVE_POLL_H)
475#include <poll.h>
476#elif defined(HAVE_SYS_POLL_H)
477#include <sys/poll.h>
478#endif
479
Charles-François Natalifda7b372011-08-28 16:22:33 +0200480#ifdef HAVE_POLL
Anthony Baxter93ab5fa2006-07-11 02:04:09 +0000481/* Instead of select(), we'll use poll() since poll() works on any fd. */
482#define IS_SELECTABLE(s) 1
483/* Can we call select() with this socket without a buffer overrun? */
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000484#else
Charles-François Natalifda7b372011-08-28 16:22:33 +0200485/* If there's no timeout left, we don't have to call select, so it's a safe,
486 * little white lie. */
487#define IS_SELECTABLE(s) (_PyIsSelectable_fd((s)->sock_fd) || (s)->sock_timeout <= 0.0)
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000488#endif
Neal Norwitz082b2df2006-02-07 07:04:46 +0000489
490static PyObject*
491select_error(void)
492{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000493 PyErr_SetString(socket_error, "unable to select on socket");
494 return NULL;
Neal Norwitz082b2df2006-02-07 07:04:46 +0000495}
496
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -0700497#ifdef MS_WINDOWS
498#ifndef WSAEAGAIN
499#define WSAEAGAIN WSAEWOULDBLOCK
500#endif
501#define CHECK_ERRNO(expected) \
502 (WSAGetLastError() == WSA ## expected)
503#else
504#define CHECK_ERRNO(expected) \
505 (errno == expected)
506#endif
507
Guido van Rossum30a685f1991-06-27 15:51:29 +0000508/* Convenience function to raise an error according to errno
509 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000510
Guido van Rossum73624e91994-10-10 17:59:00 +0000511static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000512set_error(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000513{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000514#ifdef MS_WINDOWS
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000515 int err_no = WSAGetLastError();
516 /* PyErr_SetExcFromWindowsErr() invokes FormatMessage() which
517 recognizes the error codes used by both GetLastError() and
518 WSAGetLastError */
519 if (err_no)
520 return PyErr_SetExcFromWindowsErr(socket_error, err_no);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000521#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000522
Andrew MacIntyreba43e872002-03-03 03:03:52 +0000523#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000524 if (sock_errno() != NO_ERROR) {
525 APIRET rc;
526 ULONG msglen;
527 char outbuf[100];
528 int myerrorcode = sock_errno();
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000529
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000530 /* Retrieve socket-related error message from MPTN.MSG file */
531 rc = DosGetMessage(NULL, 0, outbuf, sizeof(outbuf),
532 myerrorcode - SOCBASEERR + 26,
533 "mptn.msg",
534 &msglen);
535 if (rc == NO_ERROR) {
536 PyObject *v;
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000537
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000538 /* OS/2 doesn't guarantee a terminator */
539 outbuf[msglen] = '\0';
540 if (strlen(outbuf) > 0) {
541 /* If non-empty msg, trim CRLF */
542 char *lastc = &outbuf[ strlen(outbuf)-1 ];
543 while (lastc > outbuf &&
544 isspace(Py_CHARMASK(*lastc))) {
545 /* Trim trailing whitespace (CRLF) */
546 *lastc-- = '\0';
547 }
548 }
549 v = Py_BuildValue("(is)", myerrorcode, outbuf);
550 if (v != NULL) {
551 PyErr_SetObject(socket_error, v);
552 Py_DECREF(v);
553 }
554 return NULL;
555 }
556 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000557#endif
558
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000559#if defined(RISCOS)
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000560 if (_inet_error.errnum != NULL) {
561 PyObject *v;
562 v = Py_BuildValue("(is)", errno, _inet_err());
563 if (v != NULL) {
564 PyErr_SetObject(socket_error, v);
565 Py_DECREF(v);
566 }
567 return NULL;
568 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000569#endif
570
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000571 return PyErr_SetFromErrno(socket_error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000572}
573
Guido van Rossum30a685f1991-06-27 15:51:29 +0000574
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000575static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000576set_herror(int h_error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000577{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000578 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000579
580#ifdef HAVE_HSTRERROR
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000581 v = Py_BuildValue("(is)", h_error, (char *)hstrerror(h_error));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000582#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000583 v = Py_BuildValue("(is)", h_error, "host not found");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000584#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000585 if (v != NULL) {
586 PyErr_SetObject(socket_herror, v);
587 Py_DECREF(v);
588 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000589
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000590 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000591}
592
593
594static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000595set_gaierror(int error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000596{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000597 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000598
Martin v. Löwis272cb402002-03-01 08:31:07 +0000599#ifdef EAI_SYSTEM
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000600 /* EAI_SYSTEM is not available on Windows XP. */
601 if (error == EAI_SYSTEM)
602 return set_error();
Martin v. Löwis272cb402002-03-01 08:31:07 +0000603#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000604
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000605#ifdef HAVE_GAI_STRERROR
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000606 v = Py_BuildValue("(is)", error, gai_strerror(error));
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000607#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000608 v = Py_BuildValue("(is)", error, "getaddrinfo failed");
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000609#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000610 if (v != NULL) {
611 PyErr_SetObject(socket_gaierror, v);
612 Py_DECREF(v);
613 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000614
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000615 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000616}
617
Neal Norwitz2a30cd02006-07-10 01:18:57 +0000618#ifdef __VMS
619/* Function to send in segments */
620static int
621sendsegmented(int sock_fd, char *buf, int len, int flags)
622{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000623 int n = 0;
624 int remaining = len;
Neal Norwitz2a30cd02006-07-10 01:18:57 +0000625
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000626 while (remaining > 0) {
627 unsigned int segment;
Neal Norwitz2a30cd02006-07-10 01:18:57 +0000628
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000629 segment = (remaining >= SEGMENT_SIZE ? SEGMENT_SIZE : remaining);
630 n = send(sock_fd, buf, segment, flags);
631 if (n < 0) {
632 return n;
633 }
634 remaining -= segment;
635 buf += segment;
636 } /* end while */
Neal Norwitz2a30cd02006-07-10 01:18:57 +0000637
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000638 return len;
Neal Norwitz2a30cd02006-07-10 01:18:57 +0000639}
640#endif
641
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000642/* Function to perform the setting of socket blocking mode
643 internally. block = (1 | 0). */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000644static int
645internal_setblocking(PySocketSockObject *s, int block)
646{
647#ifndef RISCOS
648#ifndef MS_WINDOWS
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000649 int delay_flag;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000650#endif
651#endif
652
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000653 Py_BEGIN_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000654#ifdef __BEOS__
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000655 block = !block;
656 setsockopt(s->sock_fd, SOL_SOCKET, SO_NONBLOCK,
657 (void *)(&block), sizeof(int));
Guido van Rossum67f7a382002-06-06 21:08:16 +0000658#else
659#ifndef RISCOS
660#ifndef MS_WINDOWS
661#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000662 block = !block;
663 ioctl(s->sock_fd, FIONBIO, (caddr_t)&block, sizeof(block));
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000664#elif defined(__VMS)
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000665 block = !block;
666 ioctl(s->sock_fd, FIONBIO, (unsigned int *)&block);
Neal Norwitz2a30cd02006-07-10 01:18:57 +0000667#else /* !PYOS_OS2 && !__VMS */
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000668 delay_flag = fcntl(s->sock_fd, F_GETFL, 0);
669 if (block)
670 delay_flag &= (~O_NONBLOCK);
671 else
672 delay_flag |= O_NONBLOCK;
673 fcntl(s->sock_fd, F_SETFL, delay_flag);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000674#endif /* !PYOS_OS2 */
675#else /* MS_WINDOWS */
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000676 block = !block;
677 ioctlsocket(s->sock_fd, FIONBIO, (u_long*)&block);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000678#endif /* MS_WINDOWS */
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000679#else /* RISCOS */
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000680 block = !block;
681 socketioctl(s->sock_fd, FIONBIO, (u_long*)&block);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000682#endif /* RISCOS */
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000683#endif /* __BEOS__ */
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000684 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000685
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000686 /* Since these don't return anything */
687 return 1;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000688}
689
Anthony Baxter93ab5fa2006-07-11 02:04:09 +0000690/* Do a select()/poll() on the socket, if necessary (sock_timeout > 0).
Guido van Rossum11ba0942002-06-13 15:07:44 +0000691 The argument writing indicates the direction.
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000692 This does not raise an exception; we'll let our caller do that
693 after they've reacquired the interpreter lock.
Neal Norwitz9b0ca792006-08-02 06:46:21 +0000694 Returns 1 on timeout, -1 on error, 0 otherwise. */
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000695static int
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -0700696internal_select_ex(PySocketSockObject *s, int writing, double interval)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000697{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000698 int n;
Guido van Rossum11ba0942002-06-13 15:07:44 +0000699
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000700 /* Nothing to do unless we're in timeout mode (not non-blocking) */
701 if (s->sock_timeout <= 0.0)
702 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000703
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000704 /* Guard against closed socket */
705 if (s->sock_fd < 0)
706 return 0;
Guido van Rossumad654902002-07-19 12:44:59 +0000707
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -0700708 /* Handling this condition here simplifies the select loops */
709 if (interval < 0.0)
710 return 1;
711
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000712 /* Prefer poll, if available, since you can poll() any fd
713 * which can't be done with select(). */
Anthony Baxter93ab5fa2006-07-11 02:04:09 +0000714#ifdef HAVE_POLL
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000715 {
716 struct pollfd pollfd;
717 int timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000718
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000719 pollfd.fd = s->sock_fd;
720 pollfd.events = writing ? POLLOUT : POLLIN;
Anthony Baxter93ab5fa2006-07-11 02:04:09 +0000721
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000722 /* s->sock_timeout is in seconds, timeout in ms */
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -0700723 timeout = (int)(interval * 1000 + 0.5);
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000724 n = poll(&pollfd, 1, timeout);
725 }
Anthony Baxter93ab5fa2006-07-11 02:04:09 +0000726#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000727 {
728 /* Construct the arguments to select */
729 fd_set fds;
730 struct timeval tv;
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -0700731 tv.tv_sec = (int)interval;
732 tv.tv_usec = (int)((interval - tv.tv_sec) * 1e6);
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000733 FD_ZERO(&fds);
734 FD_SET(s->sock_fd, &fds);
Anthony Baxter93ab5fa2006-07-11 02:04:09 +0000735
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000736 /* See if the socket is ready */
737 if (writing)
738 n = select(s->sock_fd+1, NULL, &fds, NULL, &tv);
739 else
740 n = select(s->sock_fd+1, &fds, NULL, NULL, &tv);
741 }
Anthony Baxter93ab5fa2006-07-11 02:04:09 +0000742#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000743
744 if (n < 0)
745 return -1;
746 if (n == 0)
747 return 1;
748 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000749}
750
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -0700751static int
752internal_select(PySocketSockObject *s, int writing)
753{
754 return internal_select_ex(s, writing, s->sock_timeout);
755}
756
757/*
758 Two macros for automatic retry of select() in case of false positives
759 (for example, select() could indicate a socket is ready for reading
760 but the data then discarded by the OS because of a wrong checksum).
761 Here is an example of use:
762
763 BEGIN_SELECT_LOOP(s)
764 Py_BEGIN_ALLOW_THREADS
765 timeout = internal_select_ex(s, 0, interval);
766 if (!timeout)
767 outlen = recv(s->sock_fd, cbuf, len, flags);
768 Py_END_ALLOW_THREADS
769 if (timeout == 1) {
770 PyErr_SetString(socket_timeout, "timed out");
771 return -1;
772 }
773 END_SELECT_LOOP(s)
774*/
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -0700775#define BEGIN_SELECT_LOOP(s) \
776 { \
777 double deadline, interval = s->sock_timeout; \
778 int has_timeout = s->sock_timeout > 0.0; \
779 if (has_timeout) { \
Kristján Valur Jónsson868f0aa2013-03-19 13:53:56 -0700780 deadline = _PyTime_FloatTime() + s->sock_timeout; \
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -0700781 } \
782 while (1) { \
Kristján Valur Jónsson868f0aa2013-03-19 13:53:56 -0700783 errno = 0;
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -0700784
785#define END_SELECT_LOOP(s) \
786 if (!has_timeout || \
787 (!CHECK_ERRNO(EWOULDBLOCK) && !CHECK_ERRNO(EAGAIN))) \
788 break; \
Kristján Valur Jónsson868f0aa2013-03-19 13:53:56 -0700789 interval = deadline - _PyTime_FloatTime(); \
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -0700790 } \
Kristján Valur Jónsson620e3642013-03-19 13:01:05 -0700791 }
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -0700792
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000793/* Initialize a new socket object. */
794
Tim Petersa12b4cf2002-07-18 22:38:44 +0000795static double defaulttimeout = -1.0; /* Default timeout for new sockets */
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000796
Mark Hammond62b1ab12002-07-23 06:31:15 +0000797PyMODINIT_FUNC
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000798init_sockobject(PySocketSockObject *s,
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000799 SOCKET_T fd, int family, int type, int proto)
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000800{
801#ifdef RISCOS
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000802 int block = 1;
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000803#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000804 s->sock_fd = fd;
805 s->sock_family = family;
806 s->sock_type = type;
807 s->sock_proto = proto;
808 s->sock_timeout = defaulttimeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000809
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000810 s->errorhandler = &set_error;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000811
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000812 if (defaulttimeout >= 0.0)
813 internal_setblocking(s, 0);
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000814
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000815#ifdef RISCOS
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000816 if (taskwindow)
817 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000818#endif
819}
820
821
Guido van Rossum30a685f1991-06-27 15:51:29 +0000822/* Create a new socket object.
823 This just creates the object and initializes it.
824 If the creation fails, return NULL and set an exception (implicit
825 in NEWOBJ()). */
826
Guido van Rossum73624e91994-10-10 17:59:00 +0000827static PySocketSockObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000828new_sockobject(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000829{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000830 PySocketSockObject *s;
831 s = (PySocketSockObject *)
832 PyType_GenericNew(&sock_type, NULL, NULL);
833 if (s != NULL)
834 init_sockobject(s, fd, family, type, proto);
835 return s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000836}
837
Guido van Rossum30a685f1991-06-27 15:51:29 +0000838
Guido van Rossum48a680c2001-03-02 06:34:14 +0000839/* Lock to allow python interpreter to continue, but only allow one
Just van Rossum1040d2c2003-05-09 07:53:18 +0000840 thread to be in gethostbyname or getaddrinfo */
841#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Matthias Klosec5517762012-08-14 17:24:47 +0200842static PyThread_type_lock netdb_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000843#endif
844
845
Guido van Rossum30a685f1991-06-27 15:51:29 +0000846/* Convert a string specifying a host name or one of a few symbolic
847 names to a numeric IP address. This usually calls gethostbyname()
848 to do the work; the names "" and "<broadcast>" are special.
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000849 Return the length (IPv4 should be 4 bytes), or negative if
Guido van Rossum30a685f1991-06-27 15:51:29 +0000850 an error occurred; then an exception is raised. */
851
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000852static int
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000853setipaddr(char *name, struct sockaddr *addr_ret, size_t addr_ret_size, int af)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000854{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000855 struct addrinfo hints, *res;
856 int error;
857 int d1, d2, d3, d4;
858 char ch;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000859
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000860 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
861 if (name[0] == '\0') {
862 int siz;
863 memset(&hints, 0, sizeof(hints));
864 hints.ai_family = af;
865 hints.ai_socktype = SOCK_DGRAM; /*dummy*/
866 hints.ai_flags = AI_PASSIVE;
867 Py_BEGIN_ALLOW_THREADS
868 ACQUIRE_GETADDRINFO_LOCK
869 error = getaddrinfo(NULL, "0", &hints, &res);
870 Py_END_ALLOW_THREADS
871 /* We assume that those thread-unsafe getaddrinfo() versions
872 *are* safe regarding their return value, ie. that a
873 subsequent call to getaddrinfo() does not destroy the
874 outcome of the first call. */
875 RELEASE_GETADDRINFO_LOCK
876 if (error) {
877 set_gaierror(error);
878 return -1;
879 }
880 switch (res->ai_family) {
881 case AF_INET:
882 siz = 4;
883 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000884#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000885 case AF_INET6:
886 siz = 16;
887 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000888#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000889 default:
890 freeaddrinfo(res);
891 PyErr_SetString(socket_error,
892 "unsupported address family");
893 return -1;
894 }
895 if (res->ai_next) {
896 freeaddrinfo(res);
897 PyErr_SetString(socket_error,
898 "wildcard resolved to multiple address");
899 return -1;
900 }
901 if (res->ai_addrlen < addr_ret_size)
902 addr_ret_size = res->ai_addrlen;
903 memcpy(addr_ret, res->ai_addr, addr_ret_size);
904 freeaddrinfo(res);
905 return siz;
906 }
907 if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
908 struct sockaddr_in *sin;
909 if (af != AF_INET && af != AF_UNSPEC) {
910 PyErr_SetString(socket_error,
911 "address family mismatched");
912 return -1;
913 }
914 sin = (struct sockaddr_in *)addr_ret;
915 memset((void *) sin, '\0', sizeof(*sin));
916 sin->sin_family = AF_INET;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000917#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000918 sin->sin_len = sizeof(*sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000919#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000920 sin->sin_addr.s_addr = INADDR_BROADCAST;
921 return sizeof(sin->sin_addr);
922 }
923 if (sscanf(name, "%d.%d.%d.%d%c", &d1, &d2, &d3, &d4, &ch) == 4 &&
924 0 <= d1 && d1 <= 255 && 0 <= d2 && d2 <= 255 &&
925 0 <= d3 && d3 <= 255 && 0 <= d4 && d4 <= 255) {
926 struct sockaddr_in *sin;
927 sin = (struct sockaddr_in *)addr_ret;
928 sin->sin_addr.s_addr = htonl(
929 ((long) d1 << 24) | ((long) d2 << 16) |
930 ((long) d3 << 8) | ((long) d4 << 0));
931 sin->sin_family = AF_INET;
Anthony Baxter0e85f9d2003-05-02 15:40:46 +0000932#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000933 sin->sin_len = sizeof(*sin);
Anthony Baxter0e85f9d2003-05-02 15:40:46 +0000934#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000935 return 4;
936 }
937 memset(&hints, 0, sizeof(hints));
938 hints.ai_family = af;
939 Py_BEGIN_ALLOW_THREADS
940 ACQUIRE_GETADDRINFO_LOCK
941 error = getaddrinfo(name, NULL, &hints, &res);
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000942#if defined(__digital__) && defined(__unix__)
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000943 if (error == EAI_NONAME && af == AF_UNSPEC) {
944 /* On Tru64 V5.1, numeric-to-addr conversion fails
945 if no address family is given. Assume IPv4 for now.*/
946 hints.ai_family = AF_INET;
947 error = getaddrinfo(name, NULL, &hints, &res);
948 }
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000949#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000950 Py_END_ALLOW_THREADS
951 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
952 if (error) {
953 set_gaierror(error);
954 return -1;
955 }
956 if (res->ai_addrlen < addr_ret_size)
957 addr_ret_size = res->ai_addrlen;
958 memcpy((char *) addr_ret, res->ai_addr, addr_ret_size);
959 freeaddrinfo(res);
960 switch (addr_ret->sa_family) {
961 case AF_INET:
962 return 4;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000963#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000964 case AF_INET6:
965 return 16;
Guido van Rossum955becc1999-03-22 20:14:53 +0000966#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000967 default:
968 PyErr_SetString(socket_error, "unknown address family");
969 return -1;
970 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000971}
972
Guido van Rossum30a685f1991-06-27 15:51:29 +0000973
Guido van Rossum30a685f1991-06-27 15:51:29 +0000974/* Create a string object representing an IP address.
975 This is always a string of the form 'dd.dd.dd.dd' (with variable
976 size numbers). */
977
Guido van Rossum73624e91994-10-10 17:59:00 +0000978static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000979makeipaddr(struct sockaddr *addr, int addrlen)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000980{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000981 char buf[NI_MAXHOST];
982 int error;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000983
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000984 error = getnameinfo(addr, addrlen, buf, sizeof(buf), NULL, 0,
985 NI_NUMERICHOST);
986 if (error) {
987 set_gaierror(error);
988 return NULL;
989 }
990 return PyString_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000991}
992
993
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000994#ifdef USE_BLUETOOTH
995/* Convert a string representation of a Bluetooth address into a numeric
996 address. Returns the length (6), or raises an exception and returns -1 if
997 an error occurred. */
998
999static int
1000setbdaddr(char *name, bdaddr_t *bdaddr)
1001{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001002 unsigned int b0, b1, b2, b3, b4, b5;
1003 char ch;
1004 int n;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001005
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001006 n = sscanf(name, "%X:%X:%X:%X:%X:%X%c",
1007 &b5, &b4, &b3, &b2, &b1, &b0, &ch);
1008 if (n == 6 && (b0 | b1 | b2 | b3 | b4 | b5) < 256) {
1009 bdaddr->b[0] = b0;
1010 bdaddr->b[1] = b1;
1011 bdaddr->b[2] = b2;
1012 bdaddr->b[3] = b3;
1013 bdaddr->b[4] = b4;
1014 bdaddr->b[5] = b5;
1015 return 6;
1016 } else {
1017 PyErr_SetString(socket_error, "bad bluetooth address");
1018 return -1;
1019 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001020}
1021
1022/* Create a string representation of the Bluetooth address. This is always a
1023 string of the form 'XX:XX:XX:XX:XX:XX' where XX is a two digit hexadecimal
1024 value (zero padded if necessary). */
1025
1026static PyObject *
1027makebdaddr(bdaddr_t *bdaddr)
1028{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001029 char buf[(6 * 2) + 5 + 1];
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001030
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001031 sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X",
1032 bdaddr->b[5], bdaddr->b[4], bdaddr->b[3],
1033 bdaddr->b[2], bdaddr->b[1], bdaddr->b[0]);
1034 return PyString_FromString(buf);
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001035}
1036#endif
1037
1038
Guido van Rossum30a685f1991-06-27 15:51:29 +00001039/* Create an object representing the given socket address,
1040 suitable for passing it back to bind(), connect() etc.
1041 The family field of the sockaddr structure is inspected
1042 to determine what kind of address it really is. */
1043
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001044/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001045static PyObject *
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001046makesockaddr(int sockfd, struct sockaddr *addr, int addrlen, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001047{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001048 if (addrlen == 0) {
1049 /* No address -- may be recvfrom() from known socket */
1050 Py_INCREF(Py_None);
1051 return Py_None;
1052 }
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001053
Guido van Rossumbcc20741998-08-04 22:53:56 +00001054#ifdef __BEOS__
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001055 /* XXX: BeOS version of accept() doesn't set family correctly */
1056 addr->sa_family = AF_INET;
Guido van Rossumbcc20741998-08-04 22:53:56 +00001057#endif
1058
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001059 switch (addr->sa_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001060
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001061 case AF_INET:
1062 {
1063 struct sockaddr_in *a;
1064 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
1065 PyObject *ret = NULL;
1066 if (addrobj) {
1067 a = (struct sockaddr_in *)addr;
1068 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
1069 Py_DECREF(addrobj);
1070 }
1071 return ret;
1072 }
Guido van Rossum30a685f1991-06-27 15:51:29 +00001073
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001074#if defined(AF_UNIX)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001075 case AF_UNIX:
1076 {
1077 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Armin Rigoa9017c32006-04-19 11:50:27 +00001078#ifdef linux
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001079 if (a->sun_path[0] == 0) { /* Linux abstract namespace */
1080 addrlen -= offsetof(struct sockaddr_un, sun_path);
1081 return PyString_FromStringAndSize(a->sun_path,
1082 addrlen);
1083 }
1084 else
Armin Rigoa9017c32006-04-19 11:50:27 +00001085#endif /* linux */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001086 {
1087 /* regular NULL-terminated string */
1088 return PyString_FromString(a->sun_path);
1089 }
1090 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001091#endif /* AF_UNIX */
1092
Martin v. Löwis11017b12006-01-14 18:12:57 +00001093#if defined(AF_NETLINK)
1094 case AF_NETLINK:
1095 {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001096 struct sockaddr_nl *a = (struct sockaddr_nl *) addr;
1097 return Py_BuildValue("II", a->nl_pid, a->nl_groups);
Martin v. Löwis11017b12006-01-14 18:12:57 +00001098 }
1099#endif /* AF_NETLINK */
1100
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001101#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001102 case AF_INET6:
1103 {
1104 struct sockaddr_in6 *a;
1105 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
1106 PyObject *ret = NULL;
1107 if (addrobj) {
1108 a = (struct sockaddr_in6 *)addr;
Charles-François Natali3aa59e32012-01-02 15:38:27 +01001109 ret = Py_BuildValue("OiII",
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001110 addrobj,
1111 ntohs(a->sin6_port),
Charles-François Natali3aa59e32012-01-02 15:38:27 +01001112 ntohl(a->sin6_flowinfo),
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001113 a->sin6_scope_id);
1114 Py_DECREF(addrobj);
1115 }
1116 return ret;
1117 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001118#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001119
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001120#ifdef USE_BLUETOOTH
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001121 case AF_BLUETOOTH:
1122 switch (proto) {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001123
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001124 case BTPROTO_L2CAP:
1125 {
1126 struct sockaddr_l2 *a = (struct sockaddr_l2 *) addr;
1127 PyObject *addrobj = makebdaddr(&_BT_L2_MEMB(a, bdaddr));
1128 PyObject *ret = NULL;
1129 if (addrobj) {
1130 ret = Py_BuildValue("Oi",
1131 addrobj,
1132 _BT_L2_MEMB(a, psm));
1133 Py_DECREF(addrobj);
1134 }
1135 return ret;
1136 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001137
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001138 case BTPROTO_RFCOMM:
1139 {
1140 struct sockaddr_rc *a = (struct sockaddr_rc *) addr;
1141 PyObject *addrobj = makebdaddr(&_BT_RC_MEMB(a, bdaddr));
1142 PyObject *ret = NULL;
1143 if (addrobj) {
1144 ret = Py_BuildValue("Oi",
1145 addrobj,
1146 _BT_RC_MEMB(a, channel));
1147 Py_DECREF(addrobj);
1148 }
1149 return ret;
1150 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001151
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001152 case BTPROTO_HCI:
1153 {
1154 struct sockaddr_hci *a = (struct sockaddr_hci *) addr;
Gregory P. Smith886a1cd2010-10-17 04:28:14 +00001155#if defined(__NetBSD__) || defined(__DragonFly__)
1156 return makebdaddr(&_BT_HCI_MEMB(a, bdaddr));
1157#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001158 PyObject *ret = NULL;
1159 ret = Py_BuildValue("i", _BT_HCI_MEMB(a, dev));
1160 return ret;
Gregory P. Smith886a1cd2010-10-17 04:28:14 +00001161#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001162 }
Martin v. Löwis45423a72007-02-14 10:07:37 +00001163
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001164#if !defined(__FreeBSD__)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001165 case BTPROTO_SCO:
1166 {
1167 struct sockaddr_sco *a = (struct sockaddr_sco *) addr;
1168 return makebdaddr(&_BT_SCO_MEMB(a, bdaddr));
1169 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001170#endif
1171
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001172 default:
1173 PyErr_SetString(PyExc_ValueError,
1174 "Unknown Bluetooth protocol");
1175 return NULL;
1176 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001177#endif
1178
Antoine Pitroue0c5f3c2010-10-27 20:35:26 +00001179#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFNAME)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001180 case AF_PACKET:
1181 {
1182 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
1183 char *ifname = "";
1184 struct ifreq ifr;
1185 /* need to look up interface name give index */
1186 if (a->sll_ifindex) {
1187 ifr.ifr_ifindex = a->sll_ifindex;
1188 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1189 ifname = ifr.ifr_name;
1190 }
1191 return Py_BuildValue("shbhs#",
1192 ifname,
1193 ntohs(a->sll_protocol),
1194 a->sll_pkttype,
1195 a->sll_hatype,
1196 a->sll_addr,
1197 a->sll_halen);
1198 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001199#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001200
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001201#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001202 case AF_TIPC:
1203 {
1204 struct sockaddr_tipc *a = (struct sockaddr_tipc *) addr;
1205 if (a->addrtype == TIPC_ADDR_NAMESEQ) {
1206 return Py_BuildValue("IIIII",
1207 a->addrtype,
1208 a->addr.nameseq.type,
1209 a->addr.nameseq.lower,
1210 a->addr.nameseq.upper,
1211 a->scope);
1212 } else if (a->addrtype == TIPC_ADDR_NAME) {
1213 return Py_BuildValue("IIIII",
1214 a->addrtype,
1215 a->addr.name.name.type,
1216 a->addr.name.name.instance,
1217 a->addr.name.name.instance,
1218 a->scope);
1219 } else if (a->addrtype == TIPC_ADDR_ID) {
1220 return Py_BuildValue("IIIII",
1221 a->addrtype,
1222 a->addr.id.node,
1223 a->addr.id.ref,
1224 0,
1225 a->scope);
1226 } else {
1227 PyErr_SetString(PyExc_ValueError,
1228 "Invalid address type");
1229 return NULL;
1230 }
1231 }
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001232#endif
1233
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001234 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001235
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001236 default:
1237 /* If we don't know the address family, don't raise an
1238 exception -- return it as a tuple. */
1239 return Py_BuildValue("is#",
1240 addr->sa_family,
1241 addr->sa_data,
1242 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001243
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001244 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001245}
1246
Guido van Rossum30a685f1991-06-27 15:51:29 +00001247
1248/* Parse a socket address argument according to the socket object's
1249 address family. Return 1 if the address was in the proper format,
1250 0 of not. The address is returned through addr_ret, its length
1251 through len_ret. */
1252
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001253static int
Guido van Rossum48a680c2001-03-02 06:34:14 +00001254getsockaddrarg(PySocketSockObject *s, PyObject *args,
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001255 struct sockaddr *addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001256{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001257 switch (s->sock_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001258
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001259#if defined(AF_UNIX)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001260 case AF_UNIX:
1261 {
1262 struct sockaddr_un* addr;
1263 char *path;
1264 int len;
1265 if (!PyArg_Parse(args, "t#", &path, &len))
1266 return 0;
Martin v. Löwis046c4d12006-12-03 11:23:45 +00001267
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001268 addr = (struct sockaddr_un*)addr_ret;
Armin Rigoa9017c32006-04-19 11:50:27 +00001269#ifdef linux
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001270 if (len > 0 && path[0] == 0) {
1271 /* Linux abstract namespace extension */
1272 if (len > sizeof addr->sun_path) {
1273 PyErr_SetString(socket_error,
1274 "AF_UNIX path too long");
1275 return 0;
1276 }
1277 }
1278 else
Armin Rigoa9017c32006-04-19 11:50:27 +00001279#endif /* linux */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001280 {
1281 /* regular NULL-terminated string */
1282 if (len >= sizeof addr->sun_path) {
1283 PyErr_SetString(socket_error,
1284 "AF_UNIX path too long");
1285 return 0;
1286 }
1287 addr->sun_path[len] = 0;
1288 }
1289 addr->sun_family = s->sock_family;
1290 memcpy(addr->sun_path, path, len);
Andrew MacIntyredaedf212004-04-11 12:03:57 +00001291#if defined(PYOS_OS2)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001292 *len_ret = sizeof(*addr);
Andrew MacIntyredaedf212004-04-11 12:03:57 +00001293#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001294 *len_ret = len + offsetof(struct sockaddr_un, sun_path);
Andrew MacIntyredaedf212004-04-11 12:03:57 +00001295#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001296 return 1;
1297 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001298#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001299
Martin v. Löwis11017b12006-01-14 18:12:57 +00001300#if defined(AF_NETLINK)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001301 case AF_NETLINK:
1302 {
1303 struct sockaddr_nl* addr;
1304 int pid, groups;
1305 addr = (struct sockaddr_nl *)addr_ret;
1306 if (!PyTuple_Check(args)) {
1307 PyErr_Format(
1308 PyExc_TypeError,
1309 "getsockaddrarg: "
1310 "AF_NETLINK address must be tuple, not %.500s",
1311 Py_TYPE(args)->tp_name);
1312 return 0;
1313 }
1314 if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &pid, &groups))
1315 return 0;
1316 addr->nl_family = AF_NETLINK;
1317 addr->nl_pid = pid;
1318 addr->nl_groups = groups;
1319 *len_ret = sizeof(*addr);
1320 return 1;
1321 }
Martin v. Löwis11017b12006-01-14 18:12:57 +00001322#endif
1323
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001324 case AF_INET:
1325 {
1326 struct sockaddr_in* addr;
1327 char *host;
1328 int port, result;
1329 if (!PyTuple_Check(args)) {
1330 PyErr_Format(
1331 PyExc_TypeError,
1332 "getsockaddrarg: "
1333 "AF_INET address must be tuple, not %.500s",
1334 Py_TYPE(args)->tp_name);
1335 return 0;
1336 }
1337 if (!PyArg_ParseTuple(args, "eti:getsockaddrarg",
1338 "idna", &host, &port))
1339 return 0;
1340 addr=(struct sockaddr_in*)addr_ret;
1341 result = setipaddr(host, (struct sockaddr *)addr,
1342 sizeof(*addr), AF_INET);
1343 PyMem_Free(host);
1344 if (result < 0)
1345 return 0;
1346 if (port < 0 || port > 0xffff) {
1347 PyErr_SetString(
1348 PyExc_OverflowError,
1349 "getsockaddrarg: port must be 0-65535.");
1350 return 0;
1351 }
1352 addr->sin_family = AF_INET;
1353 addr->sin_port = htons((short)port);
1354 *len_ret = sizeof *addr;
1355 return 1;
1356 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001357
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001358#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001359 case AF_INET6:
1360 {
1361 struct sockaddr_in6* addr;
1362 char *host;
Charles-François Natali3aa59e32012-01-02 15:38:27 +01001363 int port, result;
1364 unsigned int flowinfo, scope_id;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001365 flowinfo = scope_id = 0;
1366 if (!PyTuple_Check(args)) {
1367 PyErr_Format(
1368 PyExc_TypeError,
1369 "getsockaddrarg: "
1370 "AF_INET6 address must be tuple, not %.500s",
1371 Py_TYPE(args)->tp_name);
1372 return 0;
1373 }
Charles-François Natali3aa59e32012-01-02 15:38:27 +01001374 if (!PyArg_ParseTuple(args, "eti|II",
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001375 "idna", &host, &port, &flowinfo,
1376 &scope_id)) {
1377 return 0;
1378 }
1379 addr = (struct sockaddr_in6*)addr_ret;
1380 result = setipaddr(host, (struct sockaddr *)addr,
1381 sizeof(*addr), AF_INET6);
1382 PyMem_Free(host);
1383 if (result < 0)
1384 return 0;
1385 if (port < 0 || port > 0xffff) {
1386 PyErr_SetString(
1387 PyExc_OverflowError,
1388 "getsockaddrarg: port must be 0-65535.");
1389 return 0;
1390 }
Charles-François Natali65dd7452012-06-23 10:06:56 +02001391 if (flowinfo > 0xfffff) {
Charles-François Natali3aa59e32012-01-02 15:38:27 +01001392 PyErr_SetString(
1393 PyExc_OverflowError,
1394 "getsockaddrarg: flowinfo must be 0-1048575.");
1395 return 0;
1396 }
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001397 addr->sin6_family = s->sock_family;
1398 addr->sin6_port = htons((short)port);
Charles-François Natali3aa59e32012-01-02 15:38:27 +01001399 addr->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001400 addr->sin6_scope_id = scope_id;
1401 *len_ret = sizeof *addr;
1402 return 1;
1403 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001404#endif
1405
Hye-Shik Chang81268602004-02-02 06:05:24 +00001406#ifdef USE_BLUETOOTH
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001407 case AF_BLUETOOTH:
1408 {
1409 switch (s->sock_proto) {
1410 case BTPROTO_L2CAP:
1411 {
1412 struct sockaddr_l2 *addr;
1413 char *straddr;
Martin v. Löwis12af0482004-01-31 12:34:17 +00001414
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001415 addr = (struct sockaddr_l2 *)addr_ret;
1416 memset(addr, 0, sizeof(struct sockaddr_l2));
1417 _BT_L2_MEMB(addr, family) = AF_BLUETOOTH;
1418 if (!PyArg_ParseTuple(args, "si", &straddr,
1419 &_BT_L2_MEMB(addr, psm))) {
1420 PyErr_SetString(socket_error, "getsockaddrarg: "
1421 "wrong format");
1422 return 0;
1423 }
1424 if (setbdaddr(straddr, &_BT_L2_MEMB(addr, bdaddr)) < 0)
1425 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001426
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001427 *len_ret = sizeof *addr;
1428 return 1;
1429 }
1430 case BTPROTO_RFCOMM:
1431 {
1432 struct sockaddr_rc *addr;
1433 char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001434
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001435 addr = (struct sockaddr_rc *)addr_ret;
1436 _BT_RC_MEMB(addr, family) = AF_BLUETOOTH;
1437 if (!PyArg_ParseTuple(args, "si", &straddr,
1438 &_BT_RC_MEMB(addr, channel))) {
1439 PyErr_SetString(socket_error, "getsockaddrarg: "
1440 "wrong format");
1441 return 0;
1442 }
1443 if (setbdaddr(straddr, &_BT_RC_MEMB(addr, bdaddr)) < 0)
1444 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001445
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001446 *len_ret = sizeof *addr;
1447 return 1;
1448 }
1449 case BTPROTO_HCI:
1450 {
1451 struct sockaddr_hci *addr = (struct sockaddr_hci *)addr_ret;
Gregory P. Smith886a1cd2010-10-17 04:28:14 +00001452#if defined(__NetBSD__) || defined(__DragonFly__)
1453 char *straddr = PyBytes_AS_STRING(args);
1454
1455 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
1456 if (straddr == NULL) {
1457 PyErr_SetString(socket_error, "getsockaddrarg: "
1458 "wrong format");
1459 return 0;
1460 }
1461 if (setbdaddr(straddr, &_BT_HCI_MEMB(addr, bdaddr)) < 0)
1462 return 0;
1463#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001464 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
1465 if (!PyArg_ParseTuple(args, "i", &_BT_HCI_MEMB(addr, dev))) {
1466 PyErr_SetString(socket_error, "getsockaddrarg: "
1467 "wrong format");
1468 return 0;
1469 }
Gregory P. Smith886a1cd2010-10-17 04:28:14 +00001470#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001471 *len_ret = sizeof *addr;
1472 return 1;
1473 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001474#if !defined(__FreeBSD__)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001475 case BTPROTO_SCO:
1476 {
1477 struct sockaddr_sco *addr;
1478 char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001479
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001480 addr = (struct sockaddr_sco *)addr_ret;
1481 _BT_SCO_MEMB(addr, family) = AF_BLUETOOTH;
1482 straddr = PyString_AsString(args);
1483 if (straddr == NULL) {
1484 PyErr_SetString(socket_error, "getsockaddrarg: "
1485 "wrong format");
1486 return 0;
1487 }
1488 if (setbdaddr(straddr, &_BT_SCO_MEMB(addr, bdaddr)) < 0)
1489 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001490
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001491 *len_ret = sizeof *addr;
1492 return 1;
1493 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001494#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001495 default:
1496 PyErr_SetString(socket_error, "getsockaddrarg: unknown Bluetooth protocol");
1497 return 0;
1498 }
1499 }
Martin v. Löwis12af0482004-01-31 12:34:17 +00001500#endif
1501
Antoine Pitroue0c5f3c2010-10-27 20:35:26 +00001502#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFINDEX)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001503 case AF_PACKET:
1504 {
1505 struct sockaddr_ll* addr;
1506 struct ifreq ifr;
1507 char *interfaceName;
1508 int protoNumber;
1509 int hatype = 0;
1510 int pkttype = 0;
1511 char *haddr = NULL;
1512 unsigned int halen = 0;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001513
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001514 if (!PyTuple_Check(args)) {
1515 PyErr_Format(
1516 PyExc_TypeError,
1517 "getsockaddrarg: "
1518 "AF_PACKET address must be tuple, not %.500s",
1519 Py_TYPE(args)->tp_name);
1520 return 0;
1521 }
1522 if (!PyArg_ParseTuple(args, "si|iis#", &interfaceName,
1523 &protoNumber, &pkttype, &hatype,
1524 &haddr, &halen))
1525 return 0;
1526 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
1527 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
1528 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1529 s->errorhandler();
1530 return 0;
1531 }
1532 if (halen > 8) {
1533 PyErr_SetString(PyExc_ValueError,
1534 "Hardware address must be 8 bytes or less");
1535 return 0;
1536 }
1537 if (protoNumber < 0 || protoNumber > 0xffff) {
1538 PyErr_SetString(
1539 PyExc_OverflowError,
1540 "getsockaddrarg: protoNumber must be 0-65535.");
1541 return 0;
1542 }
1543 addr = (struct sockaddr_ll*)addr_ret;
1544 addr->sll_family = AF_PACKET;
1545 addr->sll_protocol = htons((short)protoNumber);
1546 addr->sll_ifindex = ifr.ifr_ifindex;
1547 addr->sll_pkttype = pkttype;
1548 addr->sll_hatype = hatype;
1549 if (halen != 0) {
1550 memcpy(&addr->sll_addr, haddr, halen);
1551 }
1552 addr->sll_halen = halen;
1553 *len_ret = sizeof *addr;
1554 return 1;
1555 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00001556#endif
1557
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001558#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001559 case AF_TIPC:
1560 {
1561 unsigned int atype, v1, v2, v3;
1562 unsigned int scope = TIPC_CLUSTER_SCOPE;
1563 struct sockaddr_tipc *addr;
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001564
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001565 if (!PyTuple_Check(args)) {
1566 PyErr_Format(
1567 PyExc_TypeError,
1568 "getsockaddrarg: "
1569 "AF_TIPC address must be tuple, not %.500s",
1570 Py_TYPE(args)->tp_name);
1571 return 0;
1572 }
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001573
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001574 if (!PyArg_ParseTuple(args,
1575 "IIII|I;Invalid TIPC address format",
1576 &atype, &v1, &v2, &v3, &scope))
1577 return 0;
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001578
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001579 addr = (struct sockaddr_tipc *) addr_ret;
1580 memset(addr, 0, sizeof(struct sockaddr_tipc));
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001581
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001582 addr->family = AF_TIPC;
1583 addr->scope = scope;
1584 addr->addrtype = atype;
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001585
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001586 if (atype == TIPC_ADDR_NAMESEQ) {
1587 addr->addr.nameseq.type = v1;
1588 addr->addr.nameseq.lower = v2;
1589 addr->addr.nameseq.upper = v3;
1590 } else if (atype == TIPC_ADDR_NAME) {
1591 addr->addr.name.name.type = v1;
1592 addr->addr.name.name.instance = v2;
1593 } else if (atype == TIPC_ADDR_ID) {
1594 addr->addr.id.node = v1;
1595 addr->addr.id.ref = v2;
1596 } else {
1597 /* Shouldn't happen */
1598 PyErr_SetString(PyExc_TypeError, "Invalid address type");
1599 return 0;
1600 }
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001601
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001602 *len_ret = sizeof(*addr);
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001603
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001604 return 1;
1605 }
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001606#endif
1607
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001608 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001609
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001610 default:
1611 PyErr_SetString(socket_error, "getsockaddrarg: bad family");
1612 return 0;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001613
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001614 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001615}
1616
Guido van Rossum30a685f1991-06-27 15:51:29 +00001617
Guido van Rossum48a680c2001-03-02 06:34:14 +00001618/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +00001619 Return 1 if the family is known, 0 otherwise. The length is returned
1620 through len_ret. */
1621
1622static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +00001623getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +00001624{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001625 switch (s->sock_family) {
Guido van Rossum710e1df1992-06-12 10:39:36 +00001626
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001627#if defined(AF_UNIX)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001628 case AF_UNIX:
1629 {
1630 *len_ret = sizeof (struct sockaddr_un);
1631 return 1;
1632 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001633#endif /* AF_UNIX */
Martin v. Löwis11017b12006-01-14 18:12:57 +00001634#if defined(AF_NETLINK)
1635 case AF_NETLINK:
1636 {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001637 *len_ret = sizeof (struct sockaddr_nl);
1638 return 1;
Martin v. Löwis11017b12006-01-14 18:12:57 +00001639 }
1640#endif
Guido van Rossum710e1df1992-06-12 10:39:36 +00001641
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001642 case AF_INET:
1643 {
1644 *len_ret = sizeof (struct sockaddr_in);
1645 return 1;
1646 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00001647
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001648#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001649 case AF_INET6:
1650 {
1651 *len_ret = sizeof (struct sockaddr_in6);
1652 return 1;
1653 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001654#endif
1655
Hye-Shik Chang81268602004-02-02 06:05:24 +00001656#ifdef USE_BLUETOOTH
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001657 case AF_BLUETOOTH:
1658 {
1659 switch(s->sock_proto)
1660 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001661
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001662 case BTPROTO_L2CAP:
1663 *len_ret = sizeof (struct sockaddr_l2);
1664 return 1;
1665 case BTPROTO_RFCOMM:
1666 *len_ret = sizeof (struct sockaddr_rc);
1667 return 1;
1668 case BTPROTO_HCI:
1669 *len_ret = sizeof (struct sockaddr_hci);
1670 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00001671#if !defined(__FreeBSD__)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001672 case BTPROTO_SCO:
1673 *len_ret = sizeof (struct sockaddr_sco);
1674 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00001675#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001676 default:
1677 PyErr_SetString(socket_error, "getsockaddrlen: "
1678 "unknown BT protocol");
1679 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001680
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001681 }
1682 }
Martin v. Löwis12af0482004-01-31 12:34:17 +00001683#endif
1684
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00001685#ifdef HAVE_NETPACKET_PACKET_H
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001686 case AF_PACKET:
1687 {
1688 *len_ret = sizeof (struct sockaddr_ll);
1689 return 1;
1690 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001691#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001692
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001693#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001694 case AF_TIPC:
1695 {
1696 *len_ret = sizeof (struct sockaddr_tipc);
1697 return 1;
1698 }
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001699#endif
1700
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001701 /* More cases here... */
Guido van Rossum710e1df1992-06-12 10:39:36 +00001702
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001703 default:
1704 PyErr_SetString(socket_error, "getsockaddrlen: bad family");
1705 return 0;
Guido van Rossum710e1df1992-06-12 10:39:36 +00001706
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001707 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00001708}
1709
1710
Guido van Rossum30a685f1991-06-27 15:51:29 +00001711/* s.accept() method */
1712
Guido van Rossum73624e91994-10-10 17:59:00 +00001713static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001714sock_accept(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001715{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001716 sock_addr_t addrbuf;
1717 SOCKET_T newfd;
1718 socklen_t addrlen;
1719 PyObject *sock = NULL;
1720 PyObject *addr = NULL;
1721 PyObject *res = NULL;
1722 int timeout;
Barry Warsaw752300b1997-01-03 17:18:10 +00001723
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001724 if (!getsockaddrlen(s, &addrlen))
1725 return NULL;
1726 memset(&addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001727
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001728 newfd = INVALID_SOCKET;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001729
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001730 if (!IS_SELECTABLE(s))
1731 return select_error();
Neal Norwitz082b2df2006-02-07 07:04:46 +00001732
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07001733 BEGIN_SELECT_LOOP(s)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001734 Py_BEGIN_ALLOW_THREADS
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07001735 timeout = internal_select_ex(s, 0, interval);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001736 if (!timeout)
1737 newfd = accept(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
1738 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001739
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001740 if (timeout == 1) {
1741 PyErr_SetString(socket_timeout, "timed out");
1742 return NULL;
1743 }
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07001744 END_SELECT_LOOP(s)
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001745
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001746 if (newfd == INVALID_SOCKET)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001747 return s->errorhandler();
Barry Warsaw752300b1997-01-03 17:18:10 +00001748
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001749 /* Create the new object with unspecified family,
1750 to avoid calls to bind() etc. on it. */
1751 sock = (PyObject *) new_sockobject(newfd,
1752 s->sock_family,
1753 s->sock_type,
1754 s->sock_proto);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001755
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001756 if (sock == NULL) {
1757 SOCKETCLOSE(newfd);
1758 goto finally;
1759 }
1760 addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
1761 addrlen, s->sock_proto);
1762 if (addr == NULL)
1763 goto finally;
Barry Warsaw752300b1997-01-03 17:18:10 +00001764
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001765 res = PyTuple_Pack(2, sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00001766
Guido van Rossum67f7a382002-06-06 21:08:16 +00001767finally:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001768 Py_XDECREF(sock);
1769 Py_XDECREF(addr);
1770 return res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001771}
1772
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001773PyDoc_STRVAR(accept_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001774"accept() -> (socket object, address info)\n\
1775\n\
1776Wait for an incoming connection. Return a new socket representing the\n\
1777connection, and the address of the client. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001778info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001779
Guido van Rossum11ba0942002-06-13 15:07:44 +00001780/* s.setblocking(flag) method. Argument:
1781 False -- non-blocking mode; same as settimeout(0)
1782 True -- blocking mode; same as settimeout(None)
1783*/
Guido van Rossume4485b01994-09-07 14:32:49 +00001784
Guido van Rossum73624e91994-10-10 17:59:00 +00001785static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001786sock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00001787{
Serhiy Storchaka74f49ab2013-01-19 12:55:39 +02001788 long block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001789
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001790 block = PyInt_AsLong(arg);
1791 if (block == -1 && PyErr_Occurred())
1792 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001793
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001794 s->sock_timeout = block ? -1.0 : 0.0;
1795 internal_setblocking(s, block);
Guido van Rossume4485b01994-09-07 14:32:49 +00001796
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001797 Py_INCREF(Py_None);
1798 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +00001799}
Guido van Rossume4485b01994-09-07 14:32:49 +00001800
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001801PyDoc_STRVAR(setblocking_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001802"setblocking(flag)\n\
1803\n\
1804Set the socket to blocking (flag is true) or non-blocking (false).\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00001805setblocking(True) is equivalent to settimeout(None);\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001806setblocking(False) is equivalent to settimeout(0.0).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001807
Guido van Rossum11ba0942002-06-13 15:07:44 +00001808/* s.settimeout(timeout) method. Argument:
1809 None -- no timeout, blocking mode; same as setblocking(True)
1810 0.0 -- non-blocking mode; same as setblocking(False)
1811 > 0 -- timeout mode; operations time out after timeout seconds
1812 < 0 -- illegal; raises an exception
1813*/
Guido van Rossum67f7a382002-06-06 21:08:16 +00001814static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001815sock_settimeout(PySocketSockObject *s, PyObject *arg)
Guido van Rossum67f7a382002-06-06 21:08:16 +00001816{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001817 double timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001818
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001819 if (arg == Py_None)
1820 timeout = -1.0;
1821 else {
1822 timeout = PyFloat_AsDouble(arg);
1823 if (timeout < 0.0) {
1824 if (!PyErr_Occurred())
1825 PyErr_SetString(PyExc_ValueError,
1826 "Timeout value out of range");
1827 return NULL;
1828 }
1829 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00001830
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001831 s->sock_timeout = timeout;
1832 internal_setblocking(s, timeout < 0.0);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001833
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001834 Py_INCREF(Py_None);
1835 return Py_None;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001836}
1837
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001838PyDoc_STRVAR(settimeout_doc,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001839"settimeout(timeout)\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00001840\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00001841Set a timeout on socket operations. 'timeout' can be a float,\n\
1842giving in seconds, or None. Setting a timeout of None disables\n\
1843the timeout feature and is equivalent to setblocking(1).\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001844Setting a timeout of zero is the same as setblocking(0).");
Guido van Rossum67f7a382002-06-06 21:08:16 +00001845
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001846/* s.gettimeout() method.
1847 Returns the timeout associated with a socket. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00001848static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001849sock_gettimeout(PySocketSockObject *s)
Guido van Rossum67f7a382002-06-06 21:08:16 +00001850{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001851 if (s->sock_timeout < 0.0) {
1852 Py_INCREF(Py_None);
1853 return Py_None;
1854 }
1855 else
1856 return PyFloat_FromDouble(s->sock_timeout);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001857}
1858
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001859PyDoc_STRVAR(gettimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00001860"gettimeout() -> timeout\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00001861\n\
Ezio Melottica5e9082011-08-14 08:27:36 +03001862Returns the timeout in seconds (float) associated with socket \n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00001863operations. A timeout of None indicates that timeouts on socket \n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001864operations are disabled.");
Guido van Rossume4485b01994-09-07 14:32:49 +00001865
Guido van Rossum48a680c2001-03-02 06:34:14 +00001866#ifdef RISCOS
1867/* s.sleeptaskw(1 | 0) method */
1868
1869static PyObject *
Martin v. Löwisa94568a2003-05-10 07:36:56 +00001870sock_sleeptaskw(PySocketSockObject *s,PyObject *arg)
Guido van Rossum48a680c2001-03-02 06:34:14 +00001871{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001872 int block;
1873 block = PyInt_AsLong(arg);
1874 if (block == -1 && PyErr_Occurred())
1875 return NULL;
1876 Py_BEGIN_ALLOW_THREADS
1877 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
1878 Py_END_ALLOW_THREADS
Guido van Rossum48a680c2001-03-02 06:34:14 +00001879
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001880 Py_INCREF(Py_None);
1881 return Py_None;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001882}
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001883PyDoc_STRVAR(sleeptaskw_doc,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001884"sleeptaskw(flag)\n\
1885\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001886Allow sleeps in taskwindows.");
Guido van Rossum48a680c2001-03-02 06:34:14 +00001887#endif
1888
1889
Guido van Rossumaee08791992-09-08 09:05:33 +00001890/* s.setsockopt() method.
1891 With an integer third argument, sets an integer option.
1892 With a string third argument, sets an option from a buffer;
1893 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001894
Guido van Rossum73624e91994-10-10 17:59:00 +00001895static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001896sock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001897{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001898 int level;
1899 int optname;
1900 int res;
1901 char *buf;
1902 int buflen;
1903 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001904
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001905 if (PyArg_ParseTuple(args, "iii:setsockopt",
1906 &level, &optname, &flag)) {
1907 buf = (char *) &flag;
1908 buflen = sizeof flag;
1909 }
1910 else {
1911 PyErr_Clear();
1912 if (!PyArg_ParseTuple(args, "iis#:setsockopt",
1913 &level, &optname, &buf, &buflen))
1914 return NULL;
1915 }
1916 res = setsockopt(s->sock_fd, level, optname, (void *)buf, buflen);
1917 if (res < 0)
1918 return s->errorhandler();
1919 Py_INCREF(Py_None);
1920 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001921}
1922
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001923PyDoc_STRVAR(setsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001924"setsockopt(level, option, value)\n\
1925\n\
1926Set a socket option. See the Unix manual for level and option.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001927The value argument can either be an integer or a string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001928
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001929
Guido van Rossumaee08791992-09-08 09:05:33 +00001930/* s.getsockopt() method.
1931 With two arguments, retrieves an integer option.
1932 With a third integer argument, retrieves a string buffer of that size;
1933 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001934
Guido van Rossum73624e91994-10-10 17:59:00 +00001935static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001936sock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001937{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001938 int level;
1939 int optname;
1940 int res;
1941 PyObject *buf;
1942 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001943
Guido van Rossumbcc20741998-08-04 22:53:56 +00001944#ifdef __BEOS__
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001945 /* We have incomplete socket support. */
1946 PyErr_SetString(socket_error, "getsockopt not supported");
1947 return NULL;
Guido van Rossumbcc20741998-08-04 22:53:56 +00001948#else
1949
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001950 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
1951 &level, &optname, &buflen))
1952 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001953
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001954 if (buflen == 0) {
1955 int flag = 0;
1956 socklen_t flagsize = sizeof flag;
1957 res = getsockopt(s->sock_fd, level, optname,
1958 (void *)&flag, &flagsize);
1959 if (res < 0)
1960 return s->errorhandler();
1961 return PyInt_FromLong(flag);
1962 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001963#ifdef __VMS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001964 /* socklen_t is unsigned so no negative test is needed,
1965 test buflen == 0 is previously done */
1966 if (buflen > 1024) {
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001967#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001968 if (buflen <= 0 || buflen > 1024) {
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001969#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001970 PyErr_SetString(socket_error,
1971 "getsockopt buflen out of range");
1972 return NULL;
1973 }
1974 buf = PyString_FromStringAndSize((char *)NULL, buflen);
1975 if (buf == NULL)
1976 return NULL;
1977 res = getsockopt(s->sock_fd, level, optname,
1978 (void *)PyString_AS_STRING(buf), &buflen);
1979 if (res < 0) {
1980 Py_DECREF(buf);
1981 return s->errorhandler();
1982 }
1983 _PyString_Resize(&buf, buflen);
1984 return buf;
Guido van Rossumbcc20741998-08-04 22:53:56 +00001985#endif /* __BEOS__ */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001986}
1987
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001988PyDoc_STRVAR(getsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001989"getsockopt(level, option[, buffersize]) -> value\n\
1990\n\
1991Get a socket option. See the Unix manual for level and option.\n\
1992If a nonzero buffersize argument is given, the return value is a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001993string of that length; otherwise it is an integer.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001994
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001995
Fred Drake728819a2000-07-01 03:40:12 +00001996/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001997
Guido van Rossum73624e91994-10-10 17:59:00 +00001998static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001999sock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002000{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002001 sock_addr_t addrbuf;
2002 int addrlen;
2003 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002004
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002005 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2006 return NULL;
2007 Py_BEGIN_ALLOW_THREADS
2008 res = bind(s->sock_fd, SAS2SA(&addrbuf), addrlen);
2009 Py_END_ALLOW_THREADS
2010 if (res < 0)
2011 return s->errorhandler();
2012 Py_INCREF(Py_None);
2013 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002014}
2015
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002016PyDoc_STRVAR(bind_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002017"bind(address)\n\
2018\n\
2019Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00002020pair (host, port); the host must refer to the local host. For raw packet\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002021sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002022
Guido van Rossum30a685f1991-06-27 15:51:29 +00002023
2024/* s.close() method.
2025 Set the file descriptor to -1 so operations tried subsequently
2026 will surely fail. */
2027
Guido van Rossum73624e91994-10-10 17:59:00 +00002028static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002029sock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002030{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002031 SOCKET_T fd;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002032
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002033 if ((fd = s->sock_fd) != -1) {
2034 s->sock_fd = -1;
2035 Py_BEGIN_ALLOW_THREADS
2036 (void) SOCKETCLOSE(fd);
2037 Py_END_ALLOW_THREADS
2038 }
2039 Py_INCREF(Py_None);
2040 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002041}
2042
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002043PyDoc_STRVAR(close_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002044"close()\n\
2045\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002046Close the socket. It cannot be used after this call.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002047
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002048static int
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002049internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen,
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002050 int *timeoutp)
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002051{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002052 int res, timeout;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002053
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002054 timeout = 0;
2055 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002056
2057#ifdef MS_WINDOWS
2058
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002059 if (s->sock_timeout > 0.0) {
2060 if (res < 0 && WSAGetLastError() == WSAEWOULDBLOCK &&
2061 IS_SELECTABLE(s)) {
2062 /* This is a mess. Best solution: trust select */
2063 fd_set fds;
2064 fd_set fds_exc;
2065 struct timeval tv;
2066 tv.tv_sec = (int)s->sock_timeout;
2067 tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6);
2068 FD_ZERO(&fds);
2069 FD_SET(s->sock_fd, &fds);
2070 FD_ZERO(&fds_exc);
2071 FD_SET(s->sock_fd, &fds_exc);
2072 res = select(s->sock_fd+1, NULL, &fds, &fds_exc, &tv);
2073 if (res == 0) {
2074 res = WSAEWOULDBLOCK;
2075 timeout = 1;
2076 } else if (res > 0) {
2077 if (FD_ISSET(s->sock_fd, &fds))
2078 /* The socket is in the writeable set - this
2079 means connected */
2080 res = 0;
2081 else {
2082 /* As per MS docs, we need to call getsockopt()
2083 to get the underlying error */
2084 int res_size = sizeof res;
2085 /* It must be in the exception set */
2086 assert(FD_ISSET(s->sock_fd, &fds_exc));
2087 if (0 == getsockopt(s->sock_fd, SOL_SOCKET, SO_ERROR,
2088 (char *)&res, &res_size))
2089 /* getsockopt also clears WSAGetLastError,
2090 so reset it back. */
2091 WSASetLastError(res);
2092 else
2093 res = WSAGetLastError();
2094 }
2095 }
2096 /* else if (res < 0) an error occurred */
2097 }
2098 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002099
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002100 if (res < 0)
2101 res = WSAGetLastError();
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002102
2103#else
2104
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002105 if (s->sock_timeout > 0.0) {
2106 if (res < 0 && errno == EINPROGRESS && IS_SELECTABLE(s)) {
2107 timeout = internal_select(s, 1);
2108 if (timeout == 0) {
2109 /* Bug #1019808: in case of an EINPROGRESS,
2110 use getsockopt(SO_ERROR) to get the real
2111 error. */
2112 socklen_t res_size = sizeof res;
2113 (void)getsockopt(s->sock_fd, SOL_SOCKET,
2114 SO_ERROR, &res, &res_size);
2115 if (res == EISCONN)
2116 res = 0;
2117 errno = res;
2118 }
2119 else if (timeout == -1) {
2120 res = errno; /* had error */
2121 }
2122 else
2123 res = EWOULDBLOCK; /* timed out */
2124 }
2125 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002126
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002127 if (res < 0)
2128 res = errno;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002129
2130#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002131 *timeoutp = timeout;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002132
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002133 return res;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002134}
Guido van Rossum30a685f1991-06-27 15:51:29 +00002135
Fred Drake728819a2000-07-01 03:40:12 +00002136/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002137
Guido van Rossum73624e91994-10-10 17:59:00 +00002138static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002139sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002140{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002141 sock_addr_t addrbuf;
2142 int addrlen;
2143 int res;
2144 int timeout;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002145
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002146 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2147 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002148
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002149 Py_BEGIN_ALLOW_THREADS
2150 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, &timeout);
2151 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002152
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002153 if (timeout == 1) {
2154 PyErr_SetString(socket_timeout, "timed out");
2155 return NULL;
2156 }
2157 if (res != 0)
2158 return s->errorhandler();
2159 Py_INCREF(Py_None);
2160 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002161}
2162
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002163PyDoc_STRVAR(connect_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002164"connect(address)\n\
2165\n\
2166Connect the socket to a remote address. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002167is a pair (host, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002168
Guido van Rossum30a685f1991-06-27 15:51:29 +00002169
Fred Drake728819a2000-07-01 03:40:12 +00002170/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002171
2172static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002173sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002174{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002175 sock_addr_t addrbuf;
2176 int addrlen;
2177 int res;
2178 int timeout;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002179
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002180 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2181 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002182
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002183 Py_BEGIN_ALLOW_THREADS
2184 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, &timeout);
2185 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002186
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002187 /* Signals are not errors (though they may raise exceptions). Adapted
2188 from PyErr_SetFromErrnoWithFilenameObject(). */
Neal Norwitz9b0ca792006-08-02 06:46:21 +00002189#ifdef EINTR
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002190 if (res == EINTR && PyErr_CheckSignals())
2191 return NULL;
Neal Norwitz9b0ca792006-08-02 06:46:21 +00002192#endif
2193
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002194 return PyInt_FromLong((long) res);
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002195}
2196
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002197PyDoc_STRVAR(connect_ex_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002198"connect_ex(address) -> errno\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002199\n\
2200This is like connect(address), but returns an error code (the errno value)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002201instead of raising an exception when an error occurs.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002202
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002203
Guido van Rossumed233a51992-06-23 09:07:03 +00002204/* s.fileno() method */
2205
Guido van Rossum73624e91994-10-10 17:59:00 +00002206static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002207sock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00002208{
Fred Drakea04eaad2000-06-30 02:46:07 +00002209#if SIZEOF_SOCKET_T <= SIZEOF_LONG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002210 return PyInt_FromLong((long) s->sock_fd);
Fred Drakea04eaad2000-06-30 02:46:07 +00002211#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002212 return PyLong_FromLongLong((PY_LONG_LONG)s->sock_fd);
Fred Drakea04eaad2000-06-30 02:46:07 +00002213#endif
Guido van Rossumed233a51992-06-23 09:07:03 +00002214}
2215
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002216PyDoc_STRVAR(fileno_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002217"fileno() -> integer\n\
2218\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002219Return the integer file descriptor of the socket.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002220
Guido van Rossumed233a51992-06-23 09:07:03 +00002221
Guido van Rossumbe32c891996-06-20 16:25:29 +00002222#ifndef NO_DUP
2223/* s.dup() method */
2224
2225static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002226sock_dup(PySocketSockObject *s)
Guido van Rossumbe32c891996-06-20 16:25:29 +00002227{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002228 SOCKET_T newfd;
2229 PyObject *sock;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002230
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002231 newfd = dup(s->sock_fd);
2232 if (newfd < 0)
2233 return s->errorhandler();
2234 sock = (PyObject *) new_sockobject(newfd,
2235 s->sock_family,
2236 s->sock_type,
2237 s->sock_proto);
2238 if (sock == NULL)
2239 SOCKETCLOSE(newfd);
2240 return sock;
Guido van Rossumbe32c891996-06-20 16:25:29 +00002241}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002242
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002243PyDoc_STRVAR(dup_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002244"dup() -> socket object\n\
2245\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002246Return a new socket object connected to the same system resource.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002247
Guido van Rossumbe32c891996-06-20 16:25:29 +00002248#endif
2249
2250
Guido van Rossumc89705d1992-11-26 08:54:07 +00002251/* s.getsockname() method */
2252
Guido van Rossum73624e91994-10-10 17:59:00 +00002253static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002254sock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002255{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002256 sock_addr_t addrbuf;
2257 int res;
2258 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002259
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002260 if (!getsockaddrlen(s, &addrlen))
2261 return NULL;
2262 memset(&addrbuf, 0, addrlen);
2263 Py_BEGIN_ALLOW_THREADS
2264 res = getsockname(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2265 Py_END_ALLOW_THREADS
2266 if (res < 0)
2267 return s->errorhandler();
2268 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2269 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002270}
2271
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002272PyDoc_STRVAR(getsockname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002273"getsockname() -> address info\n\
2274\n\
2275Return the address of the local endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002276info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002277
Guido van Rossumc89705d1992-11-26 08:54:07 +00002278
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002279#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002280/* s.getpeername() method */
2281
Guido van Rossum73624e91994-10-10 17:59:00 +00002282static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002283sock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002284{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002285 sock_addr_t addrbuf;
2286 int res;
2287 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002288
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002289 if (!getsockaddrlen(s, &addrlen))
2290 return NULL;
2291 memset(&addrbuf, 0, addrlen);
2292 Py_BEGIN_ALLOW_THREADS
2293 res = getpeername(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2294 Py_END_ALLOW_THREADS
2295 if (res < 0)
2296 return s->errorhandler();
2297 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2298 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002299}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002300
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002301PyDoc_STRVAR(getpeername_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002302"getpeername() -> address info\n\
2303\n\
2304Return the address of the remote endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002305info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002306
Guido van Rossumb6775db1994-08-01 11:34:53 +00002307#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002308
2309
Guido van Rossum30a685f1991-06-27 15:51:29 +00002310/* s.listen(n) method */
2311
Guido van Rossum73624e91994-10-10 17:59:00 +00002312static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002313sock_listen(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002314{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002315 int backlog;
2316 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002317
Serhiy Storchaka74f49ab2013-01-19 12:55:39 +02002318 backlog = _PyInt_AsInt(arg);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002319 if (backlog == -1 && PyErr_Occurred())
2320 return NULL;
2321 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou47d1d0d2011-05-10 19:16:03 +02002322 /* To avoid problems on systems that don't allow a negative backlog
2323 * (which doesn't make sense anyway) we force a minimum value of 0. */
2324 if (backlog < 0)
2325 backlog = 0;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002326 res = listen(s->sock_fd, backlog);
2327 Py_END_ALLOW_THREADS
2328 if (res < 0)
2329 return s->errorhandler();
2330 Py_INCREF(Py_None);
2331 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002332}
2333
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002334PyDoc_STRVAR(listen_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002335"listen(backlog)\n\
2336\n\
2337Enable a server to accept connections. The backlog argument must be at\n\
Antoine Pitrou47d1d0d2011-05-10 19:16:03 +02002338least 0 (if it is lower, it is set to 0); it specifies the number of\n\
2339unaccepted connections that the system will allow before refusing new\n\
2340connections.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002341
2342
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002343#ifndef NO_DUP
Guido van Rossum30a685f1991-06-27 15:51:29 +00002344/* s.makefile(mode) method.
2345 Create a new open file object referring to a dupped version of
2346 the socket's file descriptor. (The dup() call is necessary so
2347 that the open file and socket objects may be closed independent
2348 of each other.)
2349 The mode argument specifies 'r' or 'w' passed to fdopen(). */
2350
Guido van Rossum73624e91994-10-10 17:59:00 +00002351static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002352sock_makefile(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002353{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002354 extern int fclose(FILE *);
2355 char *mode = "r";
2356 int bufsize = -1;
Fred Drakea04eaad2000-06-30 02:46:07 +00002357#ifdef MS_WIN32
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002358 Py_intptr_t fd;
Fred Drakea04eaad2000-06-30 02:46:07 +00002359#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002360 int fd;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002361#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002362 FILE *fp;
2363 PyObject *f;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002364#ifdef __VMS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002365 char *mode_r = "r";
2366 char *mode_w = "w";
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002367#endif
Guido van Rossum6b144911995-03-14 15:05:13 +00002368
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002369 if (!PyArg_ParseTuple(args, "|si:makefile", &mode, &bufsize))
2370 return NULL;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002371#ifdef __VMS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002372 if (strcmp(mode,"rb") == 0) {
2373 mode = mode_r;
2374 }
2375 else {
2376 if (strcmp(mode,"wb") == 0) {
2377 mode = mode_w;
2378 }
2379 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002380#endif
Guido van Rossum8d665e61996-06-26 18:22:49 +00002381#ifdef MS_WIN32
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002382 if (((fd = _open_osfhandle(s->sock_fd, _O_BINARY)) < 0) ||
2383 ((fd = dup(fd)) < 0) || ((fp = fdopen(fd, mode)) == NULL))
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00002384#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002385 if ((fd = dup(s->sock_fd)) < 0 || (fp = fdopen(fd, mode)) == NULL)
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00002386#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002387 {
2388 if (fd >= 0)
2389 SOCKETCLOSE(fd);
2390 return s->errorhandler();
2391 }
2392 f = PyFile_FromFile(fp, "<socket>", mode, fclose);
2393 if (f != NULL)
2394 PyFile_SetBufSize(f, bufsize);
2395 return f;
Guido van Rossum30a685f1991-06-27 15:51:29 +00002396}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002397
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002398PyDoc_STRVAR(makefile_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002399"makefile([mode[, buffersize]]) -> file object\n\
2400\n\
2401Return a regular file object corresponding to the socket.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002402The mode and buffersize arguments are as for the built-in open() function.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002403
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002404#endif /* NO_DUP */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002405
Martin Blais2856e5f2006-05-26 12:03:27 +00002406/*
Martin Blaisaf2ae722006-06-04 13:49:49 +00002407 * This is the guts of the recv() and recv_into() methods, which reads into a
Andrew M. Kuchling8d0baae2006-12-19 14:29:04 +00002408 * char buffer. If you have any inc/dec ref to do to the objects that contain
Martin Blais2856e5f2006-05-26 12:03:27 +00002409 * the buffer, do it in the caller. This function returns the number of bytes
Ezio Melottic2077b02011-03-16 12:34:31 +02002410 * successfully read. If there was an error, it returns -1. Note that it is
Martin Blais2856e5f2006-05-26 12:03:27 +00002411 * also possible that we return a number of bytes smaller than the request
2412 * bytes.
2413 */
Martin Blaisaf2ae722006-06-04 13:49:49 +00002414static ssize_t
Martin Blais2856e5f2006-05-26 12:03:27 +00002415sock_recv_guts(PySocketSockObject *s, char* cbuf, int len, int flags)
2416{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002417 ssize_t outlen = -1;
2418 int timeout;
Martin Blais2856e5f2006-05-26 12:03:27 +00002419#ifdef __VMS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002420 int remaining;
2421 char *read_buf;
Martin Blais2856e5f2006-05-26 12:03:27 +00002422#endif
2423
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002424 if (!IS_SELECTABLE(s)) {
2425 select_error();
2426 return -1;
2427 }
Martin Blais2856e5f2006-05-26 12:03:27 +00002428
2429#ifndef __VMS
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002430 BEGIN_SELECT_LOOP(s)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002431 Py_BEGIN_ALLOW_THREADS
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002432 timeout = internal_select_ex(s, 0, interval);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002433 if (!timeout)
2434 outlen = recv(s->sock_fd, cbuf, len, flags);
2435 Py_END_ALLOW_THREADS
Martin Blais2856e5f2006-05-26 12:03:27 +00002436
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002437 if (timeout == 1) {
2438 PyErr_SetString(socket_timeout, "timed out");
2439 return -1;
2440 }
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002441 END_SELECT_LOOP(s)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002442 if (outlen < 0) {
2443 /* Note: the call to errorhandler() ALWAYS indirectly returned
2444 NULL, so ignore its return value */
2445 s->errorhandler();
2446 return -1;
2447 }
Martin Blais2856e5f2006-05-26 12:03:27 +00002448#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002449 read_buf = cbuf;
2450 remaining = len;
2451 while (remaining != 0) {
2452 unsigned int segment;
2453 int nread = -1;
Martin Blais2856e5f2006-05-26 12:03:27 +00002454
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002455 segment = remaining /SEGMENT_SIZE;
2456 if (segment != 0) {
2457 segment = SEGMENT_SIZE;
2458 }
2459 else {
2460 segment = remaining;
2461 }
Martin Blais2856e5f2006-05-26 12:03:27 +00002462
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002463 BEGIN_SELECT_LOOP(s)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002464 Py_BEGIN_ALLOW_THREADS
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002465 timeout = internal_select_ex(s, 0, interval);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002466 if (!timeout)
2467 nread = recv(s->sock_fd, read_buf, segment, flags);
2468 Py_END_ALLOW_THREADS
Martin Blais2856e5f2006-05-26 12:03:27 +00002469
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002470 if (timeout == 1) {
2471 PyErr_SetString(socket_timeout, "timed out");
2472 return -1;
2473 }
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002474 END_SELECT_LOOP(s)
2475
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002476 if (nread < 0) {
2477 s->errorhandler();
2478 return -1;
2479 }
2480 if (nread != remaining) {
2481 read_buf += nread;
2482 break;
2483 }
Martin Blais2856e5f2006-05-26 12:03:27 +00002484
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002485 remaining -= segment;
2486 read_buf += segment;
2487 }
2488 outlen = read_buf - cbuf;
Martin Blais2856e5f2006-05-26 12:03:27 +00002489#endif /* !__VMS */
2490
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002491 return outlen;
Martin Blais2856e5f2006-05-26 12:03:27 +00002492}
2493
Guido van Rossum48a680c2001-03-02 06:34:14 +00002494
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002495/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002496
Guido van Rossum73624e91994-10-10 17:59:00 +00002497static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002498sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002499{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002500 int recvlen, flags = 0;
2501 ssize_t outlen;
2502 PyObject *buf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002503
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002504 if (!PyArg_ParseTuple(args, "i|i:recv", &recvlen, &flags))
2505 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002506
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002507 if (recvlen < 0) {
2508 PyErr_SetString(PyExc_ValueError,
2509 "negative buffersize in recv");
2510 return NULL;
2511 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002512
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002513 /* Allocate a new string. */
2514 buf = PyString_FromStringAndSize((char *) 0, recvlen);
2515 if (buf == NULL)
2516 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002517
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002518 /* Call the guts */
2519 outlen = sock_recv_guts(s, PyString_AS_STRING(buf), recvlen, flags);
2520 if (outlen < 0) {
2521 /* An error occurred, release the string and return an
2522 error. */
2523 Py_DECREF(buf);
2524 return NULL;
2525 }
2526 if (outlen != recvlen) {
2527 /* We did not read as many bytes as we anticipated, resize the
Ezio Melottic2077b02011-03-16 12:34:31 +02002528 string if possible and be successful. */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002529 if (_PyString_Resize(&buf, outlen) < 0)
Ezio Melottic2077b02011-03-16 12:34:31 +02002530 /* Oopsy, not so successful after all. */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002531 return NULL;
2532 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002533
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002534 return buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002535}
2536
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002537PyDoc_STRVAR(recv_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002538"recv(buffersize[, flags]) -> data\n\
2539\n\
2540Receive up to buffersize bytes from the socket. For the optional flags\n\
2541argument, see the Unix manual. When no data is available, block until\n\
2542at least one byte is available or until the remote end is closed. When\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002543the remote end is closed and all data is read, return the empty string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002544
Guido van Rossum30a685f1991-06-27 15:51:29 +00002545
Martin Blaisaf2ae722006-06-04 13:49:49 +00002546/* s.recv_into(buffer, [nbytes [,flags]]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002547
Martin Blais2856e5f2006-05-26 12:03:27 +00002548static PyObject*
Martin Blaisaf2ae722006-06-04 13:49:49 +00002549sock_recv_into(PySocketSockObject *s, PyObject *args, PyObject *kwds)
Martin Blais2856e5f2006-05-26 12:03:27 +00002550{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002551 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Martin Blais2856e5f2006-05-26 12:03:27 +00002552
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002553 int recvlen = 0, flags = 0;
2554 ssize_t readlen;
2555 Py_buffer buf;
2556 Py_ssize_t buflen;
Martin Blais2856e5f2006-05-26 12:03:27 +00002557
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002558 /* Get the buffer's memory */
2559 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ii:recv_into", kwlist,
2560 &buf, &recvlen, &flags))
2561 return NULL;
2562 buflen = buf.len;
2563 assert(buf.buf != 0 && buflen > 0);
Martin Blais2856e5f2006-05-26 12:03:27 +00002564
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002565 if (recvlen < 0) {
2566 PyErr_SetString(PyExc_ValueError,
2567 "negative buffersize in recv_into");
2568 goto error;
2569 }
2570 if (recvlen == 0) {
2571 /* If nbytes was not specified, use the buffer's length */
2572 recvlen = buflen;
2573 }
Martin Blais2856e5f2006-05-26 12:03:27 +00002574
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002575 /* Check if the buffer is large enough */
2576 if (buflen < recvlen) {
2577 PyErr_SetString(PyExc_ValueError,
2578 "buffer too small for requested bytes");
2579 goto error;
2580 }
Martin Blais2856e5f2006-05-26 12:03:27 +00002581
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002582 /* Call the guts */
2583 readlen = sock_recv_guts(s, buf.buf, recvlen, flags);
2584 if (readlen < 0) {
2585 /* Return an error. */
2586 goto error;
2587 }
Martin Blais2856e5f2006-05-26 12:03:27 +00002588
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002589 PyBuffer_Release(&buf);
2590 /* Return the number of bytes read. Note that we do not do anything
2591 special here in the case that readlen < recvlen. */
2592 return PyInt_FromSsize_t(readlen);
Antoine Pitroud7b731d2010-03-17 22:45:39 +00002593
2594error:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002595 PyBuffer_Release(&buf);
2596 return NULL;
Martin Blais2856e5f2006-05-26 12:03:27 +00002597}
2598
Martin Blaisaf2ae722006-06-04 13:49:49 +00002599PyDoc_STRVAR(recv_into_doc,
2600"recv_into(buffer, [nbytes[, flags]]) -> nbytes_read\n\
Martin Blais2856e5f2006-05-26 12:03:27 +00002601\n\
2602A version of recv() that stores its data into a buffer rather than creating \n\
2603a new string. Receive up to buffersize bytes from the socket. If buffersize \n\
2604is not specified (or 0), receive up to the size available in the given buffer.\n\
2605\n\
2606See recv() for documentation about the flags.");
2607
2608
2609/*
Guido van Rossum3c887b22007-12-18 20:10:42 +00002610 * This is the guts of the recvfrom() and recvfrom_into() methods, which reads
2611 * into a char buffer. If you have any inc/def ref to do to the objects that
2612 * contain the buffer, do it in the caller. This function returns the number
Ezio Melottic2077b02011-03-16 12:34:31 +02002613 * of bytes successfully read. If there was an error, it returns -1. Note
Guido van Rossum3c887b22007-12-18 20:10:42 +00002614 * that it is also possible that we return a number of bytes smaller than the
2615 * request bytes.
Martin Blais2856e5f2006-05-26 12:03:27 +00002616 *
2617 * 'addr' is a return value for the address object. Note that you must decref
2618 * it yourself.
2619 */
Martin Blaisaf2ae722006-06-04 13:49:49 +00002620static ssize_t
Martin Blais2856e5f2006-05-26 12:03:27 +00002621sock_recvfrom_guts(PySocketSockObject *s, char* cbuf, int len, int flags,
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002622 PyObject** addr)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002623{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002624 sock_addr_t addrbuf;
2625 int timeout;
2626 ssize_t n = -1;
2627 socklen_t addrlen;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002628
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002629 *addr = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002630
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002631 if (!getsockaddrlen(s, &addrlen))
2632 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002633
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002634 if (!IS_SELECTABLE(s)) {
2635 select_error();
2636 return -1;
2637 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00002638
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002639 BEGIN_SELECT_LOOP(s)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002640 Py_BEGIN_ALLOW_THREADS
2641 memset(&addrbuf, 0, addrlen);
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002642 timeout = internal_select_ex(s, 0, interval);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002643 if (!timeout) {
Guido van Rossum8d665e61996-06-26 18:22:49 +00002644#ifndef MS_WINDOWS
Andrew MacIntyreba43e872002-03-03 03:03:52 +00002645#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002646 n = recvfrom(s->sock_fd, cbuf, len, flags,
2647 SAS2SA(&addrbuf), &addrlen);
Guido van Rossum32c575d1997-12-02 20:37:32 +00002648#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002649 n = recvfrom(s->sock_fd, cbuf, len, flags,
2650 (void *) &addrbuf, &addrlen);
Guido van Rossum32c575d1997-12-02 20:37:32 +00002651#endif
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002652#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002653 n = recvfrom(s->sock_fd, cbuf, len, flags,
2654 SAS2SA(&addrbuf), &addrlen);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002655#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002656 }
2657 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002658
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002659 if (timeout == 1) {
2660 PyErr_SetString(socket_timeout, "timed out");
2661 return -1;
2662 }
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002663 END_SELECT_LOOP(s)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002664 if (n < 0) {
2665 s->errorhandler();
2666 return -1;
2667 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002668
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002669 if (!(*addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
2670 addrlen, s->sock_proto)))
2671 return -1;
Martin Blais2856e5f2006-05-26 12:03:27 +00002672
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002673 return n;
Martin Blais2856e5f2006-05-26 12:03:27 +00002674}
2675
2676/* s.recvfrom(nbytes [,flags]) method */
2677
2678static PyObject *
2679sock_recvfrom(PySocketSockObject *s, PyObject *args)
2680{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002681 PyObject *buf = NULL;
2682 PyObject *addr = NULL;
2683 PyObject *ret = NULL;
2684 int recvlen, flags = 0;
2685 ssize_t outlen;
Martin Blais2856e5f2006-05-26 12:03:27 +00002686
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002687 if (!PyArg_ParseTuple(args, "i|i:recvfrom", &recvlen, &flags))
2688 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002689
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002690 if (recvlen < 0) {
2691 PyErr_SetString(PyExc_ValueError,
2692 "negative buffersize in recvfrom");
2693 return NULL;
2694 }
Facundo Batista1fe9f962007-03-28 03:45:20 +00002695
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002696 buf = PyString_FromStringAndSize((char *) 0, recvlen);
2697 if (buf == NULL)
2698 return NULL;
Martin Blais2856e5f2006-05-26 12:03:27 +00002699
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002700 outlen = sock_recvfrom_guts(s, PyString_AS_STRING(buf),
2701 recvlen, flags, &addr);
2702 if (outlen < 0) {
2703 goto finally;
2704 }
Martin Blais2856e5f2006-05-26 12:03:27 +00002705
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002706 if (outlen != recvlen) {
2707 /* We did not read as many bytes as we anticipated, resize the
Ezio Melottic2077b02011-03-16 12:34:31 +02002708 string if possible and be successful. */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002709 if (_PyString_Resize(&buf, outlen) < 0)
Ezio Melottic2077b02011-03-16 12:34:31 +02002710 /* Oopsy, not so successful after all. */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002711 goto finally;
2712 }
Barry Warsaw752300b1997-01-03 17:18:10 +00002713
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002714 ret = PyTuple_Pack(2, buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002715
2716finally:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002717 Py_XDECREF(buf);
2718 Py_XDECREF(addr);
2719 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002720}
2721
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002722PyDoc_STRVAR(recvfrom_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002723"recvfrom(buffersize[, flags]) -> (data, address info)\n\
2724\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002725Like recv(buffersize, flags) but also return the sender's address info.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002726
Martin Blais2856e5f2006-05-26 12:03:27 +00002727
Martin Blaisaf2ae722006-06-04 13:49:49 +00002728/* s.recvfrom_into(buffer[, nbytes [,flags]]) method */
Martin Blais2856e5f2006-05-26 12:03:27 +00002729
2730static PyObject *
Martin Blaisaf2ae722006-06-04 13:49:49 +00002731sock_recvfrom_into(PySocketSockObject *s, PyObject *args, PyObject* kwds)
Martin Blais2856e5f2006-05-26 12:03:27 +00002732{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002733 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Martin Blais2856e5f2006-05-26 12:03:27 +00002734
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002735 int recvlen = 0, flags = 0;
2736 ssize_t readlen;
2737 Py_buffer buf;
2738 int buflen;
Martin Blais2856e5f2006-05-26 12:03:27 +00002739
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002740 PyObject *addr = NULL;
Martin Blais2856e5f2006-05-26 12:03:27 +00002741
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002742 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ii:recvfrom_into",
2743 kwlist, &buf,
2744 &recvlen, &flags))
2745 return NULL;
2746 buflen = buf.len;
Martin Blais2856e5f2006-05-26 12:03:27 +00002747
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002748 if (recvlen < 0) {
2749 PyErr_SetString(PyExc_ValueError,
2750 "negative buffersize in recvfrom_into");
2751 goto error;
2752 }
2753 if (recvlen == 0) {
2754 /* If nbytes was not specified, use the buffer's length */
2755 recvlen = buflen;
Benjamin Peterson28cf3682014-01-13 22:59:38 -05002756 } else if (recvlen > buflen) {
2757 PyErr_SetString(PyExc_ValueError,
2758 "nbytes is greater than the length of the buffer");
2759 goto error;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002760 }
Martin Blais2856e5f2006-05-26 12:03:27 +00002761
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002762 readlen = sock_recvfrom_guts(s, buf.buf, recvlen, flags, &addr);
2763 if (readlen < 0) {
2764 /* Return an error */
2765 goto error;
2766 }
Martin Blais2856e5f2006-05-26 12:03:27 +00002767
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002768 PyBuffer_Release(&buf);
2769 /* Return the number of bytes read and the address. Note that we do
2770 not do anything special here in the case that readlen < recvlen. */
2771 return Py_BuildValue("lN", readlen, addr);
Antoine Pitroud7b731d2010-03-17 22:45:39 +00002772
2773error:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002774 Py_XDECREF(addr);
2775 PyBuffer_Release(&buf);
2776 return NULL;
Martin Blais2856e5f2006-05-26 12:03:27 +00002777}
2778
Martin Blaisaf2ae722006-06-04 13:49:49 +00002779PyDoc_STRVAR(recvfrom_into_doc,
2780"recvfrom_into(buffer[, nbytes[, flags]]) -> (nbytes, address info)\n\
Martin Blais2856e5f2006-05-26 12:03:27 +00002781\n\
Martin Blaisaf2ae722006-06-04 13:49:49 +00002782Like recv_into(buffer[, nbytes[, flags]]) but also return the sender's address info.");
Martin Blais2856e5f2006-05-26 12:03:27 +00002783
2784
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002785/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002786
Guido van Rossum73624e91994-10-10 17:59:00 +00002787static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002788sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002789{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002790 char *buf;
2791 int len, n = -1, flags = 0, timeout;
2792 Py_buffer pbuf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002793
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002794 if (!PyArg_ParseTuple(args, "s*|i:send", &pbuf, &flags))
2795 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002796
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002797 if (!IS_SELECTABLE(s)) {
2798 PyBuffer_Release(&pbuf);
2799 return select_error();
2800 }
2801 buf = pbuf.buf;
2802 len = pbuf.len;
Neal Norwitz082b2df2006-02-07 07:04:46 +00002803
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002804 BEGIN_SELECT_LOOP(s)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002805 Py_BEGIN_ALLOW_THREADS
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002806 timeout = internal_select_ex(s, 1, interval);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002807 if (!timeout)
Neal Norwitz2a30cd02006-07-10 01:18:57 +00002808#ifdef __VMS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002809 n = sendsegmented(s->sock_fd, buf, len, flags);
Neal Norwitz2a30cd02006-07-10 01:18:57 +00002810#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002811 n = send(s->sock_fd, buf, len, flags);
Neal Norwitz2a30cd02006-07-10 01:18:57 +00002812#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002813 Py_END_ALLOW_THREADS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002814 if (timeout == 1) {
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002815 PyBuffer_Release(&pbuf);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002816 PyErr_SetString(socket_timeout, "timed out");
2817 return NULL;
2818 }
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002819 END_SELECT_LOOP(s)
2820
2821 PyBuffer_Release(&pbuf);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002822 if (n < 0)
2823 return s->errorhandler();
2824 return PyInt_FromLong((long)n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00002825}
2826
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002827PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002828"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002829\n\
2830Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002831argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002832sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002833
2834
2835/* s.sendall(data [,flags]) method */
2836
2837static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002838sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002839{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002840 char *buf;
Antoine Pitrou66b5df62010-09-27 18:16:46 +00002841 int len, n = -1, flags = 0, timeout, saved_errno;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002842 Py_buffer pbuf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002843
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002844 if (!PyArg_ParseTuple(args, "s*|i:sendall", &pbuf, &flags))
2845 return NULL;
2846 buf = pbuf.buf;
2847 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002848
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002849 if (!IS_SELECTABLE(s)) {
2850 PyBuffer_Release(&pbuf);
2851 return select_error();
2852 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00002853
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002854 do {
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002855 BEGIN_SELECT_LOOP(s)
Antoine Pitrou66b5df62010-09-27 18:16:46 +00002856 Py_BEGIN_ALLOW_THREADS
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002857 timeout = internal_select_ex(s, 1, interval);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002858 n = -1;
Antoine Pitrou66b5df62010-09-27 18:16:46 +00002859 if (!timeout) {
Neal Norwitz2a30cd02006-07-10 01:18:57 +00002860#ifdef __VMS
Antoine Pitrou66b5df62010-09-27 18:16:46 +00002861 n = sendsegmented(s->sock_fd, buf, len, flags);
Neal Norwitz2a30cd02006-07-10 01:18:57 +00002862#else
Antoine Pitrou66b5df62010-09-27 18:16:46 +00002863 n = send(s->sock_fd, buf, len, flags);
Neal Norwitz2a30cd02006-07-10 01:18:57 +00002864#endif
Antoine Pitrou66b5df62010-09-27 18:16:46 +00002865 }
2866 Py_END_ALLOW_THREADS
2867 if (timeout == 1) {
2868 PyBuffer_Release(&pbuf);
2869 PyErr_SetString(socket_timeout, "timed out");
2870 return NULL;
2871 }
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002872 END_SELECT_LOOP(s)
Antoine Pitrou66b5df62010-09-27 18:16:46 +00002873 /* PyErr_CheckSignals() might change errno */
2874 saved_errno = errno;
2875 /* We must run our signal handlers before looping again.
2876 send() can return a successful partial write when it is
2877 interrupted, so we can't restrict ourselves to EINTR. */
2878 if (PyErr_CheckSignals()) {
2879 PyBuffer_Release(&pbuf);
2880 return NULL;
2881 }
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002882 if (n < 0) {
Antoine Pitrou66b5df62010-09-27 18:16:46 +00002883 /* If interrupted, try again */
2884 if (saved_errno == EINTR)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002885 continue;
Antoine Pitrou66b5df62010-09-27 18:16:46 +00002886 else
2887 break;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002888 }
2889 buf += n;
2890 len -= n;
2891 } while (len > 0);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002892 PyBuffer_Release(&pbuf);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002893
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002894 if (n < 0)
2895 return s->errorhandler();
Guido van Rossum67f7a382002-06-06 21:08:16 +00002896
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002897 Py_INCREF(Py_None);
2898 return Py_None;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002899}
2900
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002901PyDoc_STRVAR(sendall_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002902"sendall(data[, flags])\n\
2903\n\
2904Send a data string to the socket. For the optional flags\n\
2905argument, see the Unix manual. This calls send() repeatedly\n\
2906until all data is sent. If an error occurs, it's impossible\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002907to tell how much data has been sent.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002908
Guido van Rossum30a685f1991-06-27 15:51:29 +00002909
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002910/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002911
Guido van Rossum73624e91994-10-10 17:59:00 +00002912static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002913sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002914{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002915 Py_buffer pbuf;
2916 PyObject *addro;
2917 char *buf;
2918 Py_ssize_t len;
2919 sock_addr_t addrbuf;
Victor Stinner31c7e4f2015-04-02 17:19:17 +02002920 int addrlen, flags, timeout;
2921 long n = -1;
Ezio Melotti0639be62011-05-07 19:21:22 +03002922 int arglen;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002923
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002924 flags = 0;
Ezio Melotti0639be62011-05-07 19:21:22 +03002925 arglen = PyTuple_Size(args);
2926 switch(arglen) {
2927 case 2:
2928 PyArg_ParseTuple(args, "s*O:sendto", &pbuf, &addro);
2929 break;
2930 case 3:
2931 PyArg_ParseTuple(args, "s*iO:sendto", &pbuf, &flags, &addro);
2932 break;
2933 default:
2934 PyErr_Format(PyExc_TypeError, "sendto() takes 2 or 3"
2935 " arguments (%d given)", arglen);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002936 }
Ezio Melotti0639be62011-05-07 19:21:22 +03002937 if (PyErr_Occurred())
2938 return NULL;
2939
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002940 buf = pbuf.buf;
2941 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002942
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002943 if (!IS_SELECTABLE(s)) {
2944 PyBuffer_Release(&pbuf);
2945 return select_error();
2946 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00002947
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002948 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen)) {
2949 PyBuffer_Release(&pbuf);
2950 return NULL;
2951 }
Martin v. Löwis046c4d12006-12-03 11:23:45 +00002952
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002953 BEGIN_SELECT_LOOP(s)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002954 Py_BEGIN_ALLOW_THREADS
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002955 timeout = internal_select_ex(s, 1, interval);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002956 if (!timeout)
2957 n = sendto(s->sock_fd, buf, len, flags, SAS2SA(&addrbuf), addrlen);
2958 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002959
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002960 if (timeout == 1) {
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002961 PyBuffer_Release(&pbuf);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002962 PyErr_SetString(socket_timeout, "timed out");
2963 return NULL;
2964 }
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002965 END_SELECT_LOOP(s)
2966 PyBuffer_Release(&pbuf);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002967 if (n < 0)
2968 return s->errorhandler();
2969 return PyInt_FromLong((long)n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002970}
2971
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002972PyDoc_STRVAR(sendto_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002973"sendto(data[, flags], address) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002974\n\
2975Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002976For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002977
Guido van Rossum30a685f1991-06-27 15:51:29 +00002978
2979/* s.shutdown(how) method */
2980
Guido van Rossum73624e91994-10-10 17:59:00 +00002981static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002982sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002983{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002984 int how;
2985 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002986
Serhiy Storchaka74f49ab2013-01-19 12:55:39 +02002987 how = _PyInt_AsInt(arg);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002988 if (how == -1 && PyErr_Occurred())
2989 return NULL;
2990 Py_BEGIN_ALLOW_THREADS
2991 res = shutdown(s->sock_fd, how);
2992 Py_END_ALLOW_THREADS
2993 if (res < 0)
2994 return s->errorhandler();
2995 Py_INCREF(Py_None);
2996 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002997}
2998
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002999PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003000"shutdown(flag)\n\
3001\n\
Martin v. Löwis94681fc2003-11-27 19:40:22 +00003002Shut down the reading side of the socket (flag == SHUT_RD), the writing side\n\
3003of the socket (flag == SHUT_WR), or both ends (flag == SHUT_RDWR).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003004
Amaury Forgeot d'Arca4dd2e22008-06-13 00:42:22 +00003005#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Christian Heimes04ae9162008-01-04 15:23:30 +00003006static PyObject*
3007sock_ioctl(PySocketSockObject *s, PyObject *arg)
3008{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003009 unsigned long cmd = SIO_RCVALL;
3010 PyObject *argO;
3011 DWORD recv;
Christian Heimes04ae9162008-01-04 15:23:30 +00003012
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003013 if (!PyArg_ParseTuple(arg, "kO:ioctl", &cmd, &argO))
3014 return NULL;
Christian Heimes04ae9162008-01-04 15:23:30 +00003015
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003016 switch (cmd) {
3017 case SIO_RCVALL: {
3018 unsigned int option = RCVALL_ON;
3019 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
3020 return NULL;
3021 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
3022 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
3023 return set_error();
3024 }
3025 return PyLong_FromUnsignedLong(recv); }
3026 case SIO_KEEPALIVE_VALS: {
3027 struct tcp_keepalive ka;
3028 if (!PyArg_ParseTuple(arg, "k(kkk):ioctl", &cmd,
3029 &ka.onoff, &ka.keepalivetime, &ka.keepaliveinterval))
3030 return NULL;
3031 if (WSAIoctl(s->sock_fd, cmd, &ka, sizeof(ka),
3032 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
3033 return set_error();
3034 }
3035 return PyLong_FromUnsignedLong(recv); }
3036 default:
3037 PyErr_Format(PyExc_ValueError, "invalid ioctl command %d", cmd);
3038 return NULL;
3039 }
Christian Heimes04ae9162008-01-04 15:23:30 +00003040}
3041PyDoc_STRVAR(sock_ioctl_doc,
3042"ioctl(cmd, option) -> long\n\
3043\n\
Kristján Valur Jónsson2fcd03b2009-09-25 15:19:51 +00003044Control the socket with WSAIoctl syscall. Currently supported 'cmd' values are\n\
3045SIO_RCVALL: 'option' must be one of the socket.RCVALL_* constants.\n\
3046SIO_KEEPALIVE_VALS: 'option' is a tuple of (onoff, timeout, interval).");
Christian Heimes04ae9162008-01-04 15:23:30 +00003047
3048#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00003049
3050/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003051
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003052static PyMethodDef sock_methods[] = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003053 {"accept", (PyCFunction)sock_accept, METH_NOARGS,
3054 accept_doc},
3055 {"bind", (PyCFunction)sock_bind, METH_O,
3056 bind_doc},
3057 {"close", (PyCFunction)sock_close, METH_NOARGS,
3058 close_doc},
3059 {"connect", (PyCFunction)sock_connect, METH_O,
3060 connect_doc},
3061 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
3062 connect_ex_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00003063#ifndef NO_DUP
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003064 {"dup", (PyCFunction)sock_dup, METH_NOARGS,
3065 dup_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00003066#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003067 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
3068 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00003069#ifdef HAVE_GETPEERNAME
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003070 {"getpeername", (PyCFunction)sock_getpeername,
3071 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00003072#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003073 {"getsockname", (PyCFunction)sock_getsockname,
3074 METH_NOARGS, getsockname_doc},
3075 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
3076 getsockopt_doc},
Amaury Forgeot d'Arca4dd2e22008-06-13 00:42:22 +00003077#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003078 {"ioctl", (PyCFunction)sock_ioctl, METH_VARARGS,
3079 sock_ioctl_doc},
Christian Heimes04ae9162008-01-04 15:23:30 +00003080#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003081 {"listen", (PyCFunction)sock_listen, METH_O,
3082 listen_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00003083#ifndef NO_DUP
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003084 {"makefile", (PyCFunction)sock_makefile, METH_VARARGS,
3085 makefile_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00003086#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003087 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
3088 recv_doc},
3089 {"recv_into", (PyCFunction)sock_recv_into, METH_VARARGS | METH_KEYWORDS,
3090 recv_into_doc},
3091 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
3092 recvfrom_doc},
3093 {"recvfrom_into", (PyCFunction)sock_recvfrom_into, METH_VARARGS | METH_KEYWORDS,
3094 recvfrom_into_doc},
3095 {"send", (PyCFunction)sock_send, METH_VARARGS,
3096 send_doc},
3097 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
3098 sendall_doc},
3099 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
3100 sendto_doc},
3101 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
3102 setblocking_doc},
3103 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
3104 settimeout_doc},
3105 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
3106 gettimeout_doc},
3107 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
3108 setsockopt_doc},
3109 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
3110 shutdown_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00003111#ifdef RISCOS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003112 {"sleeptaskw", (PyCFunction)sock_sleeptaskw, METH_O,
3113 sleeptaskw_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00003114#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003115 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003116};
3117
Georg Brandlbc45a3f2006-03-17 19:17:34 +00003118/* SockObject members */
3119static PyMemberDef sock_memberlist[] = {
3120 {"family", T_INT, offsetof(PySocketSockObject, sock_family), READONLY, "the socket family"},
3121 {"type", T_INT, offsetof(PySocketSockObject, sock_type), READONLY, "the socket type"},
3122 {"proto", T_INT, offsetof(PySocketSockObject, sock_proto), READONLY, "the socket protocol"},
3123 {"timeout", T_DOUBLE, offsetof(PySocketSockObject, sock_timeout), READONLY, "the socket timeout"},
3124 {0},
3125};
Guido van Rossum30a685f1991-06-27 15:51:29 +00003126
Guido van Rossum73624e91994-10-10 17:59:00 +00003127/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00003128 First close the file description. */
3129
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003130static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003131sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003132{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003133 if (s->sock_fd != -1)
3134 (void) SOCKETCLOSE(s->sock_fd);
Benjamin Peterson3d1f2d32014-10-06 14:38:20 -04003135 if (s->weakreflist != NULL)
3136 PyObject_ClearWeakRefs((PyObject *)s);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003137 Py_TYPE(s)->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003138}
3139
Guido van Rossum30a685f1991-06-27 15:51:29 +00003140
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003141static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003142sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003143{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003144 char buf[512];
Victor Stinner0a649c72014-07-26 14:52:55 +02003145 long sock_fd;
3146 /* On Windows, this test is needed because SOCKET_T is unsigned */
3147 if (s->sock_fd == INVALID_SOCKET) {
3148 sock_fd = -1;
3149 }
Fred Drakea04eaad2000-06-30 02:46:07 +00003150#if SIZEOF_SOCKET_T > SIZEOF_LONG
Victor Stinner0a649c72014-07-26 14:52:55 +02003151 else if (s->sock_fd > LONG_MAX) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003152 /* this can occur on Win64, and actually there is a special
3153 ugly printf formatter for decimal pointer length integer
3154 printing, only bother if necessary*/
3155 PyErr_SetString(PyExc_OverflowError,
3156 "no printf formatter to display "
3157 "the socket descriptor in decimal");
3158 return NULL;
3159 }
Fred Drakea04eaad2000-06-30 02:46:07 +00003160#endif
Victor Stinner0a649c72014-07-26 14:52:55 +02003161 else
3162 sock_fd = (long)s->sock_fd;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003163 PyOS_snprintf(
3164 buf, sizeof(buf),
3165 "<socket object, fd=%ld, family=%d, type=%d, protocol=%d>",
Victor Stinner0a649c72014-07-26 14:52:55 +02003166 sock_fd, s->sock_family,
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003167 s->sock_type,
3168 s->sock_proto);
3169 return PyString_FromString(buf);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003170}
3171
3172
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003173/* Create a new, uninitialized socket object. */
3174
3175static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003176sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003177{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003178 PyObject *new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003179
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003180 new = type->tp_alloc(type, 0);
3181 if (new != NULL) {
3182 ((PySocketSockObject *)new)->sock_fd = -1;
3183 ((PySocketSockObject *)new)->sock_timeout = -1.0;
3184 ((PySocketSockObject *)new)->errorhandler = &set_error;
Benjamin Peterson3d1f2d32014-10-06 14:38:20 -04003185 ((PySocketSockObject *)new)->weakreflist = NULL;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003186 }
3187 return new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003188}
3189
3190
3191/* Initialize a new socket object. */
3192
3193/*ARGSUSED*/
3194static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00003195sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003196{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003197 PySocketSockObject *s = (PySocketSockObject *)self;
3198 SOCKET_T fd;
3199 int family = AF_INET, type = SOCK_STREAM, proto = 0;
3200 static char *keywords[] = {"family", "type", "proto", 0};
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003201
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003202 if (!PyArg_ParseTupleAndKeywords(args, kwds,
3203 "|iii:socket", keywords,
3204 &family, &type, &proto))
3205 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003206
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003207 Py_BEGIN_ALLOW_THREADS
3208 fd = socket(family, type, proto);
3209 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00003210
Victor Stinner465db3c2014-07-26 14:47:56 +02003211 if (fd == INVALID_SOCKET) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003212 set_error();
3213 return -1;
3214 }
3215 init_sockobject(s, fd, family, type, proto);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003216
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003217 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003218
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003219}
3220
3221
Guido van Rossumb6775db1994-08-01 11:34:53 +00003222/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003223
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003224static PyTypeObject sock_type = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003225 PyVarObject_HEAD_INIT(0, 0) /* Must fill in type value later */
3226 "_socket.socket", /* tp_name */
3227 sizeof(PySocketSockObject), /* tp_basicsize */
3228 0, /* tp_itemsize */
3229 (destructor)sock_dealloc, /* tp_dealloc */
3230 0, /* tp_print */
3231 0, /* tp_getattr */
3232 0, /* tp_setattr */
3233 0, /* tp_compare */
3234 (reprfunc)sock_repr, /* tp_repr */
3235 0, /* tp_as_number */
3236 0, /* tp_as_sequence */
3237 0, /* tp_as_mapping */
3238 0, /* tp_hash */
3239 0, /* tp_call */
3240 0, /* tp_str */
3241 PyObject_GenericGetAttr, /* tp_getattro */
3242 0, /* tp_setattro */
3243 0, /* tp_as_buffer */
3244 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
3245 sock_doc, /* tp_doc */
3246 0, /* tp_traverse */
3247 0, /* tp_clear */
3248 0, /* tp_richcompare */
Benjamin Peterson3d1f2d32014-10-06 14:38:20 -04003249 offsetof(PySocketSockObject, weakreflist), /* tp_weaklistoffset */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003250 0, /* tp_iter */
3251 0, /* tp_iternext */
3252 sock_methods, /* tp_methods */
3253 sock_memberlist, /* tp_members */
3254 0, /* tp_getset */
3255 0, /* tp_base */
3256 0, /* tp_dict */
3257 0, /* tp_descr_get */
3258 0, /* tp_descr_set */
3259 0, /* tp_dictoffset */
3260 sock_initobj, /* tp_init */
3261 PyType_GenericAlloc, /* tp_alloc */
3262 sock_new, /* tp_new */
3263 PyObject_Del, /* tp_free */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003264};
3265
Guido van Rossum30a685f1991-06-27 15:51:29 +00003266
Guido van Rossum81194471991-07-27 21:42:02 +00003267/* Python interface to gethostname(). */
3268
3269/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00003270static PyObject *
Georg Brandl96a8c392006-05-29 21:04:52 +00003271socket_gethostname(PyObject *self, PyObject *unused)
Guido van Rossum81194471991-07-27 21:42:02 +00003272{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003273 char buf[1024];
3274 int res;
3275 Py_BEGIN_ALLOW_THREADS
3276 res = gethostname(buf, (int) sizeof buf - 1);
3277 Py_END_ALLOW_THREADS
3278 if (res < 0)
3279 return set_error();
3280 buf[sizeof buf - 1] = '\0';
3281 return PyString_FromString(buf);
Guido van Rossum81194471991-07-27 21:42:02 +00003282}
Guido van Rossumff4949e1992-08-05 19:58:53 +00003283
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003284PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003285"gethostname() -> string\n\
3286\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003287Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003288
Guido van Rossumff4949e1992-08-05 19:58:53 +00003289
Guido van Rossum30a685f1991-06-27 15:51:29 +00003290/* Python interface to gethostbyname(name). */
3291
3292/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00003293static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003294socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003295{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003296 char *name;
3297 sock_addr_t addrbuf;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003298
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003299 if (!PyArg_ParseTuple(args, "s:gethostbyname", &name))
3300 return NULL;
3301 if (setipaddr(name, SAS2SA(&addrbuf), sizeof(addrbuf), AF_INET) < 0)
3302 return NULL;
3303 return makeipaddr(SAS2SA(&addrbuf), sizeof(struct sockaddr_in));
Guido van Rossum30a685f1991-06-27 15:51:29 +00003304}
3305
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003306PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003307"gethostbyname(host) -> address\n\
3308\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003309Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003310
3311
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003312/* Convenience function common to gethostbyname_ex and gethostbyaddr */
3313
3314static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003315gethost_common(struct hostent *h, struct sockaddr *addr, int alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003316{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003317 char **pch;
3318 PyObject *rtn_tuple = (PyObject *)NULL;
3319 PyObject *name_list = (PyObject *)NULL;
3320 PyObject *addr_list = (PyObject *)NULL;
3321 PyObject *tmp;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003322
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003323 if (h == NULL) {
3324 /* Let's get real error message to return */
Guido van Rossume2ae77b2001-10-24 20:42:55 +00003325#ifndef RISCOS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003326 set_herror(h_errno);
Guido van Rossume2ae77b2001-10-24 20:42:55 +00003327#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003328 PyErr_SetString(socket_error, "host not found");
Guido van Rossume2ae77b2001-10-24 20:42:55 +00003329#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003330 return NULL;
3331 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003332
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003333 if (h->h_addrtype != af) {
3334 /* Let's get real error message to return */
3335 PyErr_SetString(socket_error,
3336 (char *)strerror(EAFNOSUPPORT));
Brett Cannon10ed0f52008-03-18 15:35:58 +00003337
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003338 return NULL;
3339 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003340
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003341 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00003342
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003343 case AF_INET:
3344 if (alen < sizeof(struct sockaddr_in))
3345 return NULL;
3346 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003347
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00003348#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003349 case AF_INET6:
3350 if (alen < sizeof(struct sockaddr_in6))
3351 return NULL;
3352 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003353#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00003354
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003355 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003356
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003357 if ((name_list = PyList_New(0)) == NULL)
3358 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003359
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003360 if ((addr_list = PyList_New(0)) == NULL)
3361 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003362
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003363 /* SF #1511317: h_aliases can be NULL */
3364 if (h->h_aliases) {
3365 for (pch = h->h_aliases; *pch != NULL; pch++) {
3366 int status;
3367 tmp = PyString_FromString(*pch);
3368 if (tmp == NULL)
3369 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003370
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003371 status = PyList_Append(name_list, tmp);
3372 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003373
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003374 if (status)
3375 goto err;
3376 }
3377 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003378
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003379 for (pch = h->h_addr_list; *pch != NULL; pch++) {
3380 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003381
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003382 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00003383
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003384 case AF_INET:
3385 {
3386 struct sockaddr_in sin;
3387 memset(&sin, 0, sizeof(sin));
3388 sin.sin_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 sin.sin_len = sizeof(sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003391#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003392 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
3393 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
Guido van Rossum67f7a382002-06-06 21:08:16 +00003394
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003395 if (pch == h->h_addr_list && alen >= sizeof(sin))
3396 memcpy((char *) addr, &sin, sizeof(sin));
3397 break;
3398 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003399
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00003400#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003401 case AF_INET6:
3402 {
3403 struct sockaddr_in6 sin6;
3404 memset(&sin6, 0, sizeof(sin6));
3405 sin6.sin6_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003406#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003407 sin6.sin6_len = sizeof(sin6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003408#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003409 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
3410 tmp = makeipaddr((struct sockaddr *)&sin6,
3411 sizeof(sin6));
Guido van Rossum67f7a382002-06-06 21:08:16 +00003412
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003413 if (pch == h->h_addr_list && alen >= sizeof(sin6))
3414 memcpy((char *) addr, &sin6, sizeof(sin6));
3415 break;
3416 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003417#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00003418
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003419 default: /* can't happen */
3420 PyErr_SetString(socket_error,
3421 "unsupported address family");
3422 return NULL;
3423 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003424
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003425 if (tmp == NULL)
3426 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003427
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003428 status = PyList_Append(addr_list, tmp);
3429 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003430
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003431 if (status)
3432 goto err;
3433 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003434
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003435 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003436
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003437 err:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003438 Py_XDECREF(name_list);
3439 Py_XDECREF(addr_list);
3440 return rtn_tuple;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003441}
3442
3443
3444/* Python interface to gethostbyname_ex(name). */
3445
3446/*ARGSUSED*/
3447static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003448socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003449{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003450 char *name;
3451 struct hostent *h;
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00003452#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003453 struct sockaddr_storage addr;
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00003454#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003455 struct sockaddr_in addr;
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00003456#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003457 struct sockaddr *sa;
3458 PyObject *ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003459#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003460 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003461#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003462 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003463#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003464 char buf[16384];
3465 int buf_len = (sizeof buf) - 1;
3466 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003467#endif
3468#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003469 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00003470#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003471#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003472
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003473 if (!PyArg_ParseTuple(args, "s:gethostbyname_ex", &name))
3474 return NULL;
3475 if (setipaddr(name, (struct sockaddr *)&addr, sizeof(addr), AF_INET) < 0)
3476 return NULL;
3477 Py_BEGIN_ALLOW_THREADS
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003478#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003479#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003480 result = gethostbyname_r(name, &hp_allocated, buf, buf_len,
3481 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003482#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003483 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003484#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003485 memset((void *) &data, '\0', sizeof(data));
3486 result = gethostbyname_r(name, &hp_allocated, &data);
3487 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00003488#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003489#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00003490#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003491 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003492#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003493 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003494#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003495 Py_END_ALLOW_THREADS
3496 /* Some C libraries would require addr.__ss_family instead of
3497 addr.ss_family.
3498 Therefore, we cast the sockaddr_storage into sockaddr to
3499 access sa_family. */
3500 sa = (struct sockaddr*)&addr;
3501 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr),
3502 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00003503#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003504 PyThread_release_lock(netdb_lock);
Guido van Rossum955becc1999-03-22 20:14:53 +00003505#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003506 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003507}
3508
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003509PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003510"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
3511\n\
3512Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003513for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003514
3515
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003516/* Python interface to gethostbyaddr(IP). */
3517
3518/*ARGSUSED*/
3519static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003520socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003521{
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00003522#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003523 struct sockaddr_storage addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003524#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003525 struct sockaddr_in addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003526#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003527 struct sockaddr *sa = (struct sockaddr *)&addr;
3528 char *ip_num;
3529 struct hostent *h;
3530 PyObject *ret;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003531#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003532 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003533#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003534 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003535#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003536 /* glibcs up to 2.10 assume that the buf argument to
3537 gethostbyaddr_r is 8-byte aligned, which at least llvm-gcc
3538 does not ensure. The attribute below instructs the compiler
3539 to maintain this alignment. */
3540 char buf[16384] Py_ALIGNED(8);
3541 int buf_len = (sizeof buf) - 1;
3542 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003543#endif
3544#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003545 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00003546#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003547#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003548 char *ap;
3549 int al;
3550 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003551
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003552 if (!PyArg_ParseTuple(args, "s:gethostbyaddr", &ip_num))
3553 return NULL;
3554 af = AF_UNSPEC;
3555 if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
3556 return NULL;
3557 af = sa->sa_family;
3558 ap = NULL;
3559 switch (af) {
3560 case AF_INET:
3561 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
3562 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
3563 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00003564#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003565 case AF_INET6:
3566 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
3567 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
3568 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003569#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003570 default:
3571 PyErr_SetString(socket_error, "unsupported address family");
3572 return NULL;
3573 }
3574 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003575#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003576#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003577 result = gethostbyaddr_r(ap, al, af,
3578 &hp_allocated, buf, buf_len,
3579 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003580#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003581 h = gethostbyaddr_r(ap, al, af,
3582 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003583#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003584 memset((void *) &data, '\0', sizeof(data));
3585 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
3586 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00003587#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003588#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00003589#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003590 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003591#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003592 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003593#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003594 Py_END_ALLOW_THREADS
3595 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00003596#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003597 PyThread_release_lock(netdb_lock);
Guido van Rossum3baaa131999-03-22 21:44:51 +00003598#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003599 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003600}
3601
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003602PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003603"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
3604\n\
3605Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003606for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003607
Guido van Rossum30a685f1991-06-27 15:51:29 +00003608
3609/* Python interface to getservbyname(name).
3610 This only returns the port number, since the other info is already
3611 known or not useful (like the list of aliases). */
3612
3613/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00003614static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003615socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003616{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003617 char *name, *proto=NULL;
3618 struct servent *sp;
3619 if (!PyArg_ParseTuple(args, "s|s:getservbyname", &name, &proto))
3620 return NULL;
3621 Py_BEGIN_ALLOW_THREADS
3622 sp = getservbyname(name, proto);
3623 Py_END_ALLOW_THREADS
3624 if (sp == NULL) {
3625 PyErr_SetString(socket_error, "service/proto not found");
3626 return NULL;
3627 }
3628 return PyInt_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00003629}
3630
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003631PyDoc_STRVAR(getservbyname_doc,
Barry Warsaw11b91a02004-06-28 00:50:43 +00003632"getservbyname(servicename[, protocolname]) -> integer\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003633\n\
3634Return a port number from a service name and protocol name.\n\
Barry Warsaw11b91a02004-06-28 00:50:43 +00003635The optional protocol name, if given, should be 'tcp' or 'udp',\n\
3636otherwise any protocol will match.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003637
Guido van Rossum30a685f1991-06-27 15:51:29 +00003638
Barry Warsaw11b91a02004-06-28 00:50:43 +00003639/* Python interface to getservbyport(port).
3640 This only returns the service name, since the other info is already
3641 known or not useful (like the list of aliases). */
3642
3643/*ARGSUSED*/
3644static PyObject *
3645socket_getservbyport(PyObject *self, PyObject *args)
3646{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003647 int port;
3648 char *proto=NULL;
3649 struct servent *sp;
3650 if (!PyArg_ParseTuple(args, "i|s:getservbyport", &port, &proto))
3651 return NULL;
3652 if (port < 0 || port > 0xffff) {
3653 PyErr_SetString(
3654 PyExc_OverflowError,
3655 "getservbyport: port must be 0-65535.");
3656 return NULL;
3657 }
3658 Py_BEGIN_ALLOW_THREADS
3659 sp = getservbyport(htons((short)port), proto);
3660 Py_END_ALLOW_THREADS
3661 if (sp == NULL) {
3662 PyErr_SetString(socket_error, "port/proto not found");
3663 return NULL;
3664 }
3665 return PyString_FromString(sp->s_name);
Barry Warsaw11b91a02004-06-28 00:50:43 +00003666}
3667
3668PyDoc_STRVAR(getservbyport_doc,
3669"getservbyport(port[, protocolname]) -> string\n\
3670\n\
3671Return the service name from a port number and protocol name.\n\
3672The optional protocol name, if given, should be 'tcp' or 'udp',\n\
3673otherwise any protocol will match.");
3674
Guido van Rossum3901d851996-12-19 16:35:04 +00003675/* Python interface to getprotobyname(name).
3676 This only returns the protocol number, since the other info is
3677 already known or not useful (like the list of aliases). */
3678
3679/*ARGSUSED*/
3680static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003681socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00003682{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003683 char *name;
3684 struct protoent *sp;
Guido van Rossumbcc20741998-08-04 22:53:56 +00003685#ifdef __BEOS__
3686/* Not available in BeOS yet. - [cjh] */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003687 PyErr_SetString(socket_error, "getprotobyname not supported");
3688 return NULL;
Guido van Rossumbcc20741998-08-04 22:53:56 +00003689#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003690 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
3691 return NULL;
3692 Py_BEGIN_ALLOW_THREADS
3693 sp = getprotobyname(name);
3694 Py_END_ALLOW_THREADS
3695 if (sp == NULL) {
3696 PyErr_SetString(socket_error, "protocol not found");
3697 return NULL;
3698 }
3699 return PyInt_FromLong((long) sp->p_proto);
Guido van Rossumbcc20741998-08-04 22:53:56 +00003700#endif
Guido van Rossum3901d851996-12-19 16:35:04 +00003701}
3702
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003703PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003704"getprotobyname(name) -> integer\n\
3705\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003706Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003707
Guido van Rossum3901d851996-12-19 16:35:04 +00003708
Dave Cole331708b2004-08-09 04:51:41 +00003709#ifdef HAVE_SOCKETPAIR
3710/* Create a pair of sockets using the socketpair() function.
Dave Cole07fda7e2004-08-23 05:16:23 +00003711 Arguments as for socket() except the default family is AF_UNIX if
Dave Colee8bbfe42004-08-26 00:51:16 +00003712 defined on the platform; otherwise, the default is AF_INET. */
Dave Cole331708b2004-08-09 04:51:41 +00003713
3714/*ARGSUSED*/
3715static PyObject *
3716socket_socketpair(PyObject *self, PyObject *args)
3717{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003718 PySocketSockObject *s0 = NULL, *s1 = NULL;
3719 SOCKET_T sv[2];
3720 int family, type = SOCK_STREAM, proto = 0;
3721 PyObject *res = NULL;
Dave Cole331708b2004-08-09 04:51:41 +00003722
3723#if defined(AF_UNIX)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003724 family = AF_UNIX;
Dave Cole331708b2004-08-09 04:51:41 +00003725#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003726 family = AF_INET;
Dave Cole331708b2004-08-09 04:51:41 +00003727#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003728 if (!PyArg_ParseTuple(args, "|iii:socketpair",
3729 &family, &type, &proto))
3730 return NULL;
3731 /* Create a pair of socket fds */
3732 if (socketpair(family, type, proto, sv) < 0)
3733 return set_error();
3734 s0 = new_sockobject(sv[0], family, type, proto);
3735 if (s0 == NULL)
3736 goto finally;
3737 s1 = new_sockobject(sv[1], family, type, proto);
3738 if (s1 == NULL)
3739 goto finally;
3740 res = PyTuple_Pack(2, s0, s1);
Dave Cole331708b2004-08-09 04:51:41 +00003741
3742finally:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003743 if (res == NULL) {
3744 if (s0 == NULL)
3745 SOCKETCLOSE(sv[0]);
3746 if (s1 == NULL)
3747 SOCKETCLOSE(sv[1]);
3748 }
3749 Py_XDECREF(s0);
3750 Py_XDECREF(s1);
3751 return res;
Dave Cole331708b2004-08-09 04:51:41 +00003752}
3753
3754PyDoc_STRVAR(socketpair_doc,
3755"socketpair([family[, type[, proto]]]) -> (socket object, socket object)\n\
3756\n\
3757Create a pair of socket objects from the sockets returned by the platform\n\
3758socketpair() function.\n\
Dave Cole07fda7e2004-08-23 05:16:23 +00003759The arguments are the same as for socket() except the default family is\n\
Dave Colee8bbfe42004-08-26 00:51:16 +00003760AF_UNIX if defined on the platform; otherwise, the default is AF_INET.");
Dave Cole331708b2004-08-09 04:51:41 +00003761
3762#endif /* HAVE_SOCKETPAIR */
3763
3764
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00003765#ifndef NO_DUP
Guido van Rossum2a7178e1992-12-08 13:38:24 +00003766/* Create a socket object from a numeric file description.
3767 Useful e.g. if stdin is a socket.
3768 Additional arguments as for socket(). */
3769
3770/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00003771static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003772socket_fromfd(PyObject *self, PyObject *args)
Guido van Rossum2a7178e1992-12-08 13:38:24 +00003773{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003774 PySocketSockObject *s;
3775 SOCKET_T fd;
3776 int family, type, proto = 0;
3777 if (!PyArg_ParseTuple(args, "iii|i:fromfd",
3778 &fd, &family, &type, &proto))
3779 return NULL;
3780 /* Dup the fd so it and the socket can be closed independently */
3781 fd = dup(fd);
3782 if (fd < 0)
3783 return set_error();
3784 s = new_sockobject(fd, family, type, proto);
3785 return (PyObject *) s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00003786}
Guido van Rossum82a5c661998-07-07 20:45:43 +00003787
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003788PyDoc_STRVAR(fromfd_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003789"fromfd(fd, family, type[, proto]) -> socket object\n\
3790\n\
Georg Brandldcfdae72006-04-01 07:33:08 +00003791Create a socket object from a duplicate of the given\n\
3792file descriptor.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003793The remaining arguments are the same as for socket().");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003794
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00003795#endif /* NO_DUP */
Guido van Rossum2a7178e1992-12-08 13:38:24 +00003796
Guido van Rossum82a5c661998-07-07 20:45:43 +00003797
Guido van Rossum006bf911996-06-12 04:04:55 +00003798static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003799socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00003800{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003801 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00003802
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003803 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
3804 return NULL;
3805 }
3806 if (x1 < 0) {
3807 PyErr_SetString(PyExc_OverflowError,
3808 "can't convert negative number to unsigned long");
3809 return NULL;
3810 }
3811 x2 = (unsigned int)ntohs((unsigned short)x1);
3812 return PyInt_FromLong(x2);
Guido van Rossum006bf911996-06-12 04:04:55 +00003813}
3814
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003815PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003816"ntohs(integer) -> integer\n\
3817\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003818Convert a 16-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003819
3820
Guido van Rossum006bf911996-06-12 04:04:55 +00003821static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003822socket_ntohl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00003823{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003824 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00003825
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003826 if (PyInt_Check(arg)) {
3827 x = PyInt_AS_LONG(arg);
3828 if (x == (unsigned long) -1 && PyErr_Occurred())
3829 return NULL;
3830 if ((long)x < 0) {
3831 PyErr_SetString(PyExc_OverflowError,
3832 "can't convert negative number to unsigned long");
3833 return NULL;
3834 }
3835 }
3836 else if (PyLong_Check(arg)) {
3837 x = PyLong_AsUnsignedLong(arg);
3838 if (x == (unsigned long) -1 && PyErr_Occurred())
3839 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003840#if SIZEOF_LONG > 4
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003841 {
3842 unsigned long y;
3843 /* only want the trailing 32 bits */
3844 y = x & 0xFFFFFFFFUL;
3845 if (y ^ x)
3846 return PyErr_Format(PyExc_OverflowError,
3847 "long int larger than 32 bits");
3848 x = y;
3849 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003850#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003851 }
3852 else
3853 return PyErr_Format(PyExc_TypeError,
3854 "expected int/long, %s found",
3855 Py_TYPE(arg)->tp_name);
3856 if (x == (unsigned long) -1 && PyErr_Occurred())
3857 return NULL;
3858 return PyLong_FromUnsignedLong(ntohl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00003859}
3860
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003861PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003862"ntohl(integer) -> integer\n\
3863\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003864Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003865
3866
Guido van Rossum006bf911996-06-12 04:04:55 +00003867static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003868socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00003869{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003870 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00003871
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003872 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
3873 return NULL;
3874 }
3875 if (x1 < 0) {
3876 PyErr_SetString(PyExc_OverflowError,
3877 "can't convert negative number to unsigned long");
3878 return NULL;
3879 }
3880 x2 = (unsigned int)htons((unsigned short)x1);
3881 return PyInt_FromLong(x2);
Guido van Rossum006bf911996-06-12 04:04:55 +00003882}
3883
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003884PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003885"htons(integer) -> integer\n\
3886\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003887Convert a 16-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003888
3889
Guido van Rossum006bf911996-06-12 04:04:55 +00003890static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003891socket_htonl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00003892{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003893 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00003894
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003895 if (PyInt_Check(arg)) {
3896 x = PyInt_AS_LONG(arg);
3897 if (x == (unsigned long) -1 && PyErr_Occurred())
3898 return NULL;
3899 if ((long)x < 0) {
3900 PyErr_SetString(PyExc_OverflowError,
3901 "can't convert negative number to unsigned long");
3902 return NULL;
3903 }
3904 }
3905 else if (PyLong_Check(arg)) {
3906 x = PyLong_AsUnsignedLong(arg);
3907 if (x == (unsigned long) -1 && PyErr_Occurred())
3908 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003909#if SIZEOF_LONG > 4
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003910 {
3911 unsigned long y;
3912 /* only want the trailing 32 bits */
3913 y = x & 0xFFFFFFFFUL;
3914 if (y ^ x)
3915 return PyErr_Format(PyExc_OverflowError,
3916 "long int larger than 32 bits");
3917 x = y;
3918 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003919#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003920 }
3921 else
3922 return PyErr_Format(PyExc_TypeError,
3923 "expected int/long, %s found",
3924 Py_TYPE(arg)->tp_name);
3925 return PyLong_FromUnsignedLong(htonl((unsigned long)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00003926}
3927
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003928PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003929"htonl(integer) -> integer\n\
3930\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003931Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003932
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003933/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003934
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003935PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003936"inet_aton(string) -> packed 32-bit IP representation\n\
3937\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003938Convert 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 +00003939binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003940
3941static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003942socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003943{
Guido van Rossuma2e48551999-09-09 15:42:59 +00003944#ifndef INADDR_NONE
3945#define INADDR_NONE (-1)
3946#endif
Neal Norwitz88f115b2003-02-13 02:15:42 +00003947#ifdef HAVE_INET_ATON
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003948 struct in_addr buf;
Ronald Oussorend06b6f22006-04-23 11:59:25 +00003949#endif
3950
3951#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
Gregory P. Smith3605b5c2009-02-11 23:45:25 +00003952#if (SIZEOF_INT != 4)
3953#error "Not sure if in_addr_t exists and int is not 32-bits."
3954#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003955 /* Have to use inet_addr() instead */
3956 unsigned int packed_addr;
Tim Peters1df9fdd2003-02-13 03:13:40 +00003957#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003958 char *ip_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003959
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003960 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))
3961 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003962
Tim Peters1df9fdd2003-02-13 03:13:40 +00003963
3964#ifdef HAVE_INET_ATON
Ronald Oussorend06b6f22006-04-23 11:59:25 +00003965
3966#ifdef USE_INET_ATON_WEAKLINK
3967 if (inet_aton != NULL) {
3968#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003969 if (inet_aton(ip_addr, &buf))
3970 return PyString_FromStringAndSize((char *)(&buf),
3971 sizeof(buf));
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003972
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003973 PyErr_SetString(socket_error,
3974 "illegal IP address string passed to inet_aton");
3975 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003976
Ronald Oussorend06b6f22006-04-23 11:59:25 +00003977#ifdef USE_INET_ATON_WEAKLINK
3978 } else {
3979#endif
3980
3981#endif
3982
3983#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
3984
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003985 /* special-case this address as inet_addr might return INADDR_NONE
3986 * for this */
3987 if (strcmp(ip_addr, "255.255.255.255") == 0) {
3988 packed_addr = 0xFFFFFFFF;
3989 } else {
Martin Blais2856e5f2006-05-26 12:03:27 +00003990
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003991 packed_addr = inet_addr(ip_addr);
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003992
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003993 if (packed_addr == INADDR_NONE) { /* invalid address */
3994 PyErr_SetString(socket_error,
3995 "illegal IP address string passed to inet_aton");
3996 return NULL;
3997 }
3998 }
3999 return PyString_FromStringAndSize((char *) &packed_addr,
4000 sizeof(packed_addr));
Ronald Oussorend06b6f22006-04-23 11:59:25 +00004001
4002#ifdef USE_INET_ATON_WEAKLINK
4003 }
4004#endif
4005
Guido van Rossumad05cdf2003-02-12 23:08:22 +00004006#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004007}
4008
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004009PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00004010"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004011\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004012Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004013
4014static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004015socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004016{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004017 char *packed_str;
4018 int addr_len;
4019 struct in_addr packed_addr;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004020
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004021 if (!PyArg_ParseTuple(args, "s#:inet_ntoa", &packed_str, &addr_len)) {
4022 return NULL;
4023 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00004024
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004025 if (addr_len != sizeof(packed_addr)) {
4026 PyErr_SetString(socket_error,
4027 "packed IP wrong length for inet_ntoa");
4028 return NULL;
4029 }
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004030
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004031 memcpy(&packed_addr, packed_str, addr_len);
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004032
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004033 return PyString_FromString(inet_ntoa(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004034}
Guido van Rossum82a5c661998-07-07 20:45:43 +00004035
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004036#ifdef HAVE_INET_PTON
4037
4038PyDoc_STRVAR(inet_pton_doc,
4039"inet_pton(af, ip) -> packed IP address string\n\
4040\n\
4041Convert an IP address from string format to a packed string suitable\n\
4042for use with low-level network functions.");
4043
4044static PyObject *
4045socket_inet_pton(PyObject *self, PyObject *args)
4046{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004047 int af;
4048 char* ip;
4049 int retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004050#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004051 char packed[MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004052#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004053 char packed[sizeof(struct in_addr)];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004054#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004055 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
4056 return NULL;
4057 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004058
Martin v. Löwis04697e82004-06-02 12:35:29 +00004059#if !defined(ENABLE_IPV6) && defined(AF_INET6)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004060 if(af == AF_INET6) {
4061 PyErr_SetString(socket_error,
4062 "can't use AF_INET6, IPv6 is disabled");
4063 return NULL;
4064 }
Martin Blais2856e5f2006-05-26 12:03:27 +00004065#endif
Martin v. Löwis10649092003-08-05 06:25:06 +00004066
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004067 retval = inet_pton(af, ip, packed);
4068 if (retval < 0) {
4069 PyErr_SetFromErrno(socket_error);
4070 return NULL;
4071 } else if (retval == 0) {
4072 PyErr_SetString(socket_error,
4073 "illegal IP address string passed to inet_pton");
4074 return NULL;
4075 } else if (af == AF_INET) {
4076 return PyString_FromStringAndSize(packed,
4077 sizeof(struct in_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004078#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004079 } else if (af == AF_INET6) {
4080 return PyString_FromStringAndSize(packed,
4081 sizeof(struct in6_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004082#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004083 } else {
4084 PyErr_SetString(socket_error, "unknown address family");
4085 return NULL;
4086 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004087}
Martin Blais2856e5f2006-05-26 12:03:27 +00004088
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004089PyDoc_STRVAR(inet_ntop_doc,
4090"inet_ntop(af, packed_ip) -> string formatted IP address\n\
4091\n\
4092Convert a packed IP address of the given family to string format.");
4093
4094static PyObject *
4095socket_inet_ntop(PyObject *self, PyObject *args)
4096{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004097 int af;
4098 char* packed;
4099 int len;
4100 const char* retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004101#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004102 char ip[MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004103#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004104 char ip[INET_ADDRSTRLEN + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004105#endif
Martin Blais2856e5f2006-05-26 12:03:27 +00004106
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004107 /* Guarantee NUL-termination for PyString_FromString() below */
4108 memset((void *) &ip[0], '\0', sizeof(ip));
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004109
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004110 if (!PyArg_ParseTuple(args, "is#:inet_ntop", &af, &packed, &len)) {
4111 return NULL;
4112 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004113
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004114 if (af == AF_INET) {
4115 if (len != sizeof(struct in_addr)) {
4116 PyErr_SetString(PyExc_ValueError,
4117 "invalid length of packed IP address string");
4118 return NULL;
4119 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004120#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004121 } else if (af == AF_INET6) {
4122 if (len != sizeof(struct in6_addr)) {
4123 PyErr_SetString(PyExc_ValueError,
4124 "invalid length of packed IP address string");
4125 return NULL;
4126 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004127#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004128 } else {
4129 PyErr_Format(PyExc_ValueError,
4130 "unknown address family %d", af);
4131 return NULL;
4132 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004133
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004134 retval = inet_ntop(af, packed, ip, sizeof(ip));
4135 if (!retval) {
4136 PyErr_SetFromErrno(socket_error);
4137 return NULL;
4138 } else {
4139 return PyString_FromString(retval);
4140 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004141
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004142 /* NOTREACHED */
4143 PyErr_SetString(PyExc_RuntimeError, "invalid handling of inet_ntop");
4144 return NULL;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004145}
4146
4147#endif /* HAVE_INET_PTON */
4148
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004149/* Python interface to getaddrinfo(host, port). */
4150
4151/*ARGSUSED*/
4152static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004153socket_getaddrinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004154{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004155 struct addrinfo hints, *res;
4156 struct addrinfo *res0 = NULL;
4157 PyObject *hobj = NULL;
4158 PyObject *pobj = (PyObject *)NULL;
4159 char pbuf[30];
4160 char *hptr, *pptr;
4161 int family, socktype, protocol, flags;
4162 int error;
4163 PyObject *all = (PyObject *)NULL;
4164 PyObject *single = (PyObject *)NULL;
4165 PyObject *idna = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004166
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004167 family = socktype = protocol = flags = 0;
4168 family = AF_UNSPEC;
4169 if (!PyArg_ParseTuple(args, "OO|iiii:getaddrinfo",
4170 &hobj, &pobj, &family, &socktype,
4171 &protocol, &flags)) {
4172 return NULL;
4173 }
4174 if (hobj == Py_None) {
4175 hptr = NULL;
4176 } else if (PyUnicode_Check(hobj)) {
Victor Stinner9a2326b2015-09-11 12:42:13 +02004177 idna = PyUnicode_AsEncodedString(hobj, "idna", NULL);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004178 if (!idna)
4179 return NULL;
4180 hptr = PyString_AsString(idna);
4181 } else if (PyString_Check(hobj)) {
4182 hptr = PyString_AsString(hobj);
4183 } else {
4184 PyErr_SetString(PyExc_TypeError,
4185 "getaddrinfo() argument 1 must be string or None");
4186 return NULL;
4187 }
Petri Lehtinenab7dd182012-12-20 21:06:14 +02004188 if (PyInt_Check(pobj) || PyLong_Check(pobj)) {
4189 long value = PyLong_AsLong(pobj);
4190 if (value == -1 && PyErr_Occurred())
4191 return NULL;
4192 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", value);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004193 pptr = pbuf;
4194 } else if (PyString_Check(pobj)) {
4195 pptr = PyString_AsString(pobj);
4196 } else if (pobj == Py_None) {
4197 pptr = (char *)NULL;
4198 } else {
Petri Lehtinenab7dd182012-12-20 21:06:14 +02004199 PyErr_SetString(socket_error,
4200 "getaddrinfo() argument 2 must be integer or string");
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004201 goto err;
4202 }
Ronald Oussoren0e6283e2013-06-10 10:35:36 +02004203#if defined(__APPLE__) && defined(AI_NUMERICSERV)
Ronald Oussoren16c52a32013-05-24 13:45:27 +02004204 if ((flags & AI_NUMERICSERV) && (pptr == NULL || (pptr[0] == '0' && pptr[1] == 0))) {
4205 /* On OSX upto at least OSX 10.8 getaddrinfo crashes
4206 * if AI_NUMERICSERV is set and the servname is NULL or "0".
4207 * This workaround avoids a segfault in libsystem.
4208 */
4209 pptr = "00";
4210 }
4211#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004212 memset(&hints, 0, sizeof(hints));
4213 hints.ai_family = family;
4214 hints.ai_socktype = socktype;
4215 hints.ai_protocol = protocol;
4216 hints.ai_flags = flags;
4217 Py_BEGIN_ALLOW_THREADS
4218 ACQUIRE_GETADDRINFO_LOCK
4219 error = getaddrinfo(hptr, pptr, &hints, &res0);
4220 Py_END_ALLOW_THREADS
4221 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
4222 if (error) {
4223 set_gaierror(error);
4224 goto err;
4225 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004226
Benjamin Petersona5a44ab2015-04-01 11:16:40 -04004227 all = PyList_New(0);
4228 if (all == NULL)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004229 goto err;
4230 for (res = res0; res; res = res->ai_next) {
4231 PyObject *addr =
4232 makesockaddr(-1, res->ai_addr, res->ai_addrlen, protocol);
4233 if (addr == NULL)
4234 goto err;
4235 single = Py_BuildValue("iiisO", res->ai_family,
4236 res->ai_socktype, res->ai_protocol,
4237 res->ai_canonname ? res->ai_canonname : "",
4238 addr);
4239 Py_DECREF(addr);
4240 if (single == NULL)
4241 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004242
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004243 if (PyList_Append(all, single))
4244 goto err;
4245 Py_XDECREF(single);
4246 }
4247 Py_XDECREF(idna);
4248 if (res0)
4249 freeaddrinfo(res0);
4250 return all;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004251 err:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004252 Py_XDECREF(single);
4253 Py_XDECREF(all);
4254 Py_XDECREF(idna);
4255 if (res0)
4256 freeaddrinfo(res0);
4257 return (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004258}
4259
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004260PyDoc_STRVAR(getaddrinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004261"getaddrinfo(host, port [, family, socktype, proto, flags])\n\
4262 -> list of (family, socktype, proto, canonname, sockaddr)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004263\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004264Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004265
4266/* Python interface to getnameinfo(sa, flags). */
4267
4268/*ARGSUSED*/
4269static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004270socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004271{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004272 PyObject *sa = (PyObject *)NULL;
4273 int flags;
4274 char *hostp;
Charles-François Natali3aa59e32012-01-02 15:38:27 +01004275 int port;
4276 unsigned int flowinfo, scope_id;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004277 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
4278 struct addrinfo hints, *res = NULL;
4279 int error;
4280 PyObject *ret = (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004281
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004282 flags = flowinfo = scope_id = 0;
4283 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
4284 return NULL;
4285 if (!PyTuple_Check(sa)) {
4286 PyErr_SetString(PyExc_TypeError,
4287 "getnameinfo() argument 1 must be a tuple");
4288 return NULL;
4289 }
Charles-François Natali3aa59e32012-01-02 15:38:27 +01004290 if (!PyArg_ParseTuple(sa, "si|II",
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004291 &hostp, &port, &flowinfo, &scope_id))
4292 return NULL;
Charles-François Natali65dd7452012-06-23 10:06:56 +02004293 if (flowinfo > 0xfffff) {
Charles-François Natali3aa59e32012-01-02 15:38:27 +01004294 PyErr_SetString(PyExc_OverflowError,
4295 "getsockaddrarg: flowinfo must be 0-1048575.");
4296 return NULL;
4297 }
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004298 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
4299 memset(&hints, 0, sizeof(hints));
4300 hints.ai_family = AF_UNSPEC;
4301 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
4302 Py_BEGIN_ALLOW_THREADS
4303 ACQUIRE_GETADDRINFO_LOCK
4304 error = getaddrinfo(hostp, pbuf, &hints, &res);
4305 Py_END_ALLOW_THREADS
4306 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
4307 if (error) {
4308 set_gaierror(error);
4309 goto fail;
4310 }
4311 if (res->ai_next) {
4312 PyErr_SetString(socket_error,
4313 "sockaddr resolved to multiple addresses");
4314 goto fail;
4315 }
4316 switch (res->ai_family) {
4317 case AF_INET:
4318 {
4319 if (PyTuple_GET_SIZE(sa) != 2) {
4320 PyErr_SetString(socket_error,
4321 "IPv4 sockaddr must be 2 tuple");
4322 goto fail;
4323 }
4324 break;
4325 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004326#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004327 case AF_INET6:
4328 {
4329 struct sockaddr_in6 *sin6;
4330 sin6 = (struct sockaddr_in6 *)res->ai_addr;
Charles-François Natali3aa59e32012-01-02 15:38:27 +01004331 sin6->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004332 sin6->sin6_scope_id = scope_id;
4333 break;
4334 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004335#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004336 }
4337 error = getnameinfo(res->ai_addr, res->ai_addrlen,
4338 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
4339 if (error) {
4340 set_gaierror(error);
4341 goto fail;
4342 }
4343 ret = Py_BuildValue("ss", hbuf, pbuf);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004344
4345fail:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004346 if (res)
4347 freeaddrinfo(res);
4348 return ret;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004349}
4350
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004351PyDoc_STRVAR(getnameinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004352"getnameinfo(sockaddr, flags) --> (host, port)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004353\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004354Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004355
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004356
4357/* Python API to getting and setting the default timeout value. */
4358
4359static PyObject *
4360socket_getdefaulttimeout(PyObject *self)
4361{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004362 if (defaulttimeout < 0.0) {
4363 Py_INCREF(Py_None);
4364 return Py_None;
4365 }
4366 else
4367 return PyFloat_FromDouble(defaulttimeout);
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004368}
4369
4370PyDoc_STRVAR(getdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004371"getdefaulttimeout() -> timeout\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004372\n\
Ezio Melottica5e9082011-08-14 08:27:36 +03004373Returns the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004374A value of None indicates that new socket objects have no timeout.\n\
4375When the socket module is first imported, the default is None.");
4376
4377static PyObject *
4378socket_setdefaulttimeout(PyObject *self, PyObject *arg)
4379{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004380 double timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004381
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004382 if (arg == Py_None)
4383 timeout = -1.0;
4384 else {
4385 timeout = PyFloat_AsDouble(arg);
4386 if (timeout < 0.0) {
4387 if (!PyErr_Occurred())
4388 PyErr_SetString(PyExc_ValueError,
4389 "Timeout value out of range");
4390 return NULL;
4391 }
4392 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004393
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004394 defaulttimeout = timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004395
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004396 Py_INCREF(Py_None);
4397 return Py_None;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004398}
4399
4400PyDoc_STRVAR(setdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004401"setdefaulttimeout(timeout)\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004402\n\
Ezio Melottica5e9082011-08-14 08:27:36 +03004403Set the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004404A value of None indicates that new socket objects have no timeout.\n\
4405When the socket module is first imported, the default is None.");
4406
4407
Guido van Rossum30a685f1991-06-27 15:51:29 +00004408/* List of functions exported by this module. */
4409
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004410static PyMethodDef socket_methods[] = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004411 {"gethostbyname", socket_gethostbyname,
4412 METH_VARARGS, gethostbyname_doc},
4413 {"gethostbyname_ex", socket_gethostbyname_ex,
4414 METH_VARARGS, ghbn_ex_doc},
4415 {"gethostbyaddr", socket_gethostbyaddr,
4416 METH_VARARGS, gethostbyaddr_doc},
4417 {"gethostname", socket_gethostname,
4418 METH_NOARGS, gethostname_doc},
4419 {"getservbyname", socket_getservbyname,
4420 METH_VARARGS, getservbyname_doc},
4421 {"getservbyport", socket_getservbyport,
4422 METH_VARARGS, getservbyport_doc},
4423 {"getprotobyname", socket_getprotobyname,
4424 METH_VARARGS, getprotobyname_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004425#ifndef NO_DUP
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004426 {"fromfd", socket_fromfd,
4427 METH_VARARGS, fromfd_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004428#endif
Dave Cole331708b2004-08-09 04:51:41 +00004429#ifdef HAVE_SOCKETPAIR
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004430 {"socketpair", socket_socketpair,
4431 METH_VARARGS, socketpair_doc},
Dave Cole331708b2004-08-09 04:51:41 +00004432#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004433 {"ntohs", socket_ntohs,
4434 METH_VARARGS, ntohs_doc},
4435 {"ntohl", socket_ntohl,
4436 METH_O, ntohl_doc},
4437 {"htons", socket_htons,
4438 METH_VARARGS, htons_doc},
4439 {"htonl", socket_htonl,
4440 METH_O, htonl_doc},
4441 {"inet_aton", socket_inet_aton,
4442 METH_VARARGS, inet_aton_doc},
4443 {"inet_ntoa", socket_inet_ntoa,
4444 METH_VARARGS, inet_ntoa_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004445#ifdef HAVE_INET_PTON
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004446 {"inet_pton", socket_inet_pton,
4447 METH_VARARGS, inet_pton_doc},
4448 {"inet_ntop", socket_inet_ntop,
4449 METH_VARARGS, inet_ntop_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004450#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004451 {"getaddrinfo", socket_getaddrinfo,
4452 METH_VARARGS, getaddrinfo_doc},
4453 {"getnameinfo", socket_getnameinfo,
4454 METH_VARARGS, getnameinfo_doc},
4455 {"getdefaulttimeout", (PyCFunction)socket_getdefaulttimeout,
4456 METH_NOARGS, getdefaulttimeout_doc},
4457 {"setdefaulttimeout", socket_setdefaulttimeout,
4458 METH_O, setdefaulttimeout_doc},
4459 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004460};
4461
Guido van Rossum30a685f1991-06-27 15:51:29 +00004462
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004463#ifdef RISCOS
4464#define OS_INIT_DEFINED
Guido van Rossumbe32c891996-06-20 16:25:29 +00004465
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004466static int
4467os_init(void)
4468{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004469 _kernel_swi_regs r;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004470
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004471 r.r[0] = 0;
4472 _kernel_swi(0x43380, &r, &r);
4473 taskwindow = r.r[0];
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004474
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004475 return 1;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004476}
4477
4478#endif /* RISCOS */
4479
4480
4481#ifdef MS_WINDOWS
4482#define OS_INIT_DEFINED
4483
4484/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00004485
4486static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004487os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00004488{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004489 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00004490}
4491
4492static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004493os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00004494{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004495 WSADATA WSAData;
4496 int ret;
4497 char buf[100];
4498 ret = WSAStartup(0x0101, &WSAData);
4499 switch (ret) {
4500 case 0: /* No error */
4501 Py_AtExit(os_cleanup);
4502 return 1; /* Success */
4503 case WSASYSNOTREADY:
4504 PyErr_SetString(PyExc_ImportError,
4505 "WSAStartup failed: network not ready");
4506 break;
4507 case WSAVERNOTSUPPORTED:
4508 case WSAEINVAL:
4509 PyErr_SetString(
4510 PyExc_ImportError,
4511 "WSAStartup failed: requested version not supported");
4512 break;
4513 default:
4514 PyOS_snprintf(buf, sizeof(buf),
4515 "WSAStartup failed: error code %d", ret);
4516 PyErr_SetString(PyExc_ImportError, buf);
4517 break;
4518 }
4519 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00004520}
4521
Guido van Rossum8d665e61996-06-26 18:22:49 +00004522#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00004523
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004524
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004525#ifdef PYOS_OS2
4526#define OS_INIT_DEFINED
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004527
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004528/* Additional initialization for OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004529
4530static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004531os_init(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004532{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004533#ifndef PYCC_GCC
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004534 char reason[64];
4535 int rc = sock_init();
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004536
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004537 if (rc == 0) {
4538 return 1; /* Success */
4539 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004540
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004541 PyOS_snprintf(reason, sizeof(reason),
4542 "OS/2 TCP/IP Error# %d", sock_errno());
4543 PyErr_SetString(PyExc_ImportError, reason);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004544
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004545 return 0; /* Failure */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00004546#else
Ezio Melottic2077b02011-03-16 12:34:31 +02004547 /* No need to initialize sockets with GCC/EMX */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004548 return 1; /* Success */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00004549#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004550}
4551
4552#endif /* PYOS_OS2 */
4553
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004554
4555#ifndef OS_INIT_DEFINED
4556static int
4557os_init(void)
4558{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004559 return 1; /* Success */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004560}
4561#endif
4562
4563
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00004564/* C API table - always add new things to the end for binary
4565 compatibility. */
4566static
4567PySocketModule_APIObject PySocketModuleAPI =
4568{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004569 &sock_type,
4570 NULL
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00004571};
4572
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004573
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004574/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004575
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004576 This module is actually called "_socket", and there's a wrapper
4577 "socket.py" which implements some additional functionality. On some
4578 platforms (e.g. Windows and OS/2), socket.py also implements a
4579 wrapper for the socket type that provides missing functionality such
4580 as makefile(), dup() and fromfd(). The import of "_socket" may fail
4581 with an ImportError exception if os-specific initialization fails.
4582 On Windows, this does WINSOCK initialization. When WINSOCK is
Ezio Melottic2077b02011-03-16 12:34:31 +02004583 initialized successfully, a call to WSACleanup() is scheduled to be
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004584 made at exit time.
4585*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004586
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004587PyDoc_STRVAR(socket_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004588"Implementation module for socket operations.\n\
4589\n\
4590See the socket module for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004591
Mark Hammondfe51c6d2002-08-02 02:27:13 +00004592PyMODINIT_FUNC
Thomas Wouters1e0c2f42000-07-24 16:06:23 +00004593init_socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004594{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004595 PyObject *m, *has_ipv6;
Fred Drake4baedc12002-04-01 14:53:37 +00004596
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004597 if (!os_init())
4598 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004599
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004600 Py_TYPE(&sock_type) = &PyType_Type;
4601 m = Py_InitModule3(PySocket_MODULE_NAME,
4602 socket_methods,
4603 socket_doc);
4604 if (m == NULL)
4605 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004606
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004607 socket_error = PyErr_NewException("socket.error",
4608 PyExc_IOError, NULL);
4609 if (socket_error == NULL)
4610 return;
4611 PySocketModuleAPI.error = socket_error;
4612 Py_INCREF(socket_error);
4613 PyModule_AddObject(m, "error", socket_error);
4614 socket_herror = PyErr_NewException("socket.herror",
4615 socket_error, NULL);
4616 if (socket_herror == NULL)
4617 return;
4618 Py_INCREF(socket_herror);
4619 PyModule_AddObject(m, "herror", socket_herror);
4620 socket_gaierror = PyErr_NewException("socket.gaierror", socket_error,
4621 NULL);
4622 if (socket_gaierror == NULL)
4623 return;
4624 Py_INCREF(socket_gaierror);
4625 PyModule_AddObject(m, "gaierror", socket_gaierror);
4626 socket_timeout = PyErr_NewException("socket.timeout",
4627 socket_error, NULL);
4628 if (socket_timeout == NULL)
4629 return;
4630 Py_INCREF(socket_timeout);
4631 PyModule_AddObject(m, "timeout", socket_timeout);
4632 Py_INCREF((PyObject *)&sock_type);
4633 if (PyModule_AddObject(m, "SocketType",
4634 (PyObject *)&sock_type) != 0)
4635 return;
4636 Py_INCREF((PyObject *)&sock_type);
4637 if (PyModule_AddObject(m, "socket",
4638 (PyObject *)&sock_type) != 0)
4639 return;
Guido van Rossum09be4091999-08-09 14:40:40 +00004640
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004641#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004642 has_ipv6 = Py_True;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004643#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004644 has_ipv6 = Py_False;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004645#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004646 Py_INCREF(has_ipv6);
4647 PyModule_AddObject(m, "has_ipv6", has_ipv6);
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004648
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004649 /* Export C API */
4650 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
4651 PyCapsule_New(&PySocketModuleAPI, PySocket_CAPSULE_NAME, NULL)
4652 ) != 0)
4653 return;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00004654
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004655 /* Address families (we only support AF_INET and AF_UNIX) */
Guido van Rossum09be4091999-08-09 14:40:40 +00004656#ifdef AF_UNSPEC
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004657 PyModule_AddIntConstant(m, "AF_UNSPEC", AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00004658#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004659 PyModule_AddIntConstant(m, "AF_INET", AF_INET);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004660#ifdef AF_INET6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004661 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004662#endif /* AF_INET6 */
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00004663#if defined(AF_UNIX)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004664 PyModule_AddIntConstant(m, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00004665#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00004666#ifdef AF_AX25
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004667 /* Amateur Radio AX.25 */
4668 PyModule_AddIntConstant(m, "AF_AX25", AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00004669#endif
4670#ifdef AF_IPX
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004671 PyModule_AddIntConstant(m, "AF_IPX", AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00004672#endif
4673#ifdef AF_APPLETALK
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004674 /* Appletalk DDP */
4675 PyModule_AddIntConstant(m, "AF_APPLETALK", AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00004676#endif
4677#ifdef AF_NETROM
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004678 /* Amateur radio NetROM */
4679 PyModule_AddIntConstant(m, "AF_NETROM", AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00004680#endif
4681#ifdef AF_BRIDGE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004682 /* Multiprotocol bridge */
4683 PyModule_AddIntConstant(m, "AF_BRIDGE", AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00004684#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004685#ifdef AF_ATMPVC
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004686 /* ATM PVCs */
4687 PyModule_AddIntConstant(m, "AF_ATMPVC", AF_ATMPVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004688#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00004689#ifdef AF_AAL5
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004690 /* Reserved for Werner's ATM */
4691 PyModule_AddIntConstant(m, "AF_AAL5", AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00004692#endif
4693#ifdef AF_X25
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004694 /* Reserved for X.25 project */
4695 PyModule_AddIntConstant(m, "AF_X25", AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00004696#endif
4697#ifdef AF_INET6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004698 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00004699#endif
4700#ifdef AF_ROSE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004701 /* Amateur Radio X.25 PLP */
4702 PyModule_AddIntConstant(m, "AF_ROSE", AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00004703#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004704#ifdef AF_DECnet
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004705 /* Reserved for DECnet project */
4706 PyModule_AddIntConstant(m, "AF_DECnet", AF_DECnet);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004707#endif
4708#ifdef AF_NETBEUI
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004709 /* Reserved for 802.2LLC project */
4710 PyModule_AddIntConstant(m, "AF_NETBEUI", AF_NETBEUI);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004711#endif
4712#ifdef AF_SECURITY
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004713 /* Security callback pseudo AF */
4714 PyModule_AddIntConstant(m, "AF_SECURITY", AF_SECURITY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004715#endif
4716#ifdef AF_KEY
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004717 /* PF_KEY key management API */
4718 PyModule_AddIntConstant(m, "AF_KEY", AF_KEY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004719#endif
4720#ifdef AF_NETLINK
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004721 /* */
4722 PyModule_AddIntConstant(m, "AF_NETLINK", AF_NETLINK);
4723 PyModule_AddIntConstant(m, "NETLINK_ROUTE", NETLINK_ROUTE);
Martin v. Löwis5fe60e72006-04-06 22:29:33 +00004724#ifdef NETLINK_SKIP
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004725 PyModule_AddIntConstant(m, "NETLINK_SKIP", NETLINK_SKIP);
Martin v. Löwis5fe60e72006-04-06 22:29:33 +00004726#endif
4727#ifdef NETLINK_W1
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004728 PyModule_AddIntConstant(m, "NETLINK_W1", NETLINK_W1);
Martin v. Löwis5fe60e72006-04-06 22:29:33 +00004729#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004730 PyModule_AddIntConstant(m, "NETLINK_USERSOCK", NETLINK_USERSOCK);
4731 PyModule_AddIntConstant(m, "NETLINK_FIREWALL", NETLINK_FIREWALL);
Guido van Rossum668a94a2006-02-21 01:07:27 +00004732#ifdef NETLINK_TCPDIAG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004733 PyModule_AddIntConstant(m, "NETLINK_TCPDIAG", NETLINK_TCPDIAG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00004734#endif
4735#ifdef NETLINK_NFLOG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004736 PyModule_AddIntConstant(m, "NETLINK_NFLOG", NETLINK_NFLOG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00004737#endif
Neal Norwitz65851662006-01-16 04:31:40 +00004738#ifdef NETLINK_XFRM
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004739 PyModule_AddIntConstant(m, "NETLINK_XFRM", NETLINK_XFRM);
Neal Norwitz65851662006-01-16 04:31:40 +00004740#endif
Martin v. Löwis5fe60e72006-04-06 22:29:33 +00004741#ifdef NETLINK_ARPD
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004742 PyModule_AddIntConstant(m, "NETLINK_ARPD", NETLINK_ARPD);
Martin v. Löwis5fe60e72006-04-06 22:29:33 +00004743#endif
4744#ifdef NETLINK_ROUTE6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004745 PyModule_AddIntConstant(m, "NETLINK_ROUTE6", NETLINK_ROUTE6);
Martin v. Löwis5fe60e72006-04-06 22:29:33 +00004746#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004747 PyModule_AddIntConstant(m, "NETLINK_IP6_FW", NETLINK_IP6_FW);
Martin v. Löwisb1cc1d42007-02-13 12:14:19 +00004748#ifdef NETLINK_DNRTMSG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004749 PyModule_AddIntConstant(m, "NETLINK_DNRTMSG", NETLINK_DNRTMSG);
4750#endif
Martin v. Löwis5fe60e72006-04-06 22:29:33 +00004751#ifdef NETLINK_TAPBASE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004752 PyModule_AddIntConstant(m, "NETLINK_TAPBASE", NETLINK_TAPBASE);
Martin v. Löwis5fe60e72006-04-06 22:29:33 +00004753#endif
Georg Brandldcfdae72006-04-01 07:33:08 +00004754#endif /* AF_NETLINK */
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004755#ifdef AF_ROUTE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004756 /* Alias to emulate 4.4BSD */
4757 PyModule_AddIntConstant(m, "AF_ROUTE", AF_ROUTE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004758#endif
4759#ifdef AF_ASH
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004760 /* Ash */
4761 PyModule_AddIntConstant(m, "AF_ASH", AF_ASH);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004762#endif
4763#ifdef AF_ECONET
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004764 /* Acorn Econet */
4765 PyModule_AddIntConstant(m, "AF_ECONET", AF_ECONET);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004766#endif
4767#ifdef AF_ATMSVC
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004768 /* ATM SVCs */
4769 PyModule_AddIntConstant(m, "AF_ATMSVC", AF_ATMSVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004770#endif
4771#ifdef AF_SNA
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004772 /* Linux SNA Project (nutters!) */
4773 PyModule_AddIntConstant(m, "AF_SNA", AF_SNA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004774#endif
4775#ifdef AF_IRDA
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004776 /* IRDA sockets */
4777 PyModule_AddIntConstant(m, "AF_IRDA", AF_IRDA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004778#endif
4779#ifdef AF_PPPOX
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004780 /* PPPoX sockets */
4781 PyModule_AddIntConstant(m, "AF_PPPOX", AF_PPPOX);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004782#endif
4783#ifdef AF_WANPIPE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004784 /* Wanpipe API Sockets */
4785 PyModule_AddIntConstant(m, "AF_WANPIPE", AF_WANPIPE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004786#endif
4787#ifdef AF_LLC
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004788 /* Linux LLC */
4789 PyModule_AddIntConstant(m, "AF_LLC", AF_LLC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004790#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00004791
Hye-Shik Chang81268602004-02-02 06:05:24 +00004792#ifdef USE_BLUETOOTH
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004793 PyModule_AddIntConstant(m, "AF_BLUETOOTH", AF_BLUETOOTH);
4794 PyModule_AddIntConstant(m, "BTPROTO_L2CAP", BTPROTO_L2CAP);
4795 PyModule_AddIntConstant(m, "BTPROTO_HCI", BTPROTO_HCI);
4796 PyModule_AddIntConstant(m, "SOL_HCI", SOL_HCI);
Gregory P. Smith886a1cd2010-10-17 04:28:14 +00004797#if !defined(__NetBSD__) && !defined(__DragonFly__)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004798 PyModule_AddIntConstant(m, "HCI_FILTER", HCI_FILTER);
Gregory P. Smith886a1cd2010-10-17 04:28:14 +00004799#endif
Hye-Shik Chang81268602004-02-02 06:05:24 +00004800#if !defined(__FreeBSD__)
Gregory P. Smith886a1cd2010-10-17 04:28:14 +00004801#if !defined(__NetBSD__) && !defined(__DragonFly__)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004802 PyModule_AddIntConstant(m, "HCI_TIME_STAMP", HCI_TIME_STAMP);
Gregory P. Smith886a1cd2010-10-17 04:28:14 +00004803#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004804 PyModule_AddIntConstant(m, "HCI_DATA_DIR", HCI_DATA_DIR);
4805 PyModule_AddIntConstant(m, "BTPROTO_SCO", BTPROTO_SCO);
Hye-Shik Chang81268602004-02-02 06:05:24 +00004806#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004807 PyModule_AddIntConstant(m, "BTPROTO_RFCOMM", BTPROTO_RFCOMM);
4808 PyModule_AddStringConstant(m, "BDADDR_ANY", "00:00:00:00:00:00");
4809 PyModule_AddStringConstant(m, "BDADDR_LOCAL", "00:00:00:FF:FF:FF");
Martin v. Löwis12af0482004-01-31 12:34:17 +00004810#endif
4811
Antoine Pitroue0c5f3c2010-10-27 20:35:26 +00004812#ifdef AF_PACKET
4813 PyModule_AddIntMacro(m, AF_PACKET);
4814#endif
4815#ifdef PF_PACKET
4816 PyModule_AddIntMacro(m, PF_PACKET);
4817#endif
4818#ifdef PACKET_HOST
4819 PyModule_AddIntMacro(m, PACKET_HOST);
4820#endif
4821#ifdef PACKET_BROADCAST
4822 PyModule_AddIntMacro(m, PACKET_BROADCAST);
4823#endif
4824#ifdef PACKET_MULTICAST
4825 PyModule_AddIntMacro(m, PACKET_MULTICAST);
4826#endif
4827#ifdef PACKET_OTHERHOST
4828 PyModule_AddIntMacro(m, PACKET_OTHERHOST);
4829#endif
4830#ifdef PACKET_OUTGOING
4831 PyModule_AddIntMacro(m, PACKET_OUTGOING);
4832#endif
4833#ifdef PACKET_LOOPBACK
4834 PyModule_AddIntMacro(m, PACKET_LOOPBACK);
4835#endif
4836#ifdef PACKET_FASTROUTE
4837 PyModule_AddIntMacro(m, PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00004838#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00004839
Christian Heimesfb2d25a2008-01-07 16:12:44 +00004840#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004841 PyModule_AddIntConstant(m, "AF_TIPC", AF_TIPC);
Christian Heimesfb2d25a2008-01-07 16:12:44 +00004842
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004843 /* for addresses */
4844 PyModule_AddIntConstant(m, "TIPC_ADDR_NAMESEQ", TIPC_ADDR_NAMESEQ);
4845 PyModule_AddIntConstant(m, "TIPC_ADDR_NAME", TIPC_ADDR_NAME);
4846 PyModule_AddIntConstant(m, "TIPC_ADDR_ID", TIPC_ADDR_ID);
Christian Heimesfb2d25a2008-01-07 16:12:44 +00004847
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004848 PyModule_AddIntConstant(m, "TIPC_ZONE_SCOPE", TIPC_ZONE_SCOPE);
4849 PyModule_AddIntConstant(m, "TIPC_CLUSTER_SCOPE", TIPC_CLUSTER_SCOPE);
4850 PyModule_AddIntConstant(m, "TIPC_NODE_SCOPE", TIPC_NODE_SCOPE);
Christian Heimesfb2d25a2008-01-07 16:12:44 +00004851
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004852 /* for setsockopt() */
4853 PyModule_AddIntConstant(m, "SOL_TIPC", SOL_TIPC);
4854 PyModule_AddIntConstant(m, "TIPC_IMPORTANCE", TIPC_IMPORTANCE);
4855 PyModule_AddIntConstant(m, "TIPC_SRC_DROPPABLE", TIPC_SRC_DROPPABLE);
4856 PyModule_AddIntConstant(m, "TIPC_DEST_DROPPABLE",
4857 TIPC_DEST_DROPPABLE);
4858 PyModule_AddIntConstant(m, "TIPC_CONN_TIMEOUT", TIPC_CONN_TIMEOUT);
Christian Heimesfb2d25a2008-01-07 16:12:44 +00004859
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004860 PyModule_AddIntConstant(m, "TIPC_LOW_IMPORTANCE",
4861 TIPC_LOW_IMPORTANCE);
4862 PyModule_AddIntConstant(m, "TIPC_MEDIUM_IMPORTANCE",
4863 TIPC_MEDIUM_IMPORTANCE);
4864 PyModule_AddIntConstant(m, "TIPC_HIGH_IMPORTANCE",
4865 TIPC_HIGH_IMPORTANCE);
4866 PyModule_AddIntConstant(m, "TIPC_CRITICAL_IMPORTANCE",
4867 TIPC_CRITICAL_IMPORTANCE);
Christian Heimesfb2d25a2008-01-07 16:12:44 +00004868
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004869 /* for subscriptions */
4870 PyModule_AddIntConstant(m, "TIPC_SUB_PORTS", TIPC_SUB_PORTS);
4871 PyModule_AddIntConstant(m, "TIPC_SUB_SERVICE", TIPC_SUB_SERVICE);
Georg Brandlff15c862008-01-11 09:19:11 +00004872#ifdef TIPC_SUB_CANCEL
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004873 /* doesn't seem to be available everywhere */
4874 PyModule_AddIntConstant(m, "TIPC_SUB_CANCEL", TIPC_SUB_CANCEL);
Georg Brandlff15c862008-01-11 09:19:11 +00004875#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004876 PyModule_AddIntConstant(m, "TIPC_WAIT_FOREVER", TIPC_WAIT_FOREVER);
4877 PyModule_AddIntConstant(m, "TIPC_PUBLISHED", TIPC_PUBLISHED);
4878 PyModule_AddIntConstant(m, "TIPC_WITHDRAWN", TIPC_WITHDRAWN);
4879 PyModule_AddIntConstant(m, "TIPC_SUBSCR_TIMEOUT", TIPC_SUBSCR_TIMEOUT);
4880 PyModule_AddIntConstant(m, "TIPC_CFG_SRV", TIPC_CFG_SRV);
4881 PyModule_AddIntConstant(m, "TIPC_TOP_SRV", TIPC_TOP_SRV);
Christian Heimesfb2d25a2008-01-07 16:12:44 +00004882#endif
4883
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004884 /* Socket types */
4885 PyModule_AddIntConstant(m, "SOCK_STREAM", SOCK_STREAM);
4886 PyModule_AddIntConstant(m, "SOCK_DGRAM", SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00004887#ifndef __BEOS__
4888/* We have incomplete socket support. */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004889 PyModule_AddIntConstant(m, "SOCK_RAW", SOCK_RAW);
4890 PyModule_AddIntConstant(m, "SOCK_SEQPACKET", SOCK_SEQPACKET);
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00004891#if defined(SOCK_RDM)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004892 PyModule_AddIntConstant(m, "SOCK_RDM", SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00004893#endif
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00004894#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004895
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004896#ifdef SO_DEBUG
4897 PyModule_AddIntConstant(m, "SO_DEBUG", SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004898#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004899#ifdef SO_ACCEPTCONN
4900 PyModule_AddIntConstant(m, "SO_ACCEPTCONN", SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004901#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004902#ifdef SO_REUSEADDR
4903 PyModule_AddIntConstant(m, "SO_REUSEADDR", SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004904#endif
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00004905#ifdef SO_EXCLUSIVEADDRUSE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004906 PyModule_AddIntConstant(m, "SO_EXCLUSIVEADDRUSE", SO_EXCLUSIVEADDRUSE);
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00004907#endif
4908
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004909#ifdef SO_KEEPALIVE
4910 PyModule_AddIntConstant(m, "SO_KEEPALIVE", SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004911#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004912#ifdef SO_DONTROUTE
4913 PyModule_AddIntConstant(m, "SO_DONTROUTE", SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004914#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004915#ifdef SO_BROADCAST
4916 PyModule_AddIntConstant(m, "SO_BROADCAST", SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004917#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004918#ifdef SO_USELOOPBACK
4919 PyModule_AddIntConstant(m, "SO_USELOOPBACK", SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004920#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004921#ifdef SO_LINGER
4922 PyModule_AddIntConstant(m, "SO_LINGER", SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004923#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004924#ifdef SO_OOBINLINE
4925 PyModule_AddIntConstant(m, "SO_OOBINLINE", SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004926#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004927#ifdef SO_REUSEPORT
4928 PyModule_AddIntConstant(m, "SO_REUSEPORT", SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004929#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004930#ifdef SO_SNDBUF
4931 PyModule_AddIntConstant(m, "SO_SNDBUF", SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004932#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004933#ifdef SO_RCVBUF
4934 PyModule_AddIntConstant(m, "SO_RCVBUF", SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004935#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004936#ifdef SO_SNDLOWAT
4937 PyModule_AddIntConstant(m, "SO_SNDLOWAT", SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004938#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004939#ifdef SO_RCVLOWAT
4940 PyModule_AddIntConstant(m, "SO_RCVLOWAT", SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004941#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004942#ifdef SO_SNDTIMEO
4943 PyModule_AddIntConstant(m, "SO_SNDTIMEO", SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004944#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004945#ifdef SO_RCVTIMEO
4946 PyModule_AddIntConstant(m, "SO_RCVTIMEO", SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004947#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004948#ifdef SO_ERROR
4949 PyModule_AddIntConstant(m, "SO_ERROR", SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004950#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004951#ifdef SO_TYPE
4952 PyModule_AddIntConstant(m, "SO_TYPE", SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004953#endif
Larry Hastings3b958e32010-04-02 11:18:17 +00004954#ifdef SO_SETFIB
4955 PyModule_AddIntConstant(m, "SO_SETFIB", SO_SETFIB);
4956#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004957
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004958 /* Maximum number of connections for "listen" */
4959#ifdef SOMAXCONN
4960 PyModule_AddIntConstant(m, "SOMAXCONN", SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004961#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004962 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004963#endif
4964
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004965 /* Flags for send, recv */
4966#ifdef MSG_OOB
4967 PyModule_AddIntConstant(m, "MSG_OOB", MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004968#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004969#ifdef MSG_PEEK
4970 PyModule_AddIntConstant(m, "MSG_PEEK", MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004971#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004972#ifdef MSG_DONTROUTE
4973 PyModule_AddIntConstant(m, "MSG_DONTROUTE", MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004974#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004975#ifdef MSG_DONTWAIT
4976 PyModule_AddIntConstant(m, "MSG_DONTWAIT", MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00004977#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004978#ifdef MSG_EOR
4979 PyModule_AddIntConstant(m, "MSG_EOR", MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004980#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004981#ifdef MSG_TRUNC
4982 PyModule_AddIntConstant(m, "MSG_TRUNC", MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004983#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004984#ifdef MSG_CTRUNC
4985 PyModule_AddIntConstant(m, "MSG_CTRUNC", MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004986#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004987#ifdef MSG_WAITALL
4988 PyModule_AddIntConstant(m, "MSG_WAITALL", MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004989#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004990#ifdef MSG_BTAG
4991 PyModule_AddIntConstant(m, "MSG_BTAG", MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004992#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004993#ifdef MSG_ETAG
4994 PyModule_AddIntConstant(m, "MSG_ETAG", MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004995#endif
4996
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004997 /* Protocol level and numbers, usable for [gs]etsockopt */
4998#ifdef SOL_SOCKET
4999 PyModule_AddIntConstant(m, "SOL_SOCKET", SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005000#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005001#ifdef SOL_IP
5002 PyModule_AddIntConstant(m, "SOL_IP", SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00005003#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005004 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00005005#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005006#ifdef SOL_IPX
5007 PyModule_AddIntConstant(m, "SOL_IPX", SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00005008#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005009#ifdef SOL_AX25
5010 PyModule_AddIntConstant(m, "SOL_AX25", SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00005011#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005012#ifdef SOL_ATALK
5013 PyModule_AddIntConstant(m, "SOL_ATALK", SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00005014#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005015#ifdef SOL_NETROM
5016 PyModule_AddIntConstant(m, "SOL_NETROM", SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00005017#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005018#ifdef SOL_ROSE
5019 PyModule_AddIntConstant(m, "SOL_ROSE", SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00005020#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005021#ifdef SOL_TCP
5022 PyModule_AddIntConstant(m, "SOL_TCP", SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00005023#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005024 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00005025#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005026#ifdef SOL_UDP
5027 PyModule_AddIntConstant(m, "SOL_UDP", SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00005028#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005029 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00005030#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005031#ifdef IPPROTO_IP
5032 PyModule_AddIntConstant(m, "IPPROTO_IP", IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00005033#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005034 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005035#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005036#ifdef IPPROTO_HOPOPTS
5037 PyModule_AddIntConstant(m, "IPPROTO_HOPOPTS", IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005038#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005039#ifdef IPPROTO_ICMP
5040 PyModule_AddIntConstant(m, "IPPROTO_ICMP", IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00005041#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005042 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005043#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005044#ifdef IPPROTO_IGMP
5045 PyModule_AddIntConstant(m, "IPPROTO_IGMP", IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005046#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005047#ifdef IPPROTO_GGP
5048 PyModule_AddIntConstant(m, "IPPROTO_GGP", IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005049#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005050#ifdef IPPROTO_IPV4
5051 PyModule_AddIntConstant(m, "IPPROTO_IPV4", IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005052#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005053#ifdef IPPROTO_IPV6
5054 PyModule_AddIntConstant(m, "IPPROTO_IPV6", IPPROTO_IPV6);
Martin v. Löwisa0f17342003-10-03 13:56:20 +00005055#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005056#ifdef IPPROTO_IPIP
5057 PyModule_AddIntConstant(m, "IPPROTO_IPIP", IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005058#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005059#ifdef IPPROTO_TCP
5060 PyModule_AddIntConstant(m, "IPPROTO_TCP", IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00005061#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005062 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005063#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005064#ifdef IPPROTO_EGP
5065 PyModule_AddIntConstant(m, "IPPROTO_EGP", IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005066#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005067#ifdef IPPROTO_PUP
5068 PyModule_AddIntConstant(m, "IPPROTO_PUP", IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005069#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005070#ifdef IPPROTO_UDP
5071 PyModule_AddIntConstant(m, "IPPROTO_UDP", IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00005072#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005073 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005074#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005075#ifdef IPPROTO_IDP
5076 PyModule_AddIntConstant(m, "IPPROTO_IDP", IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005077#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005078#ifdef IPPROTO_HELLO
5079 PyModule_AddIntConstant(m, "IPPROTO_HELLO", IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005080#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005081#ifdef IPPROTO_ND
5082 PyModule_AddIntConstant(m, "IPPROTO_ND", IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005083#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005084#ifdef IPPROTO_TP
5085 PyModule_AddIntConstant(m, "IPPROTO_TP", IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005086#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005087#ifdef IPPROTO_IPV6
5088 PyModule_AddIntConstant(m, "IPPROTO_IPV6", IPPROTO_IPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005089#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005090#ifdef IPPROTO_ROUTING
5091 PyModule_AddIntConstant(m, "IPPROTO_ROUTING", IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005092#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005093#ifdef IPPROTO_FRAGMENT
5094 PyModule_AddIntConstant(m, "IPPROTO_FRAGMENT", IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005095#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005096#ifdef IPPROTO_RSVP
5097 PyModule_AddIntConstant(m, "IPPROTO_RSVP", IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005098#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005099#ifdef IPPROTO_GRE
5100 PyModule_AddIntConstant(m, "IPPROTO_GRE", IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005101#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005102#ifdef IPPROTO_ESP
5103 PyModule_AddIntConstant(m, "IPPROTO_ESP", IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005104#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005105#ifdef IPPROTO_AH
5106 PyModule_AddIntConstant(m, "IPPROTO_AH", IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005107#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005108#ifdef IPPROTO_MOBILE
5109 PyModule_AddIntConstant(m, "IPPROTO_MOBILE", IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005110#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005111#ifdef IPPROTO_ICMPV6
5112 PyModule_AddIntConstant(m, "IPPROTO_ICMPV6", IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005113#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005114#ifdef IPPROTO_NONE
5115 PyModule_AddIntConstant(m, "IPPROTO_NONE", IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005116#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005117#ifdef IPPROTO_DSTOPTS
5118 PyModule_AddIntConstant(m, "IPPROTO_DSTOPTS", IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005119#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005120#ifdef IPPROTO_XTP
5121 PyModule_AddIntConstant(m, "IPPROTO_XTP", IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005122#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005123#ifdef IPPROTO_EON
5124 PyModule_AddIntConstant(m, "IPPROTO_EON", IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005125#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005126#ifdef IPPROTO_PIM
5127 PyModule_AddIntConstant(m, "IPPROTO_PIM", IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005128#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005129#ifdef IPPROTO_IPCOMP
5130 PyModule_AddIntConstant(m, "IPPROTO_IPCOMP", IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005131#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005132#ifdef IPPROTO_VRRP
5133 PyModule_AddIntConstant(m, "IPPROTO_VRRP", IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005134#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005135#ifdef IPPROTO_BIP
5136 PyModule_AddIntConstant(m, "IPPROTO_BIP", IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005137#endif
5138/**/
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005139#ifdef IPPROTO_RAW
5140 PyModule_AddIntConstant(m, "IPPROTO_RAW", IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00005141#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005142 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005143#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005144#ifdef IPPROTO_MAX
5145 PyModule_AddIntConstant(m, "IPPROTO_MAX", IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005146#endif
5147
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005148 /* Some port configuration */
5149#ifdef IPPORT_RESERVED
5150 PyModule_AddIntConstant(m, "IPPORT_RESERVED", IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005151#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005152 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005153#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005154#ifdef IPPORT_USERRESERVED
5155 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005156#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005157 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005158#endif
5159
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005160 /* Some reserved IP v.4 addresses */
5161#ifdef INADDR_ANY
5162 PyModule_AddIntConstant(m, "INADDR_ANY", INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005163#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005164 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005165#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005166#ifdef INADDR_BROADCAST
5167 PyModule_AddIntConstant(m, "INADDR_BROADCAST", INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005168#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005169 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005170#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005171#ifdef INADDR_LOOPBACK
5172 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005173#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005174 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005175#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005176#ifdef INADDR_UNSPEC_GROUP
5177 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005178#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005179 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005180#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005181#ifdef INADDR_ALLHOSTS_GROUP
5182 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
5183 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005184#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005185 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005186#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005187#ifdef INADDR_MAX_LOCAL_GROUP
5188 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP",
5189 INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005190#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005191 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005192#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005193#ifdef INADDR_NONE
5194 PyModule_AddIntConstant(m, "INADDR_NONE", INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005195#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005196 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005197#endif
5198
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005199 /* IPv4 [gs]etsockopt options */
5200#ifdef IP_OPTIONS
5201 PyModule_AddIntConstant(m, "IP_OPTIONS", IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005202#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005203#ifdef IP_HDRINCL
5204 PyModule_AddIntConstant(m, "IP_HDRINCL", IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005205#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005206#ifdef IP_TOS
5207 PyModule_AddIntConstant(m, "IP_TOS", IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005208#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005209#ifdef IP_TTL
5210 PyModule_AddIntConstant(m, "IP_TTL", IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005211#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005212#ifdef IP_RECVOPTS
5213 PyModule_AddIntConstant(m, "IP_RECVOPTS", IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005214#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005215#ifdef IP_RECVRETOPTS
5216 PyModule_AddIntConstant(m, "IP_RECVRETOPTS", IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005217#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005218#ifdef IP_RECVDSTADDR
5219 PyModule_AddIntConstant(m, "IP_RECVDSTADDR", IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005220#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005221#ifdef IP_RETOPTS
5222 PyModule_AddIntConstant(m, "IP_RETOPTS", IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005223#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005224#ifdef IP_MULTICAST_IF
5225 PyModule_AddIntConstant(m, "IP_MULTICAST_IF", IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005226#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005227#ifdef IP_MULTICAST_TTL
5228 PyModule_AddIntConstant(m, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005229#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005230#ifdef IP_MULTICAST_LOOP
5231 PyModule_AddIntConstant(m, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005232#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005233#ifdef IP_ADD_MEMBERSHIP
5234 PyModule_AddIntConstant(m, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005235#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005236#ifdef IP_DROP_MEMBERSHIP
5237 PyModule_AddIntConstant(m, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005238#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005239#ifdef IP_DEFAULT_MULTICAST_TTL
5240 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_TTL",
5241 IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00005242#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005243#ifdef IP_DEFAULT_MULTICAST_LOOP
5244 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_LOOP",
5245 IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00005246#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005247#ifdef IP_MAX_MEMBERSHIPS
5248 PyModule_AddIntConstant(m, "IP_MAX_MEMBERSHIPS", IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00005249#endif
5250
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005251 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
5252#ifdef IPV6_JOIN_GROUP
5253 PyModule_AddIntConstant(m, "IPV6_JOIN_GROUP", IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005254#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005255#ifdef IPV6_LEAVE_GROUP
5256 PyModule_AddIntConstant(m, "IPV6_LEAVE_GROUP", IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005257#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005258#ifdef IPV6_MULTICAST_HOPS
5259 PyModule_AddIntConstant(m, "IPV6_MULTICAST_HOPS", IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005260#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005261#ifdef IPV6_MULTICAST_IF
5262 PyModule_AddIntConstant(m, "IPV6_MULTICAST_IF", IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005263#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005264#ifdef IPV6_MULTICAST_LOOP
5265 PyModule_AddIntConstant(m, "IPV6_MULTICAST_LOOP", IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005266#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005267#ifdef IPV6_UNICAST_HOPS
5268 PyModule_AddIntConstant(m, "IPV6_UNICAST_HOPS", IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005269#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005270 /* Additional IPV6 socket options, defined in RFC 3493 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00005271#ifdef IPV6_V6ONLY
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005272 PyModule_AddIntConstant(m, "IPV6_V6ONLY", IPV6_V6ONLY);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005273#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005274 /* Advanced IPV6 socket options, from RFC 3542 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00005275#ifdef IPV6_CHECKSUM
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005276 PyModule_AddIntConstant(m, "IPV6_CHECKSUM", IPV6_CHECKSUM);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005277#endif
5278#ifdef IPV6_DONTFRAG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005279 PyModule_AddIntConstant(m, "IPV6_DONTFRAG", IPV6_DONTFRAG);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005280#endif
5281#ifdef IPV6_DSTOPTS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005282 PyModule_AddIntConstant(m, "IPV6_DSTOPTS", IPV6_DSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005283#endif
5284#ifdef IPV6_HOPLIMIT
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005285 PyModule_AddIntConstant(m, "IPV6_HOPLIMIT", IPV6_HOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005286#endif
5287#ifdef IPV6_HOPOPTS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005288 PyModule_AddIntConstant(m, "IPV6_HOPOPTS", IPV6_HOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005289#endif
5290#ifdef IPV6_NEXTHOP
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005291 PyModule_AddIntConstant(m, "IPV6_NEXTHOP", IPV6_NEXTHOP);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005292#endif
5293#ifdef IPV6_PATHMTU
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005294 PyModule_AddIntConstant(m, "IPV6_PATHMTU", IPV6_PATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005295#endif
5296#ifdef IPV6_PKTINFO
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005297 PyModule_AddIntConstant(m, "IPV6_PKTINFO", IPV6_PKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005298#endif
5299#ifdef IPV6_RECVDSTOPTS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005300 PyModule_AddIntConstant(m, "IPV6_RECVDSTOPTS", IPV6_RECVDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005301#endif
5302#ifdef IPV6_RECVHOPLIMIT
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005303 PyModule_AddIntConstant(m, "IPV6_RECVHOPLIMIT", IPV6_RECVHOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005304#endif
5305#ifdef IPV6_RECVHOPOPTS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005306 PyModule_AddIntConstant(m, "IPV6_RECVHOPOPTS", IPV6_RECVHOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005307#endif
5308#ifdef IPV6_RECVPKTINFO
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005309 PyModule_AddIntConstant(m, "IPV6_RECVPKTINFO", IPV6_RECVPKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005310#endif
5311#ifdef IPV6_RECVRTHDR
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005312 PyModule_AddIntConstant(m, "IPV6_RECVRTHDR", IPV6_RECVRTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005313#endif
5314#ifdef IPV6_RECVTCLASS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005315 PyModule_AddIntConstant(m, "IPV6_RECVTCLASS", IPV6_RECVTCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005316#endif
5317#ifdef IPV6_RTHDR
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005318 PyModule_AddIntConstant(m, "IPV6_RTHDR", IPV6_RTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005319#endif
5320#ifdef IPV6_RTHDRDSTOPTS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005321 PyModule_AddIntConstant(m, "IPV6_RTHDRDSTOPTS", IPV6_RTHDRDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005322#endif
5323#ifdef IPV6_RTHDR_TYPE_0
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005324 PyModule_AddIntConstant(m, "IPV6_RTHDR_TYPE_0", IPV6_RTHDR_TYPE_0);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005325#endif
5326#ifdef IPV6_RECVPATHMTU
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005327 PyModule_AddIntConstant(m, "IPV6_RECVPATHMTU", IPV6_RECVPATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005328#endif
5329#ifdef IPV6_TCLASS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005330 PyModule_AddIntConstant(m, "IPV6_TCLASS", IPV6_TCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005331#endif
5332#ifdef IPV6_USE_MIN_MTU
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005333 PyModule_AddIntConstant(m, "IPV6_USE_MIN_MTU", IPV6_USE_MIN_MTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005334#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005335
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005336 /* TCP options */
5337#ifdef TCP_NODELAY
5338 PyModule_AddIntConstant(m, "TCP_NODELAY", TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00005339#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005340#ifdef TCP_MAXSEG
5341 PyModule_AddIntConstant(m, "TCP_MAXSEG", TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00005342#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005343#ifdef TCP_CORK
5344 PyModule_AddIntConstant(m, "TCP_CORK", TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005345#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005346#ifdef TCP_KEEPIDLE
5347 PyModule_AddIntConstant(m, "TCP_KEEPIDLE", TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005348#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005349#ifdef TCP_KEEPINTVL
5350 PyModule_AddIntConstant(m, "TCP_KEEPINTVL", TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005351#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005352#ifdef TCP_KEEPCNT
5353 PyModule_AddIntConstant(m, "TCP_KEEPCNT", TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005354#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005355#ifdef TCP_SYNCNT
5356 PyModule_AddIntConstant(m, "TCP_SYNCNT", TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005357#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005358#ifdef TCP_LINGER2
5359 PyModule_AddIntConstant(m, "TCP_LINGER2", TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005360#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005361#ifdef TCP_DEFER_ACCEPT
5362 PyModule_AddIntConstant(m, "TCP_DEFER_ACCEPT", TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005363#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005364#ifdef TCP_WINDOW_CLAMP
5365 PyModule_AddIntConstant(m, "TCP_WINDOW_CLAMP", TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005366#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005367#ifdef TCP_INFO
5368 PyModule_AddIntConstant(m, "TCP_INFO", TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005369#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005370#ifdef TCP_QUICKACK
5371 PyModule_AddIntConstant(m, "TCP_QUICKACK", TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005372#endif
5373
Guido van Rossum09be4091999-08-09 14:40:40 +00005374
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005375 /* IPX options */
5376#ifdef IPX_TYPE
5377 PyModule_AddIntConstant(m, "IPX_TYPE", IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00005378#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005379
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005380 /* get{addr,name}info parameters */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005381#ifdef EAI_ADDRFAMILY
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005382 PyModule_AddIntConstant(m, "EAI_ADDRFAMILY", EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005383#endif
5384#ifdef EAI_AGAIN
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005385 PyModule_AddIntConstant(m, "EAI_AGAIN", EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005386#endif
5387#ifdef EAI_BADFLAGS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005388 PyModule_AddIntConstant(m, "EAI_BADFLAGS", EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005389#endif
5390#ifdef EAI_FAIL
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005391 PyModule_AddIntConstant(m, "EAI_FAIL", EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005392#endif
5393#ifdef EAI_FAMILY
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005394 PyModule_AddIntConstant(m, "EAI_FAMILY", EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005395#endif
5396#ifdef EAI_MEMORY
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005397 PyModule_AddIntConstant(m, "EAI_MEMORY", EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005398#endif
5399#ifdef EAI_NODATA
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005400 PyModule_AddIntConstant(m, "EAI_NODATA", EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005401#endif
5402#ifdef EAI_NONAME
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005403 PyModule_AddIntConstant(m, "EAI_NONAME", EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005404#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00005405#ifdef EAI_OVERFLOW
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005406 PyModule_AddIntConstant(m, "EAI_OVERFLOW", EAI_OVERFLOW);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005407#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005408#ifdef EAI_SERVICE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005409 PyModule_AddIntConstant(m, "EAI_SERVICE", EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005410#endif
5411#ifdef EAI_SOCKTYPE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005412 PyModule_AddIntConstant(m, "EAI_SOCKTYPE", EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005413#endif
5414#ifdef EAI_SYSTEM
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005415 PyModule_AddIntConstant(m, "EAI_SYSTEM", EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005416#endif
5417#ifdef EAI_BADHINTS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005418 PyModule_AddIntConstant(m, "EAI_BADHINTS", EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005419#endif
5420#ifdef EAI_PROTOCOL
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005421 PyModule_AddIntConstant(m, "EAI_PROTOCOL", EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005422#endif
5423#ifdef EAI_MAX
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005424 PyModule_AddIntConstant(m, "EAI_MAX", EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005425#endif
5426#ifdef AI_PASSIVE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005427 PyModule_AddIntConstant(m, "AI_PASSIVE", AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005428#endif
5429#ifdef AI_CANONNAME
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005430 PyModule_AddIntConstant(m, "AI_CANONNAME", AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005431#endif
5432#ifdef AI_NUMERICHOST
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005433 PyModule_AddIntConstant(m, "AI_NUMERICHOST", AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005434#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00005435#ifdef AI_NUMERICSERV
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005436 PyModule_AddIntConstant(m, "AI_NUMERICSERV", AI_NUMERICSERV);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005437#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005438#ifdef AI_MASK
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005439 PyModule_AddIntConstant(m, "AI_MASK", AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005440#endif
5441#ifdef AI_ALL
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005442 PyModule_AddIntConstant(m, "AI_ALL", AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005443#endif
5444#ifdef AI_V4MAPPED_CFG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005445 PyModule_AddIntConstant(m, "AI_V4MAPPED_CFG", AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005446#endif
5447#ifdef AI_ADDRCONFIG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005448 PyModule_AddIntConstant(m, "AI_ADDRCONFIG", AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005449#endif
5450#ifdef AI_V4MAPPED
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005451 PyModule_AddIntConstant(m, "AI_V4MAPPED", AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005452#endif
5453#ifdef AI_DEFAULT
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005454 PyModule_AddIntConstant(m, "AI_DEFAULT", AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005455#endif
5456#ifdef NI_MAXHOST
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005457 PyModule_AddIntConstant(m, "NI_MAXHOST", NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005458#endif
5459#ifdef NI_MAXSERV
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005460 PyModule_AddIntConstant(m, "NI_MAXSERV", NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005461#endif
5462#ifdef NI_NOFQDN
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005463 PyModule_AddIntConstant(m, "NI_NOFQDN", NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005464#endif
5465#ifdef NI_NUMERICHOST
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005466 PyModule_AddIntConstant(m, "NI_NUMERICHOST", NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005467#endif
5468#ifdef NI_NAMEREQD
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005469 PyModule_AddIntConstant(m, "NI_NAMEREQD", NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005470#endif
5471#ifdef NI_NUMERICSERV
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005472 PyModule_AddIntConstant(m, "NI_NUMERICSERV", NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005473#endif
5474#ifdef NI_DGRAM
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005475 PyModule_AddIntConstant(m, "NI_DGRAM", NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005476#endif
5477
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005478 /* shutdown() parameters */
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005479#ifdef SHUT_RD
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005480 PyModule_AddIntConstant(m, "SHUT_RD", SHUT_RD);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005481#elif defined(SD_RECEIVE)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005482 PyModule_AddIntConstant(m, "SHUT_RD", SD_RECEIVE);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005483#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005484 PyModule_AddIntConstant(m, "SHUT_RD", 0);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005485#endif
5486#ifdef SHUT_WR
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005487 PyModule_AddIntConstant(m, "SHUT_WR", SHUT_WR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005488#elif defined(SD_SEND)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005489 PyModule_AddIntConstant(m, "SHUT_WR", SD_SEND);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005490#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005491 PyModule_AddIntConstant(m, "SHUT_WR", 1);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005492#endif
5493#ifdef SHUT_RDWR
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005494 PyModule_AddIntConstant(m, "SHUT_RDWR", SHUT_RDWR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005495#elif defined(SD_BOTH)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005496 PyModule_AddIntConstant(m, "SHUT_RDWR", SD_BOTH);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005497#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005498 PyModule_AddIntConstant(m, "SHUT_RDWR", 2);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005499#endif
5500
Christian Heimes04ae9162008-01-04 15:23:30 +00005501#ifdef SIO_RCVALL
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005502 {
5503 DWORD codes[] = {SIO_RCVALL, SIO_KEEPALIVE_VALS};
5504 const char *names[] = {"SIO_RCVALL", "SIO_KEEPALIVE_VALS"};
5505 int i;
5506 for(i = 0; i<sizeof(codes)/sizeof(*codes); ++i) {
5507 PyObject *tmp;
5508 tmp = PyLong_FromUnsignedLong(codes[i]);
5509 if (tmp == NULL)
5510 return;
5511 PyModule_AddObject(m, names[i], tmp);
5512 }
5513 }
5514 PyModule_AddIntConstant(m, "RCVALL_OFF", RCVALL_OFF);
5515 PyModule_AddIntConstant(m, "RCVALL_ON", RCVALL_ON);
5516 PyModule_AddIntConstant(m, "RCVALL_SOCKETLEVELONLY", RCVALL_SOCKETLEVELONLY);
Amaury Forgeot d'Arc94eba712008-03-28 21:55:29 +00005517#ifdef RCVALL_IPLEVEL
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005518 PyModule_AddIntConstant(m, "RCVALL_IPLEVEL", RCVALL_IPLEVEL);
Amaury Forgeot d'Arc94eba712008-03-28 21:55:29 +00005519#endif
5520#ifdef RCVALL_MAX
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005521 PyModule_AddIntConstant(m, "RCVALL_MAX", RCVALL_MAX);
Amaury Forgeot d'Arc94eba712008-03-28 21:55:29 +00005522#endif
Christian Heimes04ae9162008-01-04 15:23:30 +00005523#endif /* _MSTCPIP_ */
5524
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005525 /* Initialize gethostbyname lock */
Just van Rossum1040d2c2003-05-09 07:53:18 +00005526#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005527 netdb_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005528#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005529}
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005530
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005531
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005532#ifndef HAVE_INET_PTON
Christian Heimese8954f82007-11-22 11:21:16 +00005533#if !defined(NTDDI_VERSION) || (NTDDI_VERSION < NTDDI_LONGHORN)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005534
5535/* Simplistic emulation code for inet_pton that only works for IPv4 */
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005536/* These are not exposed because they do not set errno properly */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005537
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005538int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005539inet_pton(int af, const char *src, void *dst)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005540{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005541 if (af == AF_INET) {
Gregory P. Smith3605b5c2009-02-11 23:45:25 +00005542#if (SIZEOF_INT != 4)
5543#error "Not sure if in_addr_t exists and int is not 32-bits."
5544#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005545 unsigned int packed_addr;
5546 packed_addr = inet_addr(src);
5547 if (packed_addr == INADDR_NONE)
5548 return 0;
5549 memcpy(dst, &packed_addr, 4);
5550 return 1;
5551 }
5552 /* Should set errno to EAFNOSUPPORT */
5553 return -1;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005554}
5555
Martin v. Löwisc925b1532001-07-21 09:42:15 +00005556const char *
5557inet_ntop(int af, const void *src, char *dst, socklen_t size)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005558{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005559 if (af == AF_INET) {
5560 struct in_addr packed_addr;
5561 if (size < 16)
5562 /* Should set errno to ENOSPC. */
5563 return NULL;
5564 memcpy(&packed_addr, src, sizeof(packed_addr));
5565 return strncpy(dst, inet_ntoa(packed_addr), size);
5566 }
5567 /* Should set errno to EAFNOSUPPORT */
5568 return NULL;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005569}
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005570
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005571#endif
Christian Heimese8954f82007-11-22 11:21:16 +00005572#endif