blob: d07ce350a7c7ed7abb2857a261c30e56bbced014 [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
Ronald Oussorend06b6f22006-04-23 11:59:25 +000064#ifdef __APPLE__
65 /*
66 * inet_aton is not available on OSX 10.3, yet we want to use a binary
67 * that was build on 10.4 or later to work on that release, weak linking
68 * comes to the rescue.
69 */
70# pragma weak inet_aton
71#endif
72
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000073#include "Python.h"
Georg Brandlbc45a3f2006-03-17 19:17:34 +000074#include "structmember.h"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000075
Guido van Rossum47dfa4a2003-04-25 05:48:32 +000076#undef MAX
77#define MAX(x, y) ((x) < (y) ? (y) : (x))
78
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000079/* Socket object documentation */
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000080PyDoc_STRVAR(sock_doc,
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000081"socket([family[, type[, proto]]]) -> socket object\n\
82\n\
83Open a socket of the given type. The family argument specifies the\n\
84address family; it defaults to AF_INET. The type argument specifies\n\
85whether this is a stream (SOCK_STREAM, this is the default)\n\
86or datagram (SOCK_DGRAM) socket. The protocol argument defaults to 0,\n\
87specifying the default protocol. Keyword arguments are accepted.\n\
88\n\
89A socket object represents one endpoint of a network connection.\n\
90\n\
91Methods of socket objects (keyword arguments not allowed):\n\
92\n\
93accept() -- accept a connection, returning new socket and client address\n\
94bind(addr) -- bind the socket to a local address\n\
95close() -- close the socket\n\
96connect(addr) -- connect the socket to a remote address\n\
97connect_ex(addr) -- connect, return an error code instead of an exception\n\
98dup() -- return a new socket object identical to the current one [*]\n\
99fileno() -- return underlying file descriptor\n\
100getpeername() -- return remote address [*]\n\
101getsockname() -- return local address\n\
102getsockopt(level, optname[, buflen]) -- get socket options\n\
103gettimeout() -- return timeout or None\n\
104listen(n) -- start listening for incoming connections\n\
105makefile([mode, [bufsize]]) -- return a file object for the socket [*]\n\
106recv(buflen[, flags]) -- receive data\n\
Martin Blaisaf2ae722006-06-04 13:49:49 +0000107recv_into(buffer[, nbytes[, flags]]) -- receive data (into a buffer)\n\
Martin Blais2856e5f2006-05-26 12:03:27 +0000108recvfrom(buflen[, flags]) -- receive data and sender\'s address\n\
Martin Blaisaf2ae722006-06-04 13:49:49 +0000109recvfrom_into(buffer[, nbytes, [, flags])\n\
Martin Blais2856e5f2006-05-26 12:03:27 +0000110 -- receive data and sender\'s address (into a buffer)\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000111sendall(data[, flags]) -- send all data\n\
112send(data[, flags]) -- send data, may not send all of it\n\
113sendto(data[, flags], addr) -- send data to a given address\n\
114setblocking(0 | 1) -- set or clear the blocking I/O flag\n\
115setsockopt(level, optname, value) -- set socket options\n\
116settimeout(None | float) -- set or clear the timeout\n\
117shutdown(how) -- shut down traffic in one or both directions\n\
118\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000119 [*] not available on all platforms!");
Guido van Rossum3baaa131999-03-22 21:44:51 +0000120
Walter Dörwaldf0dfc7a2003-10-20 14:01:56 +0000121/* XXX This is a terrible mess of platform-dependent preprocessor hacks.
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000122 I hope some day someone can clean this up please... */
123
Guido van Rossum9376b741999-09-15 22:01:40 +0000124/* Hacks for gethostbyname_r(). On some non-Linux platforms, the configure
125 script doesn't get this right, so we hardcode some platform checks below.
126 On the other hand, not all Linux versions agree, so there the settings
127 computed by the configure script are needed! */
128
129#ifndef linux
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000130# undef HAVE_GETHOSTBYNAME_R_3_ARG
131# undef HAVE_GETHOSTBYNAME_R_5_ARG
132# undef HAVE_GETHOSTBYNAME_R_6_ARG
Guido van Rossum9376b741999-09-15 22:01:40 +0000133#endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000134
Guido van Rossum7a122991999-04-13 04:07:32 +0000135#ifndef WITH_THREAD
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000136# undef HAVE_GETHOSTBYNAME_R
Guido van Rossum7a122991999-04-13 04:07:32 +0000137#endif
138
Guido van Rossume7de2061999-03-24 17:24:33 +0000139#ifdef HAVE_GETHOSTBYNAME_R
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000140# if defined(_AIX) || defined(__osf__)
141# define HAVE_GETHOSTBYNAME_R_3_ARG
142# elif defined(__sun) || defined(__sgi)
143# define HAVE_GETHOSTBYNAME_R_5_ARG
144# elif defined(linux)
Guido van Rossum9376b741999-09-15 22:01:40 +0000145/* Rely on the configure script */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000146# else
147# undef HAVE_GETHOSTBYNAME_R
148# endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000149#endif
150
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000151#if !defined(HAVE_GETHOSTBYNAME_R) && defined(WITH_THREAD) && \
152 !defined(MS_WINDOWS)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000153# define USE_GETHOSTBYNAME_LOCK
Guido van Rossum3baaa131999-03-22 21:44:51 +0000154#endif
155
Hye-Shik Chang9ceebd52005-09-24 14:58:47 +0000156/* To use __FreeBSD_version */
157#ifdef HAVE_SYS_PARAM_H
158#include <sys/param.h>
159#endif
Just van Rossum1040d2c2003-05-09 07:53:18 +0000160/* On systems on which getaddrinfo() is believed to not be thread-safe,
Just van Rossum09aecd72003-05-09 08:03:44 +0000161 (this includes the getaddrinfo emulation) protect access with a lock. */
Hye-Shik Chang9ceebd52005-09-24 14:58:47 +0000162#if defined(WITH_THREAD) && (defined(__APPLE__) || \
163 (defined(__FreeBSD__) && __FreeBSD_version+0 < 503000) || \
Neal Norwitz2a30cd02006-07-10 01:18:57 +0000164 defined(__OpenBSD__) || defined(__NetBSD__) || \
165 defined(__VMS) || !defined(HAVE_GETADDRINFO))
Just van Rossum1040d2c2003-05-09 07:53:18 +0000166#define USE_GETADDRINFO_LOCK
167#endif
168
169#ifdef USE_GETADDRINFO_LOCK
170#define ACQUIRE_GETADDRINFO_LOCK PyThread_acquire_lock(netdb_lock, 1);
171#define RELEASE_GETADDRINFO_LOCK PyThread_release_lock(netdb_lock);
172#else
173#define ACQUIRE_GETADDRINFO_LOCK
174#define RELEASE_GETADDRINFO_LOCK
175#endif
176
177#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000178# include "pythread.h"
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000179#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000180
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000181#if defined(PYCC_VACPP)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000182# include <types.h>
183# include <io.h>
184# include <sys/ioctl.h>
185# include <utils.h>
186# include <ctype.h>
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000187#endif
188
Martin v. Löwis9e437302002-12-06 12:57:26 +0000189#if defined(__VMS)
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000190# include <ioctl.h>
191#endif
192
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000193#if defined(PYOS_OS2)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000194# define INCL_DOS
195# define INCL_DOSERRORS
196# define INCL_NOPMAPI
197# include <os2.h>
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000198#endif
199
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000200#if defined(__sgi) && _COMPILER_VERSION>700 && !_SGIAPI
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000201/* make sure that the reentrant (gethostbyaddr_r etc)
202 functions are declared correctly if compiling with
203 MIPSPro 7.x in ANSI C mode (default) */
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000204
Martin Blais2856e5f2006-05-26 12:03:27 +0000205/* XXX Using _SGIAPI is the wrong thing,
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000206 but I don't know what the right thing is. */
Trent Mick8ea5bdf2004-09-13 17:48:41 +0000207#undef _SGIAPI /* to avoid warning */
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000208#define _SGIAPI 1
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000209
Trent Mick8ea5bdf2004-09-13 17:48:41 +0000210#undef _XOPEN_SOURCE
211#include <sys/socket.h>
212#include <sys/types.h>
213#include <netinet/in.h>
214#ifdef _SS_ALIGNSIZE
215#define HAVE_GETADDRINFO 1
216#define HAVE_GETNAMEINFO 1
217#endif
218
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000219#define HAVE_INET_PTON
220#include <netdb.h>
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000221#endif
222
Martin Blais2856e5f2006-05-26 12:03:27 +0000223/* Irix 6.5 fails to define this variable at all. This is needed
224 for both GCC and SGI's compiler. I'd say that the SGI headers
Georg Brandldbd83392006-02-20 09:42:33 +0000225 are just busted. Same thing for Solaris. */
226#if (defined(__sgi) || defined(sun)) && !defined(INET_ADDRSTRLEN)
Anthony Baxterbab23cf2003-10-04 08:00:49 +0000227#define INET_ADDRSTRLEN 16
228#endif
229
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000230/* Generic includes */
Martin v. Löwis0e8bd7e2006-06-10 12:23:46 +0000231#ifdef HAVE_SYS_TYPES_H
Guido van Rossumb6775db1994-08-01 11:34:53 +0000232#include <sys/types.h>
Martin v. Löwis0e8bd7e2006-06-10 12:23:46 +0000233#endif
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000234
Marc-André Lemburg976ade62002-02-16 18:47:07 +0000235/* Generic socket object definitions and includes */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000236#define PySocket_BUILDING_SOCKET
Marc-André Lemburgbb8b78b2002-02-16 18:44:52 +0000237#include "socketmodule.h"
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000238
239/* Addressing includes */
240
Guido van Rossum6f489d91996-06-28 20:15:15 +0000241#ifndef MS_WINDOWS
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000242
243/* Non-MS WINDOWS includes */
244# include <netdb.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000245
Guido van Rossum9376b741999-09-15 22:01:40 +0000246/* Headers needed for inet_ntoa() and inet_addr() */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000247# ifdef __BEOS__
248# include <net/netdb.h>
249# elif defined(PYOS_OS2) && defined(PYCC_VACPP)
250# include <netdb.h>
Tim Peters603c6832001-11-05 02:45:59 +0000251typedef size_t socklen_t;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000252# else
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000253# include <arpa/inet.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000254# endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000255
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000256# ifndef RISCOS
257# include <fcntl.h>
258# else
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000259# include <sys/ioctl.h>
260# include <socklib.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000261# define NO_DUP
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000262int h_errno; /* not used */
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000263# define INET_ADDRSTRLEN 16
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000264# endif
265
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000266#else
Guido van Rossum48a680c2001-03-02 06:34:14 +0000267
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000268/* MS_WINDOWS includes */
Martin v. Löwis0e8bd7e2006-06-10 12:23:46 +0000269# ifdef HAVE_FCNTL_H
270# include <fcntl.h>
271# endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000272
Jeremy Hylton22308652001-02-02 03:23:09 +0000273#endif
274
Skip Montanaro7befb992004-02-10 16:50:21 +0000275#include <stddef.h>
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000276
277#ifndef offsetof
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000278# define offsetof(type, member) ((size_t)(&((type *)0)->member))
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000279#endif
280
Neal Norwitz39d22e52002-11-02 19:55:21 +0000281#ifndef O_NONBLOCK
282# define O_NONBLOCK O_NDELAY
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000283#endif
284
Trent Micka708d6e2004-09-07 17:48:26 +0000285/* include Python's addrinfo.h unless it causes trouble */
286#if defined(__sgi) && _COMPILER_VERSION>700 && defined(_SS_ALIGNSIZE)
287 /* Do not include addinfo.h on some newer IRIX versions.
288 * _SS_ALIGNSIZE is defined in sys/socket.h by 6.5.21,
289 * for example, but not by 6.5.10.
290 */
Martin v. Löwis0e8bd7e2006-06-10 12:23:46 +0000291#elif defined(_MSC_VER) && _MSC_VER>1201
Trent Micka708d6e2004-09-07 17:48:26 +0000292 /* Do not include addrinfo.h for MSVC7 or greater. 'addrinfo' and
293 * EAI_* constants are defined in (the already included) ws2tcpip.h.
294 */
295#else
296# include "addrinfo.h"
297#endif
Jason Tishlerc246cb72004-08-09 13:25:59 +0000298
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000299#ifndef HAVE_INET_PTON
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000300int inet_pton(int af, const char *src, void *dst);
Martin v. Löwisc925b1532001-07-21 09:42:15 +0000301const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000302#endif
303
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000304#ifdef __APPLE__
305/* On OS X, getaddrinfo returns no error indication of lookup
306 failure, so we must use the emulation instead of the libinfo
307 implementation. Unfortunately, performing an autoconf test
308 for this bug would require DNS access for the machine performing
309 the configuration, which is not acceptable. Therefore, we
310 determine the bug just by checking for __APPLE__. If this bug
311 gets ever fixed, perhaps checking for sys/version.h would be
312 appropriate, which is 10/0 on the system with the bug. */
Jack Jansen84262fb2002-07-02 14:40:42 +0000313#ifndef HAVE_GETNAMEINFO
314/* This bug seems to be fixed in Jaguar. Ths easiest way I could
315 Find to check for Jaguar is that it has getnameinfo(), which
316 older releases don't have */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000317#undef HAVE_GETADDRINFO
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000318#endif
Ronald Oussorend06b6f22006-04-23 11:59:25 +0000319
320#ifdef HAVE_INET_ATON
321#define USE_INET_ATON_WEAKLINK
322#endif
323
Jack Jansen84262fb2002-07-02 14:40:42 +0000324#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000325
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000326/* I know this is a bad practice, but it is the easiest... */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000327#if !defined(HAVE_GETADDRINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000328/* avoid clashes with the C library definition of the symbol. */
329#define getaddrinfo fake_getaddrinfo
330#define gai_strerror fake_gai_strerror
331#define freeaddrinfo fake_freeaddrinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000332#include "getaddrinfo.c"
333#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000334#if !defined(HAVE_GETNAMEINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000335#define getnameinfo fake_getnameinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000336#include "getnameinfo.c"
337#endif
338
Guido van Rossumbcc20741998-08-04 22:53:56 +0000339#if defined(MS_WINDOWS) || defined(__BEOS__)
340/* BeOS suffers from the same socket dichotomy as Win32... - [cjh] */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000341/* seem to be a few differences in the API */
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000342#define SOCKETCLOSE closesocket
Guido van Rossumbe32c891996-06-20 16:25:29 +0000343#define NO_DUP /* Actually it exists on NT 3.5, but what the heck... */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000344#endif
345
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000346#ifdef MS_WIN32
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000347#define EAFNOSUPPORT WSAEAFNOSUPPORT
348#define snprintf _snprintf
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000349#endif
Fred Drakea04eaad2000-06-30 02:46:07 +0000350
Andrew MacIntyreba43e872002-03-03 03:03:52 +0000351#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000352#define SOCKETCLOSE soclose
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000353#define NO_DUP /* Sockets are Not Actual File Handles under OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000354#endif
355
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000356#ifndef SOCKETCLOSE
357#define SOCKETCLOSE close
358#endif
359
Hye-Shik Chang81268602004-02-02 06:05:24 +0000360#if defined(HAVE_BLUETOOTH_H) || defined(HAVE_BLUETOOTH_BLUETOOTH_H)
361#define USE_BLUETOOTH 1
362#if defined(__FreeBSD__)
363#define BTPROTO_L2CAP BLUETOOTH_PROTO_L2CAP
364#define BTPROTO_RFCOMM BLUETOOTH_PROTO_RFCOMM
365#define sockaddr_l2 sockaddr_l2cap
366#define sockaddr_rc sockaddr_rfcomm
367#define _BT_SOCKADDR_MEMB(s, proto) &((s)->sock_addr)
368#define _BT_L2_MEMB(sa, memb) ((sa)->l2cap_##memb)
369#define _BT_RC_MEMB(sa, memb) ((sa)->rfcomm_##memb)
370#else
Anthony Baxter5d7c0672004-02-16 05:35:28 +0000371#define _BT_SOCKADDR_MEMB(s, proto) (&((s)->sock_addr).bt_##proto)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000372#define _BT_L2_MEMB(sa, memb) ((sa)->l2_##memb)
373#define _BT_RC_MEMB(sa, memb) ((sa)->rc_##memb)
374#define _BT_SCO_MEMB(sa, memb) ((sa)->sco_##memb)
375#endif
376#endif
377
Neal Norwitz2a30cd02006-07-10 01:18:57 +0000378#ifdef __VMS
379/* TCP/IP Services for VMS uses a maximum send/recv buffer length */
380#define SEGMENT_SIZE (32 * 1024 -1)
381#endif
382
Martin v. Löwise9416172003-05-03 10:12:45 +0000383/*
384 * Constants for getnameinfo()
385 */
386#if !defined(NI_MAXHOST)
387#define NI_MAXHOST 1025
388#endif
389#if !defined(NI_MAXSERV)
390#define NI_MAXSERV 32
391#endif
392
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000393/* XXX There's a problem here: *static* functions are not supposed to have
394 a Py prefix (or use CapitalizedWords). Later... */
395
Guido van Rossum30a685f1991-06-27 15:51:29 +0000396/* Global variable holding the exception type for errors detected
397 by this module (but not argument type or memory errors, etc.). */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000398static PyObject *socket_error;
399static PyObject *socket_herror;
400static PyObject *socket_gaierror;
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000401static PyObject *socket_timeout;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000402
Guido van Rossum48a680c2001-03-02 06:34:14 +0000403#ifdef RISCOS
404/* Global variable which is !=0 if Python is running in a RISC OS taskwindow */
405static int taskwindow;
406#endif
407
Tim Peters643a7fc2002-02-17 04:13:21 +0000408/* A forward reference to the socket type object.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000409 The sock_type variable contains pointers to various functions,
410 some of which call new_sockobject(), which uses sock_type, so
Tim Peters643a7fc2002-02-17 04:13:21 +0000411 there has to be a circular reference. */
Jeremy Hylton938ace62002-07-17 16:30:39 +0000412static PyTypeObject sock_type;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000413
Anthony Baxter93ab5fa2006-07-11 02:04:09 +0000414#if defined(HAVE_POLL_H)
415#include <poll.h>
416#elif defined(HAVE_SYS_POLL_H)
417#include <sys/poll.h>
418#endif
419
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000420#ifdef Py_SOCKET_FD_CAN_BE_GE_FD_SETSIZE
421/* Platform can select file descriptors beyond FD_SETSIZE */
422#define IS_SELECTABLE(s) 1
Anthony Baxter93ab5fa2006-07-11 02:04:09 +0000423#elif defined(HAVE_POLL)
424/* Instead of select(), we'll use poll() since poll() works on any fd. */
425#define IS_SELECTABLE(s) 1
426/* Can we call select() with this socket without a buffer overrun? */
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000427#else
428/* POSIX says selecting file descriptors beyond FD_SETSIZE
Anthony Baxter93ab5fa2006-07-11 02:04:09 +0000429 has undefined behaviour. If there's no timeout left, we don't have to
430 call select, so it's a safe, little white lie. */
431#define IS_SELECTABLE(s) ((s)->sock_fd < FD_SETSIZE || s->sock_timeout <= 0.0)
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000432#endif
Neal Norwitz082b2df2006-02-07 07:04:46 +0000433
434static PyObject*
435select_error(void)
436{
437 PyErr_SetString(socket_error, "unable to select on socket");
438 return NULL;
439}
440
Guido van Rossum30a685f1991-06-27 15:51:29 +0000441/* Convenience function to raise an error according to errno
442 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000443
Guido van Rossum73624e91994-10-10 17:59:00 +0000444static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000445set_error(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000446{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000447#ifdef MS_WINDOWS
Mark Hammond46a733d2000-07-24 01:45:11 +0000448 int err_no = WSAGetLastError();
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000449 static struct {
450 int no;
451 const char *msg;
452 } *msgp, msgs[] = {
453 {WSAEINTR, "Interrupted system call"},
454 {WSAEBADF, "Bad file descriptor"},
455 {WSAEACCES, "Permission denied"},
456 {WSAEFAULT, "Bad address"},
457 {WSAEINVAL, "Invalid argument"},
458 {WSAEMFILE, "Too many open files"},
459 {WSAEWOULDBLOCK,
460 "The socket operation could not complete "
461 "without blocking"},
462 {WSAEINPROGRESS, "Operation now in progress"},
463 {WSAEALREADY, "Operation already in progress"},
464 {WSAENOTSOCK, "Socket operation on non-socket"},
465 {WSAEDESTADDRREQ, "Destination address required"},
466 {WSAEMSGSIZE, "Message too long"},
467 {WSAEPROTOTYPE, "Protocol wrong type for socket"},
468 {WSAENOPROTOOPT, "Protocol not available"},
469 {WSAEPROTONOSUPPORT, "Protocol not supported"},
470 {WSAESOCKTNOSUPPORT, "Socket type not supported"},
471 {WSAEOPNOTSUPP, "Operation not supported"},
472 {WSAEPFNOSUPPORT, "Protocol family not supported"},
473 {WSAEAFNOSUPPORT, "Address family not supported"},
474 {WSAEADDRINUSE, "Address already in use"},
475 {WSAEADDRNOTAVAIL, "Can't assign requested address"},
476 {WSAENETDOWN, "Network is down"},
477 {WSAENETUNREACH, "Network is unreachable"},
478 {WSAENETRESET, "Network dropped connection on reset"},
479 {WSAECONNABORTED, "Software caused connection abort"},
480 {WSAECONNRESET, "Connection reset by peer"},
481 {WSAENOBUFS, "No buffer space available"},
482 {WSAEISCONN, "Socket is already connected"},
483 {WSAENOTCONN, "Socket is not connected"},
484 {WSAESHUTDOWN, "Can't send after socket shutdown"},
485 {WSAETOOMANYREFS, "Too many references: can't splice"},
486 {WSAETIMEDOUT, "Operation timed out"},
487 {WSAECONNREFUSED, "Connection refused"},
488 {WSAELOOP, "Too many levels of symbolic links"},
489 {WSAENAMETOOLONG, "File name too long"},
490 {WSAEHOSTDOWN, "Host is down"},
491 {WSAEHOSTUNREACH, "No route to host"},
492 {WSAENOTEMPTY, "Directory not empty"},
493 {WSAEPROCLIM, "Too many processes"},
494 {WSAEUSERS, "Too many users"},
495 {WSAEDQUOT, "Disc quota exceeded"},
496 {WSAESTALE, "Stale NFS file handle"},
497 {WSAEREMOTE, "Too many levels of remote in path"},
498 {WSASYSNOTREADY, "Network subsystem is unvailable"},
499 {WSAVERNOTSUPPORTED, "WinSock version is not supported"},
500 {WSANOTINITIALISED,
501 "Successful WSAStartup() not yet performed"},
502 {WSAEDISCON, "Graceful shutdown in progress"},
503 /* Resolver errors */
504 {WSAHOST_NOT_FOUND, "No such host is known"},
505 {WSATRY_AGAIN, "Host not found, or server failed"},
506 {WSANO_RECOVERY, "Unexpected server error encountered"},
507 {WSANO_DATA, "Valid name without requested data"},
508 {WSANO_ADDRESS, "No address, look for MX record"},
509 {0, NULL}
510 };
Mark Hammond46a733d2000-07-24 01:45:11 +0000511 if (err_no) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000512 PyObject *v;
Mark Hammond46a733d2000-07-24 01:45:11 +0000513 const char *msg = "winsock error";
Guido van Rossum48a680c2001-03-02 06:34:14 +0000514
Mark Hammond46a733d2000-07-24 01:45:11 +0000515 for (msgp = msgs; msgp->msg; msgp++) {
516 if (err_no == msgp->no) {
517 msg = msgp->msg;
518 break;
519 }
520 }
521
522 v = Py_BuildValue("(is)", err_no, msg);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000523 if (v != NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000524 PyErr_SetObject(socket_error, v);
Guido van Rossum73624e91994-10-10 17:59:00 +0000525 Py_DECREF(v);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000526 }
527 return NULL;
528 }
529 else
530#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000531
Andrew MacIntyreba43e872002-03-03 03:03:52 +0000532#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000533 if (sock_errno() != NO_ERROR) {
534 APIRET rc;
535 ULONG msglen;
536 char outbuf[100];
537 int myerrorcode = sock_errno();
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000538
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000539 /* Retrieve socket-related error message from MPTN.MSG file */
540 rc = DosGetMessage(NULL, 0, outbuf, sizeof(outbuf),
541 myerrorcode - SOCBASEERR + 26,
542 "mptn.msg",
543 &msglen);
544 if (rc == NO_ERROR) {
545 PyObject *v;
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000546
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000547 /* OS/2 doesn't guarantee a terminator */
548 outbuf[msglen] = '\0';
549 if (strlen(outbuf) > 0) {
550 /* If non-empty msg, trim CRLF */
551 char *lastc = &outbuf[ strlen(outbuf)-1 ];
Neal Norwitz30b5c5d2005-12-19 06:05:18 +0000552 while (lastc > outbuf &&
553 isspace(Py_CHARMASK(*lastc))) {
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000554 /* Trim trailing whitespace (CRLF) */
555 *lastc-- = '\0';
556 }
557 }
558 v = Py_BuildValue("(is)", myerrorcode, outbuf);
559 if (v != NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000560 PyErr_SetObject(socket_error, v);
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000561 Py_DECREF(v);
562 }
563 return NULL;
564 }
565 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000566#endif
567
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000568#if defined(RISCOS)
569 if (_inet_error.errnum != NULL) {
570 PyObject *v;
571 v = Py_BuildValue("(is)", errno, _inet_err());
572 if (v != NULL) {
573 PyErr_SetObject(socket_error, v);
574 Py_DECREF(v);
575 }
576 return NULL;
577 }
578#endif
579
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000580 return PyErr_SetFromErrno(socket_error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000581}
582
Guido van Rossum30a685f1991-06-27 15:51:29 +0000583
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000584static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000585set_herror(int h_error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000586{
587 PyObject *v;
588
589#ifdef HAVE_HSTRERROR
590 v = Py_BuildValue("(is)", h_error, (char *)hstrerror(h_error));
591#else
592 v = Py_BuildValue("(is)", h_error, "host not found");
593#endif
594 if (v != NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000595 PyErr_SetObject(socket_herror, v);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000596 Py_DECREF(v);
597 }
598
599 return NULL;
600}
601
602
603static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000604set_gaierror(int error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000605{
606 PyObject *v;
607
Martin v. Löwis272cb402002-03-01 08:31:07 +0000608#ifdef EAI_SYSTEM
609 /* EAI_SYSTEM is not available on Windows XP. */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000610 if (error == EAI_SYSTEM)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000611 return set_error();
Martin v. Löwis272cb402002-03-01 08:31:07 +0000612#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000613
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000614#ifdef HAVE_GAI_STRERROR
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000615 v = Py_BuildValue("(is)", error, gai_strerror(error));
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000616#else
617 v = Py_BuildValue("(is)", error, "getaddrinfo failed");
618#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000619 if (v != NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000620 PyErr_SetObject(socket_gaierror, v);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000621 Py_DECREF(v);
622 }
623
624 return NULL;
625}
626
Neal Norwitz2a30cd02006-07-10 01:18:57 +0000627#ifdef __VMS
628/* Function to send in segments */
629static int
630sendsegmented(int sock_fd, char *buf, int len, int flags)
631{
632 int n = 0;
633 int remaining = len;
634
635 while (remaining > 0) {
636 unsigned int segment;
637
638 segment = (remaining >= SEGMENT_SIZE ? SEGMENT_SIZE : remaining);
639 n = send(sock_fd, buf, segment, flags);
640 if (n < 0) {
641 return n;
642 }
643 remaining -= segment;
644 buf += segment;
645 } /* end while */
646
647 return len;
648}
649#endif
650
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000651/* Function to perform the setting of socket blocking mode
652 internally. block = (1 | 0). */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000653static int
654internal_setblocking(PySocketSockObject *s, int block)
655{
656#ifndef RISCOS
657#ifndef MS_WINDOWS
658 int delay_flag;
659#endif
660#endif
661
662 Py_BEGIN_ALLOW_THREADS
663#ifdef __BEOS__
664 block = !block;
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000665 setsockopt(s->sock_fd, SOL_SOCKET, SO_NONBLOCK,
666 (void *)(&block), sizeof(int));
Guido van Rossum67f7a382002-06-06 21:08:16 +0000667#else
668#ifndef RISCOS
669#ifndef MS_WINDOWS
670#if defined(PYOS_OS2) && !defined(PYCC_GCC)
671 block = !block;
672 ioctl(s->sock_fd, FIONBIO, (caddr_t)&block, sizeof(block));
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000673#elif defined(__VMS)
674 block = !block;
Neal Norwitz2a30cd02006-07-10 01:18:57 +0000675 ioctl(s->sock_fd, FIONBIO, (unsigned int *)&block);
676#else /* !PYOS_OS2 && !__VMS */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000677 delay_flag = fcntl(s->sock_fd, F_GETFL, 0);
678 if (block)
Neal Norwitz39d22e52002-11-02 19:55:21 +0000679 delay_flag &= (~O_NONBLOCK);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000680 else
Neal Norwitz39d22e52002-11-02 19:55:21 +0000681 delay_flag |= O_NONBLOCK;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000682 fcntl(s->sock_fd, F_SETFL, delay_flag);
683#endif /* !PYOS_OS2 */
684#else /* MS_WINDOWS */
685 block = !block;
686 ioctlsocket(s->sock_fd, FIONBIO, (u_long*)&block);
687#endif /* MS_WINDOWS */
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000688#else /* RISCOS */
689 block = !block;
690 socketioctl(s->sock_fd, FIONBIO, (u_long*)&block);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000691#endif /* RISCOS */
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000692#endif /* __BEOS__ */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000693 Py_END_ALLOW_THREADS
694
695 /* Since these don't return anything */
696 return 1;
697}
698
Anthony Baxter93ab5fa2006-07-11 02:04:09 +0000699/* Do a select()/poll() on the socket, if necessary (sock_timeout > 0).
Guido van Rossum11ba0942002-06-13 15:07:44 +0000700 The argument writing indicates the direction.
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000701 This does not raise an exception; we'll let our caller do that
702 after they've reacquired the interpreter lock.
703 Returns 1 on timeout, 0 otherwise. */
704static int
Guido van Rossumb9e916a2002-06-07 01:42:47 +0000705internal_select(PySocketSockObject *s, int writing)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000706{
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000707 int n;
Guido van Rossum11ba0942002-06-13 15:07:44 +0000708
Guido van Rossumad654902002-07-19 12:44:59 +0000709 /* Nothing to do unless we're in timeout mode (not non-blocking) */
Guido van Rossum11ba0942002-06-13 15:07:44 +0000710 if (s->sock_timeout <= 0.0)
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000711 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000712
Guido van Rossumad654902002-07-19 12:44:59 +0000713 /* Guard against closed socket */
714 if (s->sock_fd < 0)
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000715 return 0;
Guido van Rossumad654902002-07-19 12:44:59 +0000716
Anthony Baxter93ab5fa2006-07-11 02:04:09 +0000717 /* Prefer poll, if available, since you can poll() any fd
718 * which can't be done with select(). */
719#ifdef HAVE_POLL
720 {
721 struct pollfd pollfd;
722 int timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000723
Anthony Baxter93ab5fa2006-07-11 02:04:09 +0000724 pollfd.fd = s->sock_fd;
725 pollfd.events = writing ? POLLOUT : POLLIN;
726
727 /* s->sock_timeout is in seconds, timeout in ms */
728 timeout = (int)(s->sock_timeout * 1000 + 0.5);
729 n = poll(&pollfd, 1, timeout);
730 }
731#else
732 {
733 /* Construct the arguments to select */
734 fd_set fds;
735 struct timeval tv;
736 tv.tv_sec = (int)s->sock_timeout;
737 tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6);
738 FD_ZERO(&fds);
739 FD_SET(s->sock_fd, &fds);
740
741 /* See if the socket is ready */
742 if (writing)
743 n = select(s->sock_fd+1, NULL, &fds, NULL, &tv);
744 else
745 n = select(s->sock_fd+1, &fds, NULL, NULL, &tv);
746 }
747#endif
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000748 if (n == 0)
749 return 1;
750 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000751}
752
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000753/* Initialize a new socket object. */
754
Tim Petersa12b4cf2002-07-18 22:38:44 +0000755static double defaulttimeout = -1.0; /* Default timeout for new sockets */
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000756
Mark Hammond62b1ab12002-07-23 06:31:15 +0000757PyMODINIT_FUNC
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000758init_sockobject(PySocketSockObject *s,
759 SOCKET_T fd, int family, int type, int proto)
760{
761#ifdef RISCOS
762 int block = 1;
763#endif
764 s->sock_fd = fd;
765 s->sock_family = family;
766 s->sock_type = type;
767 s->sock_proto = proto;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000768 s->sock_timeout = defaulttimeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000769
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000770 s->errorhandler = &set_error;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000771
772 if (defaulttimeout >= 0.0)
773 internal_setblocking(s, 0);
774
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000775#ifdef RISCOS
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000776 if (taskwindow)
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000777 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000778#endif
779}
780
781
Guido van Rossum30a685f1991-06-27 15:51:29 +0000782/* Create a new socket object.
783 This just creates the object and initializes it.
784 If the creation fails, return NULL and set an exception (implicit
785 in NEWOBJ()). */
786
Guido van Rossum73624e91994-10-10 17:59:00 +0000787static PySocketSockObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000788new_sockobject(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000789{
Guido van Rossum73624e91994-10-10 17:59:00 +0000790 PySocketSockObject *s;
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000791 s = (PySocketSockObject *)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000792 PyType_GenericNew(&sock_type, NULL, NULL);
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000793 if (s != NULL)
794 init_sockobject(s, fd, family, type, proto);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000795 return s;
796}
797
Guido van Rossum30a685f1991-06-27 15:51:29 +0000798
Guido van Rossum48a680c2001-03-02 06:34:14 +0000799/* Lock to allow python interpreter to continue, but only allow one
Just van Rossum1040d2c2003-05-09 07:53:18 +0000800 thread to be in gethostbyname or getaddrinfo */
801#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
802PyThread_type_lock netdb_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000803#endif
804
805
Guido van Rossum30a685f1991-06-27 15:51:29 +0000806/* Convert a string specifying a host name or one of a few symbolic
807 names to a numeric IP address. This usually calls gethostbyname()
808 to do the work; the names "" and "<broadcast>" are special.
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000809 Return the length (IPv4 should be 4 bytes), or negative if
Guido van Rossum30a685f1991-06-27 15:51:29 +0000810 an error occurred; then an exception is raised. */
811
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000812static int
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000813setipaddr(char *name, struct sockaddr *addr_ret, size_t addr_ret_size, int af)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000814{
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000815 struct addrinfo hints, *res;
816 int error;
Anthony Baxter0e85f9d2003-05-02 15:40:46 +0000817 int d1, d2, d3, d4;
818 char ch;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000819
Guido van Rossuma376cc51996-12-05 23:43:35 +0000820 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
Guido van Rossum30a685f1991-06-27 15:51:29 +0000821 if (name[0] == '\0') {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000822 int siz;
823 memset(&hints, 0, sizeof(hints));
824 hints.ai_family = af;
825 hints.ai_socktype = SOCK_DGRAM; /*dummy*/
826 hints.ai_flags = AI_PASSIVE;
Just van Rossum1040d2c2003-05-09 07:53:18 +0000827 Py_BEGIN_ALLOW_THREADS
828 ACQUIRE_GETADDRINFO_LOCK
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000829 error = getaddrinfo(NULL, "0", &hints, &res);
Just van Rossum1040d2c2003-05-09 07:53:18 +0000830 Py_END_ALLOW_THREADS
831 /* We assume that those thread-unsafe getaddrinfo() versions
832 *are* safe regarding their return value, ie. that a
833 subsequent call to getaddrinfo() does not destroy the
834 outcome of the first call. */
835 RELEASE_GETADDRINFO_LOCK
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000836 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000837 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000838 return -1;
839 }
840 switch (res->ai_family) {
841 case AF_INET:
842 siz = 4;
843 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000844#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000845 case AF_INET6:
846 siz = 16;
847 break;
848#endif
849 default:
850 freeaddrinfo(res);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000851 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000852 "unsupported address family");
853 return -1;
854 }
855 if (res->ai_next) {
Martin v. Löwisf0b11d22001-11-07 08:31:03 +0000856 freeaddrinfo(res);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000857 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000858 "wildcard resolved to multiple address");
859 return -1;
860 }
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000861 if (res->ai_addrlen < addr_ret_size)
862 addr_ret_size = res->ai_addrlen;
863 memcpy(addr_ret, res->ai_addr, addr_ret_size);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000864 freeaddrinfo(res);
865 return siz;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000866 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000867 if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000868 struct sockaddr_in *sin;
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +0000869 if (af != AF_INET && af != AF_UNSPEC) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000870 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000871 "address family mismatched");
872 return -1;
873 }
874 sin = (struct sockaddr_in *)addr_ret;
875 memset((void *) sin, '\0', sizeof(*sin));
876 sin->sin_family = AF_INET;
877#ifdef HAVE_SOCKADDR_SA_LEN
878 sin->sin_len = sizeof(*sin);
879#endif
880 sin->sin_addr.s_addr = INADDR_BROADCAST;
881 return sizeof(sin->sin_addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000882 }
Anthony Baxter0e85f9d2003-05-02 15:40:46 +0000883 if (sscanf(name, "%d.%d.%d.%d%c", &d1, &d2, &d3, &d4, &ch) == 4 &&
884 0 <= d1 && d1 <= 255 && 0 <= d2 && d2 <= 255 &&
885 0 <= d3 && d3 <= 255 && 0 <= d4 && d4 <= 255) {
886 struct sockaddr_in *sin;
887 sin = (struct sockaddr_in *)addr_ret;
888 sin->sin_addr.s_addr = htonl(
889 ((long) d1 << 24) | ((long) d2 << 16) |
890 ((long) d3 << 8) | ((long) d4 << 0));
891 sin->sin_family = AF_INET;
892#ifdef HAVE_SOCKADDR_SA_LEN
893 sin->sin_len = sizeof(*sin);
894#endif
895 return 4;
896 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000897 memset(&hints, 0, sizeof(hints));
898 hints.ai_family = af;
Just van Rossum1040d2c2003-05-09 07:53:18 +0000899 Py_BEGIN_ALLOW_THREADS
900 ACQUIRE_GETADDRINFO_LOCK
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000901 error = getaddrinfo(name, NULL, &hints, &res);
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000902#if defined(__digital__) && defined(__unix__)
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000903 if (error == EAI_NONAME && af == AF_UNSPEC) {
904 /* On Tru64 V5.1, numeric-to-addr conversion fails
905 if no address family is given. Assume IPv4 for now.*/
906 hints.ai_family = AF_INET;
907 error = getaddrinfo(name, NULL, &hints, &res);
908 }
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000909#endif
Just van Rossum1040d2c2003-05-09 07:53:18 +0000910 Py_END_ALLOW_THREADS
911 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000912 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000913 set_gaierror(error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000914 return -1;
915 }
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000916 if (res->ai_addrlen < addr_ret_size)
917 addr_ret_size = res->ai_addrlen;
918 memcpy((char *) addr_ret, res->ai_addr, addr_ret_size);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000919 freeaddrinfo(res);
920 switch (addr_ret->sa_family) {
921 case AF_INET:
922 return 4;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000923#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000924 case AF_INET6:
925 return 16;
Guido van Rossum955becc1999-03-22 20:14:53 +0000926#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000927 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000928 PyErr_SetString(socket_error, "unknown address family");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000929 return -1;
930 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000931}
932
Guido van Rossum30a685f1991-06-27 15:51:29 +0000933
Guido van Rossum30a685f1991-06-27 15:51:29 +0000934/* Create a string object representing an IP address.
935 This is always a string of the form 'dd.dd.dd.dd' (with variable
936 size numbers). */
937
Guido van Rossum73624e91994-10-10 17:59:00 +0000938static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000939makeipaddr(struct sockaddr *addr, int addrlen)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000940{
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000941 char buf[NI_MAXHOST];
942 int error;
943
944 error = getnameinfo(addr, addrlen, buf, sizeof(buf), NULL, 0,
945 NI_NUMERICHOST);
946 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000947 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000948 return NULL;
949 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000950 return PyString_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000951}
952
953
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000954#ifdef USE_BLUETOOTH
955/* Convert a string representation of a Bluetooth address into a numeric
956 address. Returns the length (6), or raises an exception and returns -1 if
957 an error occurred. */
958
959static int
960setbdaddr(char *name, bdaddr_t *bdaddr)
961{
962 unsigned int b0, b1, b2, b3, b4, b5;
963 char ch;
964 int n;
965
966 n = sscanf(name, "%X:%X:%X:%X:%X:%X%c",
967 &b5, &b4, &b3, &b2, &b1, &b0, &ch);
968 if (n == 6 && (b0 | b1 | b2 | b3 | b4 | b5) < 256) {
969 bdaddr->b[0] = b0;
970 bdaddr->b[1] = b1;
971 bdaddr->b[2] = b2;
972 bdaddr->b[3] = b3;
973 bdaddr->b[4] = b4;
974 bdaddr->b[5] = b5;
975 return 6;
976 } else {
977 PyErr_SetString(socket_error, "bad bluetooth address");
978 return -1;
979 }
980}
981
982/* Create a string representation of the Bluetooth address. This is always a
983 string of the form 'XX:XX:XX:XX:XX:XX' where XX is a two digit hexadecimal
984 value (zero padded if necessary). */
985
986static PyObject *
987makebdaddr(bdaddr_t *bdaddr)
988{
989 char buf[(6 * 2) + 5 + 1];
990
991 sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X",
992 bdaddr->b[5], bdaddr->b[4], bdaddr->b[3],
993 bdaddr->b[2], bdaddr->b[1], bdaddr->b[0]);
994 return PyString_FromString(buf);
995}
996#endif
997
998
Guido van Rossum30a685f1991-06-27 15:51:29 +0000999/* Create an object representing the given socket address,
1000 suitable for passing it back to bind(), connect() etc.
1001 The family field of the sockaddr structure is inspected
1002 to determine what kind of address it really is. */
1003
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001004/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001005static PyObject *
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001006makesockaddr(int sockfd, struct sockaddr *addr, int addrlen, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001007{
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001008 if (addrlen == 0) {
1009 /* No address -- may be recvfrom() from known socket */
Guido van Rossum73624e91994-10-10 17:59:00 +00001010 Py_INCREF(Py_None);
1011 return Py_None;
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001012 }
1013
Guido van Rossumbcc20741998-08-04 22:53:56 +00001014#ifdef __BEOS__
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00001015 /* XXX: BeOS version of accept() doesn't set family correctly */
Guido van Rossumbcc20741998-08-04 22:53:56 +00001016 addr->sa_family = AF_INET;
1017#endif
1018
Guido van Rossum30a685f1991-06-27 15:51:29 +00001019 switch (addr->sa_family) {
1020
1021 case AF_INET:
1022 {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001023 struct sockaddr_in *a;
1024 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
Barry Warsaw752300b1997-01-03 17:18:10 +00001025 PyObject *ret = NULL;
1026 if (addrobj) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001027 a = (struct sockaddr_in *)addr;
Barry Warsaw752300b1997-01-03 17:18:10 +00001028 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
1029 Py_DECREF(addrobj);
1030 }
Guido van Rossum6f5afc91993-02-05 09:46:15 +00001031 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001032 }
Guido van Rossum30a685f1991-06-27 15:51:29 +00001033
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001034#if defined(AF_UNIX)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001035 case AF_UNIX:
1036 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001037 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Armin Rigoa9017c32006-04-19 11:50:27 +00001038#ifdef linux
1039 if (a->sun_path[0] == 0) { /* Linux abstract namespace */
1040 addrlen -= (sizeof(*a) - sizeof(a->sun_path));
1041 return PyString_FromStringAndSize(a->sun_path,
1042 addrlen);
1043 }
1044 else
1045#endif /* linux */
1046 {
1047 /* regular NULL-terminated string */
1048 return PyString_FromString(a->sun_path);
1049 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001050 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001051#endif /* AF_UNIX */
1052
Martin v. Löwis11017b12006-01-14 18:12:57 +00001053#if defined(AF_NETLINK)
1054 case AF_NETLINK:
1055 {
1056 struct sockaddr_nl *a = (struct sockaddr_nl *) addr;
Martin v. Löwisd0560052006-01-15 07:49:20 +00001057 return Py_BuildValue("II", a->nl_pid, a->nl_groups);
Martin v. Löwis11017b12006-01-14 18:12:57 +00001058 }
1059#endif /* AF_NETLINK */
1060
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001061#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001062 case AF_INET6:
1063 {
1064 struct sockaddr_in6 *a;
1065 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
1066 PyObject *ret = NULL;
1067 if (addrobj) {
1068 a = (struct sockaddr_in6 *)addr;
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001069 ret = Py_BuildValue("Oiii",
1070 addrobj,
1071 ntohs(a->sin6_port),
1072 a->sin6_flowinfo,
1073 a->sin6_scope_id);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001074 Py_DECREF(addrobj);
1075 }
1076 return ret;
1077 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001078#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001079
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001080#ifdef USE_BLUETOOTH
1081 case AF_BLUETOOTH:
1082 switch (proto) {
1083
1084 case BTPROTO_L2CAP:
1085 {
1086 struct sockaddr_l2 *a = (struct sockaddr_l2 *) addr;
1087 PyObject *addrobj = makebdaddr(&_BT_L2_MEMB(a, bdaddr));
1088 PyObject *ret = NULL;
1089 if (addrobj) {
1090 ret = Py_BuildValue("Oi",
1091 addrobj,
1092 _BT_L2_MEMB(a, psm));
1093 Py_DECREF(addrobj);
1094 }
1095 return ret;
1096 }
1097
1098 case BTPROTO_RFCOMM:
1099 {
1100 struct sockaddr_rc *a = (struct sockaddr_rc *) addr;
1101 PyObject *addrobj = makebdaddr(&_BT_RC_MEMB(a, bdaddr));
1102 PyObject *ret = NULL;
1103 if (addrobj) {
1104 ret = Py_BuildValue("Oi",
1105 addrobj,
1106 _BT_RC_MEMB(a, channel));
1107 Py_DECREF(addrobj);
1108 }
1109 return ret;
1110 }
1111
1112#if !defined(__FreeBSD__)
1113 case BTPROTO_SCO:
1114 {
1115 struct sockaddr_sco *a = (struct sockaddr_sco *) addr;
1116 return makebdaddr(&_BT_SCO_MEMB(a, bdaddr));
1117 }
1118#endif
1119
1120 }
1121#endif
1122
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00001123#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +00001124 case AF_PACKET:
1125 {
1126 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
1127 char *ifname = "";
1128 struct ifreq ifr;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001129 /* need to look up interface name give index */
1130 if (a->sll_ifindex) {
Jeremy Hylton22308652001-02-02 03:23:09 +00001131 ifr.ifr_ifindex = a->sll_ifindex;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001132 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
Jeremy Hylton22308652001-02-02 03:23:09 +00001133 ifname = ifr.ifr_name;
Jeremy Hylton22308652001-02-02 03:23:09 +00001134 }
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001135 return Py_BuildValue("shbhs#",
1136 ifname,
1137 ntohs(a->sll_protocol),
1138 a->sll_pkttype,
1139 a->sll_hatype,
1140 a->sll_addr,
1141 a->sll_halen);
Jeremy Hylton22308652001-02-02 03:23:09 +00001142 }
1143#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001144
Guido van Rossum30a685f1991-06-27 15:51:29 +00001145 /* More cases here... */
1146
1147 default:
Guido van Rossumaa948df1997-05-07 17:41:48 +00001148 /* If we don't know the address family, don't raise an
1149 exception -- return it as a tuple. */
1150 return Py_BuildValue("is#",
1151 addr->sa_family,
1152 addr->sa_data,
1153 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001154
Guido van Rossum30a685f1991-06-27 15:51:29 +00001155 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001156}
1157
Guido van Rossum30a685f1991-06-27 15:51:29 +00001158
1159/* Parse a socket address argument according to the socket object's
1160 address family. Return 1 if the address was in the proper format,
1161 0 of not. The address is returned through addr_ret, its length
1162 through len_ret. */
1163
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001164static int
Guido van Rossum48a680c2001-03-02 06:34:14 +00001165getsockaddrarg(PySocketSockObject *s, PyObject *args,
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001166 struct sockaddr **addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001167{
Guido van Rossum30a685f1991-06-27 15:51:29 +00001168 switch (s->sock_family) {
1169
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001170#if defined(AF_UNIX)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001171 case AF_UNIX:
1172 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001173 struct sockaddr_un* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001174 char *path;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001175 int len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001176 addr = (struct sockaddr_un*)&(s->sock_addr).un;
Guido van Rossum7e488981998-10-08 02:25:24 +00001177 if (!PyArg_Parse(args, "t#", &path, &len))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001178 return 0;
Armin Rigoa9017c32006-04-19 11:50:27 +00001179#ifdef linux
1180 if (len > 0 && path[0] == 0) {
1181 /* Linux abstract namespace extension */
1182 if (len > sizeof addr->sun_path) {
1183 PyErr_SetString(socket_error,
1184 "AF_UNIX path too long");
1185 return 0;
1186 }
1187 }
1188 else
1189#endif /* linux */
1190 {
1191 /* regular NULL-terminated string */
1192 if (len >= sizeof addr->sun_path) {
1193 PyErr_SetString(socket_error,
1194 "AF_UNIX path too long");
1195 return 0;
1196 }
1197 addr->sun_path[len] = 0;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001198 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001199 addr->sun_family = s->sock_family;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001200 memcpy(addr->sun_path, path, len);
1201 *addr_ret = (struct sockaddr *) addr;
Andrew MacIntyredaedf212004-04-11 12:03:57 +00001202#if defined(PYOS_OS2)
1203 *len_ret = sizeof(*addr);
1204#else
Guido van Rossum65af28a1996-06-11 18:36:33 +00001205 *len_ret = len + sizeof(*addr) - sizeof(addr->sun_path);
Andrew MacIntyredaedf212004-04-11 12:03:57 +00001206#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001207 return 1;
1208 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001209#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001210
Martin v. Löwis11017b12006-01-14 18:12:57 +00001211#if defined(AF_NETLINK)
1212 case AF_NETLINK:
1213 {
1214 struct sockaddr_nl* addr;
1215 int pid, groups;
1216 addr = (struct sockaddr_nl *)&(s->sock_addr).nl;
1217 if (!PyTuple_Check(args)) {
1218 PyErr_Format(
1219 PyExc_TypeError,
1220 "getsockaddrarg: "
1221 "AF_NETLINK address must be tuple, not %.500s",
1222 args->ob_type->tp_name);
1223 return 0;
1224 }
1225 if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &pid, &groups))
1226 return 0;
1227 addr->nl_family = AF_NETLINK;
1228 addr->nl_pid = pid;
1229 addr->nl_groups = groups;
1230 *addr_ret = (struct sockaddr *) addr;
1231 *len_ret = sizeof(*addr);
1232 return 1;
1233 }
1234#endif
1235
Guido van Rossum30a685f1991-06-27 15:51:29 +00001236 case AF_INET:
1237 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001238 struct sockaddr_in* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001239 char *host;
Martin v. Löwis5db099a2003-08-07 11:55:15 +00001240 int port, result;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001241 addr=(struct sockaddr_in*)&(s->sock_addr).in;
Guido van Rossume4dad902000-12-01 13:13:11 +00001242 if (!PyTuple_Check(args)) {
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001243 PyErr_Format(
1244 PyExc_TypeError,
1245 "getsockaddrarg: "
1246 "AF_INET address must be tuple, not %.500s",
1247 args->ob_type->tp_name);
Guido van Rossume4dad902000-12-01 13:13:11 +00001248 return 0;
1249 }
Martin Blais2856e5f2006-05-26 12:03:27 +00001250 if (!PyArg_ParseTuple(args, "eti:getsockaddrarg",
Martin v. Löwis2548c732003-04-18 10:39:54 +00001251 "idna", &host, &port))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001252 return 0;
Martin Blais2856e5f2006-05-26 12:03:27 +00001253 result = setipaddr(host, (struct sockaddr *)addr,
Martin v. Löwis5db099a2003-08-07 11:55:15 +00001254 sizeof(*addr), AF_INET);
1255 PyMem_Free(host);
1256 if (result < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001257 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001258 addr->sin_family = AF_INET;
Guido van Rossum644a12b1997-04-09 19:24:53 +00001259 addr->sin_port = htons((short)port);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001260 *addr_ret = (struct sockaddr *) addr;
1261 *len_ret = sizeof *addr;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001262 return 1;
1263 }
1264
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001265#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001266 case AF_INET6:
1267 {
1268 struct sockaddr_in6* addr;
1269 char *host;
Martin v. Löwis5db099a2003-08-07 11:55:15 +00001270 int port, flowinfo, scope_id, result;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001271 addr = (struct sockaddr_in6*)&(s->sock_addr).in6;
1272 flowinfo = scope_id = 0;
Thomas Wouters04520492006-04-25 15:08:10 +00001273 if (!PyTuple_Check(args)) {
1274 PyErr_Format(
1275 PyExc_TypeError,
1276 "getsockaddrarg: "
1277 "AF_INET6 address must be tuple, not %.500s",
1278 args->ob_type->tp_name);
1279 return 0;
1280 }
Martin Blais2856e5f2006-05-26 12:03:27 +00001281 if (!PyArg_ParseTuple(args, "eti|ii",
Martin v. Löwis2548c732003-04-18 10:39:54 +00001282 "idna", &host, &port, &flowinfo,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001283 &scope_id)) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001284 return 0;
1285 }
Martin Blais2856e5f2006-05-26 12:03:27 +00001286 result = setipaddr(host, (struct sockaddr *)addr,
Martin v. Löwis5db099a2003-08-07 11:55:15 +00001287 sizeof(*addr), AF_INET6);
1288 PyMem_Free(host);
1289 if (result < 0)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001290 return 0;
1291 addr->sin6_family = s->sock_family;
1292 addr->sin6_port = htons((short)port);
1293 addr->sin6_flowinfo = flowinfo;
1294 addr->sin6_scope_id = scope_id;
1295 *addr_ret = (struct sockaddr *) addr;
1296 *len_ret = sizeof *addr;
1297 return 1;
1298 }
1299#endif
1300
Hye-Shik Chang81268602004-02-02 06:05:24 +00001301#ifdef USE_BLUETOOTH
Martin v. Löwis12af0482004-01-31 12:34:17 +00001302 case AF_BLUETOOTH:
1303 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001304 switch (s->sock_proto) {
1305 case BTPROTO_L2CAP:
Martin v. Löwis12af0482004-01-31 12:34:17 +00001306 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001307 struct sockaddr_l2 *addr = (struct sockaddr_l2 *) _BT_SOCKADDR_MEMB(s, l2);
1308 char *straddr;
Martin v. Löwis12af0482004-01-31 12:34:17 +00001309
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001310 _BT_L2_MEMB(addr, family) = AF_BLUETOOTH;
1311 if (!PyArg_ParseTuple(args, "si", &straddr,
1312 &_BT_L2_MEMB(addr, psm))) {
1313 PyErr_SetString(socket_error, "getsockaddrarg: "
1314 "wrong format");
Martin v. Löwis12af0482004-01-31 12:34:17 +00001315 return 0;
1316 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001317 if (setbdaddr(straddr, &_BT_L2_MEMB(addr, bdaddr)) < 0)
1318 return 0;
1319
1320 *addr_ret = (struct sockaddr *) addr;
1321 *len_ret = sizeof *addr;
1322 return 1;
1323 }
1324 case BTPROTO_RFCOMM:
1325 {
1326 struct sockaddr_rc *addr = (struct sockaddr_rc *) _BT_SOCKADDR_MEMB(s, rc);
1327 char *straddr;
1328
1329 _BT_RC_MEMB(addr, family) = AF_BLUETOOTH;
1330 if (!PyArg_ParseTuple(args, "si", &straddr,
1331 &_BT_RC_MEMB(addr, channel))) {
1332 PyErr_SetString(socket_error, "getsockaddrarg: "
1333 "wrong format");
1334 return 0;
1335 }
1336 if (setbdaddr(straddr, &_BT_RC_MEMB(addr, bdaddr)) < 0)
1337 return 0;
1338
1339 *addr_ret = (struct sockaddr *) addr;
1340 *len_ret = sizeof *addr;
1341 return 1;
1342 }
1343#if !defined(__FreeBSD__)
1344 case BTPROTO_SCO:
1345 {
1346 struct sockaddr_sco *addr = (struct sockaddr_sco *) _BT_SOCKADDR_MEMB(s, sco);
1347 char *straddr;
1348
1349 _BT_SCO_MEMB(addr, family) = AF_BLUETOOTH;
1350 straddr = PyString_AsString(args);
1351 if (straddr == NULL) {
1352 PyErr_SetString(socket_error, "getsockaddrarg: "
1353 "wrong format");
1354 return 0;
1355 }
1356 if (setbdaddr(straddr, &_BT_SCO_MEMB(addr, bdaddr)) < 0)
1357 return 0;
1358
1359 *addr_ret = (struct sockaddr *) addr;
1360 *len_ret = sizeof *addr;
1361 return 1;
1362 }
1363#endif
1364 default:
1365 PyErr_SetString(socket_error, "getsockaddrarg: unknown Bluetooth protocol");
1366 return 0;
Martin v. Löwis12af0482004-01-31 12:34:17 +00001367 }
1368 }
1369#endif
1370
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00001371#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +00001372 case AF_PACKET:
1373 {
1374 struct sockaddr_ll* addr;
1375 struct ifreq ifr;
1376 char *interfaceName;
1377 int protoNumber;
1378 int hatype = 0;
1379 int pkttype = 0;
Andrew M. Kuchlingb8e17172004-07-10 23:39:35 +00001380 char *haddr = NULL;
1381 unsigned int halen = 0;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001382
Thomas Wouters04520492006-04-25 15:08:10 +00001383 if (!PyTuple_Check(args)) {
1384 PyErr_Format(
1385 PyExc_TypeError,
1386 "getsockaddrarg: "
1387 "AF_PACKET address must be tuple, not %.500s",
1388 args->ob_type->tp_name);
1389 return 0;
1390 }
Andrew M. Kuchlingb8e17172004-07-10 23:39:35 +00001391 if (!PyArg_ParseTuple(args, "si|iis#", &interfaceName,
1392 &protoNumber, &pkttype, &hatype,
1393 &haddr, &halen))
Jeremy Hylton22308652001-02-02 03:23:09 +00001394 return 0;
1395 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
1396 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001397 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001398 s->errorhandler();
Jeremy Hylton22308652001-02-02 03:23:09 +00001399 return 0;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001400 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001401 addr = &(s->sock_addr.ll);
1402 addr->sll_family = AF_PACKET;
1403 addr->sll_protocol = htons((short)protoNumber);
1404 addr->sll_ifindex = ifr.ifr_ifindex;
1405 addr->sll_pkttype = pkttype;
1406 addr->sll_hatype = hatype;
Andrew M. Kuchlingb8e17172004-07-10 23:39:35 +00001407 if (halen > 8) {
1408 PyErr_SetString(PyExc_ValueError,
1409 "Hardware address must be 8 bytes or less");
1410 return 0;
1411 }
1412 if (halen != 0) {
1413 memcpy(&addr->sll_addr, haddr, halen);
1414 }
1415 addr->sll_halen = halen;
Jeremy Hylton22308652001-02-02 03:23:09 +00001416 *addr_ret = (struct sockaddr *) addr;
1417 *len_ret = sizeof *addr;
1418 return 1;
1419 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00001420#endif
1421
Guido van Rossum30a685f1991-06-27 15:51:29 +00001422 /* More cases here... */
1423
1424 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001425 PyErr_SetString(socket_error, "getsockaddrarg: bad family");
Guido van Rossum30a685f1991-06-27 15:51:29 +00001426 return 0;
1427
1428 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001429}
1430
Guido van Rossum30a685f1991-06-27 15:51:29 +00001431
Guido van Rossum48a680c2001-03-02 06:34:14 +00001432/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +00001433 Return 1 if the family is known, 0 otherwise. The length is returned
1434 through len_ret. */
1435
1436static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +00001437getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +00001438{
1439 switch (s->sock_family) {
1440
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001441#if defined(AF_UNIX)
Guido van Rossum710e1df1992-06-12 10:39:36 +00001442 case AF_UNIX:
1443 {
1444 *len_ret = sizeof (struct sockaddr_un);
1445 return 1;
1446 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001447#endif /* AF_UNIX */
Martin v. Löwis11017b12006-01-14 18:12:57 +00001448#if defined(AF_NETLINK)
1449 case AF_NETLINK:
1450 {
1451 *len_ret = sizeof (struct sockaddr_nl);
1452 return 1;
1453 }
1454#endif
Guido van Rossum710e1df1992-06-12 10:39:36 +00001455
1456 case AF_INET:
1457 {
1458 *len_ret = sizeof (struct sockaddr_in);
1459 return 1;
1460 }
1461
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001462#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001463 case AF_INET6:
1464 {
1465 *len_ret = sizeof (struct sockaddr_in6);
1466 return 1;
1467 }
1468#endif
1469
Hye-Shik Chang81268602004-02-02 06:05:24 +00001470#ifdef USE_BLUETOOTH
Martin v. Löwis12af0482004-01-31 12:34:17 +00001471 case AF_BLUETOOTH:
1472 {
1473 switch(s->sock_proto)
1474 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001475
1476 case BTPROTO_L2CAP:
1477 *len_ret = sizeof (struct sockaddr_l2);
1478 return 1;
1479 case BTPROTO_RFCOMM:
1480 *len_ret = sizeof (struct sockaddr_rc);
1481 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00001482#if !defined(__FreeBSD__)
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001483 case BTPROTO_SCO:
1484 *len_ret = sizeof (struct sockaddr_sco);
1485 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00001486#endif
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001487 default:
1488 PyErr_SetString(socket_error, "getsockaddrlen: "
1489 "unknown BT protocol");
1490 return 0;
1491
Martin v. Löwis12af0482004-01-31 12:34:17 +00001492 }
1493 }
1494#endif
1495
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00001496#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +00001497 case AF_PACKET:
1498 {
1499 *len_ret = sizeof (struct sockaddr_ll);
1500 return 1;
1501 }
1502#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001503
Guido van Rossum710e1df1992-06-12 10:39:36 +00001504 /* More cases here... */
1505
1506 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001507 PyErr_SetString(socket_error, "getsockaddrlen: bad family");
Guido van Rossum710e1df1992-06-12 10:39:36 +00001508 return 0;
1509
1510 }
1511}
1512
1513
Guido van Rossum30a685f1991-06-27 15:51:29 +00001514/* s.accept() method */
1515
Guido van Rossum73624e91994-10-10 17:59:00 +00001516static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001517sock_accept(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001518{
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001519 sock_addr_t addrbuf;
Fred Drakea04eaad2000-06-30 02:46:07 +00001520 SOCKET_T newfd;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001521 socklen_t addrlen;
Barry Warsaw752300b1997-01-03 17:18:10 +00001522 PyObject *sock = NULL;
1523 PyObject *addr = NULL;
1524 PyObject *res = NULL;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001525 int timeout;
Barry Warsaw752300b1997-01-03 17:18:10 +00001526
Guido van Rossum710e1df1992-06-12 10:39:36 +00001527 if (!getsockaddrlen(s, &addrlen))
1528 return NULL;
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001529 memset(&addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001530
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001531#ifdef MS_WINDOWS
1532 newfd = INVALID_SOCKET;
1533#else
1534 newfd = -1;
1535#endif
1536
Neal Norwitz082b2df2006-02-07 07:04:46 +00001537 if (!IS_SELECTABLE(s))
1538 return select_error();
1539
Guido van Rossum73624e91994-10-10 17:59:00 +00001540 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001541 timeout = internal_select(s, 0);
1542 if (!timeout)
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001543 newfd = accept(s->sock_fd, (struct sockaddr *) &addrbuf,
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001544 &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001545 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001546
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001547 if (timeout) {
1548 PyErr_SetString(socket_timeout, "timed out");
1549 return NULL;
1550 }
1551
Fred Drakea04eaad2000-06-30 02:46:07 +00001552#ifdef MS_WINDOWS
1553 if (newfd == INVALID_SOCKET)
1554#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001555 if (newfd < 0)
Fred Drakea04eaad2000-06-30 02:46:07 +00001556#endif
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001557 return s->errorhandler();
Barry Warsaw752300b1997-01-03 17:18:10 +00001558
Guido van Rossum30a685f1991-06-27 15:51:29 +00001559 /* Create the new object with unspecified family,
1560 to avoid calls to bind() etc. on it. */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001561 sock = (PyObject *) new_sockobject(newfd,
1562 s->sock_family,
1563 s->sock_type,
1564 s->sock_proto);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001565
Barry Warsaw752300b1997-01-03 17:18:10 +00001566 if (sock == NULL) {
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001567 SOCKETCLOSE(newfd);
Barry Warsaw752300b1997-01-03 17:18:10 +00001568 goto finally;
1569 }
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001570 addr = makesockaddr(s->sock_fd, (struct sockaddr *) &addrbuf,
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001571 addrlen, s->sock_proto);
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001572 if (addr == NULL)
Barry Warsaw752300b1997-01-03 17:18:10 +00001573 goto finally;
1574
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001575 res = PyTuple_Pack(2, sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00001576
Guido van Rossum67f7a382002-06-06 21:08:16 +00001577finally:
Guido van Rossum73624e91994-10-10 17:59:00 +00001578 Py_XDECREF(sock);
1579 Py_XDECREF(addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001580 return res;
1581}
1582
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001583PyDoc_STRVAR(accept_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001584"accept() -> (socket object, address info)\n\
1585\n\
1586Wait for an incoming connection. Return a new socket representing the\n\
1587connection, and the address of the client. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001588info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001589
Guido van Rossum11ba0942002-06-13 15:07:44 +00001590/* s.setblocking(flag) method. Argument:
1591 False -- non-blocking mode; same as settimeout(0)
1592 True -- blocking mode; same as settimeout(None)
1593*/
Guido van Rossume4485b01994-09-07 14:32:49 +00001594
Guido van Rossum73624e91994-10-10 17:59:00 +00001595static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001596sock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00001597{
1598 int block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001599
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001600 block = PyInt_AsLong(arg);
1601 if (block == -1 && PyErr_Occurred())
Guido van Rossume4485b01994-09-07 14:32:49 +00001602 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001603
Guido van Rossum11ba0942002-06-13 15:07:44 +00001604 s->sock_timeout = block ? -1.0 : 0.0;
Guido van Rossume8008f02002-06-07 03:36:20 +00001605 internal_setblocking(s, block);
Guido van Rossume4485b01994-09-07 14:32:49 +00001606
Guido van Rossum73624e91994-10-10 17:59:00 +00001607 Py_INCREF(Py_None);
1608 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +00001609}
Guido van Rossume4485b01994-09-07 14:32:49 +00001610
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001611PyDoc_STRVAR(setblocking_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001612"setblocking(flag)\n\
1613\n\
1614Set the socket to blocking (flag is true) or non-blocking (false).\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00001615setblocking(True) is equivalent to settimeout(None);\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001616setblocking(False) is equivalent to settimeout(0.0).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001617
Guido van Rossum11ba0942002-06-13 15:07:44 +00001618/* s.settimeout(timeout) method. Argument:
1619 None -- no timeout, blocking mode; same as setblocking(True)
1620 0.0 -- non-blocking mode; same as setblocking(False)
1621 > 0 -- timeout mode; operations time out after timeout seconds
1622 < 0 -- illegal; raises an exception
1623*/
Guido van Rossum67f7a382002-06-06 21:08:16 +00001624static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001625sock_settimeout(PySocketSockObject *s, PyObject *arg)
Guido van Rossum67f7a382002-06-06 21:08:16 +00001626{
Guido van Rossum11ba0942002-06-13 15:07:44 +00001627 double timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001628
1629 if (arg == Py_None)
Guido van Rossum11ba0942002-06-13 15:07:44 +00001630 timeout = -1.0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001631 else {
Guido van Rossum11ba0942002-06-13 15:07:44 +00001632 timeout = PyFloat_AsDouble(arg);
1633 if (timeout < 0.0) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00001634 if (!PyErr_Occurred())
1635 PyErr_SetString(PyExc_ValueError,
Guido van Rossum11ba0942002-06-13 15:07:44 +00001636 "Timeout value out of range");
Guido van Rossum67f7a382002-06-06 21:08:16 +00001637 return NULL;
1638 }
1639 }
1640
Guido van Rossum11ba0942002-06-13 15:07:44 +00001641 s->sock_timeout = timeout;
1642 internal_setblocking(s, timeout < 0.0);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001643
1644 Py_INCREF(Py_None);
1645 return Py_None;
1646}
1647
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001648PyDoc_STRVAR(settimeout_doc,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001649"settimeout(timeout)\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00001650\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00001651Set a timeout on socket operations. 'timeout' can be a float,\n\
1652giving in seconds, or None. Setting a timeout of None disables\n\
1653the timeout feature and is equivalent to setblocking(1).\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001654Setting a timeout of zero is the same as setblocking(0).");
Guido van Rossum67f7a382002-06-06 21:08:16 +00001655
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001656/* s.gettimeout() method.
1657 Returns the timeout associated with a socket. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00001658static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001659sock_gettimeout(PySocketSockObject *s)
Guido van Rossum67f7a382002-06-06 21:08:16 +00001660{
1661 if (s->sock_timeout < 0.0) {
1662 Py_INCREF(Py_None);
1663 return Py_None;
1664 }
1665 else
1666 return PyFloat_FromDouble(s->sock_timeout);
1667}
1668
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001669PyDoc_STRVAR(gettimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00001670"gettimeout() -> timeout\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00001671\n\
1672Returns the timeout in floating seconds associated with socket \n\
1673operations. A timeout of None indicates that timeouts on socket \n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001674operations are disabled.");
Guido van Rossume4485b01994-09-07 14:32:49 +00001675
Guido van Rossum48a680c2001-03-02 06:34:14 +00001676#ifdef RISCOS
1677/* s.sleeptaskw(1 | 0) method */
1678
1679static PyObject *
Martin v. Löwisa94568a2003-05-10 07:36:56 +00001680sock_sleeptaskw(PySocketSockObject *s,PyObject *arg)
Guido van Rossum48a680c2001-03-02 06:34:14 +00001681{
Guido van Rossum67f7a382002-06-06 21:08:16 +00001682 int block;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00001683 block = PyInt_AsLong(arg);
1684 if (block == -1 && PyErr_Occurred())
Guido van Rossum67f7a382002-06-06 21:08:16 +00001685 return NULL;
1686 Py_BEGIN_ALLOW_THREADS
1687 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
1688 Py_END_ALLOW_THREADS
Guido van Rossum48a680c2001-03-02 06:34:14 +00001689
Guido van Rossum67f7a382002-06-06 21:08:16 +00001690 Py_INCREF(Py_None);
1691 return Py_None;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001692}
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001693PyDoc_STRVAR(sleeptaskw_doc,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001694"sleeptaskw(flag)\n\
1695\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001696Allow sleeps in taskwindows.");
Guido van Rossum48a680c2001-03-02 06:34:14 +00001697#endif
1698
1699
Guido van Rossumaee08791992-09-08 09:05:33 +00001700/* s.setsockopt() method.
1701 With an integer third argument, sets an integer option.
1702 With a string third argument, sets an option from a buffer;
1703 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001704
Guido van Rossum73624e91994-10-10 17:59:00 +00001705static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001706sock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001707{
1708 int level;
1709 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001710 int res;
Guido van Rossumaee08791992-09-08 09:05:33 +00001711 char *buf;
1712 int buflen;
1713 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001714
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001715 if (PyArg_ParseTuple(args, "iii:setsockopt",
1716 &level, &optname, &flag)) {
Guido van Rossumaee08791992-09-08 09:05:33 +00001717 buf = (char *) &flag;
1718 buflen = sizeof flag;
1719 }
1720 else {
Guido van Rossum73624e91994-10-10 17:59:00 +00001721 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001722 if (!PyArg_ParseTuple(args, "iis#:setsockopt",
1723 &level, &optname, &buf, &buflen))
Guido van Rossumaee08791992-09-08 09:05:33 +00001724 return NULL;
1725 }
Thomas Wouters334fb892000-07-25 12:56:38 +00001726 res = setsockopt(s->sock_fd, level, optname, (void *)buf, buflen);
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001727 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001728 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001729 Py_INCREF(Py_None);
1730 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001731}
1732
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001733PyDoc_STRVAR(setsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001734"setsockopt(level, option, value)\n\
1735\n\
1736Set a socket option. See the Unix manual for level and option.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001737The value argument can either be an integer or a string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001738
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001739
Guido van Rossumaee08791992-09-08 09:05:33 +00001740/* s.getsockopt() method.
1741 With two arguments, retrieves an integer option.
1742 With a third integer argument, retrieves a string buffer of that size;
1743 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001744
Guido van Rossum73624e91994-10-10 17:59:00 +00001745static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001746sock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001747{
1748 int level;
1749 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001750 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +00001751 PyObject *buf;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001752 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001753
Guido van Rossumbcc20741998-08-04 22:53:56 +00001754#ifdef __BEOS__
Fred Drake564a6cc2001-05-11 20:12:26 +00001755 /* We have incomplete socket support. */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001756 PyErr_SetString(socket_error, "getsockopt not supported");
Guido van Rossumbcc20741998-08-04 22:53:56 +00001757 return NULL;
1758#else
1759
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001760 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
1761 &level, &optname, &buflen))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001762 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001763
Guido van Rossumbe32c891996-06-20 16:25:29 +00001764 if (buflen == 0) {
Guido van Rossumaee08791992-09-08 09:05:33 +00001765 int flag = 0;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001766 socklen_t flagsize = sizeof flag;
Guido van Rossumb376a4a1993-11-23 17:53:17 +00001767 res = getsockopt(s->sock_fd, level, optname,
Thomas Wouters334fb892000-07-25 12:56:38 +00001768 (void *)&flag, &flagsize);
Guido van Rossumaee08791992-09-08 09:05:33 +00001769 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001770 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001771 return PyInt_FromLong(flag);
Guido van Rossumaee08791992-09-08 09:05:33 +00001772 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001773#ifdef __VMS
Neal Norwitz2a30cd02006-07-10 01:18:57 +00001774 /* socklen_t is unsigned so no negative test is needed,
1775 test buflen == 0 is previously done */
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001776 if (buflen > 1024) {
1777#else
Guido van Rossumaee08791992-09-08 09:05:33 +00001778 if (buflen <= 0 || buflen > 1024) {
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001779#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001780 PyErr_SetString(socket_error,
Barry Warsaw752300b1997-01-03 17:18:10 +00001781 "getsockopt buflen out of range");
Guido van Rossumaee08791992-09-08 09:05:33 +00001782 return NULL;
1783 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001784 buf = PyString_FromStringAndSize((char *)NULL, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001785 if (buf == NULL)
1786 return NULL;
Guido van Rossumb376a4a1993-11-23 17:53:17 +00001787 res = getsockopt(s->sock_fd, level, optname,
Fred Drake564a6cc2001-05-11 20:12:26 +00001788 (void *)PyString_AS_STRING(buf), &buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001789 if (res < 0) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001790 Py_DECREF(buf);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001791 return s->errorhandler();
Guido van Rossumaee08791992-09-08 09:05:33 +00001792 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001793 _PyString_Resize(&buf, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001794 return buf;
Guido van Rossumbcc20741998-08-04 22:53:56 +00001795#endif /* __BEOS__ */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001796}
1797
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001798PyDoc_STRVAR(getsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001799"getsockopt(level, option[, buffersize]) -> value\n\
1800\n\
1801Get a socket option. See the Unix manual for level and option.\n\
1802If a nonzero buffersize argument is given, the return value is a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001803string of that length; otherwise it is an integer.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001804
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001805
Fred Drake728819a2000-07-01 03:40:12 +00001806/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001807
Guido van Rossum73624e91994-10-10 17:59:00 +00001808static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001809sock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001810{
1811 struct sockaddr *addr;
1812 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001813 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001814
Fred Drake728819a2000-07-01 03:40:12 +00001815 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001816 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001817 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001818 res = bind(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001819 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001820 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001821 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001822 Py_INCREF(Py_None);
1823 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001824}
1825
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001826PyDoc_STRVAR(bind_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001827"bind(address)\n\
1828\n\
1829Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00001830pair (host, port); the host must refer to the local host. For raw packet\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001831sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001832
Guido van Rossum30a685f1991-06-27 15:51:29 +00001833
1834/* s.close() method.
1835 Set the file descriptor to -1 so operations tried subsequently
1836 will surely fail. */
1837
Guido van Rossum73624e91994-10-10 17:59:00 +00001838static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001839sock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001840{
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001841 SOCKET_T fd;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001842
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001843 if ((fd = s->sock_fd) != -1) {
1844 s->sock_fd = -1;
Guido van Rossum08481461996-10-12 14:07:22 +00001845 Py_BEGIN_ALLOW_THREADS
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001846 (void) SOCKETCLOSE(fd);
Guido van Rossum08481461996-10-12 14:07:22 +00001847 Py_END_ALLOW_THREADS
1848 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001849 Py_INCREF(Py_None);
1850 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001851}
1852
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001853PyDoc_STRVAR(close_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001854"close()\n\
1855\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001856Close the socket. It cannot be used after this call.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001857
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001858static int
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001859internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen,
1860 int *timeoutp)
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001861{
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001862 int res, timeout;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001863
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001864 timeout = 0;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001865 res = connect(s->sock_fd, addr, addrlen);
1866
1867#ifdef MS_WINDOWS
1868
1869 if (s->sock_timeout > 0.0) {
Neal Norwitz082b2df2006-02-07 07:04:46 +00001870 if (res < 0 && WSAGetLastError() == WSAEWOULDBLOCK &&
1871 IS_SELECTABLE(s)) {
Guido van Rossumb76bdf82003-02-19 17:50:16 +00001872 /* This is a mess. Best solution: trust select */
1873 fd_set fds;
Mark Hammonda57ec932004-08-03 05:06:26 +00001874 fd_set fds_exc;
Guido van Rossumb76bdf82003-02-19 17:50:16 +00001875 struct timeval tv;
1876 tv.tv_sec = (int)s->sock_timeout;
1877 tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6);
1878 FD_ZERO(&fds);
1879 FD_SET(s->sock_fd, &fds);
Mark Hammonda57ec932004-08-03 05:06:26 +00001880 FD_ZERO(&fds_exc);
1881 FD_SET(s->sock_fd, &fds_exc);
1882 res = select(s->sock_fd+1, NULL, &fds, &fds_exc, &tv);
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001883 if (res == 0) {
Guido van Rossumb76bdf82003-02-19 17:50:16 +00001884 res = WSAEWOULDBLOCK;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001885 timeout = 1;
Mark Hammonda57ec932004-08-03 05:06:26 +00001886 } else if (res > 0) {
1887 if (FD_ISSET(s->sock_fd, &fds))
1888 /* The socket is in the writeable set - this
1889 means connected */
1890 res = 0;
1891 else {
1892 /* As per MS docs, we need to call getsockopt()
1893 to get the underlying error */
1894 int res_size = sizeof res;
1895 /* It must be in the exception set */
1896 assert(FD_ISSET(s->sock_fd, &fds_exc));
Martin Blais2856e5f2006-05-26 12:03:27 +00001897 if (0 == getsockopt(s->sock_fd, SOL_SOCKET, SO_ERROR,
Mark Hammonda57ec932004-08-03 05:06:26 +00001898 (char *)&res, &res_size))
1899 /* getsockopt also clears WSAGetLastError,
1900 so reset it back. */
1901 WSASetLastError(res);
1902 else
1903 res = WSAGetLastError();
1904 }
1905 }
Guido van Rossumb76bdf82003-02-19 17:50:16 +00001906 /* else if (res < 0) an error occurred */
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001907 }
1908 }
1909
1910 if (res < 0)
1911 res = WSAGetLastError();
1912
1913#else
1914
1915 if (s->sock_timeout > 0.0) {
Neal Norwitz082b2df2006-02-07 07:04:46 +00001916 if (res < 0 && errno == EINPROGRESS && IS_SELECTABLE(s)) {
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001917 timeout = internal_select(s, 1);
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001918 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum12e3c712002-08-08 20:39:30 +00001919 if (res < 0 && errno == EISCONN)
1920 res = 0;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001921 }
1922 }
1923
1924 if (res < 0)
1925 res = errno;
1926
1927#endif
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001928 *timeoutp = timeout;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001929
1930 return res;
1931}
Guido van Rossum30a685f1991-06-27 15:51:29 +00001932
Fred Drake728819a2000-07-01 03:40:12 +00001933/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001934
Guido van Rossum73624e91994-10-10 17:59:00 +00001935static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001936sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001937{
1938 struct sockaddr *addr;
1939 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001940 int res;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001941 int timeout;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001942
Fred Drake728819a2000-07-01 03:40:12 +00001943 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001944 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001945
Guido van Rossum73624e91994-10-10 17:59:00 +00001946 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001947 res = internal_connect(s, addr, addrlen, &timeout);
Guido van Rossum11ba0942002-06-13 15:07:44 +00001948 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001949
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001950 if (timeout) {
1951 PyErr_SetString(socket_timeout, "timed out");
1952 return NULL;
1953 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001954 if (res != 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001955 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001956 Py_INCREF(Py_None);
1957 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001958}
1959
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001960PyDoc_STRVAR(connect_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001961"connect(address)\n\
1962\n\
1963Connect the socket to a remote address. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001964is a pair (host, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001965
Guido van Rossum30a685f1991-06-27 15:51:29 +00001966
Fred Drake728819a2000-07-01 03:40:12 +00001967/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001968
1969static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001970sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001971{
1972 struct sockaddr *addr;
1973 int addrlen;
1974 int res;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001975 int timeout;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001976
Fred Drake728819a2000-07-01 03:40:12 +00001977 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001978 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001979
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001980 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001981 res = internal_connect(s, addr, addrlen, &timeout);
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001982 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001983
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001984 return PyInt_FromLong((long) res);
1985}
1986
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001987PyDoc_STRVAR(connect_ex_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00001988"connect_ex(address) -> errno\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00001989\n\
1990This is like connect(address), but returns an error code (the errno value)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001991instead of raising an exception when an error occurs.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001992
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001993
Guido van Rossumed233a51992-06-23 09:07:03 +00001994/* s.fileno() method */
1995
Guido van Rossum73624e91994-10-10 17:59:00 +00001996static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001997sock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00001998{
Fred Drakea04eaad2000-06-30 02:46:07 +00001999#if SIZEOF_SOCKET_T <= SIZEOF_LONG
Guido van Rossum73624e91994-10-10 17:59:00 +00002000 return PyInt_FromLong((long) s->sock_fd);
Fred Drakea04eaad2000-06-30 02:46:07 +00002001#else
Martin v. Löwisb9a0f912003-03-29 10:06:18 +00002002 return PyLong_FromLongLong((PY_LONG_LONG)s->sock_fd);
Fred Drakea04eaad2000-06-30 02:46:07 +00002003#endif
Guido van Rossumed233a51992-06-23 09:07:03 +00002004}
2005
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002006PyDoc_STRVAR(fileno_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002007"fileno() -> integer\n\
2008\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002009Return the integer file descriptor of the socket.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002010
Guido van Rossumed233a51992-06-23 09:07:03 +00002011
Guido van Rossumbe32c891996-06-20 16:25:29 +00002012#ifndef NO_DUP
2013/* s.dup() method */
2014
2015static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002016sock_dup(PySocketSockObject *s)
Guido van Rossumbe32c891996-06-20 16:25:29 +00002017{
Fred Drakea04eaad2000-06-30 02:46:07 +00002018 SOCKET_T newfd;
Guido van Rossumbe32c891996-06-20 16:25:29 +00002019 PyObject *sock;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002020
Guido van Rossumbe32c891996-06-20 16:25:29 +00002021 newfd = dup(s->sock_fd);
2022 if (newfd < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002023 return s->errorhandler();
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002024 sock = (PyObject *) new_sockobject(newfd,
2025 s->sock_family,
2026 s->sock_type,
2027 s->sock_proto);
Guido van Rossumbe32c891996-06-20 16:25:29 +00002028 if (sock == NULL)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00002029 SOCKETCLOSE(newfd);
Guido van Rossumbe32c891996-06-20 16:25:29 +00002030 return sock;
2031}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002032
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002033PyDoc_STRVAR(dup_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002034"dup() -> socket object\n\
2035\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002036Return a new socket object connected to the same system resource.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002037
Guido van Rossumbe32c891996-06-20 16:25:29 +00002038#endif
2039
2040
Guido van Rossumc89705d1992-11-26 08:54:07 +00002041/* s.getsockname() method */
2042
Guido van Rossum73624e91994-10-10 17:59:00 +00002043static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002044sock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002045{
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00002046 sock_addr_t addrbuf;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002047 int res;
2048 socklen_t addrlen;
2049
Guido van Rossumc89705d1992-11-26 08:54:07 +00002050 if (!getsockaddrlen(s, &addrlen))
2051 return NULL;
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00002052 memset(&addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00002053 Py_BEGIN_ALLOW_THREADS
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00002054 res = getsockname(s->sock_fd, (struct sockaddr *) &addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00002055 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00002056 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002057 return s->errorhandler();
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00002058 return makesockaddr(s->sock_fd, (struct sockaddr *) &addrbuf, addrlen,
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00002059 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002060}
2061
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002062PyDoc_STRVAR(getsockname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002063"getsockname() -> address info\n\
2064\n\
2065Return the address of the local endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002066info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002067
Guido van Rossumc89705d1992-11-26 08:54:07 +00002068
Guido van Rossumb6775db1994-08-01 11:34:53 +00002069#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002070/* s.getpeername() method */
2071
Guido van Rossum73624e91994-10-10 17:59:00 +00002072static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002073sock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002074{
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00002075 sock_addr_t addrbuf;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002076 int res;
2077 socklen_t addrlen;
2078
Guido van Rossumc89705d1992-11-26 08:54:07 +00002079 if (!getsockaddrlen(s, &addrlen))
2080 return NULL;
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00002081 memset(&addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00002082 Py_BEGIN_ALLOW_THREADS
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00002083 res = getpeername(s->sock_fd, (struct sockaddr *) &addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00002084 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00002085 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002086 return s->errorhandler();
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00002087 return makesockaddr(s->sock_fd, (struct sockaddr *) &addrbuf, addrlen,
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00002088 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002089}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002090
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002091PyDoc_STRVAR(getpeername_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002092"getpeername() -> address info\n\
2093\n\
2094Return the address of the remote endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002095info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002096
Guido van Rossumb6775db1994-08-01 11:34:53 +00002097#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002098
2099
Guido van Rossum30a685f1991-06-27 15:51:29 +00002100/* s.listen(n) method */
2101
Guido van Rossum73624e91994-10-10 17:59:00 +00002102static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002103sock_listen(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002104{
2105 int backlog;
Guido van Rossumff4949e1992-08-05 19:58:53 +00002106 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002107
2108 backlog = PyInt_AsLong(arg);
2109 if (backlog == -1 && PyErr_Occurred())
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002110 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00002111 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +00002112 if (backlog < 1)
2113 backlog = 1;
Guido van Rossumff4949e1992-08-05 19:58:53 +00002114 res = listen(s->sock_fd, backlog);
Guido van Rossum73624e91994-10-10 17:59:00 +00002115 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002116 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002117 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00002118 Py_INCREF(Py_None);
2119 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002120}
2121
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002122PyDoc_STRVAR(listen_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002123"listen(backlog)\n\
2124\n\
2125Enable a server to accept connections. The backlog argument must be at\n\
2126least 1; it specifies the number of unaccepted connection that the system\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002127will allow before refusing new connections.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002128
2129
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002130#ifndef NO_DUP
Guido van Rossum30a685f1991-06-27 15:51:29 +00002131/* s.makefile(mode) method.
2132 Create a new open file object referring to a dupped version of
2133 the socket's file descriptor. (The dup() call is necessary so
2134 that the open file and socket objects may be closed independent
2135 of each other.)
2136 The mode argument specifies 'r' or 'w' passed to fdopen(). */
2137
Guido van Rossum73624e91994-10-10 17:59:00 +00002138static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002139sock_makefile(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002140{
Tim Petersdbd9ba62000-07-09 03:09:57 +00002141 extern int fclose(FILE *);
Guido van Rossum6b144911995-03-14 15:05:13 +00002142 char *mode = "r";
2143 int bufsize = -1;
Fred Drakea04eaad2000-06-30 02:46:07 +00002144#ifdef MS_WIN32
Tim Peters79248aa2001-08-29 21:37:10 +00002145 Py_intptr_t fd;
Fred Drakea04eaad2000-06-30 02:46:07 +00002146#else
Guido van Rossum30a685f1991-06-27 15:51:29 +00002147 int fd;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002148#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00002149 FILE *fp;
Guido van Rossum6b144911995-03-14 15:05:13 +00002150 PyObject *f;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002151#ifdef __VMS
2152 char *mode_r = "r";
2153 char *mode_w = "w";
2154#endif
Guido van Rossum6b144911995-03-14 15:05:13 +00002155
Guido van Rossum43713e52000-02-29 13:59:29 +00002156 if (!PyArg_ParseTuple(args, "|si:makefile", &mode, &bufsize))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002157 return NULL;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002158#ifdef __VMS
2159 if (strcmp(mode,"rb") == 0) {
2160 mode = mode_r;
2161 }
2162 else {
2163 if (strcmp(mode,"wb") == 0) {
2164 mode = mode_w;
2165 }
2166 }
2167#endif
Guido van Rossum8d665e61996-06-26 18:22:49 +00002168#ifdef MS_WIN32
Guido van Rossum82a5c661998-07-07 20:45:43 +00002169 if (((fd = _open_osfhandle(s->sock_fd, _O_BINARY)) < 0) ||
2170 ((fd = dup(fd)) < 0) || ((fp = fdopen(fd, mode)) == NULL))
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00002171#else
Guido van Rossum82a5c661998-07-07 20:45:43 +00002172 if ((fd = dup(s->sock_fd)) < 0 || (fp = fdopen(fd, mode)) == NULL)
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00002173#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00002174 {
Guido van Rossum6b144911995-03-14 15:05:13 +00002175 if (fd >= 0)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00002176 SOCKETCLOSE(fd);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002177 return s->errorhandler();
Guido van Rossum6b144911995-03-14 15:05:13 +00002178 }
2179 f = PyFile_FromFile(fp, "<socket>", mode, fclose);
2180 if (f != NULL)
2181 PyFile_SetBufSize(f, bufsize);
2182 return f;
Guido van Rossum30a685f1991-06-27 15:51:29 +00002183}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002184
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002185PyDoc_STRVAR(makefile_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002186"makefile([mode[, buffersize]]) -> file object\n\
2187\n\
2188Return a regular file object corresponding to the socket.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002189The mode and buffersize arguments are as for the built-in open() function.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002190
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002191#endif /* NO_DUP */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002192
Martin Blais2856e5f2006-05-26 12:03:27 +00002193/*
Martin Blaisaf2ae722006-06-04 13:49:49 +00002194 * This is the guts of the recv() and recv_into() methods, which reads into a
Martin Blais2856e5f2006-05-26 12:03:27 +00002195 * char buffer. If you have any inc/def ref to do to the objects that contain
2196 * the buffer, do it in the caller. This function returns the number of bytes
2197 * succesfully read. If there was an error, it returns -1. Note that it is
2198 * also possible that we return a number of bytes smaller than the request
2199 * bytes.
2200 */
Martin Blaisaf2ae722006-06-04 13:49:49 +00002201static ssize_t
Martin Blais2856e5f2006-05-26 12:03:27 +00002202sock_recv_guts(PySocketSockObject *s, char* cbuf, int len, int flags)
2203{
Martin Blaisaf2ae722006-06-04 13:49:49 +00002204 ssize_t outlen = 0;
2205 int timeout;
Martin Blais2856e5f2006-05-26 12:03:27 +00002206#ifdef __VMS
2207 int remaining, nread;
2208 char *read_buf;
2209#endif
2210
2211 if (!IS_SELECTABLE(s)) {
2212 select_error();
2213 return -1;
2214 }
2215
2216#ifndef __VMS
2217 Py_BEGIN_ALLOW_THREADS
2218 timeout = internal_select(s, 0);
2219 if (!timeout)
2220 outlen = recv(s->sock_fd, cbuf, len, flags);
2221 Py_END_ALLOW_THREADS
2222
2223 if (timeout) {
2224 PyErr_SetString(socket_timeout, "timed out");
2225 return -1;
2226 }
2227 if (outlen < 0) {
2228 /* Note: the call to errorhandler() ALWAYS indirectly returned
2229 NULL, so ignore its return value */
2230 s->errorhandler();
2231 return -1;
2232 }
2233#else
2234 read_buf = cbuf;
2235 remaining = len;
2236 while (remaining != 0) {
2237 unsigned int segment;
2238
2239 segment = remaining /SEGMENT_SIZE;
2240 if (segment != 0) {
2241 segment = SEGMENT_SIZE;
2242 }
2243 else {
2244 segment = remaining;
2245 }
2246
2247 Py_BEGIN_ALLOW_THREADS
2248 timeout = internal_select(s, 0);
2249 if (!timeout)
2250 nread = recv(s->sock_fd, read_buf, segment, flags);
2251 Py_END_ALLOW_THREADS
2252
2253 if (timeout) {
2254 PyErr_SetString(socket_timeout, "timed out");
2255 return -1;
2256 }
2257 if (nread < 0) {
2258 s->errorhandler();
2259 return -1;
2260 }
2261 if (nread != remaining) {
2262 read_buf += nread;
2263 break;
2264 }
2265
2266 remaining -= segment;
2267 read_buf += segment;
2268 }
2269 outlen = read_buf - cbuf;
2270#endif /* !__VMS */
2271
2272 return outlen;
2273}
2274
Guido van Rossum48a680c2001-03-02 06:34:14 +00002275
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002276/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002277
Guido van Rossum73624e91994-10-10 17:59:00 +00002278static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002279sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002280{
Martin Blaisaf2ae722006-06-04 13:49:49 +00002281 int recvlen, flags = 0;
2282 ssize_t outlen;
Guido van Rossum73624e91994-10-10 17:59:00 +00002283 PyObject *buf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002284
Martin Blais2856e5f2006-05-26 12:03:27 +00002285 if (!PyArg_ParseTuple(args, "i|i:recv", &recvlen, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00002286 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002287
Martin Blais2856e5f2006-05-26 12:03:27 +00002288 if (recvlen < 0) {
Martin v. Löwisfba64e12001-11-19 10:41:26 +00002289 PyErr_SetString(PyExc_ValueError,
Guido van Rossum11ba0942002-06-13 15:07:44 +00002290 "negative buffersize in recv");
Martin v. Löwisfba64e12001-11-19 10:41:26 +00002291 return NULL;
2292 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002293
Martin Blais2856e5f2006-05-26 12:03:27 +00002294 /* Allocate a new string. */
2295 buf = PyString_FromStringAndSize((char *) 0, recvlen);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002296 if (buf == NULL)
2297 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002298
Martin Blais2856e5f2006-05-26 12:03:27 +00002299 /* Call the guts */
Martin Blaisaf2ae722006-06-04 13:49:49 +00002300 outlen = sock_recv_guts(s, PyString_AS_STRING(buf), recvlen, flags);
Martin Blais2856e5f2006-05-26 12:03:27 +00002301 if (outlen < 0) {
2302 /* An error occured, release the string and return an
2303 error. */
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002304 Py_DECREF(buf);
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002305 return NULL;
2306 }
Martin Blais2856e5f2006-05-26 12:03:27 +00002307 if (outlen != recvlen) {
2308 /* We did not read as many bytes as we anticipated, resize the
2309 string if possible and be succesful. */
2310 if (_PyString_Resize(&buf, outlen) < 0)
2311 /* Oopsy, not so succesful after all. */
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002312 return NULL;
Martin Blais2856e5f2006-05-26 12:03:27 +00002313 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002314
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002315 return buf;
2316}
2317
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002318PyDoc_STRVAR(recv_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002319"recv(buffersize[, flags]) -> data\n\
2320\n\
2321Receive up to buffersize bytes from the socket. For the optional flags\n\
2322argument, see the Unix manual. When no data is available, block until\n\
2323at least one byte is available or until the remote end is closed. When\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002324the remote end is closed and all data is read, return the empty string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002325
Guido van Rossum30a685f1991-06-27 15:51:29 +00002326
Martin Blaisaf2ae722006-06-04 13:49:49 +00002327/* s.recv_into(buffer, [nbytes [,flags]]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002328
Martin Blais2856e5f2006-05-26 12:03:27 +00002329static PyObject*
Martin Blaisaf2ae722006-06-04 13:49:49 +00002330sock_recv_into(PySocketSockObject *s, PyObject *args, PyObject *kwds)
Martin Blais2856e5f2006-05-26 12:03:27 +00002331{
2332 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
2333
Martin Blaisaf2ae722006-06-04 13:49:49 +00002334 int recvlen = 0, flags = 0;
2335 ssize_t readlen;
Martin Blais2856e5f2006-05-26 12:03:27 +00002336 char *buf;
2337 int buflen;
2338
2339 /* Get the buffer's memory */
Martin Blaisaf2ae722006-06-04 13:49:49 +00002340 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w#|ii:recv", kwlist,
Martin Blais2856e5f2006-05-26 12:03:27 +00002341 &buf, &buflen, &recvlen, &flags))
2342 return NULL;
2343 assert(buf != 0 && buflen > 0);
2344
2345 if (recvlen < 0) {
2346 PyErr_SetString(PyExc_ValueError,
2347 "negative buffersize in recv");
2348 return NULL;
2349 }
2350 if (recvlen == 0) {
2351 /* If nbytes was not specified, use the buffer's length */
2352 recvlen = buflen;
2353 }
2354
2355 /* Check if the buffer is large enough */
2356 if (buflen < recvlen) {
2357 PyErr_SetString(PyExc_ValueError,
2358 "buffer too small for requested bytes");
2359 return NULL;
2360 }
2361
2362 /* Call the guts */
2363 readlen = sock_recv_guts(s, buf, recvlen, flags);
2364 if (readlen < 0) {
2365 /* Return an error. */
2366 return NULL;
2367 }
2368
2369 /* Return the number of bytes read. Note that we do not do anything
2370 special here in the case that readlen < recvlen. */
Martin Blaisaf2ae722006-06-04 13:49:49 +00002371 return PyInt_FromSsize_t(readlen);
Martin Blais2856e5f2006-05-26 12:03:27 +00002372}
2373
Martin Blaisaf2ae722006-06-04 13:49:49 +00002374PyDoc_STRVAR(recv_into_doc,
2375"recv_into(buffer, [nbytes[, flags]]) -> nbytes_read\n\
Martin Blais2856e5f2006-05-26 12:03:27 +00002376\n\
2377A version of recv() that stores its data into a buffer rather than creating \n\
2378a new string. Receive up to buffersize bytes from the socket. If buffersize \n\
2379is not specified (or 0), receive up to the size available in the given buffer.\n\
2380\n\
2381See recv() for documentation about the flags.");
2382
2383
2384/*
Martin Blaisaf2ae722006-06-04 13:49:49 +00002385 * This is the guts of the recv() and recv_into() methods, which reads into a
Martin Blais2856e5f2006-05-26 12:03:27 +00002386 * char buffer. If you have any inc/def ref to do to the objects that contain
2387 * the buffer, do it in the caller. This function returns the number of bytes
2388 * succesfully read. If there was an error, it returns -1. Note that it is
2389 * also possible that we return a number of bytes smaller than the request
2390 * bytes.
2391 *
2392 * 'addr' is a return value for the address object. Note that you must decref
2393 * it yourself.
2394 */
Martin Blaisaf2ae722006-06-04 13:49:49 +00002395static ssize_t
Martin Blais2856e5f2006-05-26 12:03:27 +00002396sock_recvfrom_guts(PySocketSockObject *s, char* cbuf, int len, int flags,
2397 PyObject** addr)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002398{
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00002399 sock_addr_t addrbuf;
Martin Blaisaf2ae722006-06-04 13:49:49 +00002400 int timeout;
2401 ssize_t n = 0;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002402 socklen_t addrlen;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002403
Martin Blais2856e5f2006-05-26 12:03:27 +00002404 *addr = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002405
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00002406 if (!getsockaddrlen(s, &addrlen))
Martin Blais2856e5f2006-05-26 12:03:27 +00002407 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002408
Martin Blais2856e5f2006-05-26 12:03:27 +00002409 if (!IS_SELECTABLE(s)) {
2410 select_error();
2411 return -1;
2412 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00002413
Guido van Rossum73624e91994-10-10 17:59:00 +00002414 Py_BEGIN_ALLOW_THREADS
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00002415 memset(&addrbuf, 0, addrlen);
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002416 timeout = internal_select(s, 0);
Martin v. Löwis7e75f1a2006-04-15 08:35:59 +00002417 if (!timeout) {
Guido van Rossum8d665e61996-06-26 18:22:49 +00002418#ifndef MS_WINDOWS
Andrew MacIntyreba43e872002-03-03 03:03:52 +00002419#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Martin Blais2856e5f2006-05-26 12:03:27 +00002420 n = recvfrom(s->sock_fd, cbuf, len, flags,
Martin v. Löwis7e75f1a2006-04-15 08:35:59 +00002421 (struct sockaddr *) &addrbuf, &addrlen);
Guido van Rossum32c575d1997-12-02 20:37:32 +00002422#else
Martin Blais2856e5f2006-05-26 12:03:27 +00002423 n = recvfrom(s->sock_fd, cbuf, len, flags,
Martin v. Löwis7e75f1a2006-04-15 08:35:59 +00002424 (void *) &addrbuf, &addrlen);
Guido van Rossum32c575d1997-12-02 20:37:32 +00002425#endif
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002426#else
Martin Blais2856e5f2006-05-26 12:03:27 +00002427 n = recvfrom(s->sock_fd, cbuf, len, flags,
Martin v. Löwis7e75f1a2006-04-15 08:35:59 +00002428 (struct sockaddr *) &addrbuf, &addrlen);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002429#endif
Martin v. Löwis7e75f1a2006-04-15 08:35:59 +00002430 }
Guido van Rossum73624e91994-10-10 17:59:00 +00002431 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002432
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002433 if (timeout) {
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002434 PyErr_SetString(socket_timeout, "timed out");
Martin Blais2856e5f2006-05-26 12:03:27 +00002435 return -1;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002436 }
Guido van Rossum7c53b771995-09-13 18:39:47 +00002437 if (n < 0) {
Martin Blais2856e5f2006-05-26 12:03:27 +00002438 s->errorhandler();
2439 return -1;
Guido van Rossum7c53b771995-09-13 18:39:47 +00002440 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002441
Martin Blais2856e5f2006-05-26 12:03:27 +00002442 if (!(*addr = makesockaddr(s->sock_fd, (struct sockaddr *) &addrbuf,
2443 addrlen, s->sock_proto)))
2444 return -1;
2445
2446 return n;
2447}
2448
2449/* s.recvfrom(nbytes [,flags]) method */
2450
2451static PyObject *
2452sock_recvfrom(PySocketSockObject *s, PyObject *args)
2453{
2454 PyObject *buf = NULL;
2455 PyObject *addr = NULL;
2456 PyObject *ret = NULL;
Martin Blaisaf2ae722006-06-04 13:49:49 +00002457 int recvlen, flags = 0;
2458 ssize_t outlen;
Martin Blais2856e5f2006-05-26 12:03:27 +00002459
2460 if (!PyArg_ParseTuple(args, "i|i:recvfrom", &recvlen, &flags))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002461 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002462
Martin Blais2856e5f2006-05-26 12:03:27 +00002463 buf = PyString_FromStringAndSize((char *) 0, recvlen);
2464 if (buf == NULL)
2465 return NULL;
2466
2467 outlen = sock_recvfrom_guts(s, PyString_AS_STRING(buf),
2468 recvlen, flags, &addr);
2469 if (outlen < 0) {
Barry Warsaw752300b1997-01-03 17:18:10 +00002470 goto finally;
Martin Blais2856e5f2006-05-26 12:03:27 +00002471 }
2472
2473 if (outlen != recvlen) {
2474 /* We did not read as many bytes as we anticipated, resize the
2475 string if possible and be succesful. */
2476 if (_PyString_Resize(&buf, outlen) < 0)
2477 /* Oopsy, not so succesful after all. */
2478 goto finally;
2479 }
Barry Warsaw752300b1997-01-03 17:18:10 +00002480
Raymond Hettinger8ae46892003-10-12 19:09:37 +00002481 ret = PyTuple_Pack(2, buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002482
2483finally:
Guido van Rossum73624e91994-10-10 17:59:00 +00002484 Py_XDECREF(buf);
Martin Blais2856e5f2006-05-26 12:03:27 +00002485 Py_XDECREF(addr);
Guido van Rossum6f5afc91993-02-05 09:46:15 +00002486 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002487}
2488
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002489PyDoc_STRVAR(recvfrom_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002490"recvfrom(buffersize[, flags]) -> (data, address info)\n\
2491\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002492Like recv(buffersize, flags) but also return the sender's address info.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002493
Martin Blais2856e5f2006-05-26 12:03:27 +00002494
Martin Blaisaf2ae722006-06-04 13:49:49 +00002495/* s.recvfrom_into(buffer[, nbytes [,flags]]) method */
Martin Blais2856e5f2006-05-26 12:03:27 +00002496
2497static PyObject *
Martin Blaisaf2ae722006-06-04 13:49:49 +00002498sock_recvfrom_into(PySocketSockObject *s, PyObject *args, PyObject* kwds)
Martin Blais2856e5f2006-05-26 12:03:27 +00002499{
2500 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
2501
Martin Blaisaf2ae722006-06-04 13:49:49 +00002502 int recvlen = 0, flags = 0;
2503 ssize_t readlen;
Martin Blais2856e5f2006-05-26 12:03:27 +00002504 char *buf;
2505 int buflen;
2506
2507 PyObject *addr = NULL;
Martin Blais2856e5f2006-05-26 12:03:27 +00002508
Martin Blaisaf2ae722006-06-04 13:49:49 +00002509 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w#|ii:recvfrom", kwlist,
Martin Blais2856e5f2006-05-26 12:03:27 +00002510 &buf, &buflen, &recvlen, &flags))
2511 return NULL;
2512 assert(buf != 0 && buflen > 0);
2513
2514 if (recvlen < 0) {
2515 PyErr_SetString(PyExc_ValueError,
2516 "negative buffersize in recv");
2517 return NULL;
2518 }
2519 if (recvlen == 0) {
2520 /* If nbytes was not specified, use the buffer's length */
2521 recvlen = buflen;
2522 }
2523
2524 readlen = sock_recvfrom_guts(s, buf, recvlen, flags, &addr);
2525 if (readlen < 0) {
2526 /* Return an error */
Martin Blaisaf2ae722006-06-04 13:49:49 +00002527 Py_XDECREF(addr);
2528 return NULL;
Martin Blais2856e5f2006-05-26 12:03:27 +00002529 }
2530
2531 /* Return the number of bytes read and the address. Note that we do
2532 not do anything special here in the case that readlen < recvlen. */
Neal Norwitzf0cab1f2006-06-08 05:12:45 +00002533 return Py_BuildValue("lN", readlen, addr);
Martin Blais2856e5f2006-05-26 12:03:27 +00002534}
2535
Martin Blaisaf2ae722006-06-04 13:49:49 +00002536PyDoc_STRVAR(recvfrom_into_doc,
2537"recvfrom_into(buffer[, nbytes[, flags]]) -> (nbytes, address info)\n\
Martin Blais2856e5f2006-05-26 12:03:27 +00002538\n\
Martin Blaisaf2ae722006-06-04 13:49:49 +00002539Like recv_into(buffer[, nbytes[, flags]]) but also return the sender's address info.");
Martin Blais2856e5f2006-05-26 12:03:27 +00002540
2541
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002542/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002543
Guido van Rossum73624e91994-10-10 17:59:00 +00002544static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002545sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002546{
Guido van Rossumff4949e1992-08-05 19:58:53 +00002547 char *buf;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002548 int len, n = 0, flags = 0, timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002549
Guido van Rossum43713e52000-02-29 13:59:29 +00002550 if (!PyArg_ParseTuple(args, "s#|i:send", &buf, &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00002551 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002552
Neal Norwitz082b2df2006-02-07 07:04:46 +00002553 if (!IS_SELECTABLE(s))
2554 return select_error();
2555
Guido van Rossum73624e91994-10-10 17:59:00 +00002556 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002557 timeout = internal_select(s, 1);
2558 if (!timeout)
Neal Norwitz2a30cd02006-07-10 01:18:57 +00002559#ifdef __VMS
2560 n = sendsegmented(s->sock_fd, buf, len, flags);
2561#else
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002562 n = send(s->sock_fd, buf, len, flags);
Neal Norwitz2a30cd02006-07-10 01:18:57 +00002563#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00002564 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002565
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002566 if (timeout) {
2567 PyErr_SetString(socket_timeout, "timed out");
2568 return NULL;
2569 }
Guido van Rossum30a685f1991-06-27 15:51:29 +00002570 if (n < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002571 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00002572 return PyInt_FromLong((long)n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00002573}
2574
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002575PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002576"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002577\n\
2578Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002579argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002580sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002581
2582
2583/* s.sendall(data [,flags]) method */
2584
2585static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002586sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002587{
2588 char *buf;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002589 int len, n = 0, flags = 0, timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002590
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002591 if (!PyArg_ParseTuple(args, "s#|i:sendall", &buf, &len, &flags))
2592 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002593
Neal Norwitz082b2df2006-02-07 07:04:46 +00002594 if (!IS_SELECTABLE(s))
2595 return select_error();
2596
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002597 Py_BEGIN_ALLOW_THREADS
2598 do {
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002599 timeout = internal_select(s, 1);
2600 if (timeout)
2601 break;
Neal Norwitz2a30cd02006-07-10 01:18:57 +00002602#ifdef __VMS
2603 n = sendsegmented(s->sock_fd, buf, len, flags);
2604#else
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002605 n = send(s->sock_fd, buf, len, flags);
Neal Norwitz2a30cd02006-07-10 01:18:57 +00002606#endif
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002607 if (n < 0)
2608 break;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002609 buf += n;
2610 len -= n;
2611 } while (len > 0);
2612 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002613
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002614 if (timeout) {
2615 PyErr_SetString(socket_timeout, "timed out");
2616 return NULL;
2617 }
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002618 if (n < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002619 return s->errorhandler();
Guido van Rossum67f7a382002-06-06 21:08:16 +00002620
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002621 Py_INCREF(Py_None);
2622 return Py_None;
2623}
2624
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002625PyDoc_STRVAR(sendall_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002626"sendall(data[, flags])\n\
2627\n\
2628Send a data string to the socket. For the optional flags\n\
2629argument, see the Unix manual. This calls send() repeatedly\n\
2630until all data is sent. If an error occurs, it's impossible\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002631to tell how much data has been sent.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002632
Guido van Rossum30a685f1991-06-27 15:51:29 +00002633
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002634/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002635
Guido van Rossum73624e91994-10-10 17:59:00 +00002636static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002637sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002638{
Guido van Rossum73624e91994-10-10 17:59:00 +00002639 PyObject *addro;
Guido van Rossumff4949e1992-08-05 19:58:53 +00002640 char *buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002641 struct sockaddr *addr;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002642 int addrlen, len, n = 0, flags, timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002643
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002644 flags = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002645 if (!PyArg_ParseTuple(args, "s#O:sendto", &buf, &len, &addro)) {
Guido van Rossum73624e91994-10-10 17:59:00 +00002646 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002647 if (!PyArg_ParseTuple(args, "s#iO:sendto",
2648 &buf, &len, &flags, &addro))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002649 return NULL;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002650 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002651
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002652 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002653 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002654
Neal Norwitz082b2df2006-02-07 07:04:46 +00002655 if (!IS_SELECTABLE(s))
2656 return select_error();
2657
Guido van Rossum73624e91994-10-10 17:59:00 +00002658 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002659 timeout = internal_select(s, 1);
2660 if (!timeout)
2661 n = sendto(s->sock_fd, buf, len, flags, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00002662 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002663
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002664 if (timeout) {
2665 PyErr_SetString(socket_timeout, "timed out");
2666 return NULL;
2667 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002668 if (n < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002669 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00002670 return PyInt_FromLong((long)n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002671}
2672
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002673PyDoc_STRVAR(sendto_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002674"sendto(data[, flags], address) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002675\n\
2676Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002677For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002678
Guido van Rossum30a685f1991-06-27 15:51:29 +00002679
2680/* s.shutdown(how) method */
2681
Guido van Rossum73624e91994-10-10 17:59:00 +00002682static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002683sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002684{
2685 int how;
Guido van Rossumff4949e1992-08-05 19:58:53 +00002686 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002687
2688 how = PyInt_AsLong(arg);
2689 if (how == -1 && PyErr_Occurred())
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002690 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00002691 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002692 res = shutdown(s->sock_fd, how);
Guido van Rossum73624e91994-10-10 17:59:00 +00002693 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002694 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002695 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00002696 Py_INCREF(Py_None);
2697 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002698}
2699
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002700PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002701"shutdown(flag)\n\
2702\n\
Martin v. Löwis94681fc2003-11-27 19:40:22 +00002703Shut down the reading side of the socket (flag == SHUT_RD), the writing side\n\
2704of the socket (flag == SHUT_WR), or both ends (flag == SHUT_RDWR).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002705
Guido van Rossum30a685f1991-06-27 15:51:29 +00002706
2707/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002708
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002709static PyMethodDef sock_methods[] = {
Martin Blais2856e5f2006-05-26 12:03:27 +00002710 {"accept", (PyCFunction)sock_accept, METH_NOARGS,
2711 accept_doc},
2712 {"bind", (PyCFunction)sock_bind, METH_O,
2713 bind_doc},
2714 {"close", (PyCFunction)sock_close, METH_NOARGS,
2715 close_doc},
2716 {"connect", (PyCFunction)sock_connect, METH_O,
2717 connect_doc},
2718 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
2719 connect_ex_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00002720#ifndef NO_DUP
Martin Blais2856e5f2006-05-26 12:03:27 +00002721 {"dup", (PyCFunction)sock_dup, METH_NOARGS,
2722 dup_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00002723#endif
Martin Blais2856e5f2006-05-26 12:03:27 +00002724 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
2725 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00002726#ifdef HAVE_GETPEERNAME
Martin Blais2856e5f2006-05-26 12:03:27 +00002727 {"getpeername", (PyCFunction)sock_getpeername,
2728 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00002729#endif
Martin Blais2856e5f2006-05-26 12:03:27 +00002730 {"getsockname", (PyCFunction)sock_getsockname,
2731 METH_NOARGS, getsockname_doc},
2732 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
2733 getsockopt_doc},
2734 {"listen", (PyCFunction)sock_listen, METH_O,
2735 listen_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002736#ifndef NO_DUP
Martin Blais2856e5f2006-05-26 12:03:27 +00002737 {"makefile", (PyCFunction)sock_makefile, METH_VARARGS,
2738 makefile_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002739#endif
Martin Blais2856e5f2006-05-26 12:03:27 +00002740 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
2741 recv_doc},
Martin Blaisaf2ae722006-06-04 13:49:49 +00002742 {"recv_into", (PyCFunction)sock_recv_into, METH_VARARGS | METH_KEYWORDS,
2743 recv_into_doc},
Martin Blais2856e5f2006-05-26 12:03:27 +00002744 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
2745 recvfrom_doc},
Martin Blaisaf2ae722006-06-04 13:49:49 +00002746 {"recvfrom_into", (PyCFunction)sock_recvfrom_into, METH_VARARGS | METH_KEYWORDS,
2747 recvfrom_into_doc},
Martin Blais2856e5f2006-05-26 12:03:27 +00002748 {"send", (PyCFunction)sock_send, METH_VARARGS,
2749 send_doc},
2750 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
2751 sendall_doc},
2752 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
2753 sendto_doc},
2754 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
2755 setblocking_doc},
2756 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
2757 settimeout_doc},
2758 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
2759 gettimeout_doc},
2760 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
2761 setsockopt_doc},
2762 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
2763 shutdown_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002764#ifdef RISCOS
Martin Blais2856e5f2006-05-26 12:03:27 +00002765 {"sleeptaskw", (PyCFunction)sock_sleeptaskw, METH_O,
2766 sleeptaskw_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002767#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +00002768 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002769};
2770
Georg Brandlbc45a3f2006-03-17 19:17:34 +00002771/* SockObject members */
2772static PyMemberDef sock_memberlist[] = {
2773 {"family", T_INT, offsetof(PySocketSockObject, sock_family), READONLY, "the socket family"},
2774 {"type", T_INT, offsetof(PySocketSockObject, sock_type), READONLY, "the socket type"},
2775 {"proto", T_INT, offsetof(PySocketSockObject, sock_proto), READONLY, "the socket protocol"},
2776 {"timeout", T_DOUBLE, offsetof(PySocketSockObject, sock_timeout), READONLY, "the socket timeout"},
2777 {0},
2778};
Guido van Rossum30a685f1991-06-27 15:51:29 +00002779
Guido van Rossum73624e91994-10-10 17:59:00 +00002780/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00002781 First close the file description. */
2782
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002783static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002784sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002785{
Guido van Rossumfa972c92000-04-10 12:45:45 +00002786 if (s->sock_fd != -1)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00002787 (void) SOCKETCLOSE(s->sock_fd);
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002788 s->ob_type->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002789}
2790
Guido van Rossum30a685f1991-06-27 15:51:29 +00002791
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002792static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002793sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002794{
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002795 char buf[512];
Fred Drakea04eaad2000-06-30 02:46:07 +00002796#if SIZEOF_SOCKET_T > SIZEOF_LONG
2797 if (s->sock_fd > LONG_MAX) {
2798 /* this can occur on Win64, and actually there is a special
2799 ugly printf formatter for decimal pointer length integer
2800 printing, only bother if necessary*/
2801 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002802 "no printf formatter to display "
2803 "the socket descriptor in decimal");
Fred Drakea04eaad2000-06-30 02:46:07 +00002804 return NULL;
2805 }
2806#endif
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002807 PyOS_snprintf(
2808 buf, sizeof(buf),
2809 "<socket object, fd=%ld, family=%d, type=%d, protocol=%d>",
2810 (long)s->sock_fd, s->sock_family,
2811 s->sock_type,
2812 s->sock_proto);
Guido van Rossumdc1c64a1996-02-27 15:21:19 +00002813 return PyString_FromString(buf);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002814}
2815
2816
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002817/* Create a new, uninitialized socket object. */
2818
2819static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002820sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002821{
2822 PyObject *new;
2823
2824 new = type->tp_alloc(type, 0);
Guido van Rossume1c478f2002-06-06 20:08:25 +00002825 if (new != NULL) {
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002826 ((PySocketSockObject *)new)->sock_fd = -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002827 ((PySocketSockObject *)new)->sock_timeout = -1.0;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002828 ((PySocketSockObject *)new)->errorhandler = &set_error;
Guido van Rossume1c478f2002-06-06 20:08:25 +00002829 }
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002830 return new;
2831}
2832
2833
2834/* Initialize a new socket object. */
2835
2836/*ARGSUSED*/
2837static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00002838sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002839{
2840 PySocketSockObject *s = (PySocketSockObject *)self;
2841 SOCKET_T fd;
2842 int family = AF_INET, type = SOCK_STREAM, proto = 0;
Martin v. Löwis02cbf4a2006-02-27 17:20:04 +00002843 static char *keywords[] = {"family", "type", "proto", 0};
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002844
2845 if (!PyArg_ParseTupleAndKeywords(args, kwds,
2846 "|iii:socket", keywords,
2847 &family, &type, &proto))
2848 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002849
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002850 Py_BEGIN_ALLOW_THREADS
2851 fd = socket(family, type, proto);
2852 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002853
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002854#ifdef MS_WINDOWS
2855 if (fd == INVALID_SOCKET)
2856#else
2857 if (fd < 0)
2858#endif
2859 {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002860 set_error();
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002861 return -1;
2862 }
2863 init_sockobject(s, fd, family, type, proto);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002864
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002865 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002866
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002867}
2868
2869
Guido van Rossumb6775db1994-08-01 11:34:53 +00002870/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002871
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002872static PyTypeObject sock_type = {
Guido van Rossum55558541996-05-23 22:54:50 +00002873 PyObject_HEAD_INIT(0) /* Must fill in type value later */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002874 0, /* ob_size */
Guido van Rossumca6dfa52001-10-28 12:31:33 +00002875 "_socket.socket", /* tp_name */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002876 sizeof(PySocketSockObject), /* tp_basicsize */
2877 0, /* tp_itemsize */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002878 (destructor)sock_dealloc, /* tp_dealloc */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002879 0, /* tp_print */
2880 0, /* tp_getattr */
2881 0, /* tp_setattr */
2882 0, /* tp_compare */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002883 (reprfunc)sock_repr, /* tp_repr */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002884 0, /* tp_as_number */
2885 0, /* tp_as_sequence */
2886 0, /* tp_as_mapping */
2887 0, /* tp_hash */
2888 0, /* tp_call */
2889 0, /* tp_str */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002890 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002891 0, /* tp_setattro */
2892 0, /* tp_as_buffer */
2893 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002894 sock_doc, /* tp_doc */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002895 0, /* tp_traverse */
2896 0, /* tp_clear */
2897 0, /* tp_richcompare */
2898 0, /* tp_weaklistoffset */
2899 0, /* tp_iter */
2900 0, /* tp_iternext */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002901 sock_methods, /* tp_methods */
Georg Brandlbc45a3f2006-03-17 19:17:34 +00002902 sock_memberlist, /* tp_members */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002903 0, /* tp_getset */
2904 0, /* tp_base */
2905 0, /* tp_dict */
2906 0, /* tp_descr_get */
2907 0, /* tp_descr_set */
2908 0, /* tp_dictoffset */
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00002909 sock_initobj, /* tp_init */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002910 PyType_GenericAlloc, /* tp_alloc */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002911 sock_new, /* tp_new */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002912 PyObject_Del, /* tp_free */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002913};
2914
Guido van Rossum30a685f1991-06-27 15:51:29 +00002915
Guido van Rossum81194471991-07-27 21:42:02 +00002916/* Python interface to gethostname(). */
2917
2918/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002919static PyObject *
Georg Brandl96a8c392006-05-29 21:04:52 +00002920socket_gethostname(PyObject *self, PyObject *unused)
Guido van Rossum81194471991-07-27 21:42:02 +00002921{
2922 char buf[1024];
Guido van Rossumff4949e1992-08-05 19:58:53 +00002923 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +00002924 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002925 res = gethostname(buf, (int) sizeof buf - 1);
Guido van Rossum73624e91994-10-10 17:59:00 +00002926 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002927 if (res < 0)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002928 return set_error();
Guido van Rossum81194471991-07-27 21:42:02 +00002929 buf[sizeof buf - 1] = '\0';
Guido van Rossum73624e91994-10-10 17:59:00 +00002930 return PyString_FromString(buf);
Guido van Rossum81194471991-07-27 21:42:02 +00002931}
Guido van Rossumff4949e1992-08-05 19:58:53 +00002932
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002933PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002934"gethostname() -> string\n\
2935\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002936Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002937
Guido van Rossumff4949e1992-08-05 19:58:53 +00002938
Guido van Rossum30a685f1991-06-27 15:51:29 +00002939/* Python interface to gethostbyname(name). */
2940
2941/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002942static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002943socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002944{
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002945 char *name;
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00002946 sock_addr_t addrbuf;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002947
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002948 if (!PyArg_ParseTuple(args, "s:gethostbyname", &name))
Guido van Rossum30a685f1991-06-27 15:51:29 +00002949 return NULL;
Martin v. Löwisddc6f472002-07-28 16:10:31 +00002950 if (setipaddr(name, (struct sockaddr *)&addrbuf, sizeof(addrbuf), AF_INET) < 0)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002951 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002952 return makeipaddr((struct sockaddr *)&addrbuf,
2953 sizeof(struct sockaddr_in));
Guido van Rossum30a685f1991-06-27 15:51:29 +00002954}
2955
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002956PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002957"gethostbyname(host) -> address\n\
2958\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002959Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002960
2961
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002962/* Convenience function common to gethostbyname_ex and gethostbyaddr */
2963
2964static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002965gethost_common(struct hostent *h, struct sockaddr *addr, int alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002966{
2967 char **pch;
2968 PyObject *rtn_tuple = (PyObject *)NULL;
2969 PyObject *name_list = (PyObject *)NULL;
2970 PyObject *addr_list = (PyObject *)NULL;
2971 PyObject *tmp;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002972
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002973 if (h == NULL) {
Guido van Rossum48a680c2001-03-02 06:34:14 +00002974 /* Let's get real error message to return */
Guido van Rossume2ae77b2001-10-24 20:42:55 +00002975#ifndef RISCOS
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002976 set_herror(h_errno);
Guido van Rossume2ae77b2001-10-24 20:42:55 +00002977#else
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002978 PyErr_SetString(socket_error, "host not found");
Guido van Rossume2ae77b2001-10-24 20:42:55 +00002979#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002980 return NULL;
2981 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002982
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002983 if (h->h_addrtype != af) {
2984#ifdef HAVE_STRERROR
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002985 /* Let's get real error message to return */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002986 PyErr_SetString(socket_error,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002987 (char *)strerror(EAFNOSUPPORT));
2988#else
2989 PyErr_SetString(
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002990 socket_error,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002991 "Address family not supported by protocol family");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002992#endif
2993 return NULL;
2994 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002995
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002996 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00002997
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002998 case AF_INET:
2999 if (alen < sizeof(struct sockaddr_in))
3000 return NULL;
3001 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003002
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00003003#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003004 case AF_INET6:
3005 if (alen < sizeof(struct sockaddr_in6))
3006 return NULL;
3007 break;
3008#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00003009
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003010 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003011
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003012 if ((name_list = PyList_New(0)) == NULL)
3013 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003014
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003015 if ((addr_list = PyList_New(0)) == NULL)
3016 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003017
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003018 for (pch = h->h_aliases; *pch != NULL; pch++) {
3019 int status;
3020 tmp = PyString_FromString(*pch);
3021 if (tmp == NULL)
3022 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003023
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003024 status = PyList_Append(name_list, tmp);
3025 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003026
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003027 if (status)
3028 goto err;
3029 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003030
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003031 for (pch = h->h_addr_list; *pch != NULL; pch++) {
3032 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003033
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003034 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00003035
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003036 case AF_INET:
3037 {
3038 struct sockaddr_in sin;
3039 memset(&sin, 0, sizeof(sin));
3040 sin.sin_family = af;
3041#ifdef HAVE_SOCKADDR_SA_LEN
3042 sin.sin_len = sizeof(sin);
3043#endif
3044 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
3045 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
Guido van Rossum67f7a382002-06-06 21:08:16 +00003046
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003047 if (pch == h->h_addr_list && alen >= sizeof(sin))
3048 memcpy((char *) addr, &sin, sizeof(sin));
3049 break;
3050 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003051
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00003052#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003053 case AF_INET6:
3054 {
3055 struct sockaddr_in6 sin6;
3056 memset(&sin6, 0, sizeof(sin6));
3057 sin6.sin6_family = af;
3058#ifdef HAVE_SOCKADDR_SA_LEN
3059 sin6.sin6_len = sizeof(sin6);
3060#endif
3061 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
3062 tmp = makeipaddr((struct sockaddr *)&sin6,
3063 sizeof(sin6));
Guido van Rossum67f7a382002-06-06 21:08:16 +00003064
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003065 if (pch == h->h_addr_list && alen >= sizeof(sin6))
3066 memcpy((char *) addr, &sin6, sizeof(sin6));
3067 break;
3068 }
3069#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00003070
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003071 default: /* can't happen */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003072 PyErr_SetString(socket_error,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003073 "unsupported address family");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003074 return NULL;
3075 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003076
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003077 if (tmp == NULL)
3078 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003079
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003080 status = PyList_Append(addr_list, tmp);
3081 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003082
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003083 if (status)
3084 goto err;
3085 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003086
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003087 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003088
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003089 err:
3090 Py_XDECREF(name_list);
3091 Py_XDECREF(addr_list);
3092 return rtn_tuple;
3093}
3094
3095
3096/* Python interface to gethostbyname_ex(name). */
3097
3098/*ARGSUSED*/
3099static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003100socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003101{
3102 char *name;
3103 struct hostent *h;
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00003104#ifdef ENABLE_IPV6
3105 struct sockaddr_storage addr;
3106#else
3107 struct sockaddr_in addr;
3108#endif
Martin v. Löwis9db2f572001-07-23 01:30:10 +00003109 struct sockaddr *sa;
Guido van Rossum955becc1999-03-22 20:14:53 +00003110 PyObject *ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003111#ifdef HAVE_GETHOSTBYNAME_R
3112 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003113#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
3114 struct hostent_data data;
3115#else
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003116 char buf[16384];
3117 int buf_len = (sizeof buf) - 1;
3118 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003119#endif
3120#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00003121 int result;
3122#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003123#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003124
Guido van Rossum27fc3c02000-03-24 20:56:56 +00003125 if (!PyArg_ParseTuple(args, "s:gethostbyname_ex", &name))
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003126 return NULL;
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00003127 if (setipaddr(name, (struct sockaddr *)&addr, sizeof(addr), AF_INET) < 0)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003128 return NULL;
3129 Py_BEGIN_ALLOW_THREADS
3130#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003131#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003132 result = gethostbyname_r(name, &hp_allocated, buf, buf_len,
3133 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003134#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003135 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003136#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00003137 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003138 result = gethostbyname_r(name, &hp_allocated, &data);
3139 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00003140#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003141#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00003142#ifdef USE_GETHOSTBYNAME_LOCK
Just van Rossum1040d2c2003-05-09 07:53:18 +00003143 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003144#endif
3145 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003146#endif /* HAVE_GETHOSTBYNAME_R */
3147 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00003148 /* Some C libraries would require addr.__ss_family instead of
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003149 addr.ss_family.
3150 Therefore, we cast the sockaddr_storage into sockaddr to
3151 access sa_family. */
Martin v. Löwis9db2f572001-07-23 01:30:10 +00003152 sa = (struct sockaddr*)&addr;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003153 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr),
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003154 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00003155#ifdef USE_GETHOSTBYNAME_LOCK
Just van Rossum1040d2c2003-05-09 07:53:18 +00003156 PyThread_release_lock(netdb_lock);
Guido van Rossum955becc1999-03-22 20:14:53 +00003157#endif
3158 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003159}
3160
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003161PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003162"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
3163\n\
3164Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003165for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003166
3167
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003168/* Python interface to gethostbyaddr(IP). */
3169
3170/*ARGSUSED*/
3171static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003172socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003173{
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00003174#ifdef ENABLE_IPV6
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003175 struct sockaddr_storage addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003176#else
Guido van Rossum48a680c2001-03-02 06:34:14 +00003177 struct sockaddr_in addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003178#endif
3179 struct sockaddr *sa = (struct sockaddr *)&addr;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003180 char *ip_num;
3181 struct hostent *h;
Guido van Rossum3baaa131999-03-22 21:44:51 +00003182 PyObject *ret;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003183#ifdef HAVE_GETHOSTBYNAME_R
3184 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003185#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
3186 struct hostent_data data;
3187#else
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003188 char buf[16384];
3189 int buf_len = (sizeof buf) - 1;
3190 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003191#endif
3192#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00003193 int result;
3194#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003195#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003196 char *ap;
3197 int al;
3198 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003199
Guido van Rossum27fc3c02000-03-24 20:56:56 +00003200 if (!PyArg_ParseTuple(args, "s:gethostbyaddr", &ip_num))
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003201 return NULL;
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00003202 af = AF_UNSPEC;
Martin v. Löwisddc6f472002-07-28 16:10:31 +00003203 if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003204 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003205 af = sa->sa_family;
3206 ap = NULL;
3207 al = 0;
3208 switch (af) {
3209 case AF_INET:
3210 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
3211 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
3212 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00003213#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003214 case AF_INET6:
3215 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
3216 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
3217 break;
3218#endif
3219 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003220 PyErr_SetString(socket_error, "unsupported address family");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003221 return NULL;
3222 }
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003223 Py_BEGIN_ALLOW_THREADS
3224#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003225#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003226 result = gethostbyaddr_r(ap, al, af,
3227 &hp_allocated, buf, buf_len,
Guido van Rossume9cd07b1999-03-15 21:40:14 +00003228 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003229#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003230 h = gethostbyaddr_r(ap, al, af,
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003231 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003232#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00003233 memset((void *) &data, '\0', sizeof(data));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003234 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003235 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00003236#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003237#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00003238#ifdef USE_GETHOSTBYNAME_LOCK
Just van Rossum1040d2c2003-05-09 07:53:18 +00003239 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003240#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003241 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003242#endif /* HAVE_GETHOSTBYNAME_R */
3243 Py_END_ALLOW_THREADS
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003244 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00003245#ifdef USE_GETHOSTBYNAME_LOCK
Just van Rossum1040d2c2003-05-09 07:53:18 +00003246 PyThread_release_lock(netdb_lock);
Guido van Rossum3baaa131999-03-22 21:44:51 +00003247#endif
3248 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003249}
3250
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003251PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003252"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
3253\n\
3254Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003255for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003256
Guido van Rossum30a685f1991-06-27 15:51:29 +00003257
3258/* Python interface to getservbyname(name).
3259 This only returns the port number, since the other info is already
3260 known or not useful (like the list of aliases). */
3261
3262/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00003263static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003264socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003265{
Barry Warsaw11b91a02004-06-28 00:50:43 +00003266 char *name, *proto=NULL;
Guido van Rossum30a685f1991-06-27 15:51:29 +00003267 struct servent *sp;
Barry Warsaw11b91a02004-06-28 00:50:43 +00003268 if (!PyArg_ParseTuple(args, "s|s:getservbyname", &name, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +00003269 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00003270 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00003271 sp = getservbyname(name, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00003272 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00003273 if (sp == NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003274 PyErr_SetString(socket_error, "service/proto not found");
Guido van Rossum30a685f1991-06-27 15:51:29 +00003275 return NULL;
3276 }
Guido van Rossum73624e91994-10-10 17:59:00 +00003277 return PyInt_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00003278}
3279
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003280PyDoc_STRVAR(getservbyname_doc,
Barry Warsaw11b91a02004-06-28 00:50:43 +00003281"getservbyname(servicename[, protocolname]) -> integer\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003282\n\
3283Return a port number from a service name and protocol name.\n\
Barry Warsaw11b91a02004-06-28 00:50:43 +00003284The optional protocol name, if given, should be 'tcp' or 'udp',\n\
3285otherwise any protocol will match.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003286
Guido van Rossum30a685f1991-06-27 15:51:29 +00003287
Barry Warsaw11b91a02004-06-28 00:50:43 +00003288/* Python interface to getservbyport(port).
3289 This only returns the service name, since the other info is already
3290 known or not useful (like the list of aliases). */
3291
3292/*ARGSUSED*/
3293static PyObject *
3294socket_getservbyport(PyObject *self, PyObject *args)
3295{
Raymond Hettinger87de0ca2004-09-28 02:19:40 +00003296 unsigned short port;
Barry Warsaw11b91a02004-06-28 00:50:43 +00003297 char *proto=NULL;
3298 struct servent *sp;
Raymond Hettinger87de0ca2004-09-28 02:19:40 +00003299 if (!PyArg_ParseTuple(args, "H|s:getservbyport", &port, &proto))
Barry Warsaw11b91a02004-06-28 00:50:43 +00003300 return NULL;
3301 Py_BEGIN_ALLOW_THREADS
3302 sp = getservbyport(htons(port), proto);
3303 Py_END_ALLOW_THREADS
3304 if (sp == NULL) {
3305 PyErr_SetString(socket_error, "port/proto not found");
3306 return NULL;
3307 }
3308 return PyString_FromString(sp->s_name);
3309}
3310
3311PyDoc_STRVAR(getservbyport_doc,
3312"getservbyport(port[, protocolname]) -> string\n\
3313\n\
3314Return the service name from a port number and protocol name.\n\
3315The optional protocol name, if given, should be 'tcp' or 'udp',\n\
3316otherwise any protocol will match.");
3317
Guido van Rossum3901d851996-12-19 16:35:04 +00003318/* Python interface to getprotobyname(name).
3319 This only returns the protocol number, since the other info is
3320 already known or not useful (like the list of aliases). */
3321
3322/*ARGSUSED*/
3323static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003324socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00003325{
3326 char *name;
3327 struct protoent *sp;
Guido van Rossumbcc20741998-08-04 22:53:56 +00003328#ifdef __BEOS__
3329/* Not available in BeOS yet. - [cjh] */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003330 PyErr_SetString(socket_error, "getprotobyname not supported");
Guido van Rossumbcc20741998-08-04 22:53:56 +00003331 return NULL;
3332#else
Guido van Rossum27fc3c02000-03-24 20:56:56 +00003333 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
Guido van Rossum3901d851996-12-19 16:35:04 +00003334 return NULL;
3335 Py_BEGIN_ALLOW_THREADS
3336 sp = getprotobyname(name);
3337 Py_END_ALLOW_THREADS
3338 if (sp == NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003339 PyErr_SetString(socket_error, "protocol not found");
Guido van Rossum3901d851996-12-19 16:35:04 +00003340 return NULL;
3341 }
3342 return PyInt_FromLong((long) sp->p_proto);
Guido van Rossumbcc20741998-08-04 22:53:56 +00003343#endif
Guido van Rossum3901d851996-12-19 16:35:04 +00003344}
3345
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003346PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003347"getprotobyname(name) -> integer\n\
3348\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003349Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003350
Guido van Rossum3901d851996-12-19 16:35:04 +00003351
Dave Cole331708b2004-08-09 04:51:41 +00003352#ifdef HAVE_SOCKETPAIR
3353/* Create a pair of sockets using the socketpair() function.
Dave Cole07fda7e2004-08-23 05:16:23 +00003354 Arguments as for socket() except the default family is AF_UNIX if
Dave Colee8bbfe42004-08-26 00:51:16 +00003355 defined on the platform; otherwise, the default is AF_INET. */
Dave Cole331708b2004-08-09 04:51:41 +00003356
3357/*ARGSUSED*/
3358static PyObject *
3359socket_socketpair(PyObject *self, PyObject *args)
3360{
3361 PySocketSockObject *s0 = NULL, *s1 = NULL;
3362 SOCKET_T sv[2];
3363 int family, type = SOCK_STREAM, proto = 0;
3364 PyObject *res = NULL;
3365
3366#if defined(AF_UNIX)
3367 family = AF_UNIX;
3368#else
3369 family = AF_INET;
3370#endif
3371 if (!PyArg_ParseTuple(args, "|iii:socketpair",
3372 &family, &type, &proto))
3373 return NULL;
3374 /* Create a pair of socket fds */
3375 if (socketpair(family, type, proto, sv) < 0)
3376 return set_error();
Dave Cole331708b2004-08-09 04:51:41 +00003377 s0 = new_sockobject(sv[0], family, type, proto);
3378 if (s0 == NULL)
3379 goto finally;
3380 s1 = new_sockobject(sv[1], family, type, proto);
3381 if (s1 == NULL)
3382 goto finally;
3383 res = PyTuple_Pack(2, s0, s1);
3384
3385finally:
3386 if (res == NULL) {
3387 if (s0 == NULL)
3388 SOCKETCLOSE(sv[0]);
3389 if (s1 == NULL)
3390 SOCKETCLOSE(sv[1]);
3391 }
3392 Py_XDECREF(s0);
3393 Py_XDECREF(s1);
3394 return res;
3395}
3396
3397PyDoc_STRVAR(socketpair_doc,
3398"socketpair([family[, type[, proto]]]) -> (socket object, socket object)\n\
3399\n\
3400Create a pair of socket objects from the sockets returned by the platform\n\
3401socketpair() function.\n\
Dave Cole07fda7e2004-08-23 05:16:23 +00003402The arguments are the same as for socket() except the default family is\n\
Dave Colee8bbfe42004-08-26 00:51:16 +00003403AF_UNIX if defined on the platform; otherwise, the default is AF_INET.");
Dave Cole331708b2004-08-09 04:51:41 +00003404
3405#endif /* HAVE_SOCKETPAIR */
3406
3407
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00003408#ifndef NO_DUP
Guido van Rossum2a7178e1992-12-08 13:38:24 +00003409/* Create a socket object from a numeric file description.
3410 Useful e.g. if stdin is a socket.
3411 Additional arguments as for socket(). */
3412
3413/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00003414static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003415socket_fromfd(PyObject *self, PyObject *args)
Guido van Rossum2a7178e1992-12-08 13:38:24 +00003416{
Guido van Rossum73624e91994-10-10 17:59:00 +00003417 PySocketSockObject *s;
Fred Drakea04eaad2000-06-30 02:46:07 +00003418 SOCKET_T fd;
3419 int family, type, proto = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00003420 if (!PyArg_ParseTuple(args, "iii|i:fromfd",
3421 &fd, &family, &type, &proto))
Guido van Rossumbe32c891996-06-20 16:25:29 +00003422 return NULL;
Guido van Rossum5f59d601992-12-14 16:59:51 +00003423 /* Dup the fd so it and the socket can be closed independently */
3424 fd = dup(fd);
3425 if (fd < 0)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003426 return set_error();
3427 s = new_sockobject(fd, family, type, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00003428 return (PyObject *) s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00003429}
Guido van Rossum82a5c661998-07-07 20:45:43 +00003430
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003431PyDoc_STRVAR(fromfd_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003432"fromfd(fd, family, type[, proto]) -> socket object\n\
3433\n\
Georg Brandldcfdae72006-04-01 07:33:08 +00003434Create a socket object from a duplicate of the given\n\
3435file descriptor.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003436The remaining arguments are the same as for socket().");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003437
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00003438#endif /* NO_DUP */
Guido van Rossum2a7178e1992-12-08 13:38:24 +00003439
Guido van Rossum82a5c661998-07-07 20:45:43 +00003440
Guido van Rossum006bf911996-06-12 04:04:55 +00003441static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003442socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00003443{
3444 int x1, x2;
3445
Guido van Rossum27fc3c02000-03-24 20:56:56 +00003446 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00003447 return NULL;
3448 }
3449 x2 = (int)ntohs((short)x1);
3450 return PyInt_FromLong(x2);
3451}
3452
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003453PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003454"ntohs(integer) -> integer\n\
3455\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003456Convert a 16-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003457
3458
Guido van Rossum006bf911996-06-12 04:04:55 +00003459static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003460socket_ntohl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00003461{
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003462 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00003463
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003464 if (PyInt_Check(arg)) {
3465 x = PyInt_AS_LONG(arg);
Jeremy Hylton825e47b2002-07-25 16:37:51 +00003466 if (x == (unsigned long) -1 && PyErr_Occurred())
3467 return NULL;
Guido van Rossum006bf911996-06-12 04:04:55 +00003468 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003469 else if (PyLong_Check(arg)) {
3470 x = PyLong_AsUnsignedLong(arg);
Jeremy Hylton825e47b2002-07-25 16:37:51 +00003471 if (x == (unsigned long) -1 && PyErr_Occurred())
3472 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003473#if SIZEOF_LONG > 4
3474 {
3475 unsigned long y;
3476 /* only want the trailing 32 bits */
3477 y = x & 0xFFFFFFFFUL;
3478 if (y ^ x)
3479 return PyErr_Format(PyExc_OverflowError,
3480 "long int larger than 32 bits");
3481 x = y;
Tim Peters58141872002-08-06 22:25:02 +00003482 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003483#endif
3484 }
3485 else
Tim Peters58141872002-08-06 22:25:02 +00003486 return PyErr_Format(PyExc_TypeError,
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003487 "expected int/long, %s found",
3488 arg->ob_type->tp_name);
3489 if (x == (unsigned long) -1 && PyErr_Occurred())
3490 return NULL;
3491 return PyInt_FromLong(ntohl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00003492}
3493
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003494PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003495"ntohl(integer) -> integer\n\
3496\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003497Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003498
3499
Guido van Rossum006bf911996-06-12 04:04:55 +00003500static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003501socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00003502{
Hye-Shik Changa7b673f2003-12-17 09:40:23 +00003503 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00003504
Guido van Rossum27fc3c02000-03-24 20:56:56 +00003505 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00003506 return NULL;
3507 }
3508 x2 = (int)htons((short)x1);
3509 return PyInt_FromLong(x2);
3510}
3511
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003512PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003513"htons(integer) -> integer\n\
3514\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003515Convert a 16-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003516
3517
Guido van Rossum006bf911996-06-12 04:04:55 +00003518static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003519socket_htonl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00003520{
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003521 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00003522
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003523 if (PyInt_Check(arg)) {
3524 x = PyInt_AS_LONG(arg);
Jeremy Hylton825e47b2002-07-25 16:37:51 +00003525 if (x == (unsigned long) -1 && PyErr_Occurred())
3526 return NULL;
Guido van Rossum006bf911996-06-12 04:04:55 +00003527 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003528 else if (PyLong_Check(arg)) {
3529 x = PyLong_AsUnsignedLong(arg);
Jeremy Hylton825e47b2002-07-25 16:37:51 +00003530 if (x == (unsigned long) -1 && PyErr_Occurred())
3531 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003532#if SIZEOF_LONG > 4
3533 {
3534 unsigned long y;
3535 /* only want the trailing 32 bits */
3536 y = x & 0xFFFFFFFFUL;
3537 if (y ^ x)
3538 return PyErr_Format(PyExc_OverflowError,
3539 "long int larger than 32 bits");
3540 x = y;
Tim Peters58141872002-08-06 22:25:02 +00003541 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003542#endif
3543 }
3544 else
Tim Peters58141872002-08-06 22:25:02 +00003545 return PyErr_Format(PyExc_TypeError,
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003546 "expected int/long, %s found",
3547 arg->ob_type->tp_name);
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003548 return PyInt_FromLong(htonl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00003549}
3550
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003551PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003552"htonl(integer) -> integer\n\
3553\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003554Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003555
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003556/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003557
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003558PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003559"inet_aton(string) -> packed 32-bit IP representation\n\
3560\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003561Convert 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 +00003562binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003563
3564static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003565socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003566{
Guido van Rossuma2e48551999-09-09 15:42:59 +00003567#ifndef INADDR_NONE
3568#define INADDR_NONE (-1)
3569#endif
Neal Norwitz88f115b2003-02-13 02:15:42 +00003570#ifdef HAVE_INET_ATON
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003571 struct in_addr buf;
Ronald Oussorend06b6f22006-04-23 11:59:25 +00003572#endif
3573
3574#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
Tim Peters1df9fdd2003-02-13 03:13:40 +00003575 /* Have to use inet_addr() instead */
3576 unsigned long packed_addr;
3577#endif
3578 char *ip_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003579
Tim Peters1df9fdd2003-02-13 03:13:40 +00003580 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003581 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003582
Tim Peters1df9fdd2003-02-13 03:13:40 +00003583
3584#ifdef HAVE_INET_ATON
Ronald Oussorend06b6f22006-04-23 11:59:25 +00003585
3586#ifdef USE_INET_ATON_WEAKLINK
3587 if (inet_aton != NULL) {
3588#endif
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003589 if (inet_aton(ip_addr, &buf))
3590 return PyString_FromStringAndSize((char *)(&buf),
3591 sizeof(buf));
3592
3593 PyErr_SetString(socket_error,
3594 "illegal IP address string passed to inet_aton");
3595 return NULL;
3596
Ronald Oussorend06b6f22006-04-23 11:59:25 +00003597#ifdef USE_INET_ATON_WEAKLINK
3598 } else {
3599#endif
3600
3601#endif
3602
3603#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
3604
Georg Brandld2e3ba72005-08-26 08:34:00 +00003605 /* special-case this address as inet_addr might return INADDR_NONE
3606 * for this */
3607 if (strcmp(ip_addr, "255.255.255.255") == 0) {
3608 packed_addr = 0xFFFFFFFF;
3609 } else {
Martin Blais2856e5f2006-05-26 12:03:27 +00003610
Georg Brandld2e3ba72005-08-26 08:34:00 +00003611 packed_addr = inet_addr(ip_addr);
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003612
Georg Brandld2e3ba72005-08-26 08:34:00 +00003613 if (packed_addr == INADDR_NONE) { /* invalid address */
3614 PyErr_SetString(socket_error,
3615 "illegal IP address string passed to inet_aton");
3616 return NULL;
3617 }
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003618 }
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003619 return PyString_FromStringAndSize((char *) &packed_addr,
3620 sizeof(packed_addr));
Ronald Oussorend06b6f22006-04-23 11:59:25 +00003621
3622#ifdef USE_INET_ATON_WEAKLINK
3623 }
3624#endif
3625
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003626#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003627}
3628
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003629PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00003630"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003631\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003632Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003633
3634static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003635socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003636{
3637 char *packed_str;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003638 int addr_len;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003639 struct in_addr packed_addr;
3640
Guido van Rossum27fc3c02000-03-24 20:56:56 +00003641 if (!PyArg_ParseTuple(args, "s#:inet_ntoa", &packed_str, &addr_len)) {
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003642 return NULL;
3643 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00003644
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003645 if (addr_len != sizeof(packed_addr)) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003646 PyErr_SetString(socket_error,
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003647 "packed IP wrong length for inet_ntoa");
3648 return NULL;
3649 }
3650
3651 memcpy(&packed_addr, packed_str, addr_len);
3652
3653 return PyString_FromString(inet_ntoa(packed_addr));
3654}
Guido van Rossum82a5c661998-07-07 20:45:43 +00003655
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003656#ifdef HAVE_INET_PTON
3657
3658PyDoc_STRVAR(inet_pton_doc,
3659"inet_pton(af, ip) -> packed IP address string\n\
3660\n\
3661Convert an IP address from string format to a packed string suitable\n\
3662for use with low-level network functions.");
3663
3664static PyObject *
3665socket_inet_pton(PyObject *self, PyObject *args)
3666{
3667 int af;
3668 char* ip;
3669 int retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003670#ifdef ENABLE_IPV6
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003671 char packed[MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003672#else
3673 char packed[sizeof(struct in_addr)];
3674#endif
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003675 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
3676 return NULL;
3677 }
3678
Martin v. Löwis04697e82004-06-02 12:35:29 +00003679#if !defined(ENABLE_IPV6) && defined(AF_INET6)
Martin v. Löwis10649092003-08-05 06:25:06 +00003680 if(af == AF_INET6) {
3681 PyErr_SetString(socket_error,
3682 "can't use AF_INET6, IPv6 is disabled");
3683 return NULL;
3684 }
Martin Blais2856e5f2006-05-26 12:03:27 +00003685#endif
Martin v. Löwis10649092003-08-05 06:25:06 +00003686
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003687 retval = inet_pton(af, ip, packed);
3688 if (retval < 0) {
3689 PyErr_SetFromErrno(socket_error);
3690 return NULL;
3691 } else if (retval == 0) {
3692 PyErr_SetString(socket_error,
3693 "illegal IP address string passed to inet_pton");
3694 return NULL;
3695 } else if (af == AF_INET) {
3696 return PyString_FromStringAndSize(packed,
3697 sizeof(struct in_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003698#ifdef ENABLE_IPV6
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003699 } else if (af == AF_INET6) {
3700 return PyString_FromStringAndSize(packed,
3701 sizeof(struct in6_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003702#endif
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003703 } else {
3704 PyErr_SetString(socket_error, "unknown address family");
3705 return NULL;
3706 }
3707}
Martin Blais2856e5f2006-05-26 12:03:27 +00003708
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003709PyDoc_STRVAR(inet_ntop_doc,
3710"inet_ntop(af, packed_ip) -> string formatted IP address\n\
3711\n\
3712Convert a packed IP address of the given family to string format.");
3713
3714static PyObject *
3715socket_inet_ntop(PyObject *self, PyObject *args)
3716{
3717 int af;
3718 char* packed;
3719 int len;
3720 const char* retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003721#ifdef ENABLE_IPV6
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003722 char ip[MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003723#else
3724 char ip[INET_ADDRSTRLEN + 1];
3725#endif
Martin Blais2856e5f2006-05-26 12:03:27 +00003726
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003727 /* Guarantee NUL-termination for PyString_FromString() below */
Jeremy Hylton80961f32004-11-07 14:24:25 +00003728 memset((void *) &ip[0], '\0', sizeof(ip));
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003729
3730 if (!PyArg_ParseTuple(args, "is#:inet_ntop", &af, &packed, &len)) {
3731 return NULL;
3732 }
3733
3734 if (af == AF_INET) {
3735 if (len != sizeof(struct in_addr)) {
3736 PyErr_SetString(PyExc_ValueError,
3737 "invalid length of packed IP address string");
3738 return NULL;
3739 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003740#ifdef ENABLE_IPV6
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003741 } else if (af == AF_INET6) {
3742 if (len != sizeof(struct in6_addr)) {
3743 PyErr_SetString(PyExc_ValueError,
3744 "invalid length of packed IP address string");
3745 return NULL;
3746 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003747#endif
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003748 } else {
3749 PyErr_Format(PyExc_ValueError,
3750 "unknown address family %d", af);
3751 return NULL;
3752 }
3753
3754 retval = inet_ntop(af, packed, ip, sizeof(ip));
3755 if (!retval) {
3756 PyErr_SetFromErrno(socket_error);
3757 return NULL;
3758 } else {
3759 return PyString_FromString(retval);
3760 }
3761
3762 /* NOTREACHED */
3763 PyErr_SetString(PyExc_RuntimeError, "invalid handling of inet_ntop");
3764 return NULL;
3765}
3766
3767#endif /* HAVE_INET_PTON */
3768
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003769/* Python interface to getaddrinfo(host, port). */
3770
3771/*ARGSUSED*/
3772static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003773socket_getaddrinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003774{
Martin v. Löwisf0b11d22001-11-07 08:31:03 +00003775 struct addrinfo hints, *res;
3776 struct addrinfo *res0 = NULL;
Martin v. Löwis2548c732003-04-18 10:39:54 +00003777 PyObject *hobj = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003778 PyObject *pobj = (PyObject *)NULL;
Martin v. Löwisf65b1a12001-08-12 09:28:40 +00003779 char pbuf[30];
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003780 char *hptr, *pptr;
3781 int family, socktype, protocol, flags;
3782 int error;
3783 PyObject *all = (PyObject *)NULL;
3784 PyObject *single = (PyObject *)NULL;
Martin v. Löwis2548c732003-04-18 10:39:54 +00003785 PyObject *idna = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003786
3787 family = socktype = protocol = flags = 0;
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00003788 family = AF_UNSPEC;
Martin v. Löwis2548c732003-04-18 10:39:54 +00003789 if (!PyArg_ParseTuple(args, "OO|iiii:getaddrinfo",
3790 &hobj, &pobj, &family, &socktype,
3791 &protocol, &flags)) {
3792 return NULL;
3793 }
3794 if (hobj == Py_None) {
3795 hptr = NULL;
3796 } else if (PyUnicode_Check(hobj)) {
3797 idna = PyObject_CallMethod(hobj, "encode", "s", "idna");
3798 if (!idna)
3799 return NULL;
3800 hptr = PyString_AsString(idna);
3801 } else if (PyString_Check(hobj)) {
3802 hptr = PyString_AsString(hobj);
3803 } else {
Martin Blais2856e5f2006-05-26 12:03:27 +00003804 PyErr_SetString(PyExc_TypeError,
Martin v. Löwis2548c732003-04-18 10:39:54 +00003805 "getaddrinfo() argument 1 must be string or None");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003806 return NULL;
3807 }
3808 if (PyInt_Check(pobj)) {
Marc-André Lemburg03d1b182001-07-31 18:05:33 +00003809 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", PyInt_AsLong(pobj));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003810 pptr = pbuf;
3811 } else if (PyString_Check(pobj)) {
3812 pptr = PyString_AsString(pobj);
3813 } else if (pobj == Py_None) {
3814 pptr = (char *)NULL;
3815 } else {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003816 PyErr_SetString(socket_error, "Int or String expected");
Martin v. Löwis5db099a2003-08-07 11:55:15 +00003817 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003818 }
3819 memset(&hints, 0, sizeof(hints));
3820 hints.ai_family = family;
3821 hints.ai_socktype = socktype;
3822 hints.ai_protocol = protocol;
3823 hints.ai_flags = flags;
Just van Rossum1040d2c2003-05-09 07:53:18 +00003824 Py_BEGIN_ALLOW_THREADS
3825 ACQUIRE_GETADDRINFO_LOCK
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003826 error = getaddrinfo(hptr, pptr, &hints, &res0);
Just van Rossum1040d2c2003-05-09 07:53:18 +00003827 Py_END_ALLOW_THREADS
3828 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003829 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003830 set_gaierror(error);
Martin v. Löwis5db099a2003-08-07 11:55:15 +00003831 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003832 }
3833
3834 if ((all = PyList_New(0)) == NULL)
3835 goto err;
3836 for (res = res0; res; res = res->ai_next) {
Guido van Rossum716aac02001-10-12 18:59:27 +00003837 PyObject *addr =
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00003838 makesockaddr(-1, res->ai_addr, res->ai_addrlen, protocol);
Guido van Rossum716aac02001-10-12 18:59:27 +00003839 if (addr == NULL)
3840 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003841 single = Py_BuildValue("iiisO", res->ai_family,
3842 res->ai_socktype, res->ai_protocol,
3843 res->ai_canonname ? res->ai_canonname : "",
Guido van Rossum716aac02001-10-12 18:59:27 +00003844 addr);
3845 Py_DECREF(addr);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003846 if (single == NULL)
3847 goto err;
3848
3849 if (PyList_Append(all, single))
3850 goto err;
3851 Py_XDECREF(single);
3852 }
Martin v. Löwis2548c732003-04-18 10:39:54 +00003853 Py_XDECREF(idna);
Neal Norwitz90128ba2002-08-09 03:37:42 +00003854 if (res0)
3855 freeaddrinfo(res0);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003856 return all;
3857 err:
3858 Py_XDECREF(single);
3859 Py_XDECREF(all);
Martin v. Löwis2548c732003-04-18 10:39:54 +00003860 Py_XDECREF(idna);
Martin v. Löwisf0b11d22001-11-07 08:31:03 +00003861 if (res0)
3862 freeaddrinfo(res0);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003863 return (PyObject *)NULL;
3864}
3865
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003866PyDoc_STRVAR(getaddrinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003867"getaddrinfo(host, port [, family, socktype, proto, flags])\n\
3868 -> list of (family, socktype, proto, canonname, sockaddr)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003869\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003870Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003871
3872/* Python interface to getnameinfo(sa, flags). */
3873
3874/*ARGSUSED*/
3875static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003876socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003877{
3878 PyObject *sa = (PyObject *)NULL;
3879 int flags;
3880 char *hostp;
Martin v. Löwis06b1d212001-11-02 23:34:52 +00003881 int port, flowinfo, scope_id;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003882 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
3883 struct addrinfo hints, *res = NULL;
3884 int error;
3885 PyObject *ret = (PyObject *)NULL;
3886
3887 flags = flowinfo = scope_id = 0;
Martin v. Löwis06b1d212001-11-02 23:34:52 +00003888 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003889 return NULL;
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003890 if (!PyArg_ParseTuple(sa, "si|ii",
3891 &hostp, &port, &flowinfo, &scope_id))
Martin v. Löwis06b1d212001-11-02 23:34:52 +00003892 return NULL;
Marc-André Lemburg03d1b182001-07-31 18:05:33 +00003893 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003894 memset(&hints, 0, sizeof(hints));
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00003895 hints.ai_family = AF_UNSPEC;
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003896 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Just van Rossum1040d2c2003-05-09 07:53:18 +00003897 Py_BEGIN_ALLOW_THREADS
3898 ACQUIRE_GETADDRINFO_LOCK
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003899 error = getaddrinfo(hostp, pbuf, &hints, &res);
Just van Rossum1040d2c2003-05-09 07:53:18 +00003900 Py_END_ALLOW_THREADS
3901 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003902 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003903 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003904 goto fail;
3905 }
3906 if (res->ai_next) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003907 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003908 "sockaddr resolved to multiple addresses");
3909 goto fail;
3910 }
3911 switch (res->ai_family) {
3912 case AF_INET:
3913 {
3914 char *t1;
3915 int t2;
3916 if (PyArg_ParseTuple(sa, "si", &t1, &t2) == 0) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003917 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003918 "IPv4 sockaddr must be 2 tuple");
3919 goto fail;
3920 }
3921 break;
3922 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00003923#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003924 case AF_INET6:
3925 {
3926 struct sockaddr_in6 *sin6;
3927 sin6 = (struct sockaddr_in6 *)res->ai_addr;
3928 sin6->sin6_flowinfo = flowinfo;
3929 sin6->sin6_scope_id = scope_id;
3930 break;
3931 }
3932#endif
3933 }
3934 error = getnameinfo(res->ai_addr, res->ai_addrlen,
3935 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
3936 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003937 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003938 goto fail;
3939 }
3940 ret = Py_BuildValue("ss", hbuf, pbuf);
3941
3942fail:
3943 if (res)
3944 freeaddrinfo(res);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003945 return ret;
3946}
3947
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003948PyDoc_STRVAR(getnameinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003949"getnameinfo(sockaddr, flags) --> (host, port)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003950\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003951Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003952
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00003953
3954/* Python API to getting and setting the default timeout value. */
3955
3956static PyObject *
3957socket_getdefaulttimeout(PyObject *self)
3958{
3959 if (defaulttimeout < 0.0) {
3960 Py_INCREF(Py_None);
3961 return Py_None;
3962 }
3963 else
3964 return PyFloat_FromDouble(defaulttimeout);
3965}
3966
3967PyDoc_STRVAR(getdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003968"getdefaulttimeout() -> timeout\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00003969\n\
3970Returns the default timeout in floating seconds for new socket objects.\n\
3971A value of None indicates that new socket objects have no timeout.\n\
3972When the socket module is first imported, the default is None.");
3973
3974static PyObject *
3975socket_setdefaulttimeout(PyObject *self, PyObject *arg)
3976{
3977 double timeout;
3978
3979 if (arg == Py_None)
3980 timeout = -1.0;
3981 else {
3982 timeout = PyFloat_AsDouble(arg);
3983 if (timeout < 0.0) {
3984 if (!PyErr_Occurred())
3985 PyErr_SetString(PyExc_ValueError,
3986 "Timeout value out of range");
3987 return NULL;
3988 }
3989 }
3990
3991 defaulttimeout = timeout;
3992
3993 Py_INCREF(Py_None);
3994 return Py_None;
3995}
3996
3997PyDoc_STRVAR(setdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003998"setdefaulttimeout(timeout)\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00003999\n\
4000Set the default timeout in floating seconds for new socket objects.\n\
4001A value of None indicates that new socket objects have no timeout.\n\
4002When the socket module is first imported, the default is None.");
4003
4004
Guido van Rossum30a685f1991-06-27 15:51:29 +00004005/* List of functions exported by this module. */
4006
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004007static PyMethodDef socket_methods[] = {
4008 {"gethostbyname", socket_gethostbyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00004009 METH_VARARGS, gethostbyname_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004010 {"gethostbyname_ex", socket_gethostbyname_ex,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00004011 METH_VARARGS, ghbn_ex_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004012 {"gethostbyaddr", socket_gethostbyaddr,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00004013 METH_VARARGS, gethostbyaddr_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004014 {"gethostname", socket_gethostname,
Georg Brandl96a8c392006-05-29 21:04:52 +00004015 METH_NOARGS, gethostname_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004016 {"getservbyname", socket_getservbyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00004017 METH_VARARGS, getservbyname_doc},
Barry Warsaw11b91a02004-06-28 00:50:43 +00004018 {"getservbyport", socket_getservbyport,
4019 METH_VARARGS, getservbyport_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004020 {"getprotobyname", socket_getprotobyname,
Georg Brandl96a8c392006-05-29 21:04:52 +00004021 METH_VARARGS, getprotobyname_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004022#ifndef NO_DUP
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004023 {"fromfd", socket_fromfd,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00004024 METH_VARARGS, fromfd_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004025#endif
Dave Cole331708b2004-08-09 04:51:41 +00004026#ifdef HAVE_SOCKETPAIR
4027 {"socketpair", socket_socketpair,
4028 METH_VARARGS, socketpair_doc},
4029#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004030 {"ntohs", socket_ntohs,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00004031 METH_VARARGS, ntohs_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004032 {"ntohl", socket_ntohl,
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004033 METH_O, ntohl_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004034 {"htons", socket_htons,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00004035 METH_VARARGS, htons_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004036 {"htonl", socket_htonl,
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004037 METH_O, htonl_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004038 {"inet_aton", socket_inet_aton,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00004039 METH_VARARGS, inet_aton_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004040 {"inet_ntoa", socket_inet_ntoa,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00004041 METH_VARARGS, inet_ntoa_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004042#ifdef HAVE_INET_PTON
4043 {"inet_pton", socket_inet_pton,
4044 METH_VARARGS, inet_pton_doc},
4045 {"inet_ntop", socket_inet_ntop,
4046 METH_VARARGS, inet_ntop_doc},
4047#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004048 {"getaddrinfo", socket_getaddrinfo,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004049 METH_VARARGS, getaddrinfo_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004050 {"getnameinfo", socket_getnameinfo,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004051 METH_VARARGS, getnameinfo_doc},
Guido van Rossum1693ba82002-07-18 21:11:26 +00004052 {"getdefaulttimeout", (PyCFunction)socket_getdefaulttimeout,
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004053 METH_NOARGS, getdefaulttimeout_doc},
4054 {"setdefaulttimeout", socket_setdefaulttimeout,
4055 METH_O, setdefaulttimeout_doc},
Guido van Rossum30a685f1991-06-27 15:51:29 +00004056 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004057};
4058
Guido van Rossum30a685f1991-06-27 15:51:29 +00004059
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004060#ifdef RISCOS
4061#define OS_INIT_DEFINED
Guido van Rossumbe32c891996-06-20 16:25:29 +00004062
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004063static int
4064os_init(void)
4065{
4066 _kernel_swi_regs r;
4067
4068 r.r[0] = 0;
4069 _kernel_swi(0x43380, &r, &r);
4070 taskwindow = r.r[0];
4071
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004072 return 1;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004073}
4074
4075#endif /* RISCOS */
4076
4077
4078#ifdef MS_WINDOWS
4079#define OS_INIT_DEFINED
4080
4081/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00004082
4083static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004084os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00004085{
4086 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00004087}
4088
4089static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004090os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00004091{
4092 WSADATA WSAData;
4093 int ret;
4094 char buf[100];
4095 ret = WSAStartup(0x0101, &WSAData);
4096 switch (ret) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004097 case 0: /* No error */
Mark Hammond14350ab2003-07-09 04:57:46 +00004098 Py_AtExit(os_cleanup);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004099 return 1; /* Success */
Guido van Rossumbe32c891996-06-20 16:25:29 +00004100 case WSASYSNOTREADY:
4101 PyErr_SetString(PyExc_ImportError,
4102 "WSAStartup failed: network not ready");
4103 break;
4104 case WSAVERNOTSUPPORTED:
4105 case WSAEINVAL:
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004106 PyErr_SetString(
4107 PyExc_ImportError,
4108 "WSAStartup failed: requested version not supported");
Guido van Rossumbe32c891996-06-20 16:25:29 +00004109 break;
4110 default:
Tim Peters885d4572001-11-28 20:27:42 +00004111 PyOS_snprintf(buf, sizeof(buf),
4112 "WSAStartup failed: error code %d", ret);
Guido van Rossumbe32c891996-06-20 16:25:29 +00004113 PyErr_SetString(PyExc_ImportError, buf);
4114 break;
4115 }
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004116 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00004117}
4118
Guido van Rossum8d665e61996-06-26 18:22:49 +00004119#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00004120
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004121
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004122#ifdef PYOS_OS2
4123#define OS_INIT_DEFINED
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004124
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004125/* Additional initialization for OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004126
4127static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004128os_init(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004129{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004130#ifndef PYCC_GCC
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004131 char reason[64];
4132 int rc = sock_init();
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004133
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004134 if (rc == 0) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004135 return 1; /* Success */
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004136 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004137
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004138 PyOS_snprintf(reason, sizeof(reason),
4139 "OS/2 TCP/IP Error# %d", sock_errno());
4140 PyErr_SetString(PyExc_ImportError, reason);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004141
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004142 return 0; /* Failure */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00004143#else
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004144 /* No need to initialise sockets with GCC/EMX */
4145 return 1; /* Success */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00004146#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004147}
4148
4149#endif /* PYOS_OS2 */
4150
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004151
4152#ifndef OS_INIT_DEFINED
4153static int
4154os_init(void)
4155{
4156 return 1; /* Success */
4157}
4158#endif
4159
4160
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00004161/* C API table - always add new things to the end for binary
4162 compatibility. */
4163static
4164PySocketModule_APIObject PySocketModuleAPI =
4165{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004166 &sock_type,
Brett Cannon06c34792004-03-23 23:16:54 +00004167 NULL
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00004168};
4169
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004170
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004171/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004172
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004173 This module is actually called "_socket", and there's a wrapper
4174 "socket.py" which implements some additional functionality. On some
4175 platforms (e.g. Windows and OS/2), socket.py also implements a
4176 wrapper for the socket type that provides missing functionality such
4177 as makefile(), dup() and fromfd(). The import of "_socket" may fail
4178 with an ImportError exception if os-specific initialization fails.
4179 On Windows, this does WINSOCK initialization. When WINSOCK is
4180 initialized succesfully, a call to WSACleanup() is scheduled to be
4181 made at exit time.
4182*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004183
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004184PyDoc_STRVAR(socket_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004185"Implementation module for socket operations.\n\
4186\n\
4187See the socket module for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004188
Mark Hammondfe51c6d2002-08-02 02:27:13 +00004189PyMODINIT_FUNC
Thomas Wouters1e0c2f42000-07-24 16:06:23 +00004190init_socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004191{
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004192 PyObject *m, *has_ipv6;
Fred Drake4baedc12002-04-01 14:53:37 +00004193
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004194 if (!os_init())
Guido van Rossum0cb96de1997-10-01 04:29:29 +00004195 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004196
4197 sock_type.ob_type = &PyType_Type;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004198 m = Py_InitModule3(PySocket_MODULE_NAME,
4199 socket_methods,
4200 socket_doc);
Neal Norwitz1ac754f2006-01-19 06:09:39 +00004201 if (m == NULL)
4202 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004203
4204 socket_error = PyErr_NewException("socket.error", NULL, NULL);
4205 if (socket_error == NULL)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004206 return;
Brett Cannon06c34792004-03-23 23:16:54 +00004207 PySocketModuleAPI.error = socket_error;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004208 Py_INCREF(socket_error);
4209 PyModule_AddObject(m, "error", socket_error);
4210 socket_herror = PyErr_NewException("socket.herror",
4211 socket_error, NULL);
4212 if (socket_herror == NULL)
4213 return;
4214 Py_INCREF(socket_herror);
4215 PyModule_AddObject(m, "herror", socket_herror);
4216 socket_gaierror = PyErr_NewException("socket.gaierror", socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004217 NULL);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004218 if (socket_gaierror == NULL)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004219 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004220 Py_INCREF(socket_gaierror);
4221 PyModule_AddObject(m, "gaierror", socket_gaierror);
Raymond Hettingeref7343c2003-06-29 03:08:05 +00004222 socket_timeout = PyErr_NewException("socket.timeout",
4223 socket_error, NULL);
4224 if (socket_timeout == NULL)
4225 return;
4226 Py_INCREF(socket_timeout);
4227 PyModule_AddObject(m, "timeout", socket_timeout);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004228 Py_INCREF((PyObject *)&sock_type);
Fred Drake4baedc12002-04-01 14:53:37 +00004229 if (PyModule_AddObject(m, "SocketType",
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004230 (PyObject *)&sock_type) != 0)
Guido van Rossum0cb96de1997-10-01 04:29:29 +00004231 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004232 Py_INCREF((PyObject *)&sock_type);
Fred Drake4baedc12002-04-01 14:53:37 +00004233 if (PyModule_AddObject(m, "socket",
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004234 (PyObject *)&sock_type) != 0)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004235 return;
Guido van Rossum09be4091999-08-09 14:40:40 +00004236
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004237#ifdef ENABLE_IPV6
4238 has_ipv6 = Py_True;
4239#else
4240 has_ipv6 = Py_False;
4241#endif
4242 Py_INCREF(has_ipv6);
4243 PyModule_AddObject(m, "has_ipv6", has_ipv6);
4244
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00004245 /* Export C API */
Fred Drake4baedc12002-04-01 14:53:37 +00004246 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00004247 PyCObject_FromVoidPtr((void *)&PySocketModuleAPI, NULL)
4248 ) != 0)
4249 return;
4250
Guido van Rossum09be4091999-08-09 14:40:40 +00004251 /* Address families (we only support AF_INET and AF_UNIX) */
4252#ifdef AF_UNSPEC
Fred Drake4baedc12002-04-01 14:53:37 +00004253 PyModule_AddIntConstant(m, "AF_UNSPEC", AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00004254#endif
Fred Drake4baedc12002-04-01 14:53:37 +00004255 PyModule_AddIntConstant(m, "AF_INET", AF_INET);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004256#ifdef AF_INET6
Fred Drake4baedc12002-04-01 14:53:37 +00004257 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004258#endif /* AF_INET6 */
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00004259#if defined(AF_UNIX)
Fred Drake4baedc12002-04-01 14:53:37 +00004260 PyModule_AddIntConstant(m, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00004261#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00004262#ifdef AF_AX25
Fred Drake4baedc12002-04-01 14:53:37 +00004263 /* Amateur Radio AX.25 */
4264 PyModule_AddIntConstant(m, "AF_AX25", AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00004265#endif
4266#ifdef AF_IPX
Fred Drake4baedc12002-04-01 14:53:37 +00004267 PyModule_AddIntConstant(m, "AF_IPX", AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00004268#endif
4269#ifdef AF_APPLETALK
Fred Drake4baedc12002-04-01 14:53:37 +00004270 /* Appletalk DDP */
4271 PyModule_AddIntConstant(m, "AF_APPLETALK", AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00004272#endif
4273#ifdef AF_NETROM
Fred Drake4baedc12002-04-01 14:53:37 +00004274 /* Amateur radio NetROM */
4275 PyModule_AddIntConstant(m, "AF_NETROM", AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00004276#endif
4277#ifdef AF_BRIDGE
Fred Drake4baedc12002-04-01 14:53:37 +00004278 /* Multiprotocol bridge */
4279 PyModule_AddIntConstant(m, "AF_BRIDGE", AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00004280#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004281#ifdef AF_ATMPVC
4282 /* ATM PVCs */
4283 PyModule_AddIntConstant(m, "AF_ATMPVC", AF_ATMPVC);
4284#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00004285#ifdef AF_AAL5
Fred Drake4baedc12002-04-01 14:53:37 +00004286 /* Reserved for Werner's ATM */
4287 PyModule_AddIntConstant(m, "AF_AAL5", AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00004288#endif
4289#ifdef AF_X25
Fred Drake4baedc12002-04-01 14:53:37 +00004290 /* Reserved for X.25 project */
4291 PyModule_AddIntConstant(m, "AF_X25", AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00004292#endif
4293#ifdef AF_INET6
Fred Drake4baedc12002-04-01 14:53:37 +00004294 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00004295#endif
4296#ifdef AF_ROSE
Fred Drake4baedc12002-04-01 14:53:37 +00004297 /* Amateur Radio X.25 PLP */
4298 PyModule_AddIntConstant(m, "AF_ROSE", AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00004299#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004300#ifdef AF_DECnet
4301 /* Reserved for DECnet project */
4302 PyModule_AddIntConstant(m, "AF_DECnet", AF_DECnet);
4303#endif
4304#ifdef AF_NETBEUI
4305 /* Reserved for 802.2LLC project */
4306 PyModule_AddIntConstant(m, "AF_NETBEUI", AF_NETBEUI);
4307#endif
4308#ifdef AF_SECURITY
4309 /* Security callback pseudo AF */
4310 PyModule_AddIntConstant(m, "AF_SECURITY", AF_SECURITY);
4311#endif
4312#ifdef AF_KEY
4313 /* PF_KEY key management API */
4314 PyModule_AddIntConstant(m, "AF_KEY", AF_KEY);
4315#endif
4316#ifdef AF_NETLINK
4317 /* */
4318 PyModule_AddIntConstant(m, "AF_NETLINK", AF_NETLINK);
Martin v. Löwis11017b12006-01-14 18:12:57 +00004319 PyModule_AddIntConstant(m, "NETLINK_ROUTE", NETLINK_ROUTE);
Martin v. Löwis5fe60e72006-04-06 22:29:33 +00004320#ifdef NETLINK_SKIP
Martin v. Löwis11017b12006-01-14 18:12:57 +00004321 PyModule_AddIntConstant(m, "NETLINK_SKIP", NETLINK_SKIP);
Martin v. Löwis5fe60e72006-04-06 22:29:33 +00004322#endif
4323#ifdef NETLINK_W1
4324 PyModule_AddIntConstant(m, "NETLINK_W1", NETLINK_W1);
4325#endif
Martin v. Löwis11017b12006-01-14 18:12:57 +00004326 PyModule_AddIntConstant(m, "NETLINK_USERSOCK", NETLINK_USERSOCK);
4327 PyModule_AddIntConstant(m, "NETLINK_FIREWALL", NETLINK_FIREWALL);
Guido van Rossum668a94a2006-02-21 01:07:27 +00004328#ifdef NETLINK_TCPDIAG
Martin v. Löwis11017b12006-01-14 18:12:57 +00004329 PyModule_AddIntConstant(m, "NETLINK_TCPDIAG", NETLINK_TCPDIAG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00004330#endif
4331#ifdef NETLINK_NFLOG
Martin v. Löwis11017b12006-01-14 18:12:57 +00004332 PyModule_AddIntConstant(m, "NETLINK_NFLOG", NETLINK_NFLOG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00004333#endif
Neal Norwitz65851662006-01-16 04:31:40 +00004334#ifdef NETLINK_XFRM
Martin v. Löwis11017b12006-01-14 18:12:57 +00004335 PyModule_AddIntConstant(m, "NETLINK_XFRM", NETLINK_XFRM);
Neal Norwitz65851662006-01-16 04:31:40 +00004336#endif
Martin v. Löwis5fe60e72006-04-06 22:29:33 +00004337#ifdef NETLINK_ARPD
Martin v. Löwis11017b12006-01-14 18:12:57 +00004338 PyModule_AddIntConstant(m, "NETLINK_ARPD", NETLINK_ARPD);
Martin v. Löwis5fe60e72006-04-06 22:29:33 +00004339#endif
4340#ifdef NETLINK_ROUTE6
Martin v. Löwis11017b12006-01-14 18:12:57 +00004341 PyModule_AddIntConstant(m, "NETLINK_ROUTE6", NETLINK_ROUTE6);
Martin v. Löwis5fe60e72006-04-06 22:29:33 +00004342#endif
Martin v. Löwis11017b12006-01-14 18:12:57 +00004343 PyModule_AddIntConstant(m, "NETLINK_IP6_FW", NETLINK_IP6_FW);
4344 PyModule_AddIntConstant(m, "NETLINK_DNRTMSG", NETLINK_DNRTMSG);
Martin v. Löwis5fe60e72006-04-06 22:29:33 +00004345#ifdef NETLINK_TAPBASE
Martin v. Löwis11017b12006-01-14 18:12:57 +00004346 PyModule_AddIntConstant(m, "NETLINK_TAPBASE", NETLINK_TAPBASE);
Martin v. Löwis5fe60e72006-04-06 22:29:33 +00004347#endif
Georg Brandldcfdae72006-04-01 07:33:08 +00004348#endif /* AF_NETLINK */
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004349#ifdef AF_ROUTE
4350 /* Alias to emulate 4.4BSD */
4351 PyModule_AddIntConstant(m, "AF_ROUTE", AF_ROUTE);
4352#endif
4353#ifdef AF_ASH
4354 /* Ash */
4355 PyModule_AddIntConstant(m, "AF_ASH", AF_ASH);
4356#endif
4357#ifdef AF_ECONET
4358 /* Acorn Econet */
4359 PyModule_AddIntConstant(m, "AF_ECONET", AF_ECONET);
4360#endif
4361#ifdef AF_ATMSVC
4362 /* ATM SVCs */
4363 PyModule_AddIntConstant(m, "AF_ATMSVC", AF_ATMSVC);
4364#endif
4365#ifdef AF_SNA
4366 /* Linux SNA Project (nutters!) */
4367 PyModule_AddIntConstant(m, "AF_SNA", AF_SNA);
4368#endif
4369#ifdef AF_IRDA
4370 /* IRDA sockets */
4371 PyModule_AddIntConstant(m, "AF_IRDA", AF_IRDA);
4372#endif
4373#ifdef AF_PPPOX
4374 /* PPPoX sockets */
4375 PyModule_AddIntConstant(m, "AF_PPPOX", AF_PPPOX);
4376#endif
4377#ifdef AF_WANPIPE
4378 /* Wanpipe API Sockets */
4379 PyModule_AddIntConstant(m, "AF_WANPIPE", AF_WANPIPE);
4380#endif
4381#ifdef AF_LLC
4382 /* Linux LLC */
4383 PyModule_AddIntConstant(m, "AF_LLC", AF_LLC);
4384#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00004385
Hye-Shik Chang81268602004-02-02 06:05:24 +00004386#ifdef USE_BLUETOOTH
Martin v. Löwis12af0482004-01-31 12:34:17 +00004387 PyModule_AddIntConstant(m, "AF_BLUETOOTH", AF_BLUETOOTH);
4388 PyModule_AddIntConstant(m, "BTPROTO_L2CAP", BTPROTO_L2CAP);
Hye-Shik Chang81268602004-02-02 06:05:24 +00004389#if !defined(__FreeBSD__)
Martin v. Löwis12af0482004-01-31 12:34:17 +00004390 PyModule_AddIntConstant(m, "BTPROTO_SCO", BTPROTO_SCO);
Hye-Shik Chang81268602004-02-02 06:05:24 +00004391#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00004392 PyModule_AddIntConstant(m, "BTPROTO_RFCOMM", BTPROTO_RFCOMM);
Neal Norwitz1e44ca92006-05-30 03:18:50 +00004393 PyModule_AddStringConstant(m, "BDADDR_ANY", "00:00:00:00:00:00");
4394 PyModule_AddStringConstant(m, "BDADDR_LOCAL", "00:00:00:FF:FF:FF");
Martin v. Löwis12af0482004-01-31 12:34:17 +00004395#endif
4396
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00004397#ifdef HAVE_NETPACKET_PACKET_H
Fred Drake4baedc12002-04-01 14:53:37 +00004398 PyModule_AddIntConstant(m, "AF_PACKET", AF_PACKET);
4399 PyModule_AddIntConstant(m, "PF_PACKET", PF_PACKET);
4400 PyModule_AddIntConstant(m, "PACKET_HOST", PACKET_HOST);
4401 PyModule_AddIntConstant(m, "PACKET_BROADCAST", PACKET_BROADCAST);
4402 PyModule_AddIntConstant(m, "PACKET_MULTICAST", PACKET_MULTICAST);
4403 PyModule_AddIntConstant(m, "PACKET_OTHERHOST", PACKET_OTHERHOST);
4404 PyModule_AddIntConstant(m, "PACKET_OUTGOING", PACKET_OUTGOING);
4405 PyModule_AddIntConstant(m, "PACKET_LOOPBACK", PACKET_LOOPBACK);
4406 PyModule_AddIntConstant(m, "PACKET_FASTROUTE", PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00004407#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00004408
4409 /* Socket types */
Fred Drake4baedc12002-04-01 14:53:37 +00004410 PyModule_AddIntConstant(m, "SOCK_STREAM", SOCK_STREAM);
4411 PyModule_AddIntConstant(m, "SOCK_DGRAM", SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00004412#ifndef __BEOS__
4413/* We have incomplete socket support. */
Fred Drake4baedc12002-04-01 14:53:37 +00004414 PyModule_AddIntConstant(m, "SOCK_RAW", SOCK_RAW);
4415 PyModule_AddIntConstant(m, "SOCK_SEQPACKET", SOCK_SEQPACKET);
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00004416#if defined(SOCK_RDM)
Fred Drake4baedc12002-04-01 14:53:37 +00004417 PyModule_AddIntConstant(m, "SOCK_RDM", SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00004418#endif
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00004419#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004420
4421#ifdef SO_DEBUG
Fred Drake4baedc12002-04-01 14:53:37 +00004422 PyModule_AddIntConstant(m, "SO_DEBUG", SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004423#endif
4424#ifdef SO_ACCEPTCONN
Fred Drake4baedc12002-04-01 14:53:37 +00004425 PyModule_AddIntConstant(m, "SO_ACCEPTCONN", SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004426#endif
4427#ifdef SO_REUSEADDR
Fred Drake4baedc12002-04-01 14:53:37 +00004428 PyModule_AddIntConstant(m, "SO_REUSEADDR", SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004429#endif
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00004430#ifdef SO_EXCLUSIVEADDRUSE
4431 PyModule_AddIntConstant(m, "SO_EXCLUSIVEADDRUSE", SO_EXCLUSIVEADDRUSE);
4432#endif
4433
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004434#ifdef SO_KEEPALIVE
Fred Drake4baedc12002-04-01 14:53:37 +00004435 PyModule_AddIntConstant(m, "SO_KEEPALIVE", SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004436#endif
4437#ifdef SO_DONTROUTE
Fred Drake4baedc12002-04-01 14:53:37 +00004438 PyModule_AddIntConstant(m, "SO_DONTROUTE", SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004439#endif
4440#ifdef SO_BROADCAST
Fred Drake4baedc12002-04-01 14:53:37 +00004441 PyModule_AddIntConstant(m, "SO_BROADCAST", SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004442#endif
4443#ifdef SO_USELOOPBACK
Fred Drake4baedc12002-04-01 14:53:37 +00004444 PyModule_AddIntConstant(m, "SO_USELOOPBACK", SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004445#endif
4446#ifdef SO_LINGER
Fred Drake4baedc12002-04-01 14:53:37 +00004447 PyModule_AddIntConstant(m, "SO_LINGER", SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004448#endif
4449#ifdef SO_OOBINLINE
Fred Drake4baedc12002-04-01 14:53:37 +00004450 PyModule_AddIntConstant(m, "SO_OOBINLINE", SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004451#endif
4452#ifdef SO_REUSEPORT
Fred Drake4baedc12002-04-01 14:53:37 +00004453 PyModule_AddIntConstant(m, "SO_REUSEPORT", SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004454#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004455#ifdef SO_SNDBUF
Fred Drake4baedc12002-04-01 14:53:37 +00004456 PyModule_AddIntConstant(m, "SO_SNDBUF", SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004457#endif
4458#ifdef SO_RCVBUF
Fred Drake4baedc12002-04-01 14:53:37 +00004459 PyModule_AddIntConstant(m, "SO_RCVBUF", SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004460#endif
4461#ifdef SO_SNDLOWAT
Fred Drake4baedc12002-04-01 14:53:37 +00004462 PyModule_AddIntConstant(m, "SO_SNDLOWAT", SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004463#endif
4464#ifdef SO_RCVLOWAT
Fred Drake4baedc12002-04-01 14:53:37 +00004465 PyModule_AddIntConstant(m, "SO_RCVLOWAT", SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004466#endif
4467#ifdef SO_SNDTIMEO
Fred Drake4baedc12002-04-01 14:53:37 +00004468 PyModule_AddIntConstant(m, "SO_SNDTIMEO", SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004469#endif
4470#ifdef SO_RCVTIMEO
Fred Drake4baedc12002-04-01 14:53:37 +00004471 PyModule_AddIntConstant(m, "SO_RCVTIMEO", SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004472#endif
4473#ifdef SO_ERROR
Fred Drake4baedc12002-04-01 14:53:37 +00004474 PyModule_AddIntConstant(m, "SO_ERROR", SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004475#endif
4476#ifdef SO_TYPE
Fred Drake4baedc12002-04-01 14:53:37 +00004477 PyModule_AddIntConstant(m, "SO_TYPE", SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004478#endif
4479
4480 /* Maximum number of connections for "listen" */
4481#ifdef SOMAXCONN
Fred Drake4baedc12002-04-01 14:53:37 +00004482 PyModule_AddIntConstant(m, "SOMAXCONN", SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004483#else
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004484 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004485#endif
4486
4487 /* Flags for send, recv */
4488#ifdef MSG_OOB
Fred Drake4baedc12002-04-01 14:53:37 +00004489 PyModule_AddIntConstant(m, "MSG_OOB", MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004490#endif
4491#ifdef MSG_PEEK
Fred Drake4baedc12002-04-01 14:53:37 +00004492 PyModule_AddIntConstant(m, "MSG_PEEK", MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004493#endif
4494#ifdef MSG_DONTROUTE
Fred Drake4baedc12002-04-01 14:53:37 +00004495 PyModule_AddIntConstant(m, "MSG_DONTROUTE", MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004496#endif
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00004497#ifdef MSG_DONTWAIT
Fred Drake4baedc12002-04-01 14:53:37 +00004498 PyModule_AddIntConstant(m, "MSG_DONTWAIT", MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00004499#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004500#ifdef MSG_EOR
Fred Drake4baedc12002-04-01 14:53:37 +00004501 PyModule_AddIntConstant(m, "MSG_EOR", MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004502#endif
4503#ifdef MSG_TRUNC
Fred Drake4baedc12002-04-01 14:53:37 +00004504 PyModule_AddIntConstant(m, "MSG_TRUNC", MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004505#endif
4506#ifdef MSG_CTRUNC
Fred Drake4baedc12002-04-01 14:53:37 +00004507 PyModule_AddIntConstant(m, "MSG_CTRUNC", MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004508#endif
4509#ifdef MSG_WAITALL
Fred Drake4baedc12002-04-01 14:53:37 +00004510 PyModule_AddIntConstant(m, "MSG_WAITALL", MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004511#endif
4512#ifdef MSG_BTAG
Fred Drake4baedc12002-04-01 14:53:37 +00004513 PyModule_AddIntConstant(m, "MSG_BTAG", MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004514#endif
4515#ifdef MSG_ETAG
Fred Drake4baedc12002-04-01 14:53:37 +00004516 PyModule_AddIntConstant(m, "MSG_ETAG", MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004517#endif
4518
4519 /* Protocol level and numbers, usable for [gs]etsockopt */
4520#ifdef SOL_SOCKET
Fred Drake4baedc12002-04-01 14:53:37 +00004521 PyModule_AddIntConstant(m, "SOL_SOCKET", SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004522#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00004523#ifdef SOL_IP
Fred Drake4baedc12002-04-01 14:53:37 +00004524 PyModule_AddIntConstant(m, "SOL_IP", SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00004525#else
Fred Drake4baedc12002-04-01 14:53:37 +00004526 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00004527#endif
4528#ifdef SOL_IPX
Fred Drake4baedc12002-04-01 14:53:37 +00004529 PyModule_AddIntConstant(m, "SOL_IPX", SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00004530#endif
4531#ifdef SOL_AX25
Fred Drake4baedc12002-04-01 14:53:37 +00004532 PyModule_AddIntConstant(m, "SOL_AX25", SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00004533#endif
4534#ifdef SOL_ATALK
Fred Drake4baedc12002-04-01 14:53:37 +00004535 PyModule_AddIntConstant(m, "SOL_ATALK", SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00004536#endif
4537#ifdef SOL_NETROM
Fred Drake4baedc12002-04-01 14:53:37 +00004538 PyModule_AddIntConstant(m, "SOL_NETROM", SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00004539#endif
4540#ifdef SOL_ROSE
Fred Drake4baedc12002-04-01 14:53:37 +00004541 PyModule_AddIntConstant(m, "SOL_ROSE", SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00004542#endif
4543#ifdef SOL_TCP
Fred Drake4baedc12002-04-01 14:53:37 +00004544 PyModule_AddIntConstant(m, "SOL_TCP", SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00004545#else
Fred Drake4baedc12002-04-01 14:53:37 +00004546 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00004547#endif
4548#ifdef SOL_UDP
Fred Drake4baedc12002-04-01 14:53:37 +00004549 PyModule_AddIntConstant(m, "SOL_UDP", SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00004550#else
Fred Drake4baedc12002-04-01 14:53:37 +00004551 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00004552#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004553#ifdef IPPROTO_IP
Fred Drake4baedc12002-04-01 14:53:37 +00004554 PyModule_AddIntConstant(m, "IPPROTO_IP", IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00004555#else
Fred Drake4baedc12002-04-01 14:53:37 +00004556 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004557#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004558#ifdef IPPROTO_HOPOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00004559 PyModule_AddIntConstant(m, "IPPROTO_HOPOPTS", IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004560#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004561#ifdef IPPROTO_ICMP
Fred Drake4baedc12002-04-01 14:53:37 +00004562 PyModule_AddIntConstant(m, "IPPROTO_ICMP", IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00004563#else
Fred Drake4baedc12002-04-01 14:53:37 +00004564 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004565#endif
4566#ifdef IPPROTO_IGMP
Fred Drake4baedc12002-04-01 14:53:37 +00004567 PyModule_AddIntConstant(m, "IPPROTO_IGMP", IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004568#endif
4569#ifdef IPPROTO_GGP
Fred Drake4baedc12002-04-01 14:53:37 +00004570 PyModule_AddIntConstant(m, "IPPROTO_GGP", IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004571#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004572#ifdef IPPROTO_IPV4
Fred Drake4baedc12002-04-01 14:53:37 +00004573 PyModule_AddIntConstant(m, "IPPROTO_IPV4", IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004574#endif
Martin v. Löwisa0f17342003-10-03 13:56:20 +00004575#ifdef IPPROTO_IPV6
4576 PyModule_AddIntConstant(m, "IPPROTO_IPV6", IPPROTO_IPV6);
4577#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004578#ifdef IPPROTO_IPIP
Fred Drake4baedc12002-04-01 14:53:37 +00004579 PyModule_AddIntConstant(m, "IPPROTO_IPIP", IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004580#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004581#ifdef IPPROTO_TCP
Fred Drake4baedc12002-04-01 14:53:37 +00004582 PyModule_AddIntConstant(m, "IPPROTO_TCP", IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00004583#else
Fred Drake4baedc12002-04-01 14:53:37 +00004584 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004585#endif
4586#ifdef IPPROTO_EGP
Fred Drake4baedc12002-04-01 14:53:37 +00004587 PyModule_AddIntConstant(m, "IPPROTO_EGP", IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004588#endif
4589#ifdef IPPROTO_PUP
Fred Drake4baedc12002-04-01 14:53:37 +00004590 PyModule_AddIntConstant(m, "IPPROTO_PUP", IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004591#endif
4592#ifdef IPPROTO_UDP
Fred Drake4baedc12002-04-01 14:53:37 +00004593 PyModule_AddIntConstant(m, "IPPROTO_UDP", IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00004594#else
Fred Drake4baedc12002-04-01 14:53:37 +00004595 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004596#endif
4597#ifdef IPPROTO_IDP
Fred Drake4baedc12002-04-01 14:53:37 +00004598 PyModule_AddIntConstant(m, "IPPROTO_IDP", IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004599#endif
4600#ifdef IPPROTO_HELLO
Fred Drake4baedc12002-04-01 14:53:37 +00004601 PyModule_AddIntConstant(m, "IPPROTO_HELLO", IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004602#endif
4603#ifdef IPPROTO_ND
Fred Drake4baedc12002-04-01 14:53:37 +00004604 PyModule_AddIntConstant(m, "IPPROTO_ND", IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004605#endif
4606#ifdef IPPROTO_TP
Fred Drake4baedc12002-04-01 14:53:37 +00004607 PyModule_AddIntConstant(m, "IPPROTO_TP", IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004608#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004609#ifdef IPPROTO_IPV6
Fred Drake4baedc12002-04-01 14:53:37 +00004610 PyModule_AddIntConstant(m, "IPPROTO_IPV6", IPPROTO_IPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004611#endif
4612#ifdef IPPROTO_ROUTING
Fred Drake4baedc12002-04-01 14:53:37 +00004613 PyModule_AddIntConstant(m, "IPPROTO_ROUTING", IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004614#endif
4615#ifdef IPPROTO_FRAGMENT
Fred Drake4baedc12002-04-01 14:53:37 +00004616 PyModule_AddIntConstant(m, "IPPROTO_FRAGMENT", IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004617#endif
4618#ifdef IPPROTO_RSVP
Fred Drake4baedc12002-04-01 14:53:37 +00004619 PyModule_AddIntConstant(m, "IPPROTO_RSVP", IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004620#endif
4621#ifdef IPPROTO_GRE
Fred Drake4baedc12002-04-01 14:53:37 +00004622 PyModule_AddIntConstant(m, "IPPROTO_GRE", IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004623#endif
4624#ifdef IPPROTO_ESP
Fred Drake4baedc12002-04-01 14:53:37 +00004625 PyModule_AddIntConstant(m, "IPPROTO_ESP", IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004626#endif
4627#ifdef IPPROTO_AH
Fred Drake4baedc12002-04-01 14:53:37 +00004628 PyModule_AddIntConstant(m, "IPPROTO_AH", IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004629#endif
4630#ifdef IPPROTO_MOBILE
Fred Drake4baedc12002-04-01 14:53:37 +00004631 PyModule_AddIntConstant(m, "IPPROTO_MOBILE", IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004632#endif
4633#ifdef IPPROTO_ICMPV6
Fred Drake4baedc12002-04-01 14:53:37 +00004634 PyModule_AddIntConstant(m, "IPPROTO_ICMPV6", IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004635#endif
4636#ifdef IPPROTO_NONE
Fred Drake4baedc12002-04-01 14:53:37 +00004637 PyModule_AddIntConstant(m, "IPPROTO_NONE", IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004638#endif
4639#ifdef IPPROTO_DSTOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00004640 PyModule_AddIntConstant(m, "IPPROTO_DSTOPTS", IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004641#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004642#ifdef IPPROTO_XTP
Fred Drake4baedc12002-04-01 14:53:37 +00004643 PyModule_AddIntConstant(m, "IPPROTO_XTP", IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004644#endif
4645#ifdef IPPROTO_EON
Fred Drake4baedc12002-04-01 14:53:37 +00004646 PyModule_AddIntConstant(m, "IPPROTO_EON", IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004647#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004648#ifdef IPPROTO_PIM
Fred Drake4baedc12002-04-01 14:53:37 +00004649 PyModule_AddIntConstant(m, "IPPROTO_PIM", IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004650#endif
4651#ifdef IPPROTO_IPCOMP
Fred Drake4baedc12002-04-01 14:53:37 +00004652 PyModule_AddIntConstant(m, "IPPROTO_IPCOMP", IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004653#endif
4654#ifdef IPPROTO_VRRP
Fred Drake4baedc12002-04-01 14:53:37 +00004655 PyModule_AddIntConstant(m, "IPPROTO_VRRP", IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004656#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004657#ifdef IPPROTO_BIP
Fred Drake4baedc12002-04-01 14:53:37 +00004658 PyModule_AddIntConstant(m, "IPPROTO_BIP", IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004659#endif
4660/**/
4661#ifdef IPPROTO_RAW
Fred Drake4baedc12002-04-01 14:53:37 +00004662 PyModule_AddIntConstant(m, "IPPROTO_RAW", IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00004663#else
Fred Drake4baedc12002-04-01 14:53:37 +00004664 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004665#endif
4666#ifdef IPPROTO_MAX
Fred Drake4baedc12002-04-01 14:53:37 +00004667 PyModule_AddIntConstant(m, "IPPROTO_MAX", IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004668#endif
4669
4670 /* Some port configuration */
4671#ifdef IPPORT_RESERVED
Fred Drake4baedc12002-04-01 14:53:37 +00004672 PyModule_AddIntConstant(m, "IPPORT_RESERVED", IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004673#else
Fred Drake4baedc12002-04-01 14:53:37 +00004674 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004675#endif
4676#ifdef IPPORT_USERRESERVED
Fred Drake4baedc12002-04-01 14:53:37 +00004677 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004678#else
Fred Drake4baedc12002-04-01 14:53:37 +00004679 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004680#endif
4681
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004682 /* Some reserved IP v.4 addresses */
4683#ifdef INADDR_ANY
Fred Drake4baedc12002-04-01 14:53:37 +00004684 PyModule_AddIntConstant(m, "INADDR_ANY", INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004685#else
Fred Drake4baedc12002-04-01 14:53:37 +00004686 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004687#endif
4688#ifdef INADDR_BROADCAST
Fred Drake4baedc12002-04-01 14:53:37 +00004689 PyModule_AddIntConstant(m, "INADDR_BROADCAST", INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004690#else
Fred Drake4baedc12002-04-01 14:53:37 +00004691 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004692#endif
4693#ifdef INADDR_LOOPBACK
Fred Drake4baedc12002-04-01 14:53:37 +00004694 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004695#else
Fred Drake4baedc12002-04-01 14:53:37 +00004696 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004697#endif
4698#ifdef INADDR_UNSPEC_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00004699 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004700#else
Fred Drake4baedc12002-04-01 14:53:37 +00004701 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004702#endif
4703#ifdef INADDR_ALLHOSTS_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00004704 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
4705 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004706#else
Fred Drake4baedc12002-04-01 14:53:37 +00004707 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004708#endif
4709#ifdef INADDR_MAX_LOCAL_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00004710 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP",
4711 INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004712#else
Fred Drake4baedc12002-04-01 14:53:37 +00004713 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004714#endif
4715#ifdef INADDR_NONE
Fred Drake4baedc12002-04-01 14:53:37 +00004716 PyModule_AddIntConstant(m, "INADDR_NONE", INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004717#else
Fred Drake4baedc12002-04-01 14:53:37 +00004718 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004719#endif
4720
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004721 /* IPv4 [gs]etsockopt options */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004722#ifdef IP_OPTIONS
Fred Drake4baedc12002-04-01 14:53:37 +00004723 PyModule_AddIntConstant(m, "IP_OPTIONS", IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004724#endif
4725#ifdef IP_HDRINCL
Fred Drake4baedc12002-04-01 14:53:37 +00004726 PyModule_AddIntConstant(m, "IP_HDRINCL", IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004727#endif
4728#ifdef IP_TOS
Fred Drake4baedc12002-04-01 14:53:37 +00004729 PyModule_AddIntConstant(m, "IP_TOS", IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004730#endif
4731#ifdef IP_TTL
Fred Drake4baedc12002-04-01 14:53:37 +00004732 PyModule_AddIntConstant(m, "IP_TTL", IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004733#endif
4734#ifdef IP_RECVOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00004735 PyModule_AddIntConstant(m, "IP_RECVOPTS", IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004736#endif
4737#ifdef IP_RECVRETOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00004738 PyModule_AddIntConstant(m, "IP_RECVRETOPTS", IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004739#endif
4740#ifdef IP_RECVDSTADDR
Fred Drake4baedc12002-04-01 14:53:37 +00004741 PyModule_AddIntConstant(m, "IP_RECVDSTADDR", IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004742#endif
4743#ifdef IP_RETOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00004744 PyModule_AddIntConstant(m, "IP_RETOPTS", IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004745#endif
4746#ifdef IP_MULTICAST_IF
Fred Drake4baedc12002-04-01 14:53:37 +00004747 PyModule_AddIntConstant(m, "IP_MULTICAST_IF", IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004748#endif
4749#ifdef IP_MULTICAST_TTL
Fred Drake4baedc12002-04-01 14:53:37 +00004750 PyModule_AddIntConstant(m, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004751#endif
4752#ifdef IP_MULTICAST_LOOP
Fred Drake4baedc12002-04-01 14:53:37 +00004753 PyModule_AddIntConstant(m, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004754#endif
4755#ifdef IP_ADD_MEMBERSHIP
Fred Drake4baedc12002-04-01 14:53:37 +00004756 PyModule_AddIntConstant(m, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004757#endif
4758#ifdef IP_DROP_MEMBERSHIP
Fred Drake4baedc12002-04-01 14:53:37 +00004759 PyModule_AddIntConstant(m, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004760#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00004761#ifdef IP_DEFAULT_MULTICAST_TTL
Fred Drake4baedc12002-04-01 14:53:37 +00004762 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_TTL",
4763 IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00004764#endif
4765#ifdef IP_DEFAULT_MULTICAST_LOOP
Fred Drake4baedc12002-04-01 14:53:37 +00004766 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_LOOP",
4767 IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00004768#endif
4769#ifdef IP_MAX_MEMBERSHIPS
Fred Drake4baedc12002-04-01 14:53:37 +00004770 PyModule_AddIntConstant(m, "IP_MAX_MEMBERSHIPS", IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00004771#endif
4772
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004773 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
4774#ifdef IPV6_JOIN_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00004775 PyModule_AddIntConstant(m, "IPV6_JOIN_GROUP", IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004776#endif
4777#ifdef IPV6_LEAVE_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00004778 PyModule_AddIntConstant(m, "IPV6_LEAVE_GROUP", IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004779#endif
4780#ifdef IPV6_MULTICAST_HOPS
Fred Drake4baedc12002-04-01 14:53:37 +00004781 PyModule_AddIntConstant(m, "IPV6_MULTICAST_HOPS", IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004782#endif
4783#ifdef IPV6_MULTICAST_IF
Fred Drake4baedc12002-04-01 14:53:37 +00004784 PyModule_AddIntConstant(m, "IPV6_MULTICAST_IF", IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004785#endif
4786#ifdef IPV6_MULTICAST_LOOP
Fred Drake4baedc12002-04-01 14:53:37 +00004787 PyModule_AddIntConstant(m, "IPV6_MULTICAST_LOOP", IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004788#endif
4789#ifdef IPV6_UNICAST_HOPS
Fred Drake4baedc12002-04-01 14:53:37 +00004790 PyModule_AddIntConstant(m, "IPV6_UNICAST_HOPS", IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004791#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00004792 /* Additional IPV6 socket options, defined in RFC 3493 */
4793#ifdef IPV6_V6ONLY
4794 PyModule_AddIntConstant(m, "IPV6_V6ONLY", IPV6_V6ONLY);
4795#endif
4796 /* Advanced IPV6 socket options, from RFC 3542 */
4797#ifdef IPV6_CHECKSUM
4798 PyModule_AddIntConstant(m, "IPV6_CHECKSUM", IPV6_CHECKSUM);
4799#endif
4800#ifdef IPV6_DONTFRAG
4801 PyModule_AddIntConstant(m, "IPV6_DONTFRAG", IPV6_DONTFRAG);
4802#endif
4803#ifdef IPV6_DSTOPTS
4804 PyModule_AddIntConstant(m, "IPV6_DSTOPTS", IPV6_DSTOPTS);
4805#endif
4806#ifdef IPV6_HOPLIMIT
4807 PyModule_AddIntConstant(m, "IPV6_HOPLIMIT", IPV6_HOPLIMIT);
4808#endif
4809#ifdef IPV6_HOPOPTS
4810 PyModule_AddIntConstant(m, "IPV6_HOPOPTS", IPV6_HOPOPTS);
4811#endif
4812#ifdef IPV6_NEXTHOP
4813 PyModule_AddIntConstant(m, "IPV6_NEXTHOP", IPV6_NEXTHOP);
4814#endif
4815#ifdef IPV6_PATHMTU
4816 PyModule_AddIntConstant(m, "IPV6_PATHMTU", IPV6_PATHMTU);
4817#endif
4818#ifdef IPV6_PKTINFO
4819 PyModule_AddIntConstant(m, "IPV6_PKTINFO", IPV6_PKTINFO);
4820#endif
4821#ifdef IPV6_RECVDSTOPTS
4822 PyModule_AddIntConstant(m, "IPV6_RECVDSTOPTS", IPV6_RECVDSTOPTS);
4823#endif
4824#ifdef IPV6_RECVHOPLIMIT
4825 PyModule_AddIntConstant(m, "IPV6_RECVHOPLIMIT", IPV6_RECVHOPLIMIT);
4826#endif
4827#ifdef IPV6_RECVHOPOPTS
4828 PyModule_AddIntConstant(m, "IPV6_RECVHOPOPTS", IPV6_RECVHOPOPTS);
4829#endif
4830#ifdef IPV6_RECVPKTINFO
4831 PyModule_AddIntConstant(m, "IPV6_RECVPKTINFO", IPV6_RECVPKTINFO);
4832#endif
4833#ifdef IPV6_RECVRTHDR
4834 PyModule_AddIntConstant(m, "IPV6_RECVRTHDR", IPV6_RECVRTHDR);
4835#endif
4836#ifdef IPV6_RECVTCLASS
4837 PyModule_AddIntConstant(m, "IPV6_RECVTCLASS", IPV6_RECVTCLASS);
4838#endif
4839#ifdef IPV6_RTHDR
4840 PyModule_AddIntConstant(m, "IPV6_RTHDR", IPV6_RTHDR);
4841#endif
4842#ifdef IPV6_RTHDRDSTOPTS
4843 PyModule_AddIntConstant(m, "IPV6_RTHDRDSTOPTS", IPV6_RTHDRDSTOPTS);
4844#endif
4845#ifdef IPV6_RTHDR_TYPE_0
4846 PyModule_AddIntConstant(m, "IPV6_RTHDR_TYPE_0", IPV6_RTHDR_TYPE_0);
4847#endif
4848#ifdef IPV6_RECVPATHMTU
4849 PyModule_AddIntConstant(m, "IPV6_RECVPATHMTU", IPV6_RECVPATHMTU);
4850#endif
4851#ifdef IPV6_TCLASS
4852 PyModule_AddIntConstant(m, "IPV6_TCLASS", IPV6_TCLASS);
4853#endif
4854#ifdef IPV6_USE_MIN_MTU
4855 PyModule_AddIntConstant(m, "IPV6_USE_MIN_MTU", IPV6_USE_MIN_MTU);
4856#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004857
Guido van Rossum09be4091999-08-09 14:40:40 +00004858 /* TCP options */
4859#ifdef TCP_NODELAY
Fred Drake4baedc12002-04-01 14:53:37 +00004860 PyModule_AddIntConstant(m, "TCP_NODELAY", TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00004861#endif
4862#ifdef TCP_MAXSEG
Fred Drake4baedc12002-04-01 14:53:37 +00004863 PyModule_AddIntConstant(m, "TCP_MAXSEG", TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00004864#endif
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004865#ifdef TCP_CORK
Fred Drake4baedc12002-04-01 14:53:37 +00004866 PyModule_AddIntConstant(m, "TCP_CORK", TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004867#endif
4868#ifdef TCP_KEEPIDLE
Fred Drake4baedc12002-04-01 14:53:37 +00004869 PyModule_AddIntConstant(m, "TCP_KEEPIDLE", TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004870#endif
4871#ifdef TCP_KEEPINTVL
Fred Drake4baedc12002-04-01 14:53:37 +00004872 PyModule_AddIntConstant(m, "TCP_KEEPINTVL", TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004873#endif
4874#ifdef TCP_KEEPCNT
Fred Drake4baedc12002-04-01 14:53:37 +00004875 PyModule_AddIntConstant(m, "TCP_KEEPCNT", TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004876#endif
4877#ifdef TCP_SYNCNT
Fred Drake4baedc12002-04-01 14:53:37 +00004878 PyModule_AddIntConstant(m, "TCP_SYNCNT", TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004879#endif
4880#ifdef TCP_LINGER2
Fred Drake4baedc12002-04-01 14:53:37 +00004881 PyModule_AddIntConstant(m, "TCP_LINGER2", TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004882#endif
4883#ifdef TCP_DEFER_ACCEPT
Fred Drake4baedc12002-04-01 14:53:37 +00004884 PyModule_AddIntConstant(m, "TCP_DEFER_ACCEPT", TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004885#endif
4886#ifdef TCP_WINDOW_CLAMP
Fred Drake4baedc12002-04-01 14:53:37 +00004887 PyModule_AddIntConstant(m, "TCP_WINDOW_CLAMP", TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004888#endif
4889#ifdef TCP_INFO
Fred Drake4baedc12002-04-01 14:53:37 +00004890 PyModule_AddIntConstant(m, "TCP_INFO", TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004891#endif
4892#ifdef TCP_QUICKACK
Fred Drake4baedc12002-04-01 14:53:37 +00004893 PyModule_AddIntConstant(m, "TCP_QUICKACK", TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004894#endif
4895
Guido van Rossum09be4091999-08-09 14:40:40 +00004896
4897 /* IPX options */
4898#ifdef IPX_TYPE
Fred Drake4baedc12002-04-01 14:53:37 +00004899 PyModule_AddIntConstant(m, "IPX_TYPE", IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00004900#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004901
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004902 /* get{addr,name}info parameters */
4903#ifdef EAI_ADDRFAMILY
Fred Drake4baedc12002-04-01 14:53:37 +00004904 PyModule_AddIntConstant(m, "EAI_ADDRFAMILY", EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004905#endif
4906#ifdef EAI_AGAIN
Fred Drake4baedc12002-04-01 14:53:37 +00004907 PyModule_AddIntConstant(m, "EAI_AGAIN", EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004908#endif
4909#ifdef EAI_BADFLAGS
Fred Drake4baedc12002-04-01 14:53:37 +00004910 PyModule_AddIntConstant(m, "EAI_BADFLAGS", EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004911#endif
4912#ifdef EAI_FAIL
Fred Drake4baedc12002-04-01 14:53:37 +00004913 PyModule_AddIntConstant(m, "EAI_FAIL", EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004914#endif
4915#ifdef EAI_FAMILY
Fred Drake4baedc12002-04-01 14:53:37 +00004916 PyModule_AddIntConstant(m, "EAI_FAMILY", EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004917#endif
4918#ifdef EAI_MEMORY
Fred Drake4baedc12002-04-01 14:53:37 +00004919 PyModule_AddIntConstant(m, "EAI_MEMORY", EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004920#endif
4921#ifdef EAI_NODATA
Fred Drake4baedc12002-04-01 14:53:37 +00004922 PyModule_AddIntConstant(m, "EAI_NODATA", EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004923#endif
4924#ifdef EAI_NONAME
Fred Drake4baedc12002-04-01 14:53:37 +00004925 PyModule_AddIntConstant(m, "EAI_NONAME", EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004926#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00004927#ifdef EAI_OVERFLOW
4928 PyModule_AddIntConstant(m, "EAI_OVERFLOW", EAI_OVERFLOW);
4929#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004930#ifdef EAI_SERVICE
Fred Drake4baedc12002-04-01 14:53:37 +00004931 PyModule_AddIntConstant(m, "EAI_SERVICE", EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004932#endif
4933#ifdef EAI_SOCKTYPE
Fred Drake4baedc12002-04-01 14:53:37 +00004934 PyModule_AddIntConstant(m, "EAI_SOCKTYPE", EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004935#endif
4936#ifdef EAI_SYSTEM
Fred Drake4baedc12002-04-01 14:53:37 +00004937 PyModule_AddIntConstant(m, "EAI_SYSTEM", EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004938#endif
4939#ifdef EAI_BADHINTS
Fred Drake4baedc12002-04-01 14:53:37 +00004940 PyModule_AddIntConstant(m, "EAI_BADHINTS", EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004941#endif
4942#ifdef EAI_PROTOCOL
Fred Drake4baedc12002-04-01 14:53:37 +00004943 PyModule_AddIntConstant(m, "EAI_PROTOCOL", EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004944#endif
4945#ifdef EAI_MAX
Fred Drake4baedc12002-04-01 14:53:37 +00004946 PyModule_AddIntConstant(m, "EAI_MAX", EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004947#endif
4948#ifdef AI_PASSIVE
Fred Drake4baedc12002-04-01 14:53:37 +00004949 PyModule_AddIntConstant(m, "AI_PASSIVE", AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004950#endif
4951#ifdef AI_CANONNAME
Fred Drake4baedc12002-04-01 14:53:37 +00004952 PyModule_AddIntConstant(m, "AI_CANONNAME", AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004953#endif
4954#ifdef AI_NUMERICHOST
Fred Drake4baedc12002-04-01 14:53:37 +00004955 PyModule_AddIntConstant(m, "AI_NUMERICHOST", AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004956#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00004957#ifdef AI_NUMERICSERV
4958 PyModule_AddIntConstant(m, "AI_NUMERICSERV", AI_NUMERICSERV);
4959#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004960#ifdef AI_MASK
Fred Drake4baedc12002-04-01 14:53:37 +00004961 PyModule_AddIntConstant(m, "AI_MASK", AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004962#endif
4963#ifdef AI_ALL
Fred Drake4baedc12002-04-01 14:53:37 +00004964 PyModule_AddIntConstant(m, "AI_ALL", AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004965#endif
4966#ifdef AI_V4MAPPED_CFG
Fred Drake4baedc12002-04-01 14:53:37 +00004967 PyModule_AddIntConstant(m, "AI_V4MAPPED_CFG", AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004968#endif
4969#ifdef AI_ADDRCONFIG
Fred Drake4baedc12002-04-01 14:53:37 +00004970 PyModule_AddIntConstant(m, "AI_ADDRCONFIG", AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004971#endif
4972#ifdef AI_V4MAPPED
Fred Drake4baedc12002-04-01 14:53:37 +00004973 PyModule_AddIntConstant(m, "AI_V4MAPPED", AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004974#endif
4975#ifdef AI_DEFAULT
Fred Drake4baedc12002-04-01 14:53:37 +00004976 PyModule_AddIntConstant(m, "AI_DEFAULT", AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004977#endif
4978#ifdef NI_MAXHOST
Fred Drake4baedc12002-04-01 14:53:37 +00004979 PyModule_AddIntConstant(m, "NI_MAXHOST", NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004980#endif
4981#ifdef NI_MAXSERV
Fred Drake4baedc12002-04-01 14:53:37 +00004982 PyModule_AddIntConstant(m, "NI_MAXSERV", NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004983#endif
4984#ifdef NI_NOFQDN
Fred Drake4baedc12002-04-01 14:53:37 +00004985 PyModule_AddIntConstant(m, "NI_NOFQDN", NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004986#endif
4987#ifdef NI_NUMERICHOST
Fred Drake4baedc12002-04-01 14:53:37 +00004988 PyModule_AddIntConstant(m, "NI_NUMERICHOST", NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004989#endif
4990#ifdef NI_NAMEREQD
Fred Drake4baedc12002-04-01 14:53:37 +00004991 PyModule_AddIntConstant(m, "NI_NAMEREQD", NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004992#endif
4993#ifdef NI_NUMERICSERV
Fred Drake4baedc12002-04-01 14:53:37 +00004994 PyModule_AddIntConstant(m, "NI_NUMERICSERV", NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004995#endif
4996#ifdef NI_DGRAM
Fred Drake4baedc12002-04-01 14:53:37 +00004997 PyModule_AddIntConstant(m, "NI_DGRAM", NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004998#endif
4999
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005000 /* shutdown() parameters */
5001#ifdef SHUT_RD
5002 PyModule_AddIntConstant(m, "SHUT_RD", SHUT_RD);
5003#elif defined(SD_RECEIVE)
5004 PyModule_AddIntConstant(m, "SHUT_RD", SD_RECEIVE);
5005#else
5006 PyModule_AddIntConstant(m, "SHUT_RD", 0);
5007#endif
5008#ifdef SHUT_WR
5009 PyModule_AddIntConstant(m, "SHUT_WR", SHUT_WR);
5010#elif defined(SD_SEND)
5011 PyModule_AddIntConstant(m, "SHUT_WR", SD_SEND);
5012#else
5013 PyModule_AddIntConstant(m, "SHUT_WR", 1);
5014#endif
5015#ifdef SHUT_RDWR
5016 PyModule_AddIntConstant(m, "SHUT_RDWR", SHUT_RDWR);
5017#elif defined(SD_BOTH)
5018 PyModule_AddIntConstant(m, "SHUT_RDWR", SD_BOTH);
5019#else
5020 PyModule_AddIntConstant(m, "SHUT_RDWR", 2);
5021#endif
5022
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005023 /* Initialize gethostbyname lock */
Just van Rossum1040d2c2003-05-09 07:53:18 +00005024#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
5025 netdb_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005026#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005027}
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005028
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005029
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005030#ifndef HAVE_INET_PTON
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005031
5032/* Simplistic emulation code for inet_pton that only works for IPv4 */
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005033/* These are not exposed because they do not set errno properly */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005034
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005035int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005036inet_pton(int af, const char *src, void *dst)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005037{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005038 if (af == AF_INET) {
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005039 long packed_addr;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005040 packed_addr = inet_addr(src);
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005041 if (packed_addr == INADDR_NONE)
5042 return 0;
5043 memcpy(dst, &packed_addr, 4);
5044 return 1;
5045 }
5046 /* Should set errno to EAFNOSUPPORT */
5047 return -1;
5048}
5049
Martin v. Löwisc925b1532001-07-21 09:42:15 +00005050const char *
5051inet_ntop(int af, const void *src, char *dst, socklen_t size)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005052{
5053 if (af == AF_INET) {
5054 struct in_addr packed_addr;
5055 if (size < 16)
5056 /* Should set errno to ENOSPC. */
5057 return NULL;
5058 memcpy(&packed_addr, src, sizeof(packed_addr));
5059 return strncpy(dst, inet_ntoa(packed_addr), size);
5060 }
5061 /* Should set errno to EAFNOSUPPORT */
5062 return NULL;
5063}
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005064
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005065#endif