blob: cdefc58d7870cea64aa428d8744c28921a92005b [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
Martin v. Löwis11017b12006-01-14 18:12:57 +000010 portable manner, though AF_PACKET and AF_NETLINK are supported under Linux.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000011- No read/write operations (use sendall/recv or makefile instead).
12- Additional restrictions apply on some non-Unix platforms (compensated
13 for by socket.py).
Guido van Rossum6574b3e1991-06-25 21:36:08 +000014
Guido van Rossum27e177d1995-03-16 15:43:47 +000015Module interface:
Guido van Rossum6574b3e1991-06-25 21:36:08 +000016
Guido van Rossum27e177d1995-03-16 15:43:47 +000017- socket.error: exception raised for socket specific errors
Martin v. Löwis2d8d4272001-07-21 18:05:31 +000018- socket.gaierror: exception raised for getaddrinfo/getnameinfo errors,
19 a subclass of socket.error
20- socket.herror: exception raised for gethostby* errors,
21 a subclass of socket.error
Guido van Rossum83a072d2002-09-03 19:10:18 +000022- socket.fromfd(fd, family, type[, proto]) --> new socket object (created
23 from an existing file descriptor)
Guido van Rossum30a685f1991-06-27 15:51:29 +000024- socket.gethostbyname(hostname) --> host IP address (string: 'dd.dd.dd.dd')
Guido van Rossum3bbc62e1995-01-02 19:30:30 +000025- socket.gethostbyaddr(IP address) --> (hostname, [alias, ...], [IP addr, ...])
Guido van Rossum27e177d1995-03-16 15:43:47 +000026- socket.gethostname() --> host name (string: 'spam' or 'spam.domain.com')
Guido van Rossum25405c71996-12-19 16:42:52 +000027- socket.getprotobyname(protocolname) --> protocol number
Barry Warsaw11b91a02004-06-28 00:50:43 +000028- socket.getservbyname(servicename[, protocolname]) --> port number
29- socket.getservbyport(portnumber[, protocolname]) --> service name
Guido van Rossum83a072d2002-09-03 19:10:18 +000030- socket.socket([family[, type [, proto]]]) --> new socket object
Dave Cole331708b2004-08-09 04:51:41 +000031- socket.socketpair([family[, type [, proto]]]) --> (socket, socket)
Guido van Rossum006bf911996-06-12 04:04:55 +000032- socket.ntohs(16 bit value) --> new int object
33- socket.ntohl(32 bit value) --> new int object
34- socket.htons(16 bit value) --> new int object
35- socket.htonl(32 bit value) --> new int object
Martin v. Löwis2d8d4272001-07-21 18:05:31 +000036- socket.getaddrinfo(host, port [, family, socktype, proto, flags])
37 --> List of (family, socktype, proto, canonname, sockaddr)
38- socket.getnameinfo(sockaddr, flags) --> (host, port)
Guido van Rossum27e177d1995-03-16 15:43:47 +000039- socket.AF_INET, socket.SOCK_STREAM, etc.: constants from <socket.h>
Guido van Rossum47dfa4a2003-04-25 05:48:32 +000040- socket.has_ipv6: boolean value indicating if IPv6 is supported
Guido van Rossum5c9eb211999-08-20 18:21:51 +000041- socket.inet_aton(IP address) -> 32-bit packed IP representation
42- socket.inet_ntoa(packed IP) -> IP address string
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +000043- socket.getdefaulttimeout() -> None | float
44- socket.setdefaulttimeout(None | float)
Guido van Rossum6574b3e1991-06-25 21:36:08 +000045- an Internet socket address is a pair (hostname, port)
46 where hostname can be anything recognized by gethostbyname()
47 (including the dd.dd.dd.dd notation) and port is in host byte order
48- where a hostname is returned, the dd.dd.dd.dd notation is used
Guido van Rossum27e177d1995-03-16 15:43:47 +000049- a UNIX domain socket address is a string specifying the pathname
Jeremy Hylton22308652001-02-02 03:23:09 +000050- an AF_PACKET socket address is a tuple containing a string
51 specifying the ethernet interface and an integer specifying
52 the Ethernet protocol number to be received. For example:
Jeremy Hyltondbfb6622001-02-02 19:55:17 +000053 ("eth0",0x1234). Optional 3rd,4th,5th elements in the tuple
Andrew M. Kuchlingb8e17172004-07-10 23:39:35 +000054 specify packet-type and ha-type/addr.
Guido van Rossum6574b3e1991-06-25 21:36:08 +000055
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000056Local naming conventions:
Guido van Rossum6574b3e1991-06-25 21:36:08 +000057
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000058- names starting with sock_ are socket object methods
59- names starting with socket_ are module-level functions
60- names starting with PySocket are exported through socketmodule.h
Guido van Rossum30a685f1991-06-27 15:51:29 +000061
Guido van Rossum6574b3e1991-06-25 21:36:08 +000062*/
63
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000064#include "Python.h"
65
Guido van Rossum47dfa4a2003-04-25 05:48:32 +000066#undef MAX
67#define MAX(x, y) ((x) < (y) ? (y) : (x))
68
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000069/* Socket object documentation */
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000070PyDoc_STRVAR(sock_doc,
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000071"socket([family[, type[, proto]]]) -> socket object\n\
72\n\
73Open a socket of the given type. The family argument specifies the\n\
74address family; it defaults to AF_INET. The type argument specifies\n\
75whether this is a stream (SOCK_STREAM, this is the default)\n\
76or datagram (SOCK_DGRAM) socket. The protocol argument defaults to 0,\n\
77specifying the default protocol. Keyword arguments are accepted.\n\
78\n\
79A socket object represents one endpoint of a network connection.\n\
80\n\
81Methods of socket objects (keyword arguments not allowed):\n\
82\n\
83accept() -- accept a connection, returning new socket and client address\n\
84bind(addr) -- bind the socket to a local address\n\
85close() -- close the socket\n\
86connect(addr) -- connect the socket to a remote address\n\
87connect_ex(addr) -- connect, return an error code instead of an exception\n\
88dup() -- return a new socket object identical to the current one [*]\n\
89fileno() -- return underlying file descriptor\n\
90getpeername() -- return remote address [*]\n\
91getsockname() -- return local address\n\
92getsockopt(level, optname[, buflen]) -- get socket options\n\
93gettimeout() -- return timeout or None\n\
94listen(n) -- start listening for incoming connections\n\
95makefile([mode, [bufsize]]) -- return a file object for the socket [*]\n\
96recv(buflen[, flags]) -- receive data\n\
97recvfrom(buflen[, flags]) -- receive data and sender's address\n\
98sendall(data[, flags]) -- send all data\n\
99send(data[, flags]) -- send data, may not send all of it\n\
100sendto(data[, flags], addr) -- send data to a given address\n\
101setblocking(0 | 1) -- set or clear the blocking I/O flag\n\
102setsockopt(level, optname, value) -- set socket options\n\
103settimeout(None | float) -- set or clear the timeout\n\
104shutdown(how) -- shut down traffic in one or both directions\n\
105\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000106 [*] not available on all platforms!");
Guido van Rossum3baaa131999-03-22 21:44:51 +0000107
Walter Dörwaldf0dfc7a2003-10-20 14:01:56 +0000108/* XXX This is a terrible mess of platform-dependent preprocessor hacks.
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000109 I hope some day someone can clean this up please... */
110
Guido van Rossum9376b741999-09-15 22:01:40 +0000111/* Hacks for gethostbyname_r(). On some non-Linux platforms, the configure
112 script doesn't get this right, so we hardcode some platform checks below.
113 On the other hand, not all Linux versions agree, so there the settings
114 computed by the configure script are needed! */
115
116#ifndef linux
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000117# undef HAVE_GETHOSTBYNAME_R_3_ARG
118# undef HAVE_GETHOSTBYNAME_R_5_ARG
119# undef HAVE_GETHOSTBYNAME_R_6_ARG
Guido van Rossum9376b741999-09-15 22:01:40 +0000120#endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000121
Guido van Rossum7a122991999-04-13 04:07:32 +0000122#ifndef WITH_THREAD
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000123# undef HAVE_GETHOSTBYNAME_R
Guido van Rossum7a122991999-04-13 04:07:32 +0000124#endif
125
Guido van Rossume7de2061999-03-24 17:24:33 +0000126#ifdef HAVE_GETHOSTBYNAME_R
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000127# if defined(_AIX) || defined(__osf__)
128# define HAVE_GETHOSTBYNAME_R_3_ARG
129# elif defined(__sun) || defined(__sgi)
130# define HAVE_GETHOSTBYNAME_R_5_ARG
131# elif defined(linux)
Guido van Rossum9376b741999-09-15 22:01:40 +0000132/* Rely on the configure script */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000133# else
134# undef HAVE_GETHOSTBYNAME_R
135# endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000136#endif
137
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000138#if !defined(HAVE_GETHOSTBYNAME_R) && defined(WITH_THREAD) && \
139 !defined(MS_WINDOWS)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000140# define USE_GETHOSTBYNAME_LOCK
Guido van Rossum3baaa131999-03-22 21:44:51 +0000141#endif
142
Hye-Shik Chang9ceebd52005-09-24 14:58:47 +0000143/* To use __FreeBSD_version */
144#ifdef HAVE_SYS_PARAM_H
145#include <sys/param.h>
146#endif
Just van Rossum1040d2c2003-05-09 07:53:18 +0000147/* On systems on which getaddrinfo() is believed to not be thread-safe,
Just van Rossum09aecd72003-05-09 08:03:44 +0000148 (this includes the getaddrinfo emulation) protect access with a lock. */
Hye-Shik Chang9ceebd52005-09-24 14:58:47 +0000149#if defined(WITH_THREAD) && (defined(__APPLE__) || \
150 (defined(__FreeBSD__) && __FreeBSD_version+0 < 503000) || \
Just van Rossum16e426b2003-05-09 08:12:00 +0000151 defined(__OpenBSD__) || defined(__NetBSD__) || !defined(HAVE_GETADDRINFO))
Just van Rossum1040d2c2003-05-09 07:53:18 +0000152#define USE_GETADDRINFO_LOCK
153#endif
154
155#ifdef USE_GETADDRINFO_LOCK
156#define ACQUIRE_GETADDRINFO_LOCK PyThread_acquire_lock(netdb_lock, 1);
157#define RELEASE_GETADDRINFO_LOCK PyThread_release_lock(netdb_lock);
158#else
159#define ACQUIRE_GETADDRINFO_LOCK
160#define RELEASE_GETADDRINFO_LOCK
161#endif
162
163#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000164# include "pythread.h"
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000165#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000166
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000167#if defined(PYCC_VACPP)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000168# include <types.h>
169# include <io.h>
170# include <sys/ioctl.h>
171# include <utils.h>
172# include <ctype.h>
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000173#endif
174
Martin v. Löwis9e437302002-12-06 12:57:26 +0000175#if defined(__VMS)
176#if ! defined(_SOCKADDR_LEN)
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000177# ifdef getaddrinfo
178# undef getaddrinfo
179# endif
180# include "TCPIP_IOCTL_ROUTINE"
181#else
182# include <ioctl.h>
183#endif
Martin v. Löwis9e437302002-12-06 12:57:26 +0000184#endif
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000185
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000186#if defined(PYOS_OS2)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000187# define INCL_DOS
188# define INCL_DOSERRORS
189# define INCL_NOPMAPI
190# include <os2.h>
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000191#endif
192
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000193#if defined(__sgi) && _COMPILER_VERSION>700 && !_SGIAPI
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000194/* make sure that the reentrant (gethostbyaddr_r etc)
195 functions are declared correctly if compiling with
196 MIPSPro 7.x in ANSI C mode (default) */
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000197
198/* XXX Using _SGIAPI is the wrong thing,
199 but I don't know what the right thing is. */
Trent Mick8ea5bdf2004-09-13 17:48:41 +0000200#undef _SGIAPI /* to avoid warning */
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000201#define _SGIAPI 1
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000202
Trent Mick8ea5bdf2004-09-13 17:48:41 +0000203#undef _XOPEN_SOURCE
204#include <sys/socket.h>
205#include <sys/types.h>
206#include <netinet/in.h>
207#ifdef _SS_ALIGNSIZE
208#define HAVE_GETADDRINFO 1
209#define HAVE_GETNAMEINFO 1
210#endif
211
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000212#define HAVE_INET_PTON
213#include <netdb.h>
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000214#endif
215
Anthony Baxterbab23cf2003-10-04 08:00:49 +0000216/* Irix 6.5 fails to define this variable at all. This is needed
217 for both GCC and SGI's compiler. I'd say that the SGI headers
218 are just busted. */
219#if defined(__sgi) && !defined(INET_ADDRSTRLEN)
220#define INET_ADDRSTRLEN 16
221#endif
222
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000223/* Generic includes */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000224#include <sys/types.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000225
Marc-André Lemburg976ade62002-02-16 18:47:07 +0000226/* Generic socket object definitions and includes */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000227#define PySocket_BUILDING_SOCKET
Marc-André Lemburgbb8b78b2002-02-16 18:44:52 +0000228#include "socketmodule.h"
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000229
230/* Addressing includes */
231
Guido van Rossum6f489d91996-06-28 20:15:15 +0000232#ifndef MS_WINDOWS
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000233
234/* Non-MS WINDOWS includes */
235# include <netdb.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000236
Guido van Rossum9376b741999-09-15 22:01:40 +0000237/* Headers needed for inet_ntoa() and inet_addr() */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000238# ifdef __BEOS__
239# include <net/netdb.h>
240# elif defined(PYOS_OS2) && defined(PYCC_VACPP)
241# include <netdb.h>
Tim Peters603c6832001-11-05 02:45:59 +0000242typedef size_t socklen_t;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000243# else
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000244# include <arpa/inet.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000245# endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000246
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000247# ifndef RISCOS
248# include <fcntl.h>
249# else
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000250# include <sys/ioctl.h>
251# include <socklib.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000252# define NO_DUP
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000253int h_errno; /* not used */
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000254# define INET_ADDRSTRLEN 16
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000255# endif
256
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000257#else
Guido van Rossum48a680c2001-03-02 06:34:14 +0000258
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000259/* MS_WINDOWS includes */
260# include <fcntl.h>
Guido van Rossum48a680c2001-03-02 06:34:14 +0000261
Jeremy Hylton22308652001-02-02 03:23:09 +0000262#endif
263
Skip Montanaro7befb992004-02-10 16:50:21 +0000264#include <stddef.h>
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000265
266#ifndef offsetof
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000267# define offsetof(type, member) ((size_t)(&((type *)0)->member))
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000268#endif
269
Neal Norwitz39d22e52002-11-02 19:55:21 +0000270#ifndef O_NONBLOCK
271# define O_NONBLOCK O_NDELAY
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000272#endif
273
Trent Micka708d6e2004-09-07 17:48:26 +0000274/* include Python's addrinfo.h unless it causes trouble */
275#if defined(__sgi) && _COMPILER_VERSION>700 && defined(_SS_ALIGNSIZE)
276 /* Do not include addinfo.h on some newer IRIX versions.
277 * _SS_ALIGNSIZE is defined in sys/socket.h by 6.5.21,
278 * for example, but not by 6.5.10.
279 */
280#elif defined(_MSC_VER) && _MSC_VER>1200
281 /* Do not include addrinfo.h for MSVC7 or greater. 'addrinfo' and
282 * EAI_* constants are defined in (the already included) ws2tcpip.h.
283 */
284#else
285# include "addrinfo.h"
286#endif
Jason Tishlerc246cb72004-08-09 13:25:59 +0000287
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000288#ifndef HAVE_INET_PTON
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000289int inet_pton(int af, const char *src, void *dst);
Martin v. Löwisc925b1532001-07-21 09:42:15 +0000290const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000291#endif
292
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000293#ifdef __APPLE__
294/* On OS X, getaddrinfo returns no error indication of lookup
295 failure, so we must use the emulation instead of the libinfo
296 implementation. Unfortunately, performing an autoconf test
297 for this bug would require DNS access for the machine performing
298 the configuration, which is not acceptable. Therefore, we
299 determine the bug just by checking for __APPLE__. If this bug
300 gets ever fixed, perhaps checking for sys/version.h would be
301 appropriate, which is 10/0 on the system with the bug. */
Jack Jansen84262fb2002-07-02 14:40:42 +0000302#ifndef HAVE_GETNAMEINFO
303/* This bug seems to be fixed in Jaguar. Ths easiest way I could
304 Find to check for Jaguar is that it has getnameinfo(), which
305 older releases don't have */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000306#undef HAVE_GETADDRINFO
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000307#endif
Jack Jansen84262fb2002-07-02 14:40:42 +0000308#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000309
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000310/* I know this is a bad practice, but it is the easiest... */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000311#if !defined(HAVE_GETADDRINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000312/* avoid clashes with the C library definition of the symbol. */
313#define getaddrinfo fake_getaddrinfo
314#define gai_strerror fake_gai_strerror
315#define freeaddrinfo fake_freeaddrinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000316#include "getaddrinfo.c"
317#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000318#if !defined(HAVE_GETNAMEINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000319#define getnameinfo fake_getnameinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000320#include "getnameinfo.c"
321#endif
322
Guido van Rossumbcc20741998-08-04 22:53:56 +0000323#if defined(MS_WINDOWS) || defined(__BEOS__)
324/* BeOS suffers from the same socket dichotomy as Win32... - [cjh] */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000325/* seem to be a few differences in the API */
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000326#define SOCKETCLOSE closesocket
Guido van Rossumbe32c891996-06-20 16:25:29 +0000327#define NO_DUP /* Actually it exists on NT 3.5, but what the heck... */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000328#endif
329
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000330#ifdef MS_WIN32
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000331#define EAFNOSUPPORT WSAEAFNOSUPPORT
332#define snprintf _snprintf
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000333#endif
Fred Drakea04eaad2000-06-30 02:46:07 +0000334
Andrew MacIntyreba43e872002-03-03 03:03:52 +0000335#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000336#define SOCKETCLOSE soclose
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000337#define NO_DUP /* Sockets are Not Actual File Handles under OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000338#endif
339
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000340#ifndef SOCKETCLOSE
341#define SOCKETCLOSE close
342#endif
343
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000344#ifdef __VMS
345/* TCP/IP Services for VMS uses a maximum send/revc buffer length of 65535 */
346#define SEGMENT_SIZE 65535
347#endif
348
Hye-Shik Chang81268602004-02-02 06:05:24 +0000349#if defined(HAVE_BLUETOOTH_H) || defined(HAVE_BLUETOOTH_BLUETOOTH_H)
350#define USE_BLUETOOTH 1
351#if defined(__FreeBSD__)
352#define BTPROTO_L2CAP BLUETOOTH_PROTO_L2CAP
353#define BTPROTO_RFCOMM BLUETOOTH_PROTO_RFCOMM
354#define sockaddr_l2 sockaddr_l2cap
355#define sockaddr_rc sockaddr_rfcomm
356#define _BT_SOCKADDR_MEMB(s, proto) &((s)->sock_addr)
357#define _BT_L2_MEMB(sa, memb) ((sa)->l2cap_##memb)
358#define _BT_RC_MEMB(sa, memb) ((sa)->rfcomm_##memb)
359#else
Anthony Baxter5d7c0672004-02-16 05:35:28 +0000360#define _BT_SOCKADDR_MEMB(s, proto) (&((s)->sock_addr).bt_##proto)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000361#define _BT_L2_MEMB(sa, memb) ((sa)->l2_##memb)
362#define _BT_RC_MEMB(sa, memb) ((sa)->rc_##memb)
363#define _BT_SCO_MEMB(sa, memb) ((sa)->sco_##memb)
364#endif
365#endif
366
Martin v. Löwise9416172003-05-03 10:12:45 +0000367/*
368 * Constants for getnameinfo()
369 */
370#if !defined(NI_MAXHOST)
371#define NI_MAXHOST 1025
372#endif
373#if !defined(NI_MAXSERV)
374#define NI_MAXSERV 32
375#endif
376
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000377/* XXX There's a problem here: *static* functions are not supposed to have
378 a Py prefix (or use CapitalizedWords). Later... */
379
Guido van Rossum30a685f1991-06-27 15:51:29 +0000380/* Global variable holding the exception type for errors detected
381 by this module (but not argument type or memory errors, etc.). */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000382static PyObject *socket_error;
383static PyObject *socket_herror;
384static PyObject *socket_gaierror;
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000385static PyObject *socket_timeout;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000386
Guido van Rossum48a680c2001-03-02 06:34:14 +0000387#ifdef RISCOS
388/* Global variable which is !=0 if Python is running in a RISC OS taskwindow */
389static int taskwindow;
390#endif
391
Tim Peters643a7fc2002-02-17 04:13:21 +0000392/* A forward reference to the socket type object.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000393 The sock_type variable contains pointers to various functions,
394 some of which call new_sockobject(), which uses sock_type, so
Tim Peters643a7fc2002-02-17 04:13:21 +0000395 there has to be a circular reference. */
Jeremy Hylton938ace62002-07-17 16:30:39 +0000396static PyTypeObject sock_type;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000397
Guido van Rossum30a685f1991-06-27 15:51:29 +0000398/* Convenience function to raise an error according to errno
399 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000400
Guido van Rossum73624e91994-10-10 17:59:00 +0000401static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000402set_error(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000403{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000404#ifdef MS_WINDOWS
Mark Hammond46a733d2000-07-24 01:45:11 +0000405 int err_no = WSAGetLastError();
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000406 static struct {
407 int no;
408 const char *msg;
409 } *msgp, msgs[] = {
410 {WSAEINTR, "Interrupted system call"},
411 {WSAEBADF, "Bad file descriptor"},
412 {WSAEACCES, "Permission denied"},
413 {WSAEFAULT, "Bad address"},
414 {WSAEINVAL, "Invalid argument"},
415 {WSAEMFILE, "Too many open files"},
416 {WSAEWOULDBLOCK,
417 "The socket operation could not complete "
418 "without blocking"},
419 {WSAEINPROGRESS, "Operation now in progress"},
420 {WSAEALREADY, "Operation already in progress"},
421 {WSAENOTSOCK, "Socket operation on non-socket"},
422 {WSAEDESTADDRREQ, "Destination address required"},
423 {WSAEMSGSIZE, "Message too long"},
424 {WSAEPROTOTYPE, "Protocol wrong type for socket"},
425 {WSAENOPROTOOPT, "Protocol not available"},
426 {WSAEPROTONOSUPPORT, "Protocol not supported"},
427 {WSAESOCKTNOSUPPORT, "Socket type not supported"},
428 {WSAEOPNOTSUPP, "Operation not supported"},
429 {WSAEPFNOSUPPORT, "Protocol family not supported"},
430 {WSAEAFNOSUPPORT, "Address family not supported"},
431 {WSAEADDRINUSE, "Address already in use"},
432 {WSAEADDRNOTAVAIL, "Can't assign requested address"},
433 {WSAENETDOWN, "Network is down"},
434 {WSAENETUNREACH, "Network is unreachable"},
435 {WSAENETRESET, "Network dropped connection on reset"},
436 {WSAECONNABORTED, "Software caused connection abort"},
437 {WSAECONNRESET, "Connection reset by peer"},
438 {WSAENOBUFS, "No buffer space available"},
439 {WSAEISCONN, "Socket is already connected"},
440 {WSAENOTCONN, "Socket is not connected"},
441 {WSAESHUTDOWN, "Can't send after socket shutdown"},
442 {WSAETOOMANYREFS, "Too many references: can't splice"},
443 {WSAETIMEDOUT, "Operation timed out"},
444 {WSAECONNREFUSED, "Connection refused"},
445 {WSAELOOP, "Too many levels of symbolic links"},
446 {WSAENAMETOOLONG, "File name too long"},
447 {WSAEHOSTDOWN, "Host is down"},
448 {WSAEHOSTUNREACH, "No route to host"},
449 {WSAENOTEMPTY, "Directory not empty"},
450 {WSAEPROCLIM, "Too many processes"},
451 {WSAEUSERS, "Too many users"},
452 {WSAEDQUOT, "Disc quota exceeded"},
453 {WSAESTALE, "Stale NFS file handle"},
454 {WSAEREMOTE, "Too many levels of remote in path"},
455 {WSASYSNOTREADY, "Network subsystem is unvailable"},
456 {WSAVERNOTSUPPORTED, "WinSock version is not supported"},
457 {WSANOTINITIALISED,
458 "Successful WSAStartup() not yet performed"},
459 {WSAEDISCON, "Graceful shutdown in progress"},
460 /* Resolver errors */
461 {WSAHOST_NOT_FOUND, "No such host is known"},
462 {WSATRY_AGAIN, "Host not found, or server failed"},
463 {WSANO_RECOVERY, "Unexpected server error encountered"},
464 {WSANO_DATA, "Valid name without requested data"},
465 {WSANO_ADDRESS, "No address, look for MX record"},
466 {0, NULL}
467 };
Mark Hammond46a733d2000-07-24 01:45:11 +0000468 if (err_no) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000469 PyObject *v;
Mark Hammond46a733d2000-07-24 01:45:11 +0000470 const char *msg = "winsock error";
Guido van Rossum48a680c2001-03-02 06:34:14 +0000471
Mark Hammond46a733d2000-07-24 01:45:11 +0000472 for (msgp = msgs; msgp->msg; msgp++) {
473 if (err_no == msgp->no) {
474 msg = msgp->msg;
475 break;
476 }
477 }
478
479 v = Py_BuildValue("(is)", err_no, msg);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000480 if (v != NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000481 PyErr_SetObject(socket_error, v);
Guido van Rossum73624e91994-10-10 17:59:00 +0000482 Py_DECREF(v);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000483 }
484 return NULL;
485 }
486 else
487#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000488
Andrew MacIntyreba43e872002-03-03 03:03:52 +0000489#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000490 if (sock_errno() != NO_ERROR) {
491 APIRET rc;
492 ULONG msglen;
493 char outbuf[100];
494 int myerrorcode = sock_errno();
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000495
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000496 /* Retrieve socket-related error message from MPTN.MSG file */
497 rc = DosGetMessage(NULL, 0, outbuf, sizeof(outbuf),
498 myerrorcode - SOCBASEERR + 26,
499 "mptn.msg",
500 &msglen);
501 if (rc == NO_ERROR) {
502 PyObject *v;
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000503
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000504 /* OS/2 doesn't guarantee a terminator */
505 outbuf[msglen] = '\0';
506 if (strlen(outbuf) > 0) {
507 /* If non-empty msg, trim CRLF */
508 char *lastc = &outbuf[ strlen(outbuf)-1 ];
Neal Norwitz30b5c5d2005-12-19 06:05:18 +0000509 while (lastc > outbuf &&
510 isspace(Py_CHARMASK(*lastc))) {
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000511 /* Trim trailing whitespace (CRLF) */
512 *lastc-- = '\0';
513 }
514 }
515 v = Py_BuildValue("(is)", myerrorcode, outbuf);
516 if (v != NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000517 PyErr_SetObject(socket_error, v);
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000518 Py_DECREF(v);
519 }
520 return NULL;
521 }
522 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000523#endif
524
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000525#if defined(RISCOS)
526 if (_inet_error.errnum != NULL) {
527 PyObject *v;
528 v = Py_BuildValue("(is)", errno, _inet_err());
529 if (v != NULL) {
530 PyErr_SetObject(socket_error, v);
531 Py_DECREF(v);
532 }
533 return NULL;
534 }
535#endif
536
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000537 return PyErr_SetFromErrno(socket_error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000538}
539
Guido van Rossum30a685f1991-06-27 15:51:29 +0000540
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000541static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000542set_herror(int h_error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000543{
544 PyObject *v;
545
546#ifdef HAVE_HSTRERROR
547 v = Py_BuildValue("(is)", h_error, (char *)hstrerror(h_error));
548#else
549 v = Py_BuildValue("(is)", h_error, "host not found");
550#endif
551 if (v != NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000552 PyErr_SetObject(socket_herror, v);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000553 Py_DECREF(v);
554 }
555
556 return NULL;
557}
558
559
560static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000561set_gaierror(int error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000562{
563 PyObject *v;
564
Martin v. Löwis272cb402002-03-01 08:31:07 +0000565#ifdef EAI_SYSTEM
566 /* EAI_SYSTEM is not available on Windows XP. */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000567 if (error == EAI_SYSTEM)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000568 return set_error();
Martin v. Löwis272cb402002-03-01 08:31:07 +0000569#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000570
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000571#ifdef HAVE_GAI_STRERROR
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000572 v = Py_BuildValue("(is)", error, gai_strerror(error));
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000573#else
574 v = Py_BuildValue("(is)", error, "getaddrinfo failed");
575#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000576 if (v != NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000577 PyErr_SetObject(socket_gaierror, v);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000578 Py_DECREF(v);
579 }
580
581 return NULL;
582}
583
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000584/* Function to perform the setting of socket blocking mode
585 internally. block = (1 | 0). */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000586static int
587internal_setblocking(PySocketSockObject *s, int block)
588{
589#ifndef RISCOS
590#ifndef MS_WINDOWS
591 int delay_flag;
592#endif
593#endif
594
595 Py_BEGIN_ALLOW_THREADS
596#ifdef __BEOS__
597 block = !block;
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000598 setsockopt(s->sock_fd, SOL_SOCKET, SO_NONBLOCK,
599 (void *)(&block), sizeof(int));
Guido van Rossum67f7a382002-06-06 21:08:16 +0000600#else
601#ifndef RISCOS
602#ifndef MS_WINDOWS
603#if defined(PYOS_OS2) && !defined(PYCC_GCC)
604 block = !block;
605 ioctl(s->sock_fd, FIONBIO, (caddr_t)&block, sizeof(block));
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000606#elif defined(__VMS)
607 block = !block;
608 ioctl(s->sock_fd, FIONBIO, (char *)&block);
609#else /* !PYOS_OS2 && !_VMS */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000610 delay_flag = fcntl(s->sock_fd, F_GETFL, 0);
611 if (block)
Neal Norwitz39d22e52002-11-02 19:55:21 +0000612 delay_flag &= (~O_NONBLOCK);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000613 else
Neal Norwitz39d22e52002-11-02 19:55:21 +0000614 delay_flag |= O_NONBLOCK;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000615 fcntl(s->sock_fd, F_SETFL, delay_flag);
616#endif /* !PYOS_OS2 */
617#else /* MS_WINDOWS */
618 block = !block;
619 ioctlsocket(s->sock_fd, FIONBIO, (u_long*)&block);
620#endif /* MS_WINDOWS */
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000621#else /* RISCOS */
622 block = !block;
623 socketioctl(s->sock_fd, FIONBIO, (u_long*)&block);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000624#endif /* RISCOS */
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000625#endif /* __BEOS__ */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000626 Py_END_ALLOW_THREADS
627
628 /* Since these don't return anything */
629 return 1;
630}
631
Guido van Rossum11ba0942002-06-13 15:07:44 +0000632/* Do a select() on the socket, if necessary (sock_timeout > 0).
633 The argument writing indicates the direction.
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000634 This does not raise an exception; we'll let our caller do that
635 after they've reacquired the interpreter lock.
636 Returns 1 on timeout, 0 otherwise. */
637static int
Guido van Rossumb9e916a2002-06-07 01:42:47 +0000638internal_select(PySocketSockObject *s, int writing)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000639{
640 fd_set fds;
641 struct timeval tv;
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000642 int n;
Guido van Rossum11ba0942002-06-13 15:07:44 +0000643
Guido van Rossumad654902002-07-19 12:44:59 +0000644 /* Nothing to do unless we're in timeout mode (not non-blocking) */
Guido van Rossum11ba0942002-06-13 15:07:44 +0000645 if (s->sock_timeout <= 0.0)
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000646 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000647
Guido van Rossumad654902002-07-19 12:44:59 +0000648 /* Guard against closed socket */
649 if (s->sock_fd < 0)
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000650 return 0;
Guido van Rossumad654902002-07-19 12:44:59 +0000651
Guido van Rossum67f7a382002-06-06 21:08:16 +0000652 /* Construct the arguments to select */
653 tv.tv_sec = (int)s->sock_timeout;
Guido van Rossumb9e916a2002-06-07 01:42:47 +0000654 tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000655 FD_ZERO(&fds);
656 FD_SET(s->sock_fd, &fds);
657
658 /* See if the socket is ready */
Guido van Rossumb9e916a2002-06-07 01:42:47 +0000659 if (writing)
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000660 n = select(s->sock_fd+1, NULL, &fds, NULL, &tv);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000661 else
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000662 n = select(s->sock_fd+1, &fds, NULL, NULL, &tv);
663 if (n == 0)
664 return 1;
665 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000666}
667
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000668/* Initialize a new socket object. */
669
Tim Petersa12b4cf2002-07-18 22:38:44 +0000670static double defaulttimeout = -1.0; /* Default timeout for new sockets */
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000671
Mark Hammond62b1ab12002-07-23 06:31:15 +0000672PyMODINIT_FUNC
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000673init_sockobject(PySocketSockObject *s,
674 SOCKET_T fd, int family, int type, int proto)
675{
676#ifdef RISCOS
677 int block = 1;
678#endif
679 s->sock_fd = fd;
680 s->sock_family = family;
681 s->sock_type = type;
682 s->sock_proto = proto;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000683 s->sock_timeout = defaulttimeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000684
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000685 s->errorhandler = &set_error;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000686
687 if (defaulttimeout >= 0.0)
688 internal_setblocking(s, 0);
689
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000690#ifdef RISCOS
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000691 if (taskwindow)
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000692 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000693#endif
694}
695
696
Guido van Rossum30a685f1991-06-27 15:51:29 +0000697/* Create a new socket object.
698 This just creates the object and initializes it.
699 If the creation fails, return NULL and set an exception (implicit
700 in NEWOBJ()). */
701
Guido van Rossum73624e91994-10-10 17:59:00 +0000702static PySocketSockObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000703new_sockobject(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000704{
Guido van Rossum73624e91994-10-10 17:59:00 +0000705 PySocketSockObject *s;
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000706 s = (PySocketSockObject *)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000707 PyType_GenericNew(&sock_type, NULL, NULL);
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000708 if (s != NULL)
709 init_sockobject(s, fd, family, type, proto);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000710 return s;
711}
712
Guido van Rossum30a685f1991-06-27 15:51:29 +0000713
Guido van Rossum48a680c2001-03-02 06:34:14 +0000714/* Lock to allow python interpreter to continue, but only allow one
Just van Rossum1040d2c2003-05-09 07:53:18 +0000715 thread to be in gethostbyname or getaddrinfo */
716#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
717PyThread_type_lock netdb_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000718#endif
719
720
Guido van Rossum30a685f1991-06-27 15:51:29 +0000721/* Convert a string specifying a host name or one of a few symbolic
722 names to a numeric IP address. This usually calls gethostbyname()
723 to do the work; the names "" and "<broadcast>" are special.
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000724 Return the length (IPv4 should be 4 bytes), or negative if
Guido van Rossum30a685f1991-06-27 15:51:29 +0000725 an error occurred; then an exception is raised. */
726
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000727static int
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000728setipaddr(char *name, struct sockaddr *addr_ret, size_t addr_ret_size, int af)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000729{
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000730 struct addrinfo hints, *res;
731 int error;
Anthony Baxter0e85f9d2003-05-02 15:40:46 +0000732 int d1, d2, d3, d4;
733 char ch;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000734
Guido van Rossuma376cc51996-12-05 23:43:35 +0000735 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
Guido van Rossum30a685f1991-06-27 15:51:29 +0000736 if (name[0] == '\0') {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000737 int siz;
738 memset(&hints, 0, sizeof(hints));
739 hints.ai_family = af;
740 hints.ai_socktype = SOCK_DGRAM; /*dummy*/
741 hints.ai_flags = AI_PASSIVE;
Just van Rossum1040d2c2003-05-09 07:53:18 +0000742 Py_BEGIN_ALLOW_THREADS
743 ACQUIRE_GETADDRINFO_LOCK
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000744 error = getaddrinfo(NULL, "0", &hints, &res);
Just van Rossum1040d2c2003-05-09 07:53:18 +0000745 Py_END_ALLOW_THREADS
746 /* We assume that those thread-unsafe getaddrinfo() versions
747 *are* safe regarding their return value, ie. that a
748 subsequent call to getaddrinfo() does not destroy the
749 outcome of the first call. */
750 RELEASE_GETADDRINFO_LOCK
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000751 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000752 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000753 return -1;
754 }
755 switch (res->ai_family) {
756 case AF_INET:
757 siz = 4;
758 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000759#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000760 case AF_INET6:
761 siz = 16;
762 break;
763#endif
764 default:
765 freeaddrinfo(res);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000766 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000767 "unsupported address family");
768 return -1;
769 }
770 if (res->ai_next) {
Martin v. Löwisf0b11d22001-11-07 08:31:03 +0000771 freeaddrinfo(res);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000772 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000773 "wildcard resolved to multiple address");
774 return -1;
775 }
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000776 if (res->ai_addrlen < addr_ret_size)
777 addr_ret_size = res->ai_addrlen;
778 memcpy(addr_ret, res->ai_addr, addr_ret_size);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000779 freeaddrinfo(res);
780 return siz;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000781 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000782 if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000783 struct sockaddr_in *sin;
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +0000784 if (af != AF_INET && af != AF_UNSPEC) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000785 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000786 "address family mismatched");
787 return -1;
788 }
789 sin = (struct sockaddr_in *)addr_ret;
790 memset((void *) sin, '\0', sizeof(*sin));
791 sin->sin_family = AF_INET;
792#ifdef HAVE_SOCKADDR_SA_LEN
793 sin->sin_len = sizeof(*sin);
794#endif
795 sin->sin_addr.s_addr = INADDR_BROADCAST;
796 return sizeof(sin->sin_addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000797 }
Anthony Baxter0e85f9d2003-05-02 15:40:46 +0000798 if (sscanf(name, "%d.%d.%d.%d%c", &d1, &d2, &d3, &d4, &ch) == 4 &&
799 0 <= d1 && d1 <= 255 && 0 <= d2 && d2 <= 255 &&
800 0 <= d3 && d3 <= 255 && 0 <= d4 && d4 <= 255) {
801 struct sockaddr_in *sin;
802 sin = (struct sockaddr_in *)addr_ret;
803 sin->sin_addr.s_addr = htonl(
804 ((long) d1 << 24) | ((long) d2 << 16) |
805 ((long) d3 << 8) | ((long) d4 << 0));
806 sin->sin_family = AF_INET;
807#ifdef HAVE_SOCKADDR_SA_LEN
808 sin->sin_len = sizeof(*sin);
809#endif
810 return 4;
811 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000812 memset(&hints, 0, sizeof(hints));
813 hints.ai_family = af;
Just van Rossum1040d2c2003-05-09 07:53:18 +0000814 Py_BEGIN_ALLOW_THREADS
815 ACQUIRE_GETADDRINFO_LOCK
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000816 error = getaddrinfo(name, NULL, &hints, &res);
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000817#if defined(__digital__) && defined(__unix__)
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000818 if (error == EAI_NONAME && af == AF_UNSPEC) {
819 /* On Tru64 V5.1, numeric-to-addr conversion fails
820 if no address family is given. Assume IPv4 for now.*/
821 hints.ai_family = AF_INET;
822 error = getaddrinfo(name, NULL, &hints, &res);
823 }
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000824#endif
Just van Rossum1040d2c2003-05-09 07:53:18 +0000825 Py_END_ALLOW_THREADS
826 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000827 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000828 set_gaierror(error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000829 return -1;
830 }
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000831 if (res->ai_addrlen < addr_ret_size)
832 addr_ret_size = res->ai_addrlen;
833 memcpy((char *) addr_ret, res->ai_addr, addr_ret_size);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000834 freeaddrinfo(res);
835 switch (addr_ret->sa_family) {
836 case AF_INET:
837 return 4;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000838#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000839 case AF_INET6:
840 return 16;
Guido van Rossum955becc1999-03-22 20:14:53 +0000841#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000842 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000843 PyErr_SetString(socket_error, "unknown address family");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000844 return -1;
845 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000846}
847
Guido van Rossum30a685f1991-06-27 15:51:29 +0000848
Guido van Rossum30a685f1991-06-27 15:51:29 +0000849/* Create a string object representing an IP address.
850 This is always a string of the form 'dd.dd.dd.dd' (with variable
851 size numbers). */
852
Guido van Rossum73624e91994-10-10 17:59:00 +0000853static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000854makeipaddr(struct sockaddr *addr, int addrlen)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000855{
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000856 char buf[NI_MAXHOST];
857 int error;
858
859 error = getnameinfo(addr, addrlen, buf, sizeof(buf), NULL, 0,
860 NI_NUMERICHOST);
861 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000862 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000863 return NULL;
864 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000865 return PyString_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000866}
867
868
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000869#ifdef USE_BLUETOOTH
870/* Convert a string representation of a Bluetooth address into a numeric
871 address. Returns the length (6), or raises an exception and returns -1 if
872 an error occurred. */
873
874static int
875setbdaddr(char *name, bdaddr_t *bdaddr)
876{
877 unsigned int b0, b1, b2, b3, b4, b5;
878 char ch;
879 int n;
880
881 n = sscanf(name, "%X:%X:%X:%X:%X:%X%c",
882 &b5, &b4, &b3, &b2, &b1, &b0, &ch);
883 if (n == 6 && (b0 | b1 | b2 | b3 | b4 | b5) < 256) {
884 bdaddr->b[0] = b0;
885 bdaddr->b[1] = b1;
886 bdaddr->b[2] = b2;
887 bdaddr->b[3] = b3;
888 bdaddr->b[4] = b4;
889 bdaddr->b[5] = b5;
890 return 6;
891 } else {
892 PyErr_SetString(socket_error, "bad bluetooth address");
893 return -1;
894 }
895}
896
897/* Create a string representation of the Bluetooth address. This is always a
898 string of the form 'XX:XX:XX:XX:XX:XX' where XX is a two digit hexadecimal
899 value (zero padded if necessary). */
900
901static PyObject *
902makebdaddr(bdaddr_t *bdaddr)
903{
904 char buf[(6 * 2) + 5 + 1];
905
906 sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X",
907 bdaddr->b[5], bdaddr->b[4], bdaddr->b[3],
908 bdaddr->b[2], bdaddr->b[1], bdaddr->b[0]);
909 return PyString_FromString(buf);
910}
911#endif
912
913
Guido van Rossum30a685f1991-06-27 15:51:29 +0000914/* Create an object representing the given socket address,
915 suitable for passing it back to bind(), connect() etc.
916 The family field of the sockaddr structure is inspected
917 to determine what kind of address it really is. */
918
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000919/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000920static PyObject *
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000921makesockaddr(int sockfd, struct sockaddr *addr, int addrlen, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000922{
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000923 if (addrlen == 0) {
924 /* No address -- may be recvfrom() from known socket */
Guido van Rossum73624e91994-10-10 17:59:00 +0000925 Py_INCREF(Py_None);
926 return Py_None;
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000927 }
928
Guido van Rossumbcc20741998-08-04 22:53:56 +0000929#ifdef __BEOS__
Guido van Rossum2c8bcb82000-04-25 21:34:53 +0000930 /* XXX: BeOS version of accept() doesn't set family correctly */
Guido van Rossumbcc20741998-08-04 22:53:56 +0000931 addr->sa_family = AF_INET;
932#endif
933
Guido van Rossum30a685f1991-06-27 15:51:29 +0000934 switch (addr->sa_family) {
935
936 case AF_INET:
937 {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000938 struct sockaddr_in *a;
939 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
Barry Warsaw752300b1997-01-03 17:18:10 +0000940 PyObject *ret = NULL;
941 if (addrobj) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000942 a = (struct sockaddr_in *)addr;
Barry Warsaw752300b1997-01-03 17:18:10 +0000943 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
944 Py_DECREF(addrobj);
945 }
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000946 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000947 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000948
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +0000949#if defined(AF_UNIX)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000950 case AF_UNIX:
951 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000952 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000953 return PyString_FromString(a->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000954 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000955#endif /* AF_UNIX */
956
Martin v. Löwis11017b12006-01-14 18:12:57 +0000957#if defined(AF_NETLINK)
958 case AF_NETLINK:
959 {
960 struct sockaddr_nl *a = (struct sockaddr_nl *) addr;
Martin v. Löwisd0560052006-01-15 07:49:20 +0000961 return Py_BuildValue("II", a->nl_pid, a->nl_groups);
Martin v. Löwis11017b12006-01-14 18:12:57 +0000962 }
963#endif /* AF_NETLINK */
964
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000965#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000966 case AF_INET6:
967 {
968 struct sockaddr_in6 *a;
969 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
970 PyObject *ret = NULL;
971 if (addrobj) {
972 a = (struct sockaddr_in6 *)addr;
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000973 ret = Py_BuildValue("Oiii",
974 addrobj,
975 ntohs(a->sin6_port),
976 a->sin6_flowinfo,
977 a->sin6_scope_id);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000978 Py_DECREF(addrobj);
979 }
980 return ret;
981 }
Jeremy Hylton22308652001-02-02 03:23:09 +0000982#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +0000983
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000984#ifdef USE_BLUETOOTH
985 case AF_BLUETOOTH:
986 switch (proto) {
987
988 case BTPROTO_L2CAP:
989 {
990 struct sockaddr_l2 *a = (struct sockaddr_l2 *) addr;
991 PyObject *addrobj = makebdaddr(&_BT_L2_MEMB(a, bdaddr));
992 PyObject *ret = NULL;
993 if (addrobj) {
994 ret = Py_BuildValue("Oi",
995 addrobj,
996 _BT_L2_MEMB(a, psm));
997 Py_DECREF(addrobj);
998 }
999 return ret;
1000 }
1001
1002 case BTPROTO_RFCOMM:
1003 {
1004 struct sockaddr_rc *a = (struct sockaddr_rc *) addr;
1005 PyObject *addrobj = makebdaddr(&_BT_RC_MEMB(a, bdaddr));
1006 PyObject *ret = NULL;
1007 if (addrobj) {
1008 ret = Py_BuildValue("Oi",
1009 addrobj,
1010 _BT_RC_MEMB(a, channel));
1011 Py_DECREF(addrobj);
1012 }
1013 return ret;
1014 }
1015
1016#if !defined(__FreeBSD__)
1017 case BTPROTO_SCO:
1018 {
1019 struct sockaddr_sco *a = (struct sockaddr_sco *) addr;
1020 return makebdaddr(&_BT_SCO_MEMB(a, bdaddr));
1021 }
1022#endif
1023
1024 }
1025#endif
1026
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00001027#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +00001028 case AF_PACKET:
1029 {
1030 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
1031 char *ifname = "";
1032 struct ifreq ifr;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001033 /* need to look up interface name give index */
1034 if (a->sll_ifindex) {
Jeremy Hylton22308652001-02-02 03:23:09 +00001035 ifr.ifr_ifindex = a->sll_ifindex;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001036 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
Jeremy Hylton22308652001-02-02 03:23:09 +00001037 ifname = ifr.ifr_name;
Jeremy Hylton22308652001-02-02 03:23:09 +00001038 }
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001039 return Py_BuildValue("shbhs#",
1040 ifname,
1041 ntohs(a->sll_protocol),
1042 a->sll_pkttype,
1043 a->sll_hatype,
1044 a->sll_addr,
1045 a->sll_halen);
Jeremy Hylton22308652001-02-02 03:23:09 +00001046 }
1047#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001048
Guido van Rossum30a685f1991-06-27 15:51:29 +00001049 /* More cases here... */
1050
1051 default:
Guido van Rossumaa948df1997-05-07 17:41:48 +00001052 /* If we don't know the address family, don't raise an
1053 exception -- return it as a tuple. */
1054 return Py_BuildValue("is#",
1055 addr->sa_family,
1056 addr->sa_data,
1057 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001058
Guido van Rossum30a685f1991-06-27 15:51:29 +00001059 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001060}
1061
Guido van Rossum30a685f1991-06-27 15:51:29 +00001062
1063/* Parse a socket address argument according to the socket object's
1064 address family. Return 1 if the address was in the proper format,
1065 0 of not. The address is returned through addr_ret, its length
1066 through len_ret. */
1067
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001068static int
Guido van Rossum48a680c2001-03-02 06:34:14 +00001069getsockaddrarg(PySocketSockObject *s, PyObject *args,
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001070 struct sockaddr **addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001071{
Guido van Rossum30a685f1991-06-27 15:51:29 +00001072 switch (s->sock_family) {
1073
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001074#if defined(AF_UNIX)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001075 case AF_UNIX:
1076 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001077 struct sockaddr_un* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001078 char *path;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001079 int len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001080 addr = (struct sockaddr_un*)&(s->sock_addr).un;
Guido van Rossum7e488981998-10-08 02:25:24 +00001081 if (!PyArg_Parse(args, "t#", &path, &len))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001082 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001083 if (len > sizeof addr->sun_path) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001084 PyErr_SetString(socket_error,
Barry Warsaw752300b1997-01-03 17:18:10 +00001085 "AF_UNIX path too long");
Guido van Rossum30a685f1991-06-27 15:51:29 +00001086 return 0;
1087 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001088 addr->sun_family = s->sock_family;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001089 memcpy(addr->sun_path, path, len);
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001090 addr->sun_path[len] = 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001091 *addr_ret = (struct sockaddr *) addr;
Andrew MacIntyredaedf212004-04-11 12:03:57 +00001092#if defined(PYOS_OS2)
1093 *len_ret = sizeof(*addr);
1094#else
Guido van Rossum65af28a1996-06-11 18:36:33 +00001095 *len_ret = len + sizeof(*addr) - sizeof(addr->sun_path);
Andrew MacIntyredaedf212004-04-11 12:03:57 +00001096#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001097 return 1;
1098 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001099#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001100
Martin v. Löwis11017b12006-01-14 18:12:57 +00001101#if defined(AF_NETLINK)
1102 case AF_NETLINK:
1103 {
1104 struct sockaddr_nl* addr;
1105 int pid, groups;
1106 addr = (struct sockaddr_nl *)&(s->sock_addr).nl;
1107 if (!PyTuple_Check(args)) {
1108 PyErr_Format(
1109 PyExc_TypeError,
1110 "getsockaddrarg: "
1111 "AF_NETLINK address must be tuple, not %.500s",
1112 args->ob_type->tp_name);
1113 return 0;
1114 }
1115 if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &pid, &groups))
1116 return 0;
1117 addr->nl_family = AF_NETLINK;
1118 addr->nl_pid = pid;
1119 addr->nl_groups = groups;
1120 *addr_ret = (struct sockaddr *) addr;
1121 *len_ret = sizeof(*addr);
1122 return 1;
1123 }
1124#endif
1125
Guido van Rossum30a685f1991-06-27 15:51:29 +00001126 case AF_INET:
1127 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001128 struct sockaddr_in* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001129 char *host;
Martin v. Löwis5db099a2003-08-07 11:55:15 +00001130 int port, result;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001131 addr=(struct sockaddr_in*)&(s->sock_addr).in;
Guido van Rossume4dad902000-12-01 13:13:11 +00001132 if (!PyTuple_Check(args)) {
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001133 PyErr_Format(
1134 PyExc_TypeError,
1135 "getsockaddrarg: "
1136 "AF_INET address must be tuple, not %.500s",
1137 args->ob_type->tp_name);
Guido van Rossume4dad902000-12-01 13:13:11 +00001138 return 0;
1139 }
Martin v. Löwis2548c732003-04-18 10:39:54 +00001140 if (!PyArg_ParseTuple(args, "eti:getsockaddrarg",
1141 "idna", &host, &port))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001142 return 0;
Martin v. Löwis5db099a2003-08-07 11:55:15 +00001143 result = setipaddr(host, (struct sockaddr *)addr,
1144 sizeof(*addr), AF_INET);
1145 PyMem_Free(host);
1146 if (result < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001147 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001148 addr->sin_family = AF_INET;
Guido van Rossum644a12b1997-04-09 19:24:53 +00001149 addr->sin_port = htons((short)port);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001150 *addr_ret = (struct sockaddr *) addr;
1151 *len_ret = sizeof *addr;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001152 return 1;
1153 }
1154
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001155#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001156 case AF_INET6:
1157 {
1158 struct sockaddr_in6* addr;
1159 char *host;
Martin v. Löwis5db099a2003-08-07 11:55:15 +00001160 int port, flowinfo, scope_id, result;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001161 addr = (struct sockaddr_in6*)&(s->sock_addr).in6;
1162 flowinfo = scope_id = 0;
Martin v. Löwis2548c732003-04-18 10:39:54 +00001163 if (!PyArg_ParseTuple(args, "eti|ii",
1164 "idna", &host, &port, &flowinfo,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001165 &scope_id)) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001166 return 0;
1167 }
Martin v. Löwis5db099a2003-08-07 11:55:15 +00001168 result = setipaddr(host, (struct sockaddr *)addr,
1169 sizeof(*addr), AF_INET6);
1170 PyMem_Free(host);
1171 if (result < 0)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001172 return 0;
1173 addr->sin6_family = s->sock_family;
1174 addr->sin6_port = htons((short)port);
1175 addr->sin6_flowinfo = flowinfo;
1176 addr->sin6_scope_id = scope_id;
1177 *addr_ret = (struct sockaddr *) addr;
1178 *len_ret = sizeof *addr;
1179 return 1;
1180 }
1181#endif
1182
Hye-Shik Chang81268602004-02-02 06:05:24 +00001183#ifdef USE_BLUETOOTH
Martin v. Löwis12af0482004-01-31 12:34:17 +00001184 case AF_BLUETOOTH:
1185 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001186 switch (s->sock_proto) {
1187 case BTPROTO_L2CAP:
Martin v. Löwis12af0482004-01-31 12:34:17 +00001188 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001189 struct sockaddr_l2 *addr = (struct sockaddr_l2 *) _BT_SOCKADDR_MEMB(s, l2);
1190 char *straddr;
Martin v. Löwis12af0482004-01-31 12:34:17 +00001191
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001192 _BT_L2_MEMB(addr, family) = AF_BLUETOOTH;
1193 if (!PyArg_ParseTuple(args, "si", &straddr,
1194 &_BT_L2_MEMB(addr, psm))) {
1195 PyErr_SetString(socket_error, "getsockaddrarg: "
1196 "wrong format");
Martin v. Löwis12af0482004-01-31 12:34:17 +00001197 return 0;
1198 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001199 if (setbdaddr(straddr, &_BT_L2_MEMB(addr, bdaddr)) < 0)
1200 return 0;
1201
1202 *addr_ret = (struct sockaddr *) addr;
1203 *len_ret = sizeof *addr;
1204 return 1;
1205 }
1206 case BTPROTO_RFCOMM:
1207 {
1208 struct sockaddr_rc *addr = (struct sockaddr_rc *) _BT_SOCKADDR_MEMB(s, rc);
1209 char *straddr;
1210
1211 _BT_RC_MEMB(addr, family) = AF_BLUETOOTH;
1212 if (!PyArg_ParseTuple(args, "si", &straddr,
1213 &_BT_RC_MEMB(addr, channel))) {
1214 PyErr_SetString(socket_error, "getsockaddrarg: "
1215 "wrong format");
1216 return 0;
1217 }
1218 if (setbdaddr(straddr, &_BT_RC_MEMB(addr, bdaddr)) < 0)
1219 return 0;
1220
1221 *addr_ret = (struct sockaddr *) addr;
1222 *len_ret = sizeof *addr;
1223 return 1;
1224 }
1225#if !defined(__FreeBSD__)
1226 case BTPROTO_SCO:
1227 {
1228 struct sockaddr_sco *addr = (struct sockaddr_sco *) _BT_SOCKADDR_MEMB(s, sco);
1229 char *straddr;
1230
1231 _BT_SCO_MEMB(addr, family) = AF_BLUETOOTH;
1232 straddr = PyString_AsString(args);
1233 if (straddr == NULL) {
1234 PyErr_SetString(socket_error, "getsockaddrarg: "
1235 "wrong format");
1236 return 0;
1237 }
1238 if (setbdaddr(straddr, &_BT_SCO_MEMB(addr, bdaddr)) < 0)
1239 return 0;
1240
1241 *addr_ret = (struct sockaddr *) addr;
1242 *len_ret = sizeof *addr;
1243 return 1;
1244 }
1245#endif
1246 default:
1247 PyErr_SetString(socket_error, "getsockaddrarg: unknown Bluetooth protocol");
1248 return 0;
Martin v. Löwis12af0482004-01-31 12:34:17 +00001249 }
1250 }
1251#endif
1252
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00001253#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +00001254 case AF_PACKET:
1255 {
1256 struct sockaddr_ll* addr;
1257 struct ifreq ifr;
1258 char *interfaceName;
1259 int protoNumber;
1260 int hatype = 0;
1261 int pkttype = 0;
Andrew M. Kuchlingb8e17172004-07-10 23:39:35 +00001262 char *haddr = NULL;
1263 unsigned int halen = 0;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001264
Andrew M. Kuchlingb8e17172004-07-10 23:39:35 +00001265 if (!PyArg_ParseTuple(args, "si|iis#", &interfaceName,
1266 &protoNumber, &pkttype, &hatype,
1267 &haddr, &halen))
Jeremy Hylton22308652001-02-02 03:23:09 +00001268 return 0;
1269 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
1270 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001271 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001272 s->errorhandler();
Jeremy Hylton22308652001-02-02 03:23:09 +00001273 return 0;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001274 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001275 addr = &(s->sock_addr.ll);
1276 addr->sll_family = AF_PACKET;
1277 addr->sll_protocol = htons((short)protoNumber);
1278 addr->sll_ifindex = ifr.ifr_ifindex;
1279 addr->sll_pkttype = pkttype;
1280 addr->sll_hatype = hatype;
Andrew M. Kuchlingb8e17172004-07-10 23:39:35 +00001281 if (halen > 8) {
1282 PyErr_SetString(PyExc_ValueError,
1283 "Hardware address must be 8 bytes or less");
1284 return 0;
1285 }
1286 if (halen != 0) {
1287 memcpy(&addr->sll_addr, haddr, halen);
1288 }
1289 addr->sll_halen = halen;
Jeremy Hylton22308652001-02-02 03:23:09 +00001290 *addr_ret = (struct sockaddr *) addr;
1291 *len_ret = sizeof *addr;
1292 return 1;
1293 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00001294#endif
1295
Guido van Rossum30a685f1991-06-27 15:51:29 +00001296 /* More cases here... */
1297
1298 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001299 PyErr_SetString(socket_error, "getsockaddrarg: bad family");
Guido van Rossum30a685f1991-06-27 15:51:29 +00001300 return 0;
1301
1302 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001303}
1304
Guido van Rossum30a685f1991-06-27 15:51:29 +00001305
Guido van Rossum48a680c2001-03-02 06:34:14 +00001306/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +00001307 Return 1 if the family is known, 0 otherwise. The length is returned
1308 through len_ret. */
1309
1310static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +00001311getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +00001312{
1313 switch (s->sock_family) {
1314
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001315#if defined(AF_UNIX)
Guido van Rossum710e1df1992-06-12 10:39:36 +00001316 case AF_UNIX:
1317 {
1318 *len_ret = sizeof (struct sockaddr_un);
1319 return 1;
1320 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001321#endif /* AF_UNIX */
Martin v. Löwis11017b12006-01-14 18:12:57 +00001322#if defined(AF_NETLINK)
1323 case AF_NETLINK:
1324 {
1325 *len_ret = sizeof (struct sockaddr_nl);
1326 return 1;
1327 }
1328#endif
Guido van Rossum710e1df1992-06-12 10:39:36 +00001329
1330 case AF_INET:
1331 {
1332 *len_ret = sizeof (struct sockaddr_in);
1333 return 1;
1334 }
1335
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001336#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001337 case AF_INET6:
1338 {
1339 *len_ret = sizeof (struct sockaddr_in6);
1340 return 1;
1341 }
1342#endif
1343
Hye-Shik Chang81268602004-02-02 06:05:24 +00001344#ifdef USE_BLUETOOTH
Martin v. Löwis12af0482004-01-31 12:34:17 +00001345 case AF_BLUETOOTH:
1346 {
1347 switch(s->sock_proto)
1348 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001349
1350 case BTPROTO_L2CAP:
1351 *len_ret = sizeof (struct sockaddr_l2);
1352 return 1;
1353 case BTPROTO_RFCOMM:
1354 *len_ret = sizeof (struct sockaddr_rc);
1355 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00001356#if !defined(__FreeBSD__)
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001357 case BTPROTO_SCO:
1358 *len_ret = sizeof (struct sockaddr_sco);
1359 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00001360#endif
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001361 default:
1362 PyErr_SetString(socket_error, "getsockaddrlen: "
1363 "unknown BT protocol");
1364 return 0;
1365
Martin v. Löwis12af0482004-01-31 12:34:17 +00001366 }
1367 }
1368#endif
1369
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00001370#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +00001371 case AF_PACKET:
1372 {
1373 *len_ret = sizeof (struct sockaddr_ll);
1374 return 1;
1375 }
1376#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001377
Guido van Rossum710e1df1992-06-12 10:39:36 +00001378 /* More cases here... */
1379
1380 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001381 PyErr_SetString(socket_error, "getsockaddrlen: bad family");
Guido van Rossum710e1df1992-06-12 10:39:36 +00001382 return 0;
1383
1384 }
1385}
1386
1387
Guido van Rossum30a685f1991-06-27 15:51:29 +00001388/* s.accept() method */
1389
Guido van Rossum73624e91994-10-10 17:59:00 +00001390static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001391sock_accept(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001392{
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001393 sock_addr_t addrbuf;
Fred Drakea04eaad2000-06-30 02:46:07 +00001394 SOCKET_T newfd;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001395 socklen_t addrlen;
Barry Warsaw752300b1997-01-03 17:18:10 +00001396 PyObject *sock = NULL;
1397 PyObject *addr = NULL;
1398 PyObject *res = NULL;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001399 int timeout;
Barry Warsaw752300b1997-01-03 17:18:10 +00001400
Guido van Rossum710e1df1992-06-12 10:39:36 +00001401 if (!getsockaddrlen(s, &addrlen))
1402 return NULL;
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001403 memset(&addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001404
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001405#ifdef MS_WINDOWS
1406 newfd = INVALID_SOCKET;
1407#else
1408 newfd = -1;
1409#endif
1410
Guido van Rossum73624e91994-10-10 17:59:00 +00001411 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001412 timeout = internal_select(s, 0);
1413 if (!timeout)
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001414 newfd = accept(s->sock_fd, (struct sockaddr *) &addrbuf,
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001415 &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001416 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001417
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001418 if (timeout) {
1419 PyErr_SetString(socket_timeout, "timed out");
1420 return NULL;
1421 }
1422
Fred Drakea04eaad2000-06-30 02:46:07 +00001423#ifdef MS_WINDOWS
1424 if (newfd == INVALID_SOCKET)
1425#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001426 if (newfd < 0)
Fred Drakea04eaad2000-06-30 02:46:07 +00001427#endif
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001428 return s->errorhandler();
Barry Warsaw752300b1997-01-03 17:18:10 +00001429
Guido van Rossum30a685f1991-06-27 15:51:29 +00001430 /* Create the new object with unspecified family,
1431 to avoid calls to bind() etc. on it. */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001432 sock = (PyObject *) new_sockobject(newfd,
1433 s->sock_family,
1434 s->sock_type,
1435 s->sock_proto);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001436
Barry Warsaw752300b1997-01-03 17:18:10 +00001437 if (sock == NULL) {
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001438 SOCKETCLOSE(newfd);
Barry Warsaw752300b1997-01-03 17:18:10 +00001439 goto finally;
1440 }
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001441 addr = makesockaddr(s->sock_fd, (struct sockaddr *) &addrbuf,
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001442 addrlen, s->sock_proto);
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001443 if (addr == NULL)
Barry Warsaw752300b1997-01-03 17:18:10 +00001444 goto finally;
1445
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001446 res = PyTuple_Pack(2, sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00001447
Guido van Rossum67f7a382002-06-06 21:08:16 +00001448finally:
Guido van Rossum73624e91994-10-10 17:59:00 +00001449 Py_XDECREF(sock);
1450 Py_XDECREF(addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001451 return res;
1452}
1453
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001454PyDoc_STRVAR(accept_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001455"accept() -> (socket object, address info)\n\
1456\n\
1457Wait for an incoming connection. Return a new socket representing the\n\
1458connection, and the address of the client. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001459info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001460
Guido van Rossum11ba0942002-06-13 15:07:44 +00001461/* s.setblocking(flag) method. Argument:
1462 False -- non-blocking mode; same as settimeout(0)
1463 True -- blocking mode; same as settimeout(None)
1464*/
Guido van Rossume4485b01994-09-07 14:32:49 +00001465
Guido van Rossum73624e91994-10-10 17:59:00 +00001466static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001467sock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00001468{
1469 int block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001470
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001471 block = PyInt_AsLong(arg);
1472 if (block == -1 && PyErr_Occurred())
Guido van Rossume4485b01994-09-07 14:32:49 +00001473 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001474
Guido van Rossum11ba0942002-06-13 15:07:44 +00001475 s->sock_timeout = block ? -1.0 : 0.0;
Guido van Rossume8008f02002-06-07 03:36:20 +00001476 internal_setblocking(s, block);
Guido van Rossume4485b01994-09-07 14:32:49 +00001477
Guido van Rossum73624e91994-10-10 17:59:00 +00001478 Py_INCREF(Py_None);
1479 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +00001480}
Guido van Rossume4485b01994-09-07 14:32:49 +00001481
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001482PyDoc_STRVAR(setblocking_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001483"setblocking(flag)\n\
1484\n\
1485Set the socket to blocking (flag is true) or non-blocking (false).\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00001486setblocking(True) is equivalent to settimeout(None);\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001487setblocking(False) is equivalent to settimeout(0.0).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001488
Guido van Rossum11ba0942002-06-13 15:07:44 +00001489/* s.settimeout(timeout) method. Argument:
1490 None -- no timeout, blocking mode; same as setblocking(True)
1491 0.0 -- non-blocking mode; same as setblocking(False)
1492 > 0 -- timeout mode; operations time out after timeout seconds
1493 < 0 -- illegal; raises an exception
1494*/
Guido van Rossum67f7a382002-06-06 21:08:16 +00001495static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001496sock_settimeout(PySocketSockObject *s, PyObject *arg)
Guido van Rossum67f7a382002-06-06 21:08:16 +00001497{
Guido van Rossum11ba0942002-06-13 15:07:44 +00001498 double timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001499
1500 if (arg == Py_None)
Guido van Rossum11ba0942002-06-13 15:07:44 +00001501 timeout = -1.0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001502 else {
Guido van Rossum11ba0942002-06-13 15:07:44 +00001503 timeout = PyFloat_AsDouble(arg);
1504 if (timeout < 0.0) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00001505 if (!PyErr_Occurred())
1506 PyErr_SetString(PyExc_ValueError,
Guido van Rossum11ba0942002-06-13 15:07:44 +00001507 "Timeout value out of range");
Guido van Rossum67f7a382002-06-06 21:08:16 +00001508 return NULL;
1509 }
1510 }
1511
Guido van Rossum11ba0942002-06-13 15:07:44 +00001512 s->sock_timeout = timeout;
1513 internal_setblocking(s, timeout < 0.0);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001514
1515 Py_INCREF(Py_None);
1516 return Py_None;
1517}
1518
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001519PyDoc_STRVAR(settimeout_doc,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001520"settimeout(timeout)\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00001521\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00001522Set a timeout on socket operations. 'timeout' can be a float,\n\
1523giving in seconds, or None. Setting a timeout of None disables\n\
1524the timeout feature and is equivalent to setblocking(1).\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001525Setting a timeout of zero is the same as setblocking(0).");
Guido van Rossum67f7a382002-06-06 21:08:16 +00001526
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001527/* s.gettimeout() method.
1528 Returns the timeout associated with a socket. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00001529static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001530sock_gettimeout(PySocketSockObject *s)
Guido van Rossum67f7a382002-06-06 21:08:16 +00001531{
1532 if (s->sock_timeout < 0.0) {
1533 Py_INCREF(Py_None);
1534 return Py_None;
1535 }
1536 else
1537 return PyFloat_FromDouble(s->sock_timeout);
1538}
1539
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001540PyDoc_STRVAR(gettimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00001541"gettimeout() -> timeout\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00001542\n\
1543Returns the timeout in floating seconds associated with socket \n\
1544operations. A timeout of None indicates that timeouts on socket \n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001545operations are disabled.");
Guido van Rossume4485b01994-09-07 14:32:49 +00001546
Guido van Rossum48a680c2001-03-02 06:34:14 +00001547#ifdef RISCOS
1548/* s.sleeptaskw(1 | 0) method */
1549
1550static PyObject *
Martin v. Löwisa94568a2003-05-10 07:36:56 +00001551sock_sleeptaskw(PySocketSockObject *s,PyObject *arg)
Guido van Rossum48a680c2001-03-02 06:34:14 +00001552{
Guido van Rossum67f7a382002-06-06 21:08:16 +00001553 int block;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00001554 block = PyInt_AsLong(arg);
1555 if (block == -1 && PyErr_Occurred())
Guido van Rossum67f7a382002-06-06 21:08:16 +00001556 return NULL;
1557 Py_BEGIN_ALLOW_THREADS
1558 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
1559 Py_END_ALLOW_THREADS
Guido van Rossum48a680c2001-03-02 06:34:14 +00001560
Guido van Rossum67f7a382002-06-06 21:08:16 +00001561 Py_INCREF(Py_None);
1562 return Py_None;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001563}
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001564PyDoc_STRVAR(sleeptaskw_doc,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001565"sleeptaskw(flag)\n\
1566\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001567Allow sleeps in taskwindows.");
Guido van Rossum48a680c2001-03-02 06:34:14 +00001568#endif
1569
1570
Guido van Rossumaee08791992-09-08 09:05:33 +00001571/* s.setsockopt() method.
1572 With an integer third argument, sets an integer option.
1573 With a string third argument, sets an option from a buffer;
1574 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001575
Guido van Rossum73624e91994-10-10 17:59:00 +00001576static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001577sock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001578{
1579 int level;
1580 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001581 int res;
Guido van Rossumaee08791992-09-08 09:05:33 +00001582 char *buf;
1583 int buflen;
1584 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001585
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001586 if (PyArg_ParseTuple(args, "iii:setsockopt",
1587 &level, &optname, &flag)) {
Guido van Rossumaee08791992-09-08 09:05:33 +00001588 buf = (char *) &flag;
1589 buflen = sizeof flag;
1590 }
1591 else {
Guido van Rossum73624e91994-10-10 17:59:00 +00001592 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001593 if (!PyArg_ParseTuple(args, "iis#:setsockopt",
1594 &level, &optname, &buf, &buflen))
Guido van Rossumaee08791992-09-08 09:05:33 +00001595 return NULL;
1596 }
Thomas Wouters334fb892000-07-25 12:56:38 +00001597 res = setsockopt(s->sock_fd, level, optname, (void *)buf, buflen);
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001598 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001599 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001600 Py_INCREF(Py_None);
1601 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001602}
1603
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001604PyDoc_STRVAR(setsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001605"setsockopt(level, option, value)\n\
1606\n\
1607Set a socket option. See the Unix manual for level and option.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001608The value argument can either be an integer or a string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001609
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001610
Guido van Rossumaee08791992-09-08 09:05:33 +00001611/* s.getsockopt() method.
1612 With two arguments, retrieves an integer option.
1613 With a third integer argument, retrieves a string buffer of that size;
1614 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001615
Guido van Rossum73624e91994-10-10 17:59:00 +00001616static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001617sock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001618{
1619 int level;
1620 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001621 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +00001622 PyObject *buf;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001623 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001624
Guido van Rossumbcc20741998-08-04 22:53:56 +00001625#ifdef __BEOS__
Fred Drake564a6cc2001-05-11 20:12:26 +00001626 /* We have incomplete socket support. */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001627 PyErr_SetString(socket_error, "getsockopt not supported");
Guido van Rossumbcc20741998-08-04 22:53:56 +00001628 return NULL;
1629#else
1630
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001631 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
1632 &level, &optname, &buflen))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001633 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001634
Guido van Rossumbe32c891996-06-20 16:25:29 +00001635 if (buflen == 0) {
Guido van Rossumaee08791992-09-08 09:05:33 +00001636 int flag = 0;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001637 socklen_t flagsize = sizeof flag;
Guido van Rossumb376a4a1993-11-23 17:53:17 +00001638 res = getsockopt(s->sock_fd, level, optname,
Thomas Wouters334fb892000-07-25 12:56:38 +00001639 (void *)&flag, &flagsize);
Guido van Rossumaee08791992-09-08 09:05:33 +00001640 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001641 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001642 return PyInt_FromLong(flag);
Guido van Rossumaee08791992-09-08 09:05:33 +00001643 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001644#ifdef __VMS
1645 if (buflen > 1024) {
1646#else
Guido van Rossumaee08791992-09-08 09:05:33 +00001647 if (buflen <= 0 || buflen > 1024) {
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001648#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001649 PyErr_SetString(socket_error,
Barry Warsaw752300b1997-01-03 17:18:10 +00001650 "getsockopt buflen out of range");
Guido van Rossumaee08791992-09-08 09:05:33 +00001651 return NULL;
1652 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001653 buf = PyString_FromStringAndSize((char *)NULL, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001654 if (buf == NULL)
1655 return NULL;
Guido van Rossumb376a4a1993-11-23 17:53:17 +00001656 res = getsockopt(s->sock_fd, level, optname,
Fred Drake564a6cc2001-05-11 20:12:26 +00001657 (void *)PyString_AS_STRING(buf), &buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001658 if (res < 0) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001659 Py_DECREF(buf);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001660 return s->errorhandler();
Guido van Rossumaee08791992-09-08 09:05:33 +00001661 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001662 _PyString_Resize(&buf, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001663 return buf;
Guido van Rossumbcc20741998-08-04 22:53:56 +00001664#endif /* __BEOS__ */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001665}
1666
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001667PyDoc_STRVAR(getsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001668"getsockopt(level, option[, buffersize]) -> value\n\
1669\n\
1670Get a socket option. See the Unix manual for level and option.\n\
1671If a nonzero buffersize argument is given, the return value is a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001672string of that length; otherwise it is an integer.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001673
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001674
Fred Drake728819a2000-07-01 03:40:12 +00001675/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001676
Guido van Rossum73624e91994-10-10 17:59:00 +00001677static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001678sock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001679{
1680 struct sockaddr *addr;
1681 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001682 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001683
Fred Drake728819a2000-07-01 03:40:12 +00001684 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001685 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001686 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001687 res = bind(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001688 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001689 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001690 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001691 Py_INCREF(Py_None);
1692 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001693}
1694
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001695PyDoc_STRVAR(bind_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001696"bind(address)\n\
1697\n\
1698Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00001699pair (host, port); the host must refer to the local host. For raw packet\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001700sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001701
Guido van Rossum30a685f1991-06-27 15:51:29 +00001702
1703/* s.close() method.
1704 Set the file descriptor to -1 so operations tried subsequently
1705 will surely fail. */
1706
Guido van Rossum73624e91994-10-10 17:59:00 +00001707static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001708sock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001709{
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001710 SOCKET_T fd;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001711
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001712 if ((fd = s->sock_fd) != -1) {
1713 s->sock_fd = -1;
Guido van Rossum08481461996-10-12 14:07:22 +00001714 Py_BEGIN_ALLOW_THREADS
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001715 (void) SOCKETCLOSE(fd);
Guido van Rossum08481461996-10-12 14:07:22 +00001716 Py_END_ALLOW_THREADS
1717 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001718 Py_INCREF(Py_None);
1719 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001720}
1721
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001722PyDoc_STRVAR(close_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001723"close()\n\
1724\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001725Close the socket. It cannot be used after this call.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001726
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001727static int
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001728internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen,
1729 int *timeoutp)
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001730{
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001731 int res, timeout;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001732
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001733 timeout = 0;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001734 res = connect(s->sock_fd, addr, addrlen);
1735
1736#ifdef MS_WINDOWS
1737
1738 if (s->sock_timeout > 0.0) {
1739 if (res < 0 && WSAGetLastError() == WSAEWOULDBLOCK) {
Guido van Rossumb76bdf82003-02-19 17:50:16 +00001740 /* This is a mess. Best solution: trust select */
1741 fd_set fds;
Mark Hammonda57ec932004-08-03 05:06:26 +00001742 fd_set fds_exc;
Guido van Rossumb76bdf82003-02-19 17:50:16 +00001743 struct timeval tv;
1744 tv.tv_sec = (int)s->sock_timeout;
1745 tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6);
1746 FD_ZERO(&fds);
1747 FD_SET(s->sock_fd, &fds);
Mark Hammonda57ec932004-08-03 05:06:26 +00001748 FD_ZERO(&fds_exc);
1749 FD_SET(s->sock_fd, &fds_exc);
1750 res = select(s->sock_fd+1, NULL, &fds, &fds_exc, &tv);
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001751 if (res == 0) {
Guido van Rossumb76bdf82003-02-19 17:50:16 +00001752 res = WSAEWOULDBLOCK;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001753 timeout = 1;
Mark Hammonda57ec932004-08-03 05:06:26 +00001754 } else if (res > 0) {
1755 if (FD_ISSET(s->sock_fd, &fds))
1756 /* The socket is in the writeable set - this
1757 means connected */
1758 res = 0;
1759 else {
1760 /* As per MS docs, we need to call getsockopt()
1761 to get the underlying error */
1762 int res_size = sizeof res;
1763 /* It must be in the exception set */
1764 assert(FD_ISSET(s->sock_fd, &fds_exc));
1765 if (0 == getsockopt(s->sock_fd, SOL_SOCKET, SO_ERROR,
1766 (char *)&res, &res_size))
1767 /* getsockopt also clears WSAGetLastError,
1768 so reset it back. */
1769 WSASetLastError(res);
1770 else
1771 res = WSAGetLastError();
1772 }
1773 }
Guido van Rossumb76bdf82003-02-19 17:50:16 +00001774 /* else if (res < 0) an error occurred */
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001775 }
1776 }
1777
1778 if (res < 0)
1779 res = WSAGetLastError();
1780
1781#else
1782
1783 if (s->sock_timeout > 0.0) {
1784 if (res < 0 && errno == EINPROGRESS) {
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001785 timeout = internal_select(s, 1);
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001786 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum12e3c712002-08-08 20:39:30 +00001787 if (res < 0 && errno == EISCONN)
1788 res = 0;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001789 }
1790 }
1791
1792 if (res < 0)
1793 res = errno;
1794
1795#endif
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001796 *timeoutp = timeout;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001797
1798 return res;
1799}
Guido van Rossum30a685f1991-06-27 15:51:29 +00001800
Fred Drake728819a2000-07-01 03:40:12 +00001801/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001802
Guido van Rossum73624e91994-10-10 17:59:00 +00001803static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001804sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001805{
1806 struct sockaddr *addr;
1807 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001808 int res;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001809 int timeout;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001810
Fred Drake728819a2000-07-01 03:40:12 +00001811 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001812 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001813
Guido van Rossum73624e91994-10-10 17:59:00 +00001814 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001815 res = internal_connect(s, addr, addrlen, &timeout);
Guido van Rossum11ba0942002-06-13 15:07:44 +00001816 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001817
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001818 if (timeout) {
1819 PyErr_SetString(socket_timeout, "timed out");
1820 return NULL;
1821 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001822 if (res != 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001823 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001824 Py_INCREF(Py_None);
1825 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001826}
1827
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001828PyDoc_STRVAR(connect_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001829"connect(address)\n\
1830\n\
1831Connect the socket to a remote address. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001832is a pair (host, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001833
Guido van Rossum30a685f1991-06-27 15:51:29 +00001834
Fred Drake728819a2000-07-01 03:40:12 +00001835/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001836
1837static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001838sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001839{
1840 struct sockaddr *addr;
1841 int addrlen;
1842 int res;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001843 int timeout;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001844
Fred Drake728819a2000-07-01 03:40:12 +00001845 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001846 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001847
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001848 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001849 res = internal_connect(s, addr, addrlen, &timeout);
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001850 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001851
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001852 return PyInt_FromLong((long) res);
1853}
1854
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001855PyDoc_STRVAR(connect_ex_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00001856"connect_ex(address) -> errno\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00001857\n\
1858This is like connect(address), but returns an error code (the errno value)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001859instead of raising an exception when an error occurs.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001860
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001861
Guido van Rossumed233a51992-06-23 09:07:03 +00001862/* s.fileno() method */
1863
Guido van Rossum73624e91994-10-10 17:59:00 +00001864static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001865sock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00001866{
Fred Drakea04eaad2000-06-30 02:46:07 +00001867#if SIZEOF_SOCKET_T <= SIZEOF_LONG
Guido van Rossum73624e91994-10-10 17:59:00 +00001868 return PyInt_FromLong((long) s->sock_fd);
Fred Drakea04eaad2000-06-30 02:46:07 +00001869#else
Martin v. Löwisb9a0f912003-03-29 10:06:18 +00001870 return PyLong_FromLongLong((PY_LONG_LONG)s->sock_fd);
Fred Drakea04eaad2000-06-30 02:46:07 +00001871#endif
Guido van Rossumed233a51992-06-23 09:07:03 +00001872}
1873
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001874PyDoc_STRVAR(fileno_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001875"fileno() -> integer\n\
1876\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001877Return the integer file descriptor of the socket.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001878
Guido van Rossumed233a51992-06-23 09:07:03 +00001879
Guido van Rossumbe32c891996-06-20 16:25:29 +00001880#ifndef NO_DUP
1881/* s.dup() method */
1882
1883static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001884sock_dup(PySocketSockObject *s)
Guido van Rossumbe32c891996-06-20 16:25:29 +00001885{
Fred Drakea04eaad2000-06-30 02:46:07 +00001886 SOCKET_T newfd;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001887 PyObject *sock;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001888
Guido van Rossumbe32c891996-06-20 16:25:29 +00001889 newfd = dup(s->sock_fd);
1890 if (newfd < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001891 return s->errorhandler();
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001892 sock = (PyObject *) new_sockobject(newfd,
1893 s->sock_family,
1894 s->sock_type,
1895 s->sock_proto);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001896 if (sock == NULL)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001897 SOCKETCLOSE(newfd);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001898 return sock;
1899}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001900
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001901PyDoc_STRVAR(dup_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001902"dup() -> socket object\n\
1903\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001904Return a new socket object connected to the same system resource.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001905
Guido van Rossumbe32c891996-06-20 16:25:29 +00001906#endif
1907
1908
Guido van Rossumc89705d1992-11-26 08:54:07 +00001909/* s.getsockname() method */
1910
Guido van Rossum73624e91994-10-10 17:59:00 +00001911static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001912sock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001913{
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001914 sock_addr_t addrbuf;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001915 int res;
1916 socklen_t addrlen;
1917
Guido van Rossumc89705d1992-11-26 08:54:07 +00001918 if (!getsockaddrlen(s, &addrlen))
1919 return NULL;
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001920 memset(&addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001921 Py_BEGIN_ALLOW_THREADS
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001922 res = getsockname(s->sock_fd, (struct sockaddr *) &addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001923 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001924 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001925 return s->errorhandler();
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001926 return makesockaddr(s->sock_fd, (struct sockaddr *) &addrbuf, addrlen,
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001927 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001928}
1929
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001930PyDoc_STRVAR(getsockname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001931"getsockname() -> address info\n\
1932\n\
1933Return the address of the local endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001934info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001935
Guido van Rossumc89705d1992-11-26 08:54:07 +00001936
Guido van Rossumb6775db1994-08-01 11:34:53 +00001937#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001938/* s.getpeername() method */
1939
Guido van Rossum73624e91994-10-10 17:59:00 +00001940static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001941sock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001942{
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001943 sock_addr_t addrbuf;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001944 int res;
1945 socklen_t addrlen;
1946
Guido van Rossumc89705d1992-11-26 08:54:07 +00001947 if (!getsockaddrlen(s, &addrlen))
1948 return NULL;
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001949 memset(&addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001950 Py_BEGIN_ALLOW_THREADS
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001951 res = getpeername(s->sock_fd, (struct sockaddr *) &addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001952 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001953 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001954 return s->errorhandler();
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001955 return makesockaddr(s->sock_fd, (struct sockaddr *) &addrbuf, addrlen,
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001956 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001957}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001958
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001959PyDoc_STRVAR(getpeername_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001960"getpeername() -> address info\n\
1961\n\
1962Return the address of the remote endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001963info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001964
Guido van Rossumb6775db1994-08-01 11:34:53 +00001965#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001966
1967
Guido van Rossum30a685f1991-06-27 15:51:29 +00001968/* s.listen(n) method */
1969
Guido van Rossum73624e91994-10-10 17:59:00 +00001970static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001971sock_listen(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001972{
1973 int backlog;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001974 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001975
1976 backlog = PyInt_AsLong(arg);
1977 if (backlog == -1 && PyErr_Occurred())
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001978 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001979 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +00001980 if (backlog < 1)
1981 backlog = 1;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001982 res = listen(s->sock_fd, backlog);
Guido van Rossum73624e91994-10-10 17:59:00 +00001983 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001984 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001985 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001986 Py_INCREF(Py_None);
1987 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001988}
1989
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001990PyDoc_STRVAR(listen_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001991"listen(backlog)\n\
1992\n\
1993Enable a server to accept connections. The backlog argument must be at\n\
1994least 1; it specifies the number of unaccepted connection that the system\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001995will allow before refusing new connections.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001996
1997
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001998#ifndef NO_DUP
Guido van Rossum30a685f1991-06-27 15:51:29 +00001999/* s.makefile(mode) method.
2000 Create a new open file object referring to a dupped version of
2001 the socket's file descriptor. (The dup() call is necessary so
2002 that the open file and socket objects may be closed independent
2003 of each other.)
2004 The mode argument specifies 'r' or 'w' passed to fdopen(). */
2005
Guido van Rossum73624e91994-10-10 17:59:00 +00002006static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002007sock_makefile(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002008{
Tim Petersdbd9ba62000-07-09 03:09:57 +00002009 extern int fclose(FILE *);
Guido van Rossum6b144911995-03-14 15:05:13 +00002010 char *mode = "r";
2011 int bufsize = -1;
Fred Drakea04eaad2000-06-30 02:46:07 +00002012#ifdef MS_WIN32
Tim Peters79248aa2001-08-29 21:37:10 +00002013 Py_intptr_t fd;
Fred Drakea04eaad2000-06-30 02:46:07 +00002014#else
Guido van Rossum30a685f1991-06-27 15:51:29 +00002015 int fd;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002016#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00002017 FILE *fp;
Guido van Rossum6b144911995-03-14 15:05:13 +00002018 PyObject *f;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002019#ifdef __VMS
2020 char *mode_r = "r";
2021 char *mode_w = "w";
2022#endif
Guido van Rossum6b144911995-03-14 15:05:13 +00002023
Guido van Rossum43713e52000-02-29 13:59:29 +00002024 if (!PyArg_ParseTuple(args, "|si:makefile", &mode, &bufsize))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002025 return NULL;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002026#ifdef __VMS
2027 if (strcmp(mode,"rb") == 0) {
2028 mode = mode_r;
2029 }
2030 else {
2031 if (strcmp(mode,"wb") == 0) {
2032 mode = mode_w;
2033 }
2034 }
2035#endif
Guido van Rossum8d665e61996-06-26 18:22:49 +00002036#ifdef MS_WIN32
Guido van Rossum82a5c661998-07-07 20:45:43 +00002037 if (((fd = _open_osfhandle(s->sock_fd, _O_BINARY)) < 0) ||
2038 ((fd = dup(fd)) < 0) || ((fp = fdopen(fd, mode)) == NULL))
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00002039#else
Guido van Rossum82a5c661998-07-07 20:45:43 +00002040 if ((fd = dup(s->sock_fd)) < 0 || (fp = fdopen(fd, mode)) == NULL)
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00002041#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00002042 {
Guido van Rossum6b144911995-03-14 15:05:13 +00002043 if (fd >= 0)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00002044 SOCKETCLOSE(fd);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002045 return s->errorhandler();
Guido van Rossum6b144911995-03-14 15:05:13 +00002046 }
2047 f = PyFile_FromFile(fp, "<socket>", mode, fclose);
2048 if (f != NULL)
2049 PyFile_SetBufSize(f, bufsize);
2050 return f;
Guido van Rossum30a685f1991-06-27 15:51:29 +00002051}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002052
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002053PyDoc_STRVAR(makefile_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002054"makefile([mode[, buffersize]]) -> file object\n\
2055\n\
2056Return a regular file object corresponding to the socket.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002057The mode and buffersize arguments are as for the built-in open() function.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002058
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002059#endif /* NO_DUP */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002060
Guido van Rossum48a680c2001-03-02 06:34:14 +00002061
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002062/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002063
Guido van Rossum73624e91994-10-10 17:59:00 +00002064static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002065sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002066{
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002067 int len, n = 0, flags = 0, timeout;
Guido van Rossum73624e91994-10-10 17:59:00 +00002068 PyObject *buf;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002069#ifdef __VMS
2070 int read_length;
2071 char *read_buf;
2072#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00002073
Guido van Rossum43713e52000-02-29 13:59:29 +00002074 if (!PyArg_ParseTuple(args, "i|i:recv", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00002075 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002076
2077 if (len < 0) {
Martin v. Löwisfba64e12001-11-19 10:41:26 +00002078 PyErr_SetString(PyExc_ValueError,
Guido van Rossum11ba0942002-06-13 15:07:44 +00002079 "negative buffersize in recv");
Martin v. Löwisfba64e12001-11-19 10:41:26 +00002080 return NULL;
2081 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002082
Guido van Rossum73624e91994-10-10 17:59:00 +00002083 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002084 if (buf == NULL)
2085 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002086
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002087#ifndef __VMS
Guido van Rossum73624e91994-10-10 17:59:00 +00002088 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002089 timeout = internal_select(s, 0);
2090 if (!timeout)
2091 n = recv(s->sock_fd, PyString_AS_STRING(buf), len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00002092 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002093
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002094 if (timeout) {
2095 Py_DECREF(buf);
2096 PyErr_SetString(socket_timeout, "timed out");
2097 return NULL;
2098 }
Guido van Rossum7c53b771995-09-13 18:39:47 +00002099 if (n < 0) {
2100 Py_DECREF(buf);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002101 return s->errorhandler();
Guido van Rossum7c53b771995-09-13 18:39:47 +00002102 }
Tim Peters5de98422002-04-27 18:44:32 +00002103 if (n != len)
2104 _PyString_Resize(&buf, n);
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002105#else
2106 read_buf = PyString_AsString(buf);
2107 read_length = len;
2108 while (read_length != 0) {
2109 unsigned int segment;
2110
2111 segment = read_length /SEGMENT_SIZE;
2112 if (segment != 0) {
2113 segment = SEGMENT_SIZE;
2114 }
2115 else {
2116 segment = read_length;
2117 }
2118
2119 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002120 timeout = internal_select(s, 0);
2121 if (!timeout)
2122 n = recv(s->sock_fd, read_buf, segment, flags);
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002123 Py_END_ALLOW_THREADS
2124
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002125 if (timeout) {
2126 Py_DECREF(buf);
2127 PyErr_SetString(socket_timeout, "timed out");
2128 return NULL;
2129 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002130 if (n < 0) {
2131 Py_DECREF(buf);
2132 return s->errorhandler();
2133 }
2134 if (n != read_length) {
2135 read_buf += n;
2136 break;
2137 }
2138
2139 read_length -= segment;
2140 read_buf += segment;
2141 }
2142 if (_PyString_Resize(&buf, (read_buf - PyString_AsString(buf))) < 0)
2143 {
2144 return NULL;
2145 }
2146#endif /* !__VMS */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002147 return buf;
2148}
2149
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002150PyDoc_STRVAR(recv_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002151"recv(buffersize[, flags]) -> data\n\
2152\n\
2153Receive up to buffersize bytes from the socket. For the optional flags\n\
2154argument, see the Unix manual. When no data is available, block until\n\
2155at least one byte is available or until the remote end is closed. When\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002156the remote end is closed and all data is read, return the empty string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002157
Guido van Rossum30a685f1991-06-27 15:51:29 +00002158
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002159/* s.recvfrom(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002160
Guido van Rossum73624e91994-10-10 17:59:00 +00002161static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002162sock_recvfrom(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002163{
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00002164 sock_addr_t addrbuf;
Barry Warsaw752300b1997-01-03 17:18:10 +00002165 PyObject *buf = NULL;
2166 PyObject *addr = NULL;
2167 PyObject *ret = NULL;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002168 int len, n = 0, flags = 0, timeout;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002169 socklen_t addrlen;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002170
Guido van Rossum43713e52000-02-29 13:59:29 +00002171 if (!PyArg_ParseTuple(args, "i|i:recvfrom", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00002172 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002173
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00002174 if (!getsockaddrlen(s, &addrlen))
2175 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00002176 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00002177 if (buf == NULL)
2178 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002179
Guido van Rossum73624e91994-10-10 17:59:00 +00002180 Py_BEGIN_ALLOW_THREADS
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00002181 memset(&addrbuf, 0, addrlen);
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002182 timeout = internal_select(s, 0);
2183 if (!timeout)
2184 n = recvfrom(s->sock_fd, PyString_AS_STRING(buf), len, flags,
Guido van Rossum8d665e61996-06-26 18:22:49 +00002185#ifndef MS_WINDOWS
Andrew MacIntyreba43e872002-03-03 03:03:52 +00002186#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00002187 (struct sockaddr *) &addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00002188#else
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00002189 (void *) &addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00002190#endif
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002191#else
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00002192 (struct sockaddr *) &addrbuf, &addrlen
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002193#endif
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002194 );
Guido van Rossum73624e91994-10-10 17:59:00 +00002195 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002196
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002197 if (timeout) {
2198 Py_DECREF(buf);
2199 PyErr_SetString(socket_timeout, "timed out");
2200 return NULL;
2201 }
Guido van Rossum7c53b771995-09-13 18:39:47 +00002202 if (n < 0) {
2203 Py_DECREF(buf);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002204 return s->errorhandler();
Guido van Rossum7c53b771995-09-13 18:39:47 +00002205 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002206
Guido van Rossum53a9bf81996-06-11 18:35:24 +00002207 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002208 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002209
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00002210 if (!(addr = makesockaddr(s->sock_fd, (struct sockaddr *) &addrbuf,
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00002211 addrlen, s->sock_proto)))
Barry Warsaw752300b1997-01-03 17:18:10 +00002212 goto finally;
2213
Raymond Hettinger8ae46892003-10-12 19:09:37 +00002214 ret = PyTuple_Pack(2, buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002215
2216finally:
Guido van Rossum73624e91994-10-10 17:59:00 +00002217 Py_XDECREF(addr);
2218 Py_XDECREF(buf);
Guido van Rossum6f5afc91993-02-05 09:46:15 +00002219 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002220}
2221
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002222PyDoc_STRVAR(recvfrom_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002223"recvfrom(buffersize[, flags]) -> (data, address info)\n\
2224\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002225Like recv(buffersize, flags) but also return the sender's address info.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002226
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002227/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002228
Guido van Rossum73624e91994-10-10 17:59:00 +00002229static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002230sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002231{
Guido van Rossumff4949e1992-08-05 19:58:53 +00002232 char *buf;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002233 int len, n = 0, flags = 0, timeout;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002234#ifdef __VMS
2235 int send_length;
2236#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00002237
Guido van Rossum43713e52000-02-29 13:59:29 +00002238 if (!PyArg_ParseTuple(args, "s#|i:send", &buf, &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00002239 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002240
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002241#ifndef __VMS
Guido van Rossum73624e91994-10-10 17:59:00 +00002242 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002243 timeout = internal_select(s, 1);
2244 if (!timeout)
2245 n = send(s->sock_fd, buf, len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00002246 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002247
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002248 if (timeout) {
2249 PyErr_SetString(socket_timeout, "timed out");
2250 return NULL;
2251 }
Guido van Rossum30a685f1991-06-27 15:51:29 +00002252 if (n < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002253 return s->errorhandler();
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002254#else
2255 /* Divide packet into smaller segments for */
2256 /* TCP/IP Services for OpenVMS */
2257 send_length = len;
2258 while (send_length != 0) {
2259 unsigned int segment;
2260
2261 segment = send_length / SEGMENT_SIZE;
2262 if (segment != 0) {
2263 segment = SEGMENT_SIZE;
2264 }
2265 else {
2266 segment = send_length;
2267 }
2268 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002269 timeout = internal_select(s, 1);
2270 if (!timeout)
2271 n = send(s->sock_fd, buf, segment, flags);
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002272 Py_END_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002273 if (timeout) {
2274 PyErr_SetString(socket_timeout, "timed out");
2275 return NULL;
2276 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002277 if (n < 0) {
2278 return s->errorhandler();
2279 }
2280 send_length -= segment;
2281 buf += segment;
2282 } /* end while */
2283#endif /* !__VMS */
Guido van Rossum73624e91994-10-10 17:59:00 +00002284 return PyInt_FromLong((long)n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00002285}
2286
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002287PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002288"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002289\n\
2290Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002291argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002292sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002293
2294
2295/* s.sendall(data [,flags]) method */
2296
2297static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002298sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002299{
2300 char *buf;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002301 int len, n = 0, flags = 0, timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002302
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002303 if (!PyArg_ParseTuple(args, "s#|i:sendall", &buf, &len, &flags))
2304 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002305
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002306 Py_BEGIN_ALLOW_THREADS
2307 do {
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002308 timeout = internal_select(s, 1);
2309 if (timeout)
2310 break;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002311 n = send(s->sock_fd, buf, len, flags);
2312 if (n < 0)
2313 break;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002314 buf += n;
2315 len -= n;
2316 } while (len > 0);
2317 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002318
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002319 if (timeout) {
2320 PyErr_SetString(socket_timeout, "timed out");
2321 return NULL;
2322 }
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002323 if (n < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002324 return s->errorhandler();
Guido van Rossum67f7a382002-06-06 21:08:16 +00002325
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002326 Py_INCREF(Py_None);
2327 return Py_None;
2328}
2329
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002330PyDoc_STRVAR(sendall_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002331"sendall(data[, flags])\n\
2332\n\
2333Send a data string to the socket. For the optional flags\n\
2334argument, see the Unix manual. This calls send() repeatedly\n\
2335until all data is sent. If an error occurs, it's impossible\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002336to tell how much data has been sent.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002337
Guido van Rossum30a685f1991-06-27 15:51:29 +00002338
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002339/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002340
Guido van Rossum73624e91994-10-10 17:59:00 +00002341static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002342sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002343{
Guido van Rossum73624e91994-10-10 17:59:00 +00002344 PyObject *addro;
Guido van Rossumff4949e1992-08-05 19:58:53 +00002345 char *buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002346 struct sockaddr *addr;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002347 int addrlen, len, n = 0, flags, timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002348
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002349 flags = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002350 if (!PyArg_ParseTuple(args, "s#O:sendto", &buf, &len, &addro)) {
Guido van Rossum73624e91994-10-10 17:59:00 +00002351 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002352 if (!PyArg_ParseTuple(args, "s#iO:sendto",
2353 &buf, &len, &flags, &addro))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002354 return NULL;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002355 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002356
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002357 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002358 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002359
Guido van Rossum73624e91994-10-10 17:59:00 +00002360 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002361 timeout = internal_select(s, 1);
2362 if (!timeout)
2363 n = sendto(s->sock_fd, buf, len, flags, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00002364 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002365
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002366 if (timeout) {
2367 PyErr_SetString(socket_timeout, "timed out");
2368 return NULL;
2369 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002370 if (n < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002371 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00002372 return PyInt_FromLong((long)n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002373}
2374
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002375PyDoc_STRVAR(sendto_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002376"sendto(data[, flags], address) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002377\n\
2378Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002379For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002380
Guido van Rossum30a685f1991-06-27 15:51:29 +00002381
2382/* s.shutdown(how) method */
2383
Guido van Rossum73624e91994-10-10 17:59:00 +00002384static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002385sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002386{
2387 int how;
Guido van Rossumff4949e1992-08-05 19:58:53 +00002388 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002389
2390 how = PyInt_AsLong(arg);
2391 if (how == -1 && PyErr_Occurred())
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002392 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00002393 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002394 res = shutdown(s->sock_fd, how);
Guido van Rossum73624e91994-10-10 17:59:00 +00002395 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002396 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002397 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00002398 Py_INCREF(Py_None);
2399 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002400}
2401
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002402PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002403"shutdown(flag)\n\
2404\n\
Martin v. Löwis94681fc2003-11-27 19:40:22 +00002405Shut down the reading side of the socket (flag == SHUT_RD), the writing side\n\
2406of the socket (flag == SHUT_WR), or both ends (flag == SHUT_RDWR).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002407
Guido van Rossum30a685f1991-06-27 15:51:29 +00002408
2409/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002410
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002411static PyMethodDef sock_methods[] = {
2412 {"accept", (PyCFunction)sock_accept, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002413 accept_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002414 {"bind", (PyCFunction)sock_bind, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002415 bind_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002416 {"close", (PyCFunction)sock_close, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002417 close_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002418 {"connect", (PyCFunction)sock_connect, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002419 connect_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002420 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002421 connect_ex_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00002422#ifndef NO_DUP
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002423 {"dup", (PyCFunction)sock_dup, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002424 dup_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00002425#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002426 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002427 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00002428#ifdef HAVE_GETPEERNAME
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002429 {"getpeername", (PyCFunction)sock_getpeername,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002430 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00002431#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002432 {"getsockname", (PyCFunction)sock_getsockname,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002433 METH_NOARGS, getsockname_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002434 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002435 getsockopt_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002436 {"listen", (PyCFunction)sock_listen, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002437 listen_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002438#ifndef NO_DUP
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002439 {"makefile", (PyCFunction)sock_makefile, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002440 makefile_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002441#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002442 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002443 recv_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002444 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002445 recvfrom_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002446 {"send", (PyCFunction)sock_send, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002447 send_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002448 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002449 sendall_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002450 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002451 sendto_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002452 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002453 setblocking_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002454 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
Guido van Rossum67f7a382002-06-06 21:08:16 +00002455 settimeout_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002456 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
Guido van Rossum67f7a382002-06-06 21:08:16 +00002457 gettimeout_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002458 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002459 setsockopt_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002460 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002461 shutdown_doc},
2462#ifdef RISCOS
Martin v. Löwisa94568a2003-05-10 07:36:56 +00002463 {"sleeptaskw", (PyCFunction)sock_sleeptaskw, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002464 sleeptaskw_doc},
2465#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +00002466 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002467};
2468
Guido van Rossum30a685f1991-06-27 15:51:29 +00002469
Guido van Rossum73624e91994-10-10 17:59:00 +00002470/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00002471 First close the file description. */
2472
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002473static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002474sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002475{
Guido van Rossumfa972c92000-04-10 12:45:45 +00002476 if (s->sock_fd != -1)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00002477 (void) SOCKETCLOSE(s->sock_fd);
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002478 s->ob_type->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002479}
2480
Guido van Rossum30a685f1991-06-27 15:51:29 +00002481
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002482static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002483sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002484{
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002485 char buf[512];
Fred Drakea04eaad2000-06-30 02:46:07 +00002486#if SIZEOF_SOCKET_T > SIZEOF_LONG
2487 if (s->sock_fd > LONG_MAX) {
2488 /* this can occur on Win64, and actually there is a special
2489 ugly printf formatter for decimal pointer length integer
2490 printing, only bother if necessary*/
2491 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002492 "no printf formatter to display "
2493 "the socket descriptor in decimal");
Fred Drakea04eaad2000-06-30 02:46:07 +00002494 return NULL;
2495 }
2496#endif
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002497 PyOS_snprintf(
2498 buf, sizeof(buf),
2499 "<socket object, fd=%ld, family=%d, type=%d, protocol=%d>",
2500 (long)s->sock_fd, s->sock_family,
2501 s->sock_type,
2502 s->sock_proto);
Guido van Rossumdc1c64a1996-02-27 15:21:19 +00002503 return PyString_FromString(buf);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002504}
2505
2506
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002507/* Create a new, uninitialized socket object. */
2508
2509static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002510sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002511{
2512 PyObject *new;
2513
2514 new = type->tp_alloc(type, 0);
Guido van Rossume1c478f2002-06-06 20:08:25 +00002515 if (new != NULL) {
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002516 ((PySocketSockObject *)new)->sock_fd = -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002517 ((PySocketSockObject *)new)->sock_timeout = -1.0;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002518 ((PySocketSockObject *)new)->errorhandler = &set_error;
Guido van Rossume1c478f2002-06-06 20:08:25 +00002519 }
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002520 return new;
2521}
2522
2523
2524/* Initialize a new socket object. */
2525
2526/*ARGSUSED*/
2527static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00002528sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002529{
2530 PySocketSockObject *s = (PySocketSockObject *)self;
2531 SOCKET_T fd;
2532 int family = AF_INET, type = SOCK_STREAM, proto = 0;
Jeremy Hyltonaf68c872005-12-10 18:50:16 +00002533 static const char *keywords[] = {"family", "type", "proto", 0};
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002534
2535 if (!PyArg_ParseTupleAndKeywords(args, kwds,
2536 "|iii:socket", keywords,
2537 &family, &type, &proto))
2538 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002539
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002540 Py_BEGIN_ALLOW_THREADS
2541 fd = socket(family, type, proto);
2542 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002543
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002544#ifdef MS_WINDOWS
2545 if (fd == INVALID_SOCKET)
2546#else
2547 if (fd < 0)
2548#endif
2549 {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002550 set_error();
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002551 return -1;
2552 }
2553 init_sockobject(s, fd, family, type, proto);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002554
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002555 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002556
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002557}
2558
2559
Guido van Rossumb6775db1994-08-01 11:34:53 +00002560/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002561
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002562static PyTypeObject sock_type = {
Guido van Rossum55558541996-05-23 22:54:50 +00002563 PyObject_HEAD_INIT(0) /* Must fill in type value later */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002564 0, /* ob_size */
Guido van Rossumca6dfa52001-10-28 12:31:33 +00002565 "_socket.socket", /* tp_name */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002566 sizeof(PySocketSockObject), /* tp_basicsize */
2567 0, /* tp_itemsize */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002568 (destructor)sock_dealloc, /* tp_dealloc */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002569 0, /* tp_print */
2570 0, /* tp_getattr */
2571 0, /* tp_setattr */
2572 0, /* tp_compare */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002573 (reprfunc)sock_repr, /* tp_repr */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002574 0, /* tp_as_number */
2575 0, /* tp_as_sequence */
2576 0, /* tp_as_mapping */
2577 0, /* tp_hash */
2578 0, /* tp_call */
2579 0, /* tp_str */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002580 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002581 0, /* tp_setattro */
2582 0, /* tp_as_buffer */
2583 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002584 sock_doc, /* tp_doc */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002585 0, /* tp_traverse */
2586 0, /* tp_clear */
2587 0, /* tp_richcompare */
2588 0, /* tp_weaklistoffset */
2589 0, /* tp_iter */
2590 0, /* tp_iternext */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002591 sock_methods, /* tp_methods */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002592 0, /* tp_members */
2593 0, /* tp_getset */
2594 0, /* tp_base */
2595 0, /* tp_dict */
2596 0, /* tp_descr_get */
2597 0, /* tp_descr_set */
2598 0, /* tp_dictoffset */
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00002599 sock_initobj, /* tp_init */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002600 PyType_GenericAlloc, /* tp_alloc */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002601 sock_new, /* tp_new */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002602 PyObject_Del, /* tp_free */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002603};
2604
Guido van Rossum30a685f1991-06-27 15:51:29 +00002605
Guido van Rossum81194471991-07-27 21:42:02 +00002606/* Python interface to gethostname(). */
2607
2608/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002609static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002610socket_gethostname(PyObject *self, PyObject *args)
Guido van Rossum81194471991-07-27 21:42:02 +00002611{
2612 char buf[1024];
Guido van Rossumff4949e1992-08-05 19:58:53 +00002613 int res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002614 if (!PyArg_ParseTuple(args, ":gethostname"))
Guido van Rossum81194471991-07-27 21:42:02 +00002615 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00002616 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002617 res = gethostname(buf, (int) sizeof buf - 1);
Guido van Rossum73624e91994-10-10 17:59:00 +00002618 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002619 if (res < 0)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002620 return set_error();
Guido van Rossum81194471991-07-27 21:42:02 +00002621 buf[sizeof buf - 1] = '\0';
Guido van Rossum73624e91994-10-10 17:59:00 +00002622 return PyString_FromString(buf);
Guido van Rossum81194471991-07-27 21:42:02 +00002623}
Guido van Rossumff4949e1992-08-05 19:58:53 +00002624
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002625PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002626"gethostname() -> string\n\
2627\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002628Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002629
Guido van Rossumff4949e1992-08-05 19:58:53 +00002630
Guido van Rossum30a685f1991-06-27 15:51:29 +00002631/* Python interface to gethostbyname(name). */
2632
2633/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002634static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002635socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002636{
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002637 char *name;
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00002638 sock_addr_t addrbuf;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002639
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002640 if (!PyArg_ParseTuple(args, "s:gethostbyname", &name))
Guido van Rossum30a685f1991-06-27 15:51:29 +00002641 return NULL;
Martin v. Löwisddc6f472002-07-28 16:10:31 +00002642 if (setipaddr(name, (struct sockaddr *)&addrbuf, sizeof(addrbuf), AF_INET) < 0)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002643 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002644 return makeipaddr((struct sockaddr *)&addrbuf,
2645 sizeof(struct sockaddr_in));
Guido van Rossum30a685f1991-06-27 15:51:29 +00002646}
2647
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002648PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002649"gethostbyname(host) -> address\n\
2650\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002651Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002652
2653
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002654/* Convenience function common to gethostbyname_ex and gethostbyaddr */
2655
2656static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002657gethost_common(struct hostent *h, struct sockaddr *addr, int alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002658{
2659 char **pch;
2660 PyObject *rtn_tuple = (PyObject *)NULL;
2661 PyObject *name_list = (PyObject *)NULL;
2662 PyObject *addr_list = (PyObject *)NULL;
2663 PyObject *tmp;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002664
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002665 if (h == NULL) {
Guido van Rossum48a680c2001-03-02 06:34:14 +00002666 /* Let's get real error message to return */
Guido van Rossume2ae77b2001-10-24 20:42:55 +00002667#ifndef RISCOS
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002668 set_herror(h_errno);
Guido van Rossume2ae77b2001-10-24 20:42:55 +00002669#else
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002670 PyErr_SetString(socket_error, "host not found");
Guido van Rossume2ae77b2001-10-24 20:42:55 +00002671#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002672 return NULL;
2673 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002674
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002675 if (h->h_addrtype != af) {
2676#ifdef HAVE_STRERROR
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002677 /* Let's get real error message to return */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002678 PyErr_SetString(socket_error,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002679 (char *)strerror(EAFNOSUPPORT));
2680#else
2681 PyErr_SetString(
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002682 socket_error,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002683 "Address family not supported by protocol family");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002684#endif
2685 return NULL;
2686 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002687
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002688 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00002689
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002690 case AF_INET:
2691 if (alen < sizeof(struct sockaddr_in))
2692 return NULL;
2693 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002694
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002695#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002696 case AF_INET6:
2697 if (alen < sizeof(struct sockaddr_in6))
2698 return NULL;
2699 break;
2700#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00002701
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002702 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002703
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002704 if ((name_list = PyList_New(0)) == NULL)
2705 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002706
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002707 if ((addr_list = PyList_New(0)) == NULL)
2708 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002709
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002710 for (pch = h->h_aliases; *pch != NULL; pch++) {
2711 int status;
2712 tmp = PyString_FromString(*pch);
2713 if (tmp == NULL)
2714 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002715
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002716 status = PyList_Append(name_list, tmp);
2717 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002718
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002719 if (status)
2720 goto err;
2721 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002722
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002723 for (pch = h->h_addr_list; *pch != NULL; pch++) {
2724 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002725
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002726 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00002727
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002728 case AF_INET:
2729 {
2730 struct sockaddr_in sin;
2731 memset(&sin, 0, sizeof(sin));
2732 sin.sin_family = af;
2733#ifdef HAVE_SOCKADDR_SA_LEN
2734 sin.sin_len = sizeof(sin);
2735#endif
2736 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
2737 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
Guido van Rossum67f7a382002-06-06 21:08:16 +00002738
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002739 if (pch == h->h_addr_list && alen >= sizeof(sin))
2740 memcpy((char *) addr, &sin, sizeof(sin));
2741 break;
2742 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002743
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002744#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002745 case AF_INET6:
2746 {
2747 struct sockaddr_in6 sin6;
2748 memset(&sin6, 0, sizeof(sin6));
2749 sin6.sin6_family = af;
2750#ifdef HAVE_SOCKADDR_SA_LEN
2751 sin6.sin6_len = sizeof(sin6);
2752#endif
2753 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
2754 tmp = makeipaddr((struct sockaddr *)&sin6,
2755 sizeof(sin6));
Guido van Rossum67f7a382002-06-06 21:08:16 +00002756
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002757 if (pch == h->h_addr_list && alen >= sizeof(sin6))
2758 memcpy((char *) addr, &sin6, sizeof(sin6));
2759 break;
2760 }
2761#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00002762
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002763 default: /* can't happen */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002764 PyErr_SetString(socket_error,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002765 "unsupported address family");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002766 return NULL;
2767 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002768
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002769 if (tmp == NULL)
2770 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002771
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002772 status = PyList_Append(addr_list, tmp);
2773 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002774
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002775 if (status)
2776 goto err;
2777 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002778
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002779 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002780
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002781 err:
2782 Py_XDECREF(name_list);
2783 Py_XDECREF(addr_list);
2784 return rtn_tuple;
2785}
2786
2787
2788/* Python interface to gethostbyname_ex(name). */
2789
2790/*ARGSUSED*/
2791static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002792socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002793{
2794 char *name;
2795 struct hostent *h;
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00002796#ifdef ENABLE_IPV6
2797 struct sockaddr_storage addr;
2798#else
2799 struct sockaddr_in addr;
2800#endif
Martin v. Löwis9db2f572001-07-23 01:30:10 +00002801 struct sockaddr *sa;
Guido van Rossum955becc1999-03-22 20:14:53 +00002802 PyObject *ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002803#ifdef HAVE_GETHOSTBYNAME_R
2804 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002805#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
2806 struct hostent_data data;
2807#else
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002808 char buf[16384];
2809 int buf_len = (sizeof buf) - 1;
2810 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002811#endif
2812#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002813 int result;
2814#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002815#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002816
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002817 if (!PyArg_ParseTuple(args, "s:gethostbyname_ex", &name))
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002818 return NULL;
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00002819 if (setipaddr(name, (struct sockaddr *)&addr, sizeof(addr), AF_INET) < 0)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002820 return NULL;
2821 Py_BEGIN_ALLOW_THREADS
2822#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002823#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002824 result = gethostbyname_r(name, &hp_allocated, buf, buf_len,
2825 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002826#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002827 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002828#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00002829 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002830 result = gethostbyname_r(name, &hp_allocated, &data);
2831 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002832#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002833#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00002834#ifdef USE_GETHOSTBYNAME_LOCK
Just van Rossum1040d2c2003-05-09 07:53:18 +00002835 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002836#endif
2837 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002838#endif /* HAVE_GETHOSTBYNAME_R */
2839 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002840 /* Some C libraries would require addr.__ss_family instead of
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002841 addr.ss_family.
2842 Therefore, we cast the sockaddr_storage into sockaddr to
2843 access sa_family. */
Martin v. Löwis9db2f572001-07-23 01:30:10 +00002844 sa = (struct sockaddr*)&addr;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002845 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr),
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002846 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00002847#ifdef USE_GETHOSTBYNAME_LOCK
Just van Rossum1040d2c2003-05-09 07:53:18 +00002848 PyThread_release_lock(netdb_lock);
Guido van Rossum955becc1999-03-22 20:14:53 +00002849#endif
2850 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002851}
2852
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002853PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002854"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
2855\n\
2856Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002857for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002858
2859
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002860/* Python interface to gethostbyaddr(IP). */
2861
2862/*ARGSUSED*/
2863static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002864socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002865{
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002866#ifdef ENABLE_IPV6
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002867 struct sockaddr_storage addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002868#else
Guido van Rossum48a680c2001-03-02 06:34:14 +00002869 struct sockaddr_in addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002870#endif
2871 struct sockaddr *sa = (struct sockaddr *)&addr;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002872 char *ip_num;
2873 struct hostent *h;
Guido van Rossum3baaa131999-03-22 21:44:51 +00002874 PyObject *ret;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002875#ifdef HAVE_GETHOSTBYNAME_R
2876 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002877#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
2878 struct hostent_data data;
2879#else
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002880 char buf[16384];
2881 int buf_len = (sizeof buf) - 1;
2882 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002883#endif
2884#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002885 int result;
2886#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002887#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002888 char *ap;
2889 int al;
2890 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002891
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002892 if (!PyArg_ParseTuple(args, "s:gethostbyaddr", &ip_num))
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002893 return NULL;
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00002894 af = AF_UNSPEC;
Martin v. Löwisddc6f472002-07-28 16:10:31 +00002895 if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002896 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002897 af = sa->sa_family;
2898 ap = NULL;
2899 al = 0;
2900 switch (af) {
2901 case AF_INET:
2902 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
2903 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
2904 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002905#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002906 case AF_INET6:
2907 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
2908 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
2909 break;
2910#endif
2911 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002912 PyErr_SetString(socket_error, "unsupported address family");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002913 return NULL;
2914 }
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002915 Py_BEGIN_ALLOW_THREADS
2916#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002917#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002918 result = gethostbyaddr_r(ap, al, af,
2919 &hp_allocated, buf, buf_len,
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002920 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002921#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002922 h = gethostbyaddr_r(ap, al, af,
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002923 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002924#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00002925 memset((void *) &data, '\0', sizeof(data));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002926 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002927 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002928#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002929#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00002930#ifdef USE_GETHOSTBYNAME_LOCK
Just van Rossum1040d2c2003-05-09 07:53:18 +00002931 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002932#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002933 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002934#endif /* HAVE_GETHOSTBYNAME_R */
2935 Py_END_ALLOW_THREADS
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002936 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00002937#ifdef USE_GETHOSTBYNAME_LOCK
Just van Rossum1040d2c2003-05-09 07:53:18 +00002938 PyThread_release_lock(netdb_lock);
Guido van Rossum3baaa131999-03-22 21:44:51 +00002939#endif
2940 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002941}
2942
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002943PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002944"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
2945\n\
2946Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002947for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002948
Guido van Rossum30a685f1991-06-27 15:51:29 +00002949
2950/* Python interface to getservbyname(name).
2951 This only returns the port number, since the other info is already
2952 known or not useful (like the list of aliases). */
2953
2954/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002955static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002956socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002957{
Barry Warsaw11b91a02004-06-28 00:50:43 +00002958 char *name, *proto=NULL;
Guido van Rossum30a685f1991-06-27 15:51:29 +00002959 struct servent *sp;
Barry Warsaw11b91a02004-06-28 00:50:43 +00002960 if (!PyArg_ParseTuple(args, "s|s:getservbyname", &name, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +00002961 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00002962 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002963 sp = getservbyname(name, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00002964 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00002965 if (sp == NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002966 PyErr_SetString(socket_error, "service/proto not found");
Guido van Rossum30a685f1991-06-27 15:51:29 +00002967 return NULL;
2968 }
Guido van Rossum73624e91994-10-10 17:59:00 +00002969 return PyInt_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00002970}
2971
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002972PyDoc_STRVAR(getservbyname_doc,
Barry Warsaw11b91a02004-06-28 00:50:43 +00002973"getservbyname(servicename[, protocolname]) -> integer\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002974\n\
2975Return a port number from a service name and protocol name.\n\
Barry Warsaw11b91a02004-06-28 00:50:43 +00002976The optional protocol name, if given, should be 'tcp' or 'udp',\n\
2977otherwise any protocol will match.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002978
Guido van Rossum30a685f1991-06-27 15:51:29 +00002979
Barry Warsaw11b91a02004-06-28 00:50:43 +00002980/* Python interface to getservbyport(port).
2981 This only returns the service name, since the other info is already
2982 known or not useful (like the list of aliases). */
2983
2984/*ARGSUSED*/
2985static PyObject *
2986socket_getservbyport(PyObject *self, PyObject *args)
2987{
Raymond Hettinger87de0ca2004-09-28 02:19:40 +00002988 unsigned short port;
Barry Warsaw11b91a02004-06-28 00:50:43 +00002989 char *proto=NULL;
2990 struct servent *sp;
Raymond Hettinger87de0ca2004-09-28 02:19:40 +00002991 if (!PyArg_ParseTuple(args, "H|s:getservbyport", &port, &proto))
Barry Warsaw11b91a02004-06-28 00:50:43 +00002992 return NULL;
2993 Py_BEGIN_ALLOW_THREADS
2994 sp = getservbyport(htons(port), proto);
2995 Py_END_ALLOW_THREADS
2996 if (sp == NULL) {
2997 PyErr_SetString(socket_error, "port/proto not found");
2998 return NULL;
2999 }
3000 return PyString_FromString(sp->s_name);
3001}
3002
3003PyDoc_STRVAR(getservbyport_doc,
3004"getservbyport(port[, protocolname]) -> string\n\
3005\n\
3006Return the service name from a port number and protocol name.\n\
3007The optional protocol name, if given, should be 'tcp' or 'udp',\n\
3008otherwise any protocol will match.");
3009
Guido van Rossum3901d851996-12-19 16:35:04 +00003010/* Python interface to getprotobyname(name).
3011 This only returns the protocol number, since the other info is
3012 already known or not useful (like the list of aliases). */
3013
3014/*ARGSUSED*/
3015static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003016socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00003017{
3018 char *name;
3019 struct protoent *sp;
Guido van Rossumbcc20741998-08-04 22:53:56 +00003020#ifdef __BEOS__
3021/* Not available in BeOS yet. - [cjh] */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003022 PyErr_SetString(socket_error, "getprotobyname not supported");
Guido van Rossumbcc20741998-08-04 22:53:56 +00003023 return NULL;
3024#else
Guido van Rossum27fc3c02000-03-24 20:56:56 +00003025 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
Guido van Rossum3901d851996-12-19 16:35:04 +00003026 return NULL;
3027 Py_BEGIN_ALLOW_THREADS
3028 sp = getprotobyname(name);
3029 Py_END_ALLOW_THREADS
3030 if (sp == NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003031 PyErr_SetString(socket_error, "protocol not found");
Guido van Rossum3901d851996-12-19 16:35:04 +00003032 return NULL;
3033 }
3034 return PyInt_FromLong((long) sp->p_proto);
Guido van Rossumbcc20741998-08-04 22:53:56 +00003035#endif
Guido van Rossum3901d851996-12-19 16:35:04 +00003036}
3037
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003038PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003039"getprotobyname(name) -> integer\n\
3040\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003041Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003042
Guido van Rossum3901d851996-12-19 16:35:04 +00003043
Dave Cole331708b2004-08-09 04:51:41 +00003044#ifdef HAVE_SOCKETPAIR
3045/* Create a pair of sockets using the socketpair() function.
Dave Cole07fda7e2004-08-23 05:16:23 +00003046 Arguments as for socket() except the default family is AF_UNIX if
Dave Colee8bbfe42004-08-26 00:51:16 +00003047 defined on the platform; otherwise, the default is AF_INET. */
Dave Cole331708b2004-08-09 04:51:41 +00003048
3049/*ARGSUSED*/
3050static PyObject *
3051socket_socketpair(PyObject *self, PyObject *args)
3052{
3053 PySocketSockObject *s0 = NULL, *s1 = NULL;
3054 SOCKET_T sv[2];
3055 int family, type = SOCK_STREAM, proto = 0;
3056 PyObject *res = NULL;
3057
3058#if defined(AF_UNIX)
3059 family = AF_UNIX;
3060#else
3061 family = AF_INET;
3062#endif
3063 if (!PyArg_ParseTuple(args, "|iii:socketpair",
3064 &family, &type, &proto))
3065 return NULL;
3066 /* Create a pair of socket fds */
3067 if (socketpair(family, type, proto, sv) < 0)
3068 return set_error();
Dave Cole331708b2004-08-09 04:51:41 +00003069 s0 = new_sockobject(sv[0], family, type, proto);
3070 if (s0 == NULL)
3071 goto finally;
3072 s1 = new_sockobject(sv[1], family, type, proto);
3073 if (s1 == NULL)
3074 goto finally;
3075 res = PyTuple_Pack(2, s0, s1);
3076
3077finally:
3078 if (res == NULL) {
3079 if (s0 == NULL)
3080 SOCKETCLOSE(sv[0]);
3081 if (s1 == NULL)
3082 SOCKETCLOSE(sv[1]);
3083 }
3084 Py_XDECREF(s0);
3085 Py_XDECREF(s1);
3086 return res;
3087}
3088
3089PyDoc_STRVAR(socketpair_doc,
3090"socketpair([family[, type[, proto]]]) -> (socket object, socket object)\n\
3091\n\
3092Create a pair of socket objects from the sockets returned by the platform\n\
3093socketpair() function.\n\
Dave Cole07fda7e2004-08-23 05:16:23 +00003094The arguments are the same as for socket() except the default family is\n\
Dave Colee8bbfe42004-08-26 00:51:16 +00003095AF_UNIX if defined on the platform; otherwise, the default is AF_INET.");
Dave Cole331708b2004-08-09 04:51:41 +00003096
3097#endif /* HAVE_SOCKETPAIR */
3098
3099
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00003100#ifndef NO_DUP
Guido van Rossum2a7178e1992-12-08 13:38:24 +00003101/* Create a socket object from a numeric file description.
3102 Useful e.g. if stdin is a socket.
3103 Additional arguments as for socket(). */
3104
3105/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00003106static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003107socket_fromfd(PyObject *self, PyObject *args)
Guido van Rossum2a7178e1992-12-08 13:38:24 +00003108{
Guido van Rossum73624e91994-10-10 17:59:00 +00003109 PySocketSockObject *s;
Fred Drakea04eaad2000-06-30 02:46:07 +00003110 SOCKET_T fd;
3111 int family, type, proto = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00003112 if (!PyArg_ParseTuple(args, "iii|i:fromfd",
3113 &fd, &family, &type, &proto))
Guido van Rossumbe32c891996-06-20 16:25:29 +00003114 return NULL;
Guido van Rossum5f59d601992-12-14 16:59:51 +00003115 /* Dup the fd so it and the socket can be closed independently */
3116 fd = dup(fd);
3117 if (fd < 0)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003118 return set_error();
3119 s = new_sockobject(fd, family, type, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00003120 return (PyObject *) s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00003121}
Guido van Rossum82a5c661998-07-07 20:45:43 +00003122
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003123PyDoc_STRVAR(fromfd_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003124"fromfd(fd, family, type[, proto]) -> socket object\n\
3125\n\
3126Create a socket object from the given file descriptor.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003127The remaining arguments are the same as for socket().");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003128
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00003129#endif /* NO_DUP */
Guido van Rossum2a7178e1992-12-08 13:38:24 +00003130
Guido van Rossum82a5c661998-07-07 20:45:43 +00003131
Guido van Rossum006bf911996-06-12 04:04:55 +00003132static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003133socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00003134{
3135 int x1, x2;
3136
Guido van Rossum27fc3c02000-03-24 20:56:56 +00003137 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00003138 return NULL;
3139 }
3140 x2 = (int)ntohs((short)x1);
3141 return PyInt_FromLong(x2);
3142}
3143
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003144PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003145"ntohs(integer) -> integer\n\
3146\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003147Convert a 16-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003148
3149
Guido van Rossum006bf911996-06-12 04:04:55 +00003150static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003151socket_ntohl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00003152{
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003153 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00003154
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003155 if (PyInt_Check(arg)) {
3156 x = PyInt_AS_LONG(arg);
Jeremy Hylton825e47b2002-07-25 16:37:51 +00003157 if (x == (unsigned long) -1 && PyErr_Occurred())
3158 return NULL;
Guido van Rossum006bf911996-06-12 04:04:55 +00003159 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003160 else if (PyLong_Check(arg)) {
3161 x = PyLong_AsUnsignedLong(arg);
Jeremy Hylton825e47b2002-07-25 16:37:51 +00003162 if (x == (unsigned long) -1 && PyErr_Occurred())
3163 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003164#if SIZEOF_LONG > 4
3165 {
3166 unsigned long y;
3167 /* only want the trailing 32 bits */
3168 y = x & 0xFFFFFFFFUL;
3169 if (y ^ x)
3170 return PyErr_Format(PyExc_OverflowError,
3171 "long int larger than 32 bits");
3172 x = y;
Tim Peters58141872002-08-06 22:25:02 +00003173 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003174#endif
3175 }
3176 else
Tim Peters58141872002-08-06 22:25:02 +00003177 return PyErr_Format(PyExc_TypeError,
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003178 "expected int/long, %s found",
3179 arg->ob_type->tp_name);
3180 if (x == (unsigned long) -1 && PyErr_Occurred())
3181 return NULL;
3182 return PyInt_FromLong(ntohl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00003183}
3184
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003185PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003186"ntohl(integer) -> integer\n\
3187\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003188Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003189
3190
Guido van Rossum006bf911996-06-12 04:04:55 +00003191static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003192socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00003193{
Hye-Shik Changa7b673f2003-12-17 09:40:23 +00003194 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00003195
Guido van Rossum27fc3c02000-03-24 20:56:56 +00003196 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00003197 return NULL;
3198 }
3199 x2 = (int)htons((short)x1);
3200 return PyInt_FromLong(x2);
3201}
3202
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003203PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003204"htons(integer) -> integer\n\
3205\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003206Convert a 16-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003207
3208
Guido van Rossum006bf911996-06-12 04:04:55 +00003209static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003210socket_htonl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00003211{
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003212 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00003213
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003214 if (PyInt_Check(arg)) {
3215 x = PyInt_AS_LONG(arg);
Jeremy Hylton825e47b2002-07-25 16:37:51 +00003216 if (x == (unsigned long) -1 && PyErr_Occurred())
3217 return NULL;
Guido van Rossum006bf911996-06-12 04:04:55 +00003218 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003219 else if (PyLong_Check(arg)) {
3220 x = PyLong_AsUnsignedLong(arg);
Jeremy Hylton825e47b2002-07-25 16:37:51 +00003221 if (x == (unsigned long) -1 && PyErr_Occurred())
3222 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003223#if SIZEOF_LONG > 4
3224 {
3225 unsigned long y;
3226 /* only want the trailing 32 bits */
3227 y = x & 0xFFFFFFFFUL;
3228 if (y ^ x)
3229 return PyErr_Format(PyExc_OverflowError,
3230 "long int larger than 32 bits");
3231 x = y;
Tim Peters58141872002-08-06 22:25:02 +00003232 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003233#endif
3234 }
3235 else
Tim Peters58141872002-08-06 22:25:02 +00003236 return PyErr_Format(PyExc_TypeError,
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003237 "expected int/long, %s found",
3238 arg->ob_type->tp_name);
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003239 return PyInt_FromLong(htonl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00003240}
3241
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003242PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003243"htonl(integer) -> integer\n\
3244\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003245Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003246
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003247/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003248
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003249PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003250"inet_aton(string) -> packed 32-bit IP representation\n\
3251\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003252Convert 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 +00003253binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003254
3255static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003256socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003257{
Guido van Rossuma2e48551999-09-09 15:42:59 +00003258#ifndef INADDR_NONE
3259#define INADDR_NONE (-1)
3260#endif
Neal Norwitz88f115b2003-02-13 02:15:42 +00003261#ifdef HAVE_INET_ATON
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003262 struct in_addr buf;
Tim Peters1df9fdd2003-02-13 03:13:40 +00003263#else
3264 /* Have to use inet_addr() instead */
3265 unsigned long packed_addr;
3266#endif
3267 char *ip_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003268
Tim Peters1df9fdd2003-02-13 03:13:40 +00003269 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003270 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003271
Tim Peters1df9fdd2003-02-13 03:13:40 +00003272
3273#ifdef HAVE_INET_ATON
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003274 if (inet_aton(ip_addr, &buf))
3275 return PyString_FromStringAndSize((char *)(&buf),
3276 sizeof(buf));
3277
3278 PyErr_SetString(socket_error,
3279 "illegal IP address string passed to inet_aton");
3280 return NULL;
3281
Tim Peters1df9fdd2003-02-13 03:13:40 +00003282#else /* ! HAVE_INET_ATON */
Georg Brandld2e3ba72005-08-26 08:34:00 +00003283 /* special-case this address as inet_addr might return INADDR_NONE
3284 * for this */
3285 if (strcmp(ip_addr, "255.255.255.255") == 0) {
3286 packed_addr = 0xFFFFFFFF;
3287 } else {
3288
3289 packed_addr = inet_addr(ip_addr);
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003290
Georg Brandld2e3ba72005-08-26 08:34:00 +00003291 if (packed_addr == INADDR_NONE) { /* invalid address */
3292 PyErr_SetString(socket_error,
3293 "illegal IP address string passed to inet_aton");
3294 return NULL;
3295 }
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003296 }
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003297 return PyString_FromStringAndSize((char *) &packed_addr,
3298 sizeof(packed_addr));
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003299#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003300}
3301
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003302PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00003303"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003304\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003305Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003306
3307static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003308socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003309{
3310 char *packed_str;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003311 int addr_len;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003312 struct in_addr packed_addr;
3313
Guido van Rossum27fc3c02000-03-24 20:56:56 +00003314 if (!PyArg_ParseTuple(args, "s#:inet_ntoa", &packed_str, &addr_len)) {
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003315 return NULL;
3316 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00003317
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003318 if (addr_len != sizeof(packed_addr)) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003319 PyErr_SetString(socket_error,
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003320 "packed IP wrong length for inet_ntoa");
3321 return NULL;
3322 }
3323
3324 memcpy(&packed_addr, packed_str, addr_len);
3325
3326 return PyString_FromString(inet_ntoa(packed_addr));
3327}
Guido van Rossum82a5c661998-07-07 20:45:43 +00003328
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003329#ifdef HAVE_INET_PTON
3330
3331PyDoc_STRVAR(inet_pton_doc,
3332"inet_pton(af, ip) -> packed IP address string\n\
3333\n\
3334Convert an IP address from string format to a packed string suitable\n\
3335for use with low-level network functions.");
3336
3337static PyObject *
3338socket_inet_pton(PyObject *self, PyObject *args)
3339{
3340 int af;
3341 char* ip;
3342 int retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003343#ifdef ENABLE_IPV6
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003344 char packed[MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003345#else
3346 char packed[sizeof(struct in_addr)];
3347#endif
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003348 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
3349 return NULL;
3350 }
3351
Martin v. Löwis04697e82004-06-02 12:35:29 +00003352#if !defined(ENABLE_IPV6) && defined(AF_INET6)
Martin v. Löwis10649092003-08-05 06:25:06 +00003353 if(af == AF_INET6) {
3354 PyErr_SetString(socket_error,
3355 "can't use AF_INET6, IPv6 is disabled");
3356 return NULL;
3357 }
3358#endif
3359
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003360 retval = inet_pton(af, ip, packed);
3361 if (retval < 0) {
3362 PyErr_SetFromErrno(socket_error);
3363 return NULL;
3364 } else if (retval == 0) {
3365 PyErr_SetString(socket_error,
3366 "illegal IP address string passed to inet_pton");
3367 return NULL;
3368 } else if (af == AF_INET) {
3369 return PyString_FromStringAndSize(packed,
3370 sizeof(struct in_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003371#ifdef ENABLE_IPV6
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003372 } else if (af == AF_INET6) {
3373 return PyString_FromStringAndSize(packed,
3374 sizeof(struct in6_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003375#endif
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003376 } else {
3377 PyErr_SetString(socket_error, "unknown address family");
3378 return NULL;
3379 }
3380}
3381
3382PyDoc_STRVAR(inet_ntop_doc,
3383"inet_ntop(af, packed_ip) -> string formatted IP address\n\
3384\n\
3385Convert a packed IP address of the given family to string format.");
3386
3387static PyObject *
3388socket_inet_ntop(PyObject *self, PyObject *args)
3389{
3390 int af;
3391 char* packed;
3392 int len;
3393 const char* retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003394#ifdef ENABLE_IPV6
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003395 char ip[MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003396#else
3397 char ip[INET_ADDRSTRLEN + 1];
3398#endif
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003399
3400 /* Guarantee NUL-termination for PyString_FromString() below */
Jeremy Hylton80961f32004-11-07 14:24:25 +00003401 memset((void *) &ip[0], '\0', sizeof(ip));
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003402
3403 if (!PyArg_ParseTuple(args, "is#:inet_ntop", &af, &packed, &len)) {
3404 return NULL;
3405 }
3406
3407 if (af == AF_INET) {
3408 if (len != sizeof(struct in_addr)) {
3409 PyErr_SetString(PyExc_ValueError,
3410 "invalid length of packed IP address string");
3411 return NULL;
3412 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003413#ifdef ENABLE_IPV6
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003414 } else if (af == AF_INET6) {
3415 if (len != sizeof(struct in6_addr)) {
3416 PyErr_SetString(PyExc_ValueError,
3417 "invalid length of packed IP address string");
3418 return NULL;
3419 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003420#endif
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003421 } else {
3422 PyErr_Format(PyExc_ValueError,
3423 "unknown address family %d", af);
3424 return NULL;
3425 }
3426
3427 retval = inet_ntop(af, packed, ip, sizeof(ip));
3428 if (!retval) {
3429 PyErr_SetFromErrno(socket_error);
3430 return NULL;
3431 } else {
3432 return PyString_FromString(retval);
3433 }
3434
3435 /* NOTREACHED */
3436 PyErr_SetString(PyExc_RuntimeError, "invalid handling of inet_ntop");
3437 return NULL;
3438}
3439
3440#endif /* HAVE_INET_PTON */
3441
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003442/* Python interface to getaddrinfo(host, port). */
3443
3444/*ARGSUSED*/
3445static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003446socket_getaddrinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003447{
Martin v. Löwisf0b11d22001-11-07 08:31:03 +00003448 struct addrinfo hints, *res;
3449 struct addrinfo *res0 = NULL;
Martin v. Löwis2548c732003-04-18 10:39:54 +00003450 PyObject *hobj = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003451 PyObject *pobj = (PyObject *)NULL;
Martin v. Löwisf65b1a12001-08-12 09:28:40 +00003452 char pbuf[30];
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003453 char *hptr, *pptr;
3454 int family, socktype, protocol, flags;
3455 int error;
3456 PyObject *all = (PyObject *)NULL;
3457 PyObject *single = (PyObject *)NULL;
Martin v. Löwis2548c732003-04-18 10:39:54 +00003458 PyObject *idna = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003459
3460 family = socktype = protocol = flags = 0;
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00003461 family = AF_UNSPEC;
Martin v. Löwis2548c732003-04-18 10:39:54 +00003462 if (!PyArg_ParseTuple(args, "OO|iiii:getaddrinfo",
3463 &hobj, &pobj, &family, &socktype,
3464 &protocol, &flags)) {
3465 return NULL;
3466 }
3467 if (hobj == Py_None) {
3468 hptr = NULL;
3469 } else if (PyUnicode_Check(hobj)) {
3470 idna = PyObject_CallMethod(hobj, "encode", "s", "idna");
3471 if (!idna)
3472 return NULL;
3473 hptr = PyString_AsString(idna);
3474 } else if (PyString_Check(hobj)) {
3475 hptr = PyString_AsString(hobj);
3476 } else {
3477 PyErr_SetString(PyExc_TypeError,
3478 "getaddrinfo() argument 1 must be string or None");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003479 return NULL;
3480 }
3481 if (PyInt_Check(pobj)) {
Marc-André Lemburg03d1b182001-07-31 18:05:33 +00003482 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", PyInt_AsLong(pobj));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003483 pptr = pbuf;
3484 } else if (PyString_Check(pobj)) {
3485 pptr = PyString_AsString(pobj);
3486 } else if (pobj == Py_None) {
3487 pptr = (char *)NULL;
3488 } else {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003489 PyErr_SetString(socket_error, "Int or String expected");
Martin v. Löwis5db099a2003-08-07 11:55:15 +00003490 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003491 }
3492 memset(&hints, 0, sizeof(hints));
3493 hints.ai_family = family;
3494 hints.ai_socktype = socktype;
3495 hints.ai_protocol = protocol;
3496 hints.ai_flags = flags;
Just van Rossum1040d2c2003-05-09 07:53:18 +00003497 Py_BEGIN_ALLOW_THREADS
3498 ACQUIRE_GETADDRINFO_LOCK
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003499 error = getaddrinfo(hptr, pptr, &hints, &res0);
Just van Rossum1040d2c2003-05-09 07:53:18 +00003500 Py_END_ALLOW_THREADS
3501 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003502 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003503 set_gaierror(error);
Martin v. Löwis5db099a2003-08-07 11:55:15 +00003504 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003505 }
3506
3507 if ((all = PyList_New(0)) == NULL)
3508 goto err;
3509 for (res = res0; res; res = res->ai_next) {
Guido van Rossum716aac02001-10-12 18:59:27 +00003510 PyObject *addr =
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00003511 makesockaddr(-1, res->ai_addr, res->ai_addrlen, protocol);
Guido van Rossum716aac02001-10-12 18:59:27 +00003512 if (addr == NULL)
3513 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003514 single = Py_BuildValue("iiisO", res->ai_family,
3515 res->ai_socktype, res->ai_protocol,
3516 res->ai_canonname ? res->ai_canonname : "",
Guido van Rossum716aac02001-10-12 18:59:27 +00003517 addr);
3518 Py_DECREF(addr);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003519 if (single == NULL)
3520 goto err;
3521
3522 if (PyList_Append(all, single))
3523 goto err;
3524 Py_XDECREF(single);
3525 }
Martin v. Löwis2548c732003-04-18 10:39:54 +00003526 Py_XDECREF(idna);
Neal Norwitz90128ba2002-08-09 03:37:42 +00003527 if (res0)
3528 freeaddrinfo(res0);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003529 return all;
3530 err:
3531 Py_XDECREF(single);
3532 Py_XDECREF(all);
Martin v. Löwis2548c732003-04-18 10:39:54 +00003533 Py_XDECREF(idna);
Martin v. Löwisf0b11d22001-11-07 08:31:03 +00003534 if (res0)
3535 freeaddrinfo(res0);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003536 return (PyObject *)NULL;
3537}
3538
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003539PyDoc_STRVAR(getaddrinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003540"getaddrinfo(host, port [, family, socktype, proto, flags])\n\
3541 -> list of (family, socktype, proto, canonname, sockaddr)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003542\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003543Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003544
3545/* Python interface to getnameinfo(sa, flags). */
3546
3547/*ARGSUSED*/
3548static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003549socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003550{
3551 PyObject *sa = (PyObject *)NULL;
3552 int flags;
3553 char *hostp;
Martin v. Löwis06b1d212001-11-02 23:34:52 +00003554 int port, flowinfo, scope_id;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003555 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
3556 struct addrinfo hints, *res = NULL;
3557 int error;
3558 PyObject *ret = (PyObject *)NULL;
3559
3560 flags = flowinfo = scope_id = 0;
Martin v. Löwis06b1d212001-11-02 23:34:52 +00003561 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003562 return NULL;
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003563 if (!PyArg_ParseTuple(sa, "si|ii",
3564 &hostp, &port, &flowinfo, &scope_id))
Martin v. Löwis06b1d212001-11-02 23:34:52 +00003565 return NULL;
Marc-André Lemburg03d1b182001-07-31 18:05:33 +00003566 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003567 memset(&hints, 0, sizeof(hints));
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00003568 hints.ai_family = AF_UNSPEC;
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003569 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Just van Rossum1040d2c2003-05-09 07:53:18 +00003570 Py_BEGIN_ALLOW_THREADS
3571 ACQUIRE_GETADDRINFO_LOCK
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003572 error = getaddrinfo(hostp, pbuf, &hints, &res);
Just van Rossum1040d2c2003-05-09 07:53:18 +00003573 Py_END_ALLOW_THREADS
3574 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003575 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003576 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003577 goto fail;
3578 }
3579 if (res->ai_next) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003580 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003581 "sockaddr resolved to multiple addresses");
3582 goto fail;
3583 }
3584 switch (res->ai_family) {
3585 case AF_INET:
3586 {
3587 char *t1;
3588 int t2;
3589 if (PyArg_ParseTuple(sa, "si", &t1, &t2) == 0) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003590 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003591 "IPv4 sockaddr must be 2 tuple");
3592 goto fail;
3593 }
3594 break;
3595 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00003596#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003597 case AF_INET6:
3598 {
3599 struct sockaddr_in6 *sin6;
3600 sin6 = (struct sockaddr_in6 *)res->ai_addr;
3601 sin6->sin6_flowinfo = flowinfo;
3602 sin6->sin6_scope_id = scope_id;
3603 break;
3604 }
3605#endif
3606 }
3607 error = getnameinfo(res->ai_addr, res->ai_addrlen,
3608 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
3609 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003610 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003611 goto fail;
3612 }
3613 ret = Py_BuildValue("ss", hbuf, pbuf);
3614
3615fail:
3616 if (res)
3617 freeaddrinfo(res);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003618 return ret;
3619}
3620
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003621PyDoc_STRVAR(getnameinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003622"getnameinfo(sockaddr, flags) --> (host, port)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003623\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003624Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003625
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00003626
3627/* Python API to getting and setting the default timeout value. */
3628
3629static PyObject *
3630socket_getdefaulttimeout(PyObject *self)
3631{
3632 if (defaulttimeout < 0.0) {
3633 Py_INCREF(Py_None);
3634 return Py_None;
3635 }
3636 else
3637 return PyFloat_FromDouble(defaulttimeout);
3638}
3639
3640PyDoc_STRVAR(getdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003641"getdefaulttimeout() -> timeout\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00003642\n\
3643Returns the default timeout in floating seconds for new socket objects.\n\
3644A value of None indicates that new socket objects have no timeout.\n\
3645When the socket module is first imported, the default is None.");
3646
3647static PyObject *
3648socket_setdefaulttimeout(PyObject *self, PyObject *arg)
3649{
3650 double timeout;
3651
3652 if (arg == Py_None)
3653 timeout = -1.0;
3654 else {
3655 timeout = PyFloat_AsDouble(arg);
3656 if (timeout < 0.0) {
3657 if (!PyErr_Occurred())
3658 PyErr_SetString(PyExc_ValueError,
3659 "Timeout value out of range");
3660 return NULL;
3661 }
3662 }
3663
3664 defaulttimeout = timeout;
3665
3666 Py_INCREF(Py_None);
3667 return Py_None;
3668}
3669
3670PyDoc_STRVAR(setdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003671"setdefaulttimeout(timeout)\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00003672\n\
3673Set the default timeout in floating seconds for new socket objects.\n\
3674A value of None indicates that new socket objects have no timeout.\n\
3675When the socket module is first imported, the default is None.");
3676
3677
Guido van Rossum30a685f1991-06-27 15:51:29 +00003678/* List of functions exported by this module. */
3679
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003680static PyMethodDef socket_methods[] = {
3681 {"gethostbyname", socket_gethostbyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003682 METH_VARARGS, gethostbyname_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003683 {"gethostbyname_ex", socket_gethostbyname_ex,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003684 METH_VARARGS, ghbn_ex_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003685 {"gethostbyaddr", socket_gethostbyaddr,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003686 METH_VARARGS, gethostbyaddr_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003687 {"gethostname", socket_gethostname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003688 METH_VARARGS, gethostname_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003689 {"getservbyname", socket_getservbyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003690 METH_VARARGS, getservbyname_doc},
Barry Warsaw11b91a02004-06-28 00:50:43 +00003691 {"getservbyport", socket_getservbyport,
3692 METH_VARARGS, getservbyport_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003693 {"getprotobyname", socket_getprotobyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003694 METH_VARARGS,getprotobyname_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00003695#ifndef NO_DUP
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003696 {"fromfd", socket_fromfd,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003697 METH_VARARGS, fromfd_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00003698#endif
Dave Cole331708b2004-08-09 04:51:41 +00003699#ifdef HAVE_SOCKETPAIR
3700 {"socketpair", socket_socketpair,
3701 METH_VARARGS, socketpair_doc},
3702#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003703 {"ntohs", socket_ntohs,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003704 METH_VARARGS, ntohs_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003705 {"ntohl", socket_ntohl,
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003706 METH_O, ntohl_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003707 {"htons", socket_htons,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003708 METH_VARARGS, htons_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003709 {"htonl", socket_htonl,
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003710 METH_O, htonl_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003711 {"inet_aton", socket_inet_aton,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003712 METH_VARARGS, inet_aton_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003713 {"inet_ntoa", socket_inet_ntoa,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003714 METH_VARARGS, inet_ntoa_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003715#ifdef HAVE_INET_PTON
3716 {"inet_pton", socket_inet_pton,
3717 METH_VARARGS, inet_pton_doc},
3718 {"inet_ntop", socket_inet_ntop,
3719 METH_VARARGS, inet_ntop_doc},
3720#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003721 {"getaddrinfo", socket_getaddrinfo,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003722 METH_VARARGS, getaddrinfo_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003723 {"getnameinfo", socket_getnameinfo,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003724 METH_VARARGS, getnameinfo_doc},
Guido van Rossum1693ba82002-07-18 21:11:26 +00003725 {"getdefaulttimeout", (PyCFunction)socket_getdefaulttimeout,
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00003726 METH_NOARGS, getdefaulttimeout_doc},
3727 {"setdefaulttimeout", socket_setdefaulttimeout,
3728 METH_O, setdefaulttimeout_doc},
Guido van Rossum30a685f1991-06-27 15:51:29 +00003729 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003730};
3731
Guido van Rossum30a685f1991-06-27 15:51:29 +00003732
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003733#ifdef RISCOS
3734#define OS_INIT_DEFINED
Guido van Rossumbe32c891996-06-20 16:25:29 +00003735
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003736static int
3737os_init(void)
3738{
3739 _kernel_swi_regs r;
3740
3741 r.r[0] = 0;
3742 _kernel_swi(0x43380, &r, &r);
3743 taskwindow = r.r[0];
3744
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003745 return 1;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003746}
3747
3748#endif /* RISCOS */
3749
3750
3751#ifdef MS_WINDOWS
3752#define OS_INIT_DEFINED
3753
3754/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00003755
3756static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003757os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00003758{
3759 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00003760}
3761
3762static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003763os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00003764{
3765 WSADATA WSAData;
3766 int ret;
3767 char buf[100];
3768 ret = WSAStartup(0x0101, &WSAData);
3769 switch (ret) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003770 case 0: /* No error */
Mark Hammond14350ab2003-07-09 04:57:46 +00003771 Py_AtExit(os_cleanup);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003772 return 1; /* Success */
Guido van Rossumbe32c891996-06-20 16:25:29 +00003773 case WSASYSNOTREADY:
3774 PyErr_SetString(PyExc_ImportError,
3775 "WSAStartup failed: network not ready");
3776 break;
3777 case WSAVERNOTSUPPORTED:
3778 case WSAEINVAL:
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003779 PyErr_SetString(
3780 PyExc_ImportError,
3781 "WSAStartup failed: requested version not supported");
Guido van Rossumbe32c891996-06-20 16:25:29 +00003782 break;
3783 default:
Tim Peters885d4572001-11-28 20:27:42 +00003784 PyOS_snprintf(buf, sizeof(buf),
3785 "WSAStartup failed: error code %d", ret);
Guido van Rossumbe32c891996-06-20 16:25:29 +00003786 PyErr_SetString(PyExc_ImportError, buf);
3787 break;
3788 }
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003789 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00003790}
3791
Guido van Rossum8d665e61996-06-26 18:22:49 +00003792#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00003793
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003794
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003795#ifdef PYOS_OS2
3796#define OS_INIT_DEFINED
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003797
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003798/* Additional initialization for OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003799
3800static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003801os_init(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003802{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003803#ifndef PYCC_GCC
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003804 char reason[64];
3805 int rc = sock_init();
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003806
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003807 if (rc == 0) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003808 return 1; /* Success */
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003809 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003810
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003811 PyOS_snprintf(reason, sizeof(reason),
3812 "OS/2 TCP/IP Error# %d", sock_errno());
3813 PyErr_SetString(PyExc_ImportError, reason);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003814
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003815 return 0; /* Failure */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00003816#else
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003817 /* No need to initialise sockets with GCC/EMX */
3818 return 1; /* Success */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00003819#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003820}
3821
3822#endif /* PYOS_OS2 */
3823
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003824
3825#ifndef OS_INIT_DEFINED
3826static int
3827os_init(void)
3828{
3829 return 1; /* Success */
3830}
3831#endif
3832
3833
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00003834/* C API table - always add new things to the end for binary
3835 compatibility. */
3836static
3837PySocketModule_APIObject PySocketModuleAPI =
3838{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003839 &sock_type,
Brett Cannon06c34792004-03-23 23:16:54 +00003840 NULL
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00003841};
3842
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003843
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003844/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003845
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003846 This module is actually called "_socket", and there's a wrapper
3847 "socket.py" which implements some additional functionality. On some
3848 platforms (e.g. Windows and OS/2), socket.py also implements a
3849 wrapper for the socket type that provides missing functionality such
3850 as makefile(), dup() and fromfd(). The import of "_socket" may fail
3851 with an ImportError exception if os-specific initialization fails.
3852 On Windows, this does WINSOCK initialization. When WINSOCK is
3853 initialized succesfully, a call to WSACleanup() is scheduled to be
3854 made at exit time.
3855*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003856
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003857PyDoc_STRVAR(socket_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003858"Implementation module for socket operations.\n\
3859\n\
3860See the socket module for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003861
Mark Hammondfe51c6d2002-08-02 02:27:13 +00003862PyMODINIT_FUNC
Thomas Wouters1e0c2f42000-07-24 16:06:23 +00003863init_socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003864{
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003865 PyObject *m, *has_ipv6;
Fred Drake4baedc12002-04-01 14:53:37 +00003866
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003867 if (!os_init())
Guido van Rossum0cb96de1997-10-01 04:29:29 +00003868 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003869
3870 sock_type.ob_type = &PyType_Type;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003871 m = Py_InitModule3(PySocket_MODULE_NAME,
3872 socket_methods,
3873 socket_doc);
Neal Norwitz1ac754f2006-01-19 06:09:39 +00003874 if (m == NULL)
3875 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003876
3877 socket_error = PyErr_NewException("socket.error", NULL, NULL);
3878 if (socket_error == NULL)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003879 return;
Brett Cannon06c34792004-03-23 23:16:54 +00003880 PySocketModuleAPI.error = socket_error;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003881 Py_INCREF(socket_error);
3882 PyModule_AddObject(m, "error", socket_error);
3883 socket_herror = PyErr_NewException("socket.herror",
3884 socket_error, NULL);
3885 if (socket_herror == NULL)
3886 return;
3887 Py_INCREF(socket_herror);
3888 PyModule_AddObject(m, "herror", socket_herror);
3889 socket_gaierror = PyErr_NewException("socket.gaierror", socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003890 NULL);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003891 if (socket_gaierror == NULL)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003892 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003893 Py_INCREF(socket_gaierror);
3894 PyModule_AddObject(m, "gaierror", socket_gaierror);
Raymond Hettingeref7343c2003-06-29 03:08:05 +00003895 socket_timeout = PyErr_NewException("socket.timeout",
3896 socket_error, NULL);
3897 if (socket_timeout == NULL)
3898 return;
3899 Py_INCREF(socket_timeout);
3900 PyModule_AddObject(m, "timeout", socket_timeout);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003901 Py_INCREF((PyObject *)&sock_type);
Fred Drake4baedc12002-04-01 14:53:37 +00003902 if (PyModule_AddObject(m, "SocketType",
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003903 (PyObject *)&sock_type) != 0)
Guido van Rossum0cb96de1997-10-01 04:29:29 +00003904 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003905 Py_INCREF((PyObject *)&sock_type);
Fred Drake4baedc12002-04-01 14:53:37 +00003906 if (PyModule_AddObject(m, "socket",
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003907 (PyObject *)&sock_type) != 0)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003908 return;
Guido van Rossum09be4091999-08-09 14:40:40 +00003909
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003910#ifdef ENABLE_IPV6
3911 has_ipv6 = Py_True;
3912#else
3913 has_ipv6 = Py_False;
3914#endif
3915 Py_INCREF(has_ipv6);
3916 PyModule_AddObject(m, "has_ipv6", has_ipv6);
3917
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00003918 /* Export C API */
Fred Drake4baedc12002-04-01 14:53:37 +00003919 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00003920 PyCObject_FromVoidPtr((void *)&PySocketModuleAPI, NULL)
3921 ) != 0)
3922 return;
3923
Guido van Rossum09be4091999-08-09 14:40:40 +00003924 /* Address families (we only support AF_INET and AF_UNIX) */
3925#ifdef AF_UNSPEC
Fred Drake4baedc12002-04-01 14:53:37 +00003926 PyModule_AddIntConstant(m, "AF_UNSPEC", AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00003927#endif
Fred Drake4baedc12002-04-01 14:53:37 +00003928 PyModule_AddIntConstant(m, "AF_INET", AF_INET);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003929#ifdef AF_INET6
Fred Drake4baedc12002-04-01 14:53:37 +00003930 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003931#endif /* AF_INET6 */
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00003932#if defined(AF_UNIX)
Fred Drake4baedc12002-04-01 14:53:37 +00003933 PyModule_AddIntConstant(m, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00003934#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00003935#ifdef AF_AX25
Fred Drake4baedc12002-04-01 14:53:37 +00003936 /* Amateur Radio AX.25 */
3937 PyModule_AddIntConstant(m, "AF_AX25", AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00003938#endif
3939#ifdef AF_IPX
Fred Drake4baedc12002-04-01 14:53:37 +00003940 PyModule_AddIntConstant(m, "AF_IPX", AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00003941#endif
3942#ifdef AF_APPLETALK
Fred Drake4baedc12002-04-01 14:53:37 +00003943 /* Appletalk DDP */
3944 PyModule_AddIntConstant(m, "AF_APPLETALK", AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00003945#endif
3946#ifdef AF_NETROM
Fred Drake4baedc12002-04-01 14:53:37 +00003947 /* Amateur radio NetROM */
3948 PyModule_AddIntConstant(m, "AF_NETROM", AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00003949#endif
3950#ifdef AF_BRIDGE
Fred Drake4baedc12002-04-01 14:53:37 +00003951 /* Multiprotocol bridge */
3952 PyModule_AddIntConstant(m, "AF_BRIDGE", AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00003953#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00003954#ifdef AF_ATMPVC
3955 /* ATM PVCs */
3956 PyModule_AddIntConstant(m, "AF_ATMPVC", AF_ATMPVC);
3957#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00003958#ifdef AF_AAL5
Fred Drake4baedc12002-04-01 14:53:37 +00003959 /* Reserved for Werner's ATM */
3960 PyModule_AddIntConstant(m, "AF_AAL5", AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00003961#endif
3962#ifdef AF_X25
Fred Drake4baedc12002-04-01 14:53:37 +00003963 /* Reserved for X.25 project */
3964 PyModule_AddIntConstant(m, "AF_X25", AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00003965#endif
3966#ifdef AF_INET6
Fred Drake4baedc12002-04-01 14:53:37 +00003967 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00003968#endif
3969#ifdef AF_ROSE
Fred Drake4baedc12002-04-01 14:53:37 +00003970 /* Amateur Radio X.25 PLP */
3971 PyModule_AddIntConstant(m, "AF_ROSE", AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00003972#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00003973#ifdef AF_DECnet
3974 /* Reserved for DECnet project */
3975 PyModule_AddIntConstant(m, "AF_DECnet", AF_DECnet);
3976#endif
3977#ifdef AF_NETBEUI
3978 /* Reserved for 802.2LLC project */
3979 PyModule_AddIntConstant(m, "AF_NETBEUI", AF_NETBEUI);
3980#endif
3981#ifdef AF_SECURITY
3982 /* Security callback pseudo AF */
3983 PyModule_AddIntConstant(m, "AF_SECURITY", AF_SECURITY);
3984#endif
3985#ifdef AF_KEY
3986 /* PF_KEY key management API */
3987 PyModule_AddIntConstant(m, "AF_KEY", AF_KEY);
3988#endif
3989#ifdef AF_NETLINK
3990 /* */
3991 PyModule_AddIntConstant(m, "AF_NETLINK", AF_NETLINK);
Martin v. Löwis11017b12006-01-14 18:12:57 +00003992 PyModule_AddIntConstant(m, "NETLINK_ROUTE", NETLINK_ROUTE);
3993 PyModule_AddIntConstant(m, "NETLINK_SKIP", NETLINK_SKIP);
3994 PyModule_AddIntConstant(m, "NETLINK_USERSOCK", NETLINK_USERSOCK);
3995 PyModule_AddIntConstant(m, "NETLINK_FIREWALL", NETLINK_FIREWALL);
3996 PyModule_AddIntConstant(m, "NETLINK_TCPDIAG", NETLINK_TCPDIAG);
3997 PyModule_AddIntConstant(m, "NETLINK_NFLOG", NETLINK_NFLOG);
Neal Norwitz65851662006-01-16 04:31:40 +00003998#ifdef NETLINK_XFRM
Martin v. Löwis11017b12006-01-14 18:12:57 +00003999 PyModule_AddIntConstant(m, "NETLINK_XFRM", NETLINK_XFRM);
Neal Norwitz65851662006-01-16 04:31:40 +00004000#endif
Martin v. Löwis11017b12006-01-14 18:12:57 +00004001 PyModule_AddIntConstant(m, "NETLINK_ARPD", NETLINK_ARPD);
4002 PyModule_AddIntConstant(m, "NETLINK_ROUTE6", NETLINK_ROUTE6);
4003 PyModule_AddIntConstant(m, "NETLINK_IP6_FW", NETLINK_IP6_FW);
4004 PyModule_AddIntConstant(m, "NETLINK_DNRTMSG", NETLINK_DNRTMSG);
4005 PyModule_AddIntConstant(m, "NETLINK_TAPBASE", NETLINK_TAPBASE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004006#endif
4007#ifdef AF_ROUTE
4008 /* Alias to emulate 4.4BSD */
4009 PyModule_AddIntConstant(m, "AF_ROUTE", AF_ROUTE);
4010#endif
4011#ifdef AF_ASH
4012 /* Ash */
4013 PyModule_AddIntConstant(m, "AF_ASH", AF_ASH);
4014#endif
4015#ifdef AF_ECONET
4016 /* Acorn Econet */
4017 PyModule_AddIntConstant(m, "AF_ECONET", AF_ECONET);
4018#endif
4019#ifdef AF_ATMSVC
4020 /* ATM SVCs */
4021 PyModule_AddIntConstant(m, "AF_ATMSVC", AF_ATMSVC);
4022#endif
4023#ifdef AF_SNA
4024 /* Linux SNA Project (nutters!) */
4025 PyModule_AddIntConstant(m, "AF_SNA", AF_SNA);
4026#endif
4027#ifdef AF_IRDA
4028 /* IRDA sockets */
4029 PyModule_AddIntConstant(m, "AF_IRDA", AF_IRDA);
4030#endif
4031#ifdef AF_PPPOX
4032 /* PPPoX sockets */
4033 PyModule_AddIntConstant(m, "AF_PPPOX", AF_PPPOX);
4034#endif
4035#ifdef AF_WANPIPE
4036 /* Wanpipe API Sockets */
4037 PyModule_AddIntConstant(m, "AF_WANPIPE", AF_WANPIPE);
4038#endif
4039#ifdef AF_LLC
4040 /* Linux LLC */
4041 PyModule_AddIntConstant(m, "AF_LLC", AF_LLC);
4042#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00004043
Hye-Shik Chang81268602004-02-02 06:05:24 +00004044#ifdef USE_BLUETOOTH
Martin v. Löwis12af0482004-01-31 12:34:17 +00004045 PyModule_AddIntConstant(m, "AF_BLUETOOTH", AF_BLUETOOTH);
4046 PyModule_AddIntConstant(m, "BTPROTO_L2CAP", BTPROTO_L2CAP);
Hye-Shik Chang81268602004-02-02 06:05:24 +00004047#if !defined(__FreeBSD__)
Martin v. Löwis12af0482004-01-31 12:34:17 +00004048 PyModule_AddIntConstant(m, "BTPROTO_SCO", BTPROTO_SCO);
Hye-Shik Chang81268602004-02-02 06:05:24 +00004049#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00004050 PyModule_AddIntConstant(m, "BTPROTO_RFCOMM", BTPROTO_RFCOMM);
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00004051 PyModule_AddObject(m, "BDADDR_ANY", Py_BuildValue("s", "00:00:00:00:00:00"));
4052 PyModule_AddObject(m, "BDADDR_LOCAL", Py_BuildValue("s", "00:00:00:FF:FF:FF"));
Martin v. Löwis12af0482004-01-31 12:34:17 +00004053#endif
4054
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00004055#ifdef HAVE_NETPACKET_PACKET_H
Fred Drake4baedc12002-04-01 14:53:37 +00004056 PyModule_AddIntConstant(m, "AF_PACKET", AF_PACKET);
4057 PyModule_AddIntConstant(m, "PF_PACKET", PF_PACKET);
4058 PyModule_AddIntConstant(m, "PACKET_HOST", PACKET_HOST);
4059 PyModule_AddIntConstant(m, "PACKET_BROADCAST", PACKET_BROADCAST);
4060 PyModule_AddIntConstant(m, "PACKET_MULTICAST", PACKET_MULTICAST);
4061 PyModule_AddIntConstant(m, "PACKET_OTHERHOST", PACKET_OTHERHOST);
4062 PyModule_AddIntConstant(m, "PACKET_OUTGOING", PACKET_OUTGOING);
4063 PyModule_AddIntConstant(m, "PACKET_LOOPBACK", PACKET_LOOPBACK);
4064 PyModule_AddIntConstant(m, "PACKET_FASTROUTE", PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00004065#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00004066
4067 /* Socket types */
Fred Drake4baedc12002-04-01 14:53:37 +00004068 PyModule_AddIntConstant(m, "SOCK_STREAM", SOCK_STREAM);
4069 PyModule_AddIntConstant(m, "SOCK_DGRAM", SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00004070#ifndef __BEOS__
4071/* We have incomplete socket support. */
Fred Drake4baedc12002-04-01 14:53:37 +00004072 PyModule_AddIntConstant(m, "SOCK_RAW", SOCK_RAW);
4073 PyModule_AddIntConstant(m, "SOCK_SEQPACKET", SOCK_SEQPACKET);
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00004074#if defined(SOCK_RDM)
Fred Drake4baedc12002-04-01 14:53:37 +00004075 PyModule_AddIntConstant(m, "SOCK_RDM", SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00004076#endif
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00004077#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004078
4079#ifdef SO_DEBUG
Fred Drake4baedc12002-04-01 14:53:37 +00004080 PyModule_AddIntConstant(m, "SO_DEBUG", SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004081#endif
4082#ifdef SO_ACCEPTCONN
Fred Drake4baedc12002-04-01 14:53:37 +00004083 PyModule_AddIntConstant(m, "SO_ACCEPTCONN", SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004084#endif
4085#ifdef SO_REUSEADDR
Fred Drake4baedc12002-04-01 14:53:37 +00004086 PyModule_AddIntConstant(m, "SO_REUSEADDR", SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004087#endif
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00004088#ifdef SO_EXCLUSIVEADDRUSE
4089 PyModule_AddIntConstant(m, "SO_EXCLUSIVEADDRUSE", SO_EXCLUSIVEADDRUSE);
4090#endif
4091
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004092#ifdef SO_KEEPALIVE
Fred Drake4baedc12002-04-01 14:53:37 +00004093 PyModule_AddIntConstant(m, "SO_KEEPALIVE", SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004094#endif
4095#ifdef SO_DONTROUTE
Fred Drake4baedc12002-04-01 14:53:37 +00004096 PyModule_AddIntConstant(m, "SO_DONTROUTE", SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004097#endif
4098#ifdef SO_BROADCAST
Fred Drake4baedc12002-04-01 14:53:37 +00004099 PyModule_AddIntConstant(m, "SO_BROADCAST", SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004100#endif
4101#ifdef SO_USELOOPBACK
Fred Drake4baedc12002-04-01 14:53:37 +00004102 PyModule_AddIntConstant(m, "SO_USELOOPBACK", SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004103#endif
4104#ifdef SO_LINGER
Fred Drake4baedc12002-04-01 14:53:37 +00004105 PyModule_AddIntConstant(m, "SO_LINGER", SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004106#endif
4107#ifdef SO_OOBINLINE
Fred Drake4baedc12002-04-01 14:53:37 +00004108 PyModule_AddIntConstant(m, "SO_OOBINLINE", SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004109#endif
4110#ifdef SO_REUSEPORT
Fred Drake4baedc12002-04-01 14:53:37 +00004111 PyModule_AddIntConstant(m, "SO_REUSEPORT", SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004112#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004113#ifdef SO_SNDBUF
Fred Drake4baedc12002-04-01 14:53:37 +00004114 PyModule_AddIntConstant(m, "SO_SNDBUF", SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004115#endif
4116#ifdef SO_RCVBUF
Fred Drake4baedc12002-04-01 14:53:37 +00004117 PyModule_AddIntConstant(m, "SO_RCVBUF", SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004118#endif
4119#ifdef SO_SNDLOWAT
Fred Drake4baedc12002-04-01 14:53:37 +00004120 PyModule_AddIntConstant(m, "SO_SNDLOWAT", SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004121#endif
4122#ifdef SO_RCVLOWAT
Fred Drake4baedc12002-04-01 14:53:37 +00004123 PyModule_AddIntConstant(m, "SO_RCVLOWAT", SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004124#endif
4125#ifdef SO_SNDTIMEO
Fred Drake4baedc12002-04-01 14:53:37 +00004126 PyModule_AddIntConstant(m, "SO_SNDTIMEO", SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004127#endif
4128#ifdef SO_RCVTIMEO
Fred Drake4baedc12002-04-01 14:53:37 +00004129 PyModule_AddIntConstant(m, "SO_RCVTIMEO", SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004130#endif
4131#ifdef SO_ERROR
Fred Drake4baedc12002-04-01 14:53:37 +00004132 PyModule_AddIntConstant(m, "SO_ERROR", SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004133#endif
4134#ifdef SO_TYPE
Fred Drake4baedc12002-04-01 14:53:37 +00004135 PyModule_AddIntConstant(m, "SO_TYPE", SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004136#endif
4137
4138 /* Maximum number of connections for "listen" */
4139#ifdef SOMAXCONN
Fred Drake4baedc12002-04-01 14:53:37 +00004140 PyModule_AddIntConstant(m, "SOMAXCONN", SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004141#else
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004142 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004143#endif
4144
4145 /* Flags for send, recv */
4146#ifdef MSG_OOB
Fred Drake4baedc12002-04-01 14:53:37 +00004147 PyModule_AddIntConstant(m, "MSG_OOB", MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004148#endif
4149#ifdef MSG_PEEK
Fred Drake4baedc12002-04-01 14:53:37 +00004150 PyModule_AddIntConstant(m, "MSG_PEEK", MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004151#endif
4152#ifdef MSG_DONTROUTE
Fred Drake4baedc12002-04-01 14:53:37 +00004153 PyModule_AddIntConstant(m, "MSG_DONTROUTE", MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004154#endif
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00004155#ifdef MSG_DONTWAIT
Fred Drake4baedc12002-04-01 14:53:37 +00004156 PyModule_AddIntConstant(m, "MSG_DONTWAIT", MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00004157#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004158#ifdef MSG_EOR
Fred Drake4baedc12002-04-01 14:53:37 +00004159 PyModule_AddIntConstant(m, "MSG_EOR", MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004160#endif
4161#ifdef MSG_TRUNC
Fred Drake4baedc12002-04-01 14:53:37 +00004162 PyModule_AddIntConstant(m, "MSG_TRUNC", MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004163#endif
4164#ifdef MSG_CTRUNC
Fred Drake4baedc12002-04-01 14:53:37 +00004165 PyModule_AddIntConstant(m, "MSG_CTRUNC", MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004166#endif
4167#ifdef MSG_WAITALL
Fred Drake4baedc12002-04-01 14:53:37 +00004168 PyModule_AddIntConstant(m, "MSG_WAITALL", MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004169#endif
4170#ifdef MSG_BTAG
Fred Drake4baedc12002-04-01 14:53:37 +00004171 PyModule_AddIntConstant(m, "MSG_BTAG", MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004172#endif
4173#ifdef MSG_ETAG
Fred Drake4baedc12002-04-01 14:53:37 +00004174 PyModule_AddIntConstant(m, "MSG_ETAG", MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004175#endif
4176
4177 /* Protocol level and numbers, usable for [gs]etsockopt */
4178#ifdef SOL_SOCKET
Fred Drake4baedc12002-04-01 14:53:37 +00004179 PyModule_AddIntConstant(m, "SOL_SOCKET", SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004180#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00004181#ifdef SOL_IP
Fred Drake4baedc12002-04-01 14:53:37 +00004182 PyModule_AddIntConstant(m, "SOL_IP", SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00004183#else
Fred Drake4baedc12002-04-01 14:53:37 +00004184 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00004185#endif
4186#ifdef SOL_IPX
Fred Drake4baedc12002-04-01 14:53:37 +00004187 PyModule_AddIntConstant(m, "SOL_IPX", SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00004188#endif
4189#ifdef SOL_AX25
Fred Drake4baedc12002-04-01 14:53:37 +00004190 PyModule_AddIntConstant(m, "SOL_AX25", SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00004191#endif
4192#ifdef SOL_ATALK
Fred Drake4baedc12002-04-01 14:53:37 +00004193 PyModule_AddIntConstant(m, "SOL_ATALK", SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00004194#endif
4195#ifdef SOL_NETROM
Fred Drake4baedc12002-04-01 14:53:37 +00004196 PyModule_AddIntConstant(m, "SOL_NETROM", SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00004197#endif
4198#ifdef SOL_ROSE
Fred Drake4baedc12002-04-01 14:53:37 +00004199 PyModule_AddIntConstant(m, "SOL_ROSE", SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00004200#endif
4201#ifdef SOL_TCP
Fred Drake4baedc12002-04-01 14:53:37 +00004202 PyModule_AddIntConstant(m, "SOL_TCP", SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00004203#else
Fred Drake4baedc12002-04-01 14:53:37 +00004204 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00004205#endif
4206#ifdef SOL_UDP
Fred Drake4baedc12002-04-01 14:53:37 +00004207 PyModule_AddIntConstant(m, "SOL_UDP", SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00004208#else
Fred Drake4baedc12002-04-01 14:53:37 +00004209 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00004210#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004211#ifdef IPPROTO_IP
Fred Drake4baedc12002-04-01 14:53:37 +00004212 PyModule_AddIntConstant(m, "IPPROTO_IP", IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00004213#else
Fred Drake4baedc12002-04-01 14:53:37 +00004214 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004215#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004216#ifdef IPPROTO_HOPOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00004217 PyModule_AddIntConstant(m, "IPPROTO_HOPOPTS", IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004218#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004219#ifdef IPPROTO_ICMP
Fred Drake4baedc12002-04-01 14:53:37 +00004220 PyModule_AddIntConstant(m, "IPPROTO_ICMP", IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00004221#else
Fred Drake4baedc12002-04-01 14:53:37 +00004222 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004223#endif
4224#ifdef IPPROTO_IGMP
Fred Drake4baedc12002-04-01 14:53:37 +00004225 PyModule_AddIntConstant(m, "IPPROTO_IGMP", IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004226#endif
4227#ifdef IPPROTO_GGP
Fred Drake4baedc12002-04-01 14:53:37 +00004228 PyModule_AddIntConstant(m, "IPPROTO_GGP", IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004229#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004230#ifdef IPPROTO_IPV4
Fred Drake4baedc12002-04-01 14:53:37 +00004231 PyModule_AddIntConstant(m, "IPPROTO_IPV4", IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004232#endif
Martin v. Löwisa0f17342003-10-03 13:56:20 +00004233#ifdef IPPROTO_IPV6
4234 PyModule_AddIntConstant(m, "IPPROTO_IPV6", IPPROTO_IPV6);
4235#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004236#ifdef IPPROTO_IPIP
Fred Drake4baedc12002-04-01 14:53:37 +00004237 PyModule_AddIntConstant(m, "IPPROTO_IPIP", IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004238#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004239#ifdef IPPROTO_TCP
Fred Drake4baedc12002-04-01 14:53:37 +00004240 PyModule_AddIntConstant(m, "IPPROTO_TCP", IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00004241#else
Fred Drake4baedc12002-04-01 14:53:37 +00004242 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004243#endif
4244#ifdef IPPROTO_EGP
Fred Drake4baedc12002-04-01 14:53:37 +00004245 PyModule_AddIntConstant(m, "IPPROTO_EGP", IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004246#endif
4247#ifdef IPPROTO_PUP
Fred Drake4baedc12002-04-01 14:53:37 +00004248 PyModule_AddIntConstant(m, "IPPROTO_PUP", IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004249#endif
4250#ifdef IPPROTO_UDP
Fred Drake4baedc12002-04-01 14:53:37 +00004251 PyModule_AddIntConstant(m, "IPPROTO_UDP", IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00004252#else
Fred Drake4baedc12002-04-01 14:53:37 +00004253 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004254#endif
4255#ifdef IPPROTO_IDP
Fred Drake4baedc12002-04-01 14:53:37 +00004256 PyModule_AddIntConstant(m, "IPPROTO_IDP", IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004257#endif
4258#ifdef IPPROTO_HELLO
Fred Drake4baedc12002-04-01 14:53:37 +00004259 PyModule_AddIntConstant(m, "IPPROTO_HELLO", IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004260#endif
4261#ifdef IPPROTO_ND
Fred Drake4baedc12002-04-01 14:53:37 +00004262 PyModule_AddIntConstant(m, "IPPROTO_ND", IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004263#endif
4264#ifdef IPPROTO_TP
Fred Drake4baedc12002-04-01 14:53:37 +00004265 PyModule_AddIntConstant(m, "IPPROTO_TP", IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004266#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004267#ifdef IPPROTO_IPV6
Fred Drake4baedc12002-04-01 14:53:37 +00004268 PyModule_AddIntConstant(m, "IPPROTO_IPV6", IPPROTO_IPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004269#endif
4270#ifdef IPPROTO_ROUTING
Fred Drake4baedc12002-04-01 14:53:37 +00004271 PyModule_AddIntConstant(m, "IPPROTO_ROUTING", IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004272#endif
4273#ifdef IPPROTO_FRAGMENT
Fred Drake4baedc12002-04-01 14:53:37 +00004274 PyModule_AddIntConstant(m, "IPPROTO_FRAGMENT", IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004275#endif
4276#ifdef IPPROTO_RSVP
Fred Drake4baedc12002-04-01 14:53:37 +00004277 PyModule_AddIntConstant(m, "IPPROTO_RSVP", IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004278#endif
4279#ifdef IPPROTO_GRE
Fred Drake4baedc12002-04-01 14:53:37 +00004280 PyModule_AddIntConstant(m, "IPPROTO_GRE", IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004281#endif
4282#ifdef IPPROTO_ESP
Fred Drake4baedc12002-04-01 14:53:37 +00004283 PyModule_AddIntConstant(m, "IPPROTO_ESP", IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004284#endif
4285#ifdef IPPROTO_AH
Fred Drake4baedc12002-04-01 14:53:37 +00004286 PyModule_AddIntConstant(m, "IPPROTO_AH", IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004287#endif
4288#ifdef IPPROTO_MOBILE
Fred Drake4baedc12002-04-01 14:53:37 +00004289 PyModule_AddIntConstant(m, "IPPROTO_MOBILE", IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004290#endif
4291#ifdef IPPROTO_ICMPV6
Fred Drake4baedc12002-04-01 14:53:37 +00004292 PyModule_AddIntConstant(m, "IPPROTO_ICMPV6", IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004293#endif
4294#ifdef IPPROTO_NONE
Fred Drake4baedc12002-04-01 14:53:37 +00004295 PyModule_AddIntConstant(m, "IPPROTO_NONE", IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004296#endif
4297#ifdef IPPROTO_DSTOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00004298 PyModule_AddIntConstant(m, "IPPROTO_DSTOPTS", IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004299#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004300#ifdef IPPROTO_XTP
Fred Drake4baedc12002-04-01 14:53:37 +00004301 PyModule_AddIntConstant(m, "IPPROTO_XTP", IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004302#endif
4303#ifdef IPPROTO_EON
Fred Drake4baedc12002-04-01 14:53:37 +00004304 PyModule_AddIntConstant(m, "IPPROTO_EON", IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004305#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004306#ifdef IPPROTO_PIM
Fred Drake4baedc12002-04-01 14:53:37 +00004307 PyModule_AddIntConstant(m, "IPPROTO_PIM", IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004308#endif
4309#ifdef IPPROTO_IPCOMP
Fred Drake4baedc12002-04-01 14:53:37 +00004310 PyModule_AddIntConstant(m, "IPPROTO_IPCOMP", IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004311#endif
4312#ifdef IPPROTO_VRRP
Fred Drake4baedc12002-04-01 14:53:37 +00004313 PyModule_AddIntConstant(m, "IPPROTO_VRRP", IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004314#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004315#ifdef IPPROTO_BIP
Fred Drake4baedc12002-04-01 14:53:37 +00004316 PyModule_AddIntConstant(m, "IPPROTO_BIP", IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004317#endif
4318/**/
4319#ifdef IPPROTO_RAW
Fred Drake4baedc12002-04-01 14:53:37 +00004320 PyModule_AddIntConstant(m, "IPPROTO_RAW", IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00004321#else
Fred Drake4baedc12002-04-01 14:53:37 +00004322 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004323#endif
4324#ifdef IPPROTO_MAX
Fred Drake4baedc12002-04-01 14:53:37 +00004325 PyModule_AddIntConstant(m, "IPPROTO_MAX", IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004326#endif
4327
4328 /* Some port configuration */
4329#ifdef IPPORT_RESERVED
Fred Drake4baedc12002-04-01 14:53:37 +00004330 PyModule_AddIntConstant(m, "IPPORT_RESERVED", IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004331#else
Fred Drake4baedc12002-04-01 14:53:37 +00004332 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004333#endif
4334#ifdef IPPORT_USERRESERVED
Fred Drake4baedc12002-04-01 14:53:37 +00004335 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004336#else
Fred Drake4baedc12002-04-01 14:53:37 +00004337 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004338#endif
4339
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004340 /* Some reserved IP v.4 addresses */
4341#ifdef INADDR_ANY
Fred Drake4baedc12002-04-01 14:53:37 +00004342 PyModule_AddIntConstant(m, "INADDR_ANY", INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004343#else
Fred Drake4baedc12002-04-01 14:53:37 +00004344 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004345#endif
4346#ifdef INADDR_BROADCAST
Fred Drake4baedc12002-04-01 14:53:37 +00004347 PyModule_AddIntConstant(m, "INADDR_BROADCAST", INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004348#else
Fred Drake4baedc12002-04-01 14:53:37 +00004349 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004350#endif
4351#ifdef INADDR_LOOPBACK
Fred Drake4baedc12002-04-01 14:53:37 +00004352 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004353#else
Fred Drake4baedc12002-04-01 14:53:37 +00004354 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004355#endif
4356#ifdef INADDR_UNSPEC_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00004357 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004358#else
Fred Drake4baedc12002-04-01 14:53:37 +00004359 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004360#endif
4361#ifdef INADDR_ALLHOSTS_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00004362 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
4363 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004364#else
Fred Drake4baedc12002-04-01 14:53:37 +00004365 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004366#endif
4367#ifdef INADDR_MAX_LOCAL_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00004368 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP",
4369 INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004370#else
Fred Drake4baedc12002-04-01 14:53:37 +00004371 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004372#endif
4373#ifdef INADDR_NONE
Fred Drake4baedc12002-04-01 14:53:37 +00004374 PyModule_AddIntConstant(m, "INADDR_NONE", INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004375#else
Fred Drake4baedc12002-04-01 14:53:37 +00004376 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004377#endif
4378
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004379 /* IPv4 [gs]etsockopt options */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004380#ifdef IP_OPTIONS
Fred Drake4baedc12002-04-01 14:53:37 +00004381 PyModule_AddIntConstant(m, "IP_OPTIONS", IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004382#endif
4383#ifdef IP_HDRINCL
Fred Drake4baedc12002-04-01 14:53:37 +00004384 PyModule_AddIntConstant(m, "IP_HDRINCL", IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004385#endif
4386#ifdef IP_TOS
Fred Drake4baedc12002-04-01 14:53:37 +00004387 PyModule_AddIntConstant(m, "IP_TOS", IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004388#endif
4389#ifdef IP_TTL
Fred Drake4baedc12002-04-01 14:53:37 +00004390 PyModule_AddIntConstant(m, "IP_TTL", IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004391#endif
4392#ifdef IP_RECVOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00004393 PyModule_AddIntConstant(m, "IP_RECVOPTS", IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004394#endif
4395#ifdef IP_RECVRETOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00004396 PyModule_AddIntConstant(m, "IP_RECVRETOPTS", IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004397#endif
4398#ifdef IP_RECVDSTADDR
Fred Drake4baedc12002-04-01 14:53:37 +00004399 PyModule_AddIntConstant(m, "IP_RECVDSTADDR", IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004400#endif
4401#ifdef IP_RETOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00004402 PyModule_AddIntConstant(m, "IP_RETOPTS", IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004403#endif
4404#ifdef IP_MULTICAST_IF
Fred Drake4baedc12002-04-01 14:53:37 +00004405 PyModule_AddIntConstant(m, "IP_MULTICAST_IF", IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004406#endif
4407#ifdef IP_MULTICAST_TTL
Fred Drake4baedc12002-04-01 14:53:37 +00004408 PyModule_AddIntConstant(m, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004409#endif
4410#ifdef IP_MULTICAST_LOOP
Fred Drake4baedc12002-04-01 14:53:37 +00004411 PyModule_AddIntConstant(m, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004412#endif
4413#ifdef IP_ADD_MEMBERSHIP
Fred Drake4baedc12002-04-01 14:53:37 +00004414 PyModule_AddIntConstant(m, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004415#endif
4416#ifdef IP_DROP_MEMBERSHIP
Fred Drake4baedc12002-04-01 14:53:37 +00004417 PyModule_AddIntConstant(m, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004418#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00004419#ifdef IP_DEFAULT_MULTICAST_TTL
Fred Drake4baedc12002-04-01 14:53:37 +00004420 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_TTL",
4421 IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00004422#endif
4423#ifdef IP_DEFAULT_MULTICAST_LOOP
Fred Drake4baedc12002-04-01 14:53:37 +00004424 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_LOOP",
4425 IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00004426#endif
4427#ifdef IP_MAX_MEMBERSHIPS
Fred Drake4baedc12002-04-01 14:53:37 +00004428 PyModule_AddIntConstant(m, "IP_MAX_MEMBERSHIPS", IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00004429#endif
4430
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004431 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
4432#ifdef IPV6_JOIN_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00004433 PyModule_AddIntConstant(m, "IPV6_JOIN_GROUP", IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004434#endif
4435#ifdef IPV6_LEAVE_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00004436 PyModule_AddIntConstant(m, "IPV6_LEAVE_GROUP", IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004437#endif
4438#ifdef IPV6_MULTICAST_HOPS
Fred Drake4baedc12002-04-01 14:53:37 +00004439 PyModule_AddIntConstant(m, "IPV6_MULTICAST_HOPS", IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004440#endif
4441#ifdef IPV6_MULTICAST_IF
Fred Drake4baedc12002-04-01 14:53:37 +00004442 PyModule_AddIntConstant(m, "IPV6_MULTICAST_IF", IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004443#endif
4444#ifdef IPV6_MULTICAST_LOOP
Fred Drake4baedc12002-04-01 14:53:37 +00004445 PyModule_AddIntConstant(m, "IPV6_MULTICAST_LOOP", IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004446#endif
4447#ifdef IPV6_UNICAST_HOPS
Fred Drake4baedc12002-04-01 14:53:37 +00004448 PyModule_AddIntConstant(m, "IPV6_UNICAST_HOPS", IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004449#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00004450 /* Additional IPV6 socket options, defined in RFC 3493 */
4451#ifdef IPV6_V6ONLY
4452 PyModule_AddIntConstant(m, "IPV6_V6ONLY", IPV6_V6ONLY);
4453#endif
4454 /* Advanced IPV6 socket options, from RFC 3542 */
4455#ifdef IPV6_CHECKSUM
4456 PyModule_AddIntConstant(m, "IPV6_CHECKSUM", IPV6_CHECKSUM);
4457#endif
4458#ifdef IPV6_DONTFRAG
4459 PyModule_AddIntConstant(m, "IPV6_DONTFRAG", IPV6_DONTFRAG);
4460#endif
4461#ifdef IPV6_DSTOPTS
4462 PyModule_AddIntConstant(m, "IPV6_DSTOPTS", IPV6_DSTOPTS);
4463#endif
4464#ifdef IPV6_HOPLIMIT
4465 PyModule_AddIntConstant(m, "IPV6_HOPLIMIT", IPV6_HOPLIMIT);
4466#endif
4467#ifdef IPV6_HOPOPTS
4468 PyModule_AddIntConstant(m, "IPV6_HOPOPTS", IPV6_HOPOPTS);
4469#endif
4470#ifdef IPV6_NEXTHOP
4471 PyModule_AddIntConstant(m, "IPV6_NEXTHOP", IPV6_NEXTHOP);
4472#endif
4473#ifdef IPV6_PATHMTU
4474 PyModule_AddIntConstant(m, "IPV6_PATHMTU", IPV6_PATHMTU);
4475#endif
4476#ifdef IPV6_PKTINFO
4477 PyModule_AddIntConstant(m, "IPV6_PKTINFO", IPV6_PKTINFO);
4478#endif
4479#ifdef IPV6_RECVDSTOPTS
4480 PyModule_AddIntConstant(m, "IPV6_RECVDSTOPTS", IPV6_RECVDSTOPTS);
4481#endif
4482#ifdef IPV6_RECVHOPLIMIT
4483 PyModule_AddIntConstant(m, "IPV6_RECVHOPLIMIT", IPV6_RECVHOPLIMIT);
4484#endif
4485#ifdef IPV6_RECVHOPOPTS
4486 PyModule_AddIntConstant(m, "IPV6_RECVHOPOPTS", IPV6_RECVHOPOPTS);
4487#endif
4488#ifdef IPV6_RECVPKTINFO
4489 PyModule_AddIntConstant(m, "IPV6_RECVPKTINFO", IPV6_RECVPKTINFO);
4490#endif
4491#ifdef IPV6_RECVRTHDR
4492 PyModule_AddIntConstant(m, "IPV6_RECVRTHDR", IPV6_RECVRTHDR);
4493#endif
4494#ifdef IPV6_RECVTCLASS
4495 PyModule_AddIntConstant(m, "IPV6_RECVTCLASS", IPV6_RECVTCLASS);
4496#endif
4497#ifdef IPV6_RTHDR
4498 PyModule_AddIntConstant(m, "IPV6_RTHDR", IPV6_RTHDR);
4499#endif
4500#ifdef IPV6_RTHDRDSTOPTS
4501 PyModule_AddIntConstant(m, "IPV6_RTHDRDSTOPTS", IPV6_RTHDRDSTOPTS);
4502#endif
4503#ifdef IPV6_RTHDR_TYPE_0
4504 PyModule_AddIntConstant(m, "IPV6_RTHDR_TYPE_0", IPV6_RTHDR_TYPE_0);
4505#endif
4506#ifdef IPV6_RECVPATHMTU
4507 PyModule_AddIntConstant(m, "IPV6_RECVPATHMTU", IPV6_RECVPATHMTU);
4508#endif
4509#ifdef IPV6_TCLASS
4510 PyModule_AddIntConstant(m, "IPV6_TCLASS", IPV6_TCLASS);
4511#endif
4512#ifdef IPV6_USE_MIN_MTU
4513 PyModule_AddIntConstant(m, "IPV6_USE_MIN_MTU", IPV6_USE_MIN_MTU);
4514#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004515
Guido van Rossum09be4091999-08-09 14:40:40 +00004516 /* TCP options */
4517#ifdef TCP_NODELAY
Fred Drake4baedc12002-04-01 14:53:37 +00004518 PyModule_AddIntConstant(m, "TCP_NODELAY", TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00004519#endif
4520#ifdef TCP_MAXSEG
Fred Drake4baedc12002-04-01 14:53:37 +00004521 PyModule_AddIntConstant(m, "TCP_MAXSEG", TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00004522#endif
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004523#ifdef TCP_CORK
Fred Drake4baedc12002-04-01 14:53:37 +00004524 PyModule_AddIntConstant(m, "TCP_CORK", TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004525#endif
4526#ifdef TCP_KEEPIDLE
Fred Drake4baedc12002-04-01 14:53:37 +00004527 PyModule_AddIntConstant(m, "TCP_KEEPIDLE", TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004528#endif
4529#ifdef TCP_KEEPINTVL
Fred Drake4baedc12002-04-01 14:53:37 +00004530 PyModule_AddIntConstant(m, "TCP_KEEPINTVL", TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004531#endif
4532#ifdef TCP_KEEPCNT
Fred Drake4baedc12002-04-01 14:53:37 +00004533 PyModule_AddIntConstant(m, "TCP_KEEPCNT", TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004534#endif
4535#ifdef TCP_SYNCNT
Fred Drake4baedc12002-04-01 14:53:37 +00004536 PyModule_AddIntConstant(m, "TCP_SYNCNT", TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004537#endif
4538#ifdef TCP_LINGER2
Fred Drake4baedc12002-04-01 14:53:37 +00004539 PyModule_AddIntConstant(m, "TCP_LINGER2", TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004540#endif
4541#ifdef TCP_DEFER_ACCEPT
Fred Drake4baedc12002-04-01 14:53:37 +00004542 PyModule_AddIntConstant(m, "TCP_DEFER_ACCEPT", TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004543#endif
4544#ifdef TCP_WINDOW_CLAMP
Fred Drake4baedc12002-04-01 14:53:37 +00004545 PyModule_AddIntConstant(m, "TCP_WINDOW_CLAMP", TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004546#endif
4547#ifdef TCP_INFO
Fred Drake4baedc12002-04-01 14:53:37 +00004548 PyModule_AddIntConstant(m, "TCP_INFO", TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004549#endif
4550#ifdef TCP_QUICKACK
Fred Drake4baedc12002-04-01 14:53:37 +00004551 PyModule_AddIntConstant(m, "TCP_QUICKACK", TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004552#endif
4553
Guido van Rossum09be4091999-08-09 14:40:40 +00004554
4555 /* IPX options */
4556#ifdef IPX_TYPE
Fred Drake4baedc12002-04-01 14:53:37 +00004557 PyModule_AddIntConstant(m, "IPX_TYPE", IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00004558#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004559
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004560 /* get{addr,name}info parameters */
4561#ifdef EAI_ADDRFAMILY
Fred Drake4baedc12002-04-01 14:53:37 +00004562 PyModule_AddIntConstant(m, "EAI_ADDRFAMILY", EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004563#endif
4564#ifdef EAI_AGAIN
Fred Drake4baedc12002-04-01 14:53:37 +00004565 PyModule_AddIntConstant(m, "EAI_AGAIN", EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004566#endif
4567#ifdef EAI_BADFLAGS
Fred Drake4baedc12002-04-01 14:53:37 +00004568 PyModule_AddIntConstant(m, "EAI_BADFLAGS", EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004569#endif
4570#ifdef EAI_FAIL
Fred Drake4baedc12002-04-01 14:53:37 +00004571 PyModule_AddIntConstant(m, "EAI_FAIL", EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004572#endif
4573#ifdef EAI_FAMILY
Fred Drake4baedc12002-04-01 14:53:37 +00004574 PyModule_AddIntConstant(m, "EAI_FAMILY", EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004575#endif
4576#ifdef EAI_MEMORY
Fred Drake4baedc12002-04-01 14:53:37 +00004577 PyModule_AddIntConstant(m, "EAI_MEMORY", EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004578#endif
4579#ifdef EAI_NODATA
Fred Drake4baedc12002-04-01 14:53:37 +00004580 PyModule_AddIntConstant(m, "EAI_NODATA", EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004581#endif
4582#ifdef EAI_NONAME
Fred Drake4baedc12002-04-01 14:53:37 +00004583 PyModule_AddIntConstant(m, "EAI_NONAME", EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004584#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00004585#ifdef EAI_OVERFLOW
4586 PyModule_AddIntConstant(m, "EAI_OVERFLOW", EAI_OVERFLOW);
4587#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004588#ifdef EAI_SERVICE
Fred Drake4baedc12002-04-01 14:53:37 +00004589 PyModule_AddIntConstant(m, "EAI_SERVICE", EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004590#endif
4591#ifdef EAI_SOCKTYPE
Fred Drake4baedc12002-04-01 14:53:37 +00004592 PyModule_AddIntConstant(m, "EAI_SOCKTYPE", EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004593#endif
4594#ifdef EAI_SYSTEM
Fred Drake4baedc12002-04-01 14:53:37 +00004595 PyModule_AddIntConstant(m, "EAI_SYSTEM", EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004596#endif
4597#ifdef EAI_BADHINTS
Fred Drake4baedc12002-04-01 14:53:37 +00004598 PyModule_AddIntConstant(m, "EAI_BADHINTS", EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004599#endif
4600#ifdef EAI_PROTOCOL
Fred Drake4baedc12002-04-01 14:53:37 +00004601 PyModule_AddIntConstant(m, "EAI_PROTOCOL", EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004602#endif
4603#ifdef EAI_MAX
Fred Drake4baedc12002-04-01 14:53:37 +00004604 PyModule_AddIntConstant(m, "EAI_MAX", EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004605#endif
4606#ifdef AI_PASSIVE
Fred Drake4baedc12002-04-01 14:53:37 +00004607 PyModule_AddIntConstant(m, "AI_PASSIVE", AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004608#endif
4609#ifdef AI_CANONNAME
Fred Drake4baedc12002-04-01 14:53:37 +00004610 PyModule_AddIntConstant(m, "AI_CANONNAME", AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004611#endif
4612#ifdef AI_NUMERICHOST
Fred Drake4baedc12002-04-01 14:53:37 +00004613 PyModule_AddIntConstant(m, "AI_NUMERICHOST", AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004614#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00004615#ifdef AI_NUMERICSERV
4616 PyModule_AddIntConstant(m, "AI_NUMERICSERV", AI_NUMERICSERV);
4617#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004618#ifdef AI_MASK
Fred Drake4baedc12002-04-01 14:53:37 +00004619 PyModule_AddIntConstant(m, "AI_MASK", AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004620#endif
4621#ifdef AI_ALL
Fred Drake4baedc12002-04-01 14:53:37 +00004622 PyModule_AddIntConstant(m, "AI_ALL", AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004623#endif
4624#ifdef AI_V4MAPPED_CFG
Fred Drake4baedc12002-04-01 14:53:37 +00004625 PyModule_AddIntConstant(m, "AI_V4MAPPED_CFG", AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004626#endif
4627#ifdef AI_ADDRCONFIG
Fred Drake4baedc12002-04-01 14:53:37 +00004628 PyModule_AddIntConstant(m, "AI_ADDRCONFIG", AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004629#endif
4630#ifdef AI_V4MAPPED
Fred Drake4baedc12002-04-01 14:53:37 +00004631 PyModule_AddIntConstant(m, "AI_V4MAPPED", AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004632#endif
4633#ifdef AI_DEFAULT
Fred Drake4baedc12002-04-01 14:53:37 +00004634 PyModule_AddIntConstant(m, "AI_DEFAULT", AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004635#endif
4636#ifdef NI_MAXHOST
Fred Drake4baedc12002-04-01 14:53:37 +00004637 PyModule_AddIntConstant(m, "NI_MAXHOST", NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004638#endif
4639#ifdef NI_MAXSERV
Fred Drake4baedc12002-04-01 14:53:37 +00004640 PyModule_AddIntConstant(m, "NI_MAXSERV", NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004641#endif
4642#ifdef NI_NOFQDN
Fred Drake4baedc12002-04-01 14:53:37 +00004643 PyModule_AddIntConstant(m, "NI_NOFQDN", NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004644#endif
4645#ifdef NI_NUMERICHOST
Fred Drake4baedc12002-04-01 14:53:37 +00004646 PyModule_AddIntConstant(m, "NI_NUMERICHOST", NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004647#endif
4648#ifdef NI_NAMEREQD
Fred Drake4baedc12002-04-01 14:53:37 +00004649 PyModule_AddIntConstant(m, "NI_NAMEREQD", NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004650#endif
4651#ifdef NI_NUMERICSERV
Fred Drake4baedc12002-04-01 14:53:37 +00004652 PyModule_AddIntConstant(m, "NI_NUMERICSERV", NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004653#endif
4654#ifdef NI_DGRAM
Fred Drake4baedc12002-04-01 14:53:37 +00004655 PyModule_AddIntConstant(m, "NI_DGRAM", NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004656#endif
4657
Martin v. Löwis94681fc2003-11-27 19:40:22 +00004658 /* shutdown() parameters */
4659#ifdef SHUT_RD
4660 PyModule_AddIntConstant(m, "SHUT_RD", SHUT_RD);
4661#elif defined(SD_RECEIVE)
4662 PyModule_AddIntConstant(m, "SHUT_RD", SD_RECEIVE);
4663#else
4664 PyModule_AddIntConstant(m, "SHUT_RD", 0);
4665#endif
4666#ifdef SHUT_WR
4667 PyModule_AddIntConstant(m, "SHUT_WR", SHUT_WR);
4668#elif defined(SD_SEND)
4669 PyModule_AddIntConstant(m, "SHUT_WR", SD_SEND);
4670#else
4671 PyModule_AddIntConstant(m, "SHUT_WR", 1);
4672#endif
4673#ifdef SHUT_RDWR
4674 PyModule_AddIntConstant(m, "SHUT_RDWR", SHUT_RDWR);
4675#elif defined(SD_BOTH)
4676 PyModule_AddIntConstant(m, "SHUT_RDWR", SD_BOTH);
4677#else
4678 PyModule_AddIntConstant(m, "SHUT_RDWR", 2);
4679#endif
4680
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004681 /* Initialize gethostbyname lock */
Just van Rossum1040d2c2003-05-09 07:53:18 +00004682#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
4683 netdb_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004684#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004685}
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004686
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004687
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004688#ifndef HAVE_INET_PTON
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004689
4690/* Simplistic emulation code for inet_pton that only works for IPv4 */
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004691/* These are not exposed because they do not set errno properly */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004692
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004693int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004694inet_pton(int af, const char *src, void *dst)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004695{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004696 if (af == AF_INET) {
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004697 long packed_addr;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004698 packed_addr = inet_addr(src);
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004699 if (packed_addr == INADDR_NONE)
4700 return 0;
4701 memcpy(dst, &packed_addr, 4);
4702 return 1;
4703 }
4704 /* Should set errno to EAFNOSUPPORT */
4705 return -1;
4706}
4707
Martin v. Löwisc925b1532001-07-21 09:42:15 +00004708const char *
4709inet_ntop(int af, const void *src, char *dst, socklen_t size)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004710{
4711 if (af == AF_INET) {
4712 struct in_addr packed_addr;
4713 if (size < 16)
4714 /* Should set errno to ENOSPC. */
4715 return NULL;
4716 memcpy(&packed_addr, src, sizeof(packed_addr));
4717 return strncpy(dst, inet_ntoa(packed_addr), size);
4718 }
4719 /* Should set errno to EAFNOSUPPORT */
4720 return NULL;
4721}
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004722
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004723#endif