blob: 2d3fc564c564bee88e37055c2ff271000a02a012 [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) || \
Just van Rossum16e426b2003-05-09 08:12:00 +0000164 defined(__OpenBSD__) || defined(__NetBSD__) || !defined(HAVE_GETADDRINFO))
Just van Rossum1040d2c2003-05-09 07:53:18 +0000165#define USE_GETADDRINFO_LOCK
166#endif
167
168#ifdef USE_GETADDRINFO_LOCK
169#define ACQUIRE_GETADDRINFO_LOCK PyThread_acquire_lock(netdb_lock, 1);
170#define RELEASE_GETADDRINFO_LOCK PyThread_release_lock(netdb_lock);
171#else
172#define ACQUIRE_GETADDRINFO_LOCK
173#define RELEASE_GETADDRINFO_LOCK
174#endif
175
176#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000177# include "pythread.h"
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000178#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000179
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000180#if defined(PYCC_VACPP)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000181# include <types.h>
182# include <io.h>
183# include <sys/ioctl.h>
184# include <utils.h>
185# include <ctype.h>
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000186#endif
187
Martin v. Löwis9e437302002-12-06 12:57:26 +0000188#if defined(__VMS)
189#if ! defined(_SOCKADDR_LEN)
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000190# ifdef getaddrinfo
191# undef getaddrinfo
192# endif
193# include "TCPIP_IOCTL_ROUTINE"
194#else
195# include <ioctl.h>
196#endif
Martin v. Löwis9e437302002-12-06 12:57:26 +0000197#endif
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000198
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000199#if defined(PYOS_OS2)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000200# define INCL_DOS
201# define INCL_DOSERRORS
202# define INCL_NOPMAPI
203# include <os2.h>
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000204#endif
205
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000206#if defined(__sgi) && _COMPILER_VERSION>700 && !_SGIAPI
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000207/* make sure that the reentrant (gethostbyaddr_r etc)
208 functions are declared correctly if compiling with
209 MIPSPro 7.x in ANSI C mode (default) */
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000210
Martin Blais2856e5f2006-05-26 12:03:27 +0000211/* XXX Using _SGIAPI is the wrong thing,
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000212 but I don't know what the right thing is. */
Trent Mick8ea5bdf2004-09-13 17:48:41 +0000213#undef _SGIAPI /* to avoid warning */
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000214#define _SGIAPI 1
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000215
Trent Mick8ea5bdf2004-09-13 17:48:41 +0000216#undef _XOPEN_SOURCE
217#include <sys/socket.h>
218#include <sys/types.h>
219#include <netinet/in.h>
220#ifdef _SS_ALIGNSIZE
221#define HAVE_GETADDRINFO 1
222#define HAVE_GETNAMEINFO 1
223#endif
224
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000225#define HAVE_INET_PTON
226#include <netdb.h>
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000227#endif
228
Martin Blais2856e5f2006-05-26 12:03:27 +0000229/* Irix 6.5 fails to define this variable at all. This is needed
230 for both GCC and SGI's compiler. I'd say that the SGI headers
Georg Brandldbd83392006-02-20 09:42:33 +0000231 are just busted. Same thing for Solaris. */
232#if (defined(__sgi) || defined(sun)) && !defined(INET_ADDRSTRLEN)
Anthony Baxterbab23cf2003-10-04 08:00:49 +0000233#define INET_ADDRSTRLEN 16
234#endif
235
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000236/* Generic includes */
Martin v. Löwis0e8bd7e2006-06-10 12:23:46 +0000237#ifdef HAVE_SYS_TYPES_H
Guido van Rossumb6775db1994-08-01 11:34:53 +0000238#include <sys/types.h>
Martin v. Löwis0e8bd7e2006-06-10 12:23:46 +0000239#endif
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000240
Marc-André Lemburg976ade62002-02-16 18:47:07 +0000241/* Generic socket object definitions and includes */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000242#define PySocket_BUILDING_SOCKET
Marc-André Lemburgbb8b78b2002-02-16 18:44:52 +0000243#include "socketmodule.h"
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000244
245/* Addressing includes */
246
Guido van Rossum6f489d91996-06-28 20:15:15 +0000247#ifndef MS_WINDOWS
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000248
249/* Non-MS WINDOWS includes */
250# include <netdb.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000251
Guido van Rossum9376b741999-09-15 22:01:40 +0000252/* Headers needed for inet_ntoa() and inet_addr() */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000253# ifdef __BEOS__
254# include <net/netdb.h>
255# elif defined(PYOS_OS2) && defined(PYCC_VACPP)
256# include <netdb.h>
Tim Peters603c6832001-11-05 02:45:59 +0000257typedef size_t socklen_t;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000258# else
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000259# include <arpa/inet.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000260# endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000261
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000262# ifndef RISCOS
263# include <fcntl.h>
264# else
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000265# include <sys/ioctl.h>
266# include <socklib.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000267# define NO_DUP
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000268int h_errno; /* not used */
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000269# define INET_ADDRSTRLEN 16
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000270# endif
271
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000272#else
Guido van Rossum48a680c2001-03-02 06:34:14 +0000273
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000274/* MS_WINDOWS includes */
Martin v. Löwis0e8bd7e2006-06-10 12:23:46 +0000275# ifdef HAVE_FCNTL_H
276# include <fcntl.h>
277# endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000278
Jeremy Hylton22308652001-02-02 03:23:09 +0000279#endif
280
Skip Montanaro7befb992004-02-10 16:50:21 +0000281#include <stddef.h>
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000282
283#ifndef offsetof
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000284# define offsetof(type, member) ((size_t)(&((type *)0)->member))
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000285#endif
286
Neal Norwitz39d22e52002-11-02 19:55:21 +0000287#ifndef O_NONBLOCK
288# define O_NONBLOCK O_NDELAY
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000289#endif
290
Trent Micka708d6e2004-09-07 17:48:26 +0000291/* include Python's addrinfo.h unless it causes trouble */
292#if defined(__sgi) && _COMPILER_VERSION>700 && defined(_SS_ALIGNSIZE)
293 /* Do not include addinfo.h on some newer IRIX versions.
294 * _SS_ALIGNSIZE is defined in sys/socket.h by 6.5.21,
295 * for example, but not by 6.5.10.
296 */
Martin v. Löwis0e8bd7e2006-06-10 12:23:46 +0000297#elif defined(_MSC_VER) && _MSC_VER>1201
Trent Micka708d6e2004-09-07 17:48:26 +0000298 /* Do not include addrinfo.h for MSVC7 or greater. 'addrinfo' and
299 * EAI_* constants are defined in (the already included) ws2tcpip.h.
300 */
301#else
302# include "addrinfo.h"
303#endif
Jason Tishlerc246cb72004-08-09 13:25:59 +0000304
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000305#ifndef HAVE_INET_PTON
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000306int inet_pton(int af, const char *src, void *dst);
Martin v. Löwisc925b1532001-07-21 09:42:15 +0000307const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000308#endif
309
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000310#ifdef __APPLE__
311/* On OS X, getaddrinfo returns no error indication of lookup
312 failure, so we must use the emulation instead of the libinfo
313 implementation. Unfortunately, performing an autoconf test
314 for this bug would require DNS access for the machine performing
315 the configuration, which is not acceptable. Therefore, we
316 determine the bug just by checking for __APPLE__. If this bug
317 gets ever fixed, perhaps checking for sys/version.h would be
318 appropriate, which is 10/0 on the system with the bug. */
Jack Jansen84262fb2002-07-02 14:40:42 +0000319#ifndef HAVE_GETNAMEINFO
320/* This bug seems to be fixed in Jaguar. Ths easiest way I could
321 Find to check for Jaguar is that it has getnameinfo(), which
322 older releases don't have */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000323#undef HAVE_GETADDRINFO
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000324#endif
Ronald Oussorend06b6f22006-04-23 11:59:25 +0000325
326#ifdef HAVE_INET_ATON
327#define USE_INET_ATON_WEAKLINK
328#endif
329
Jack Jansen84262fb2002-07-02 14:40:42 +0000330#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000331
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000332/* I know this is a bad practice, but it is the easiest... */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000333#if !defined(HAVE_GETADDRINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000334/* avoid clashes with the C library definition of the symbol. */
335#define getaddrinfo fake_getaddrinfo
336#define gai_strerror fake_gai_strerror
337#define freeaddrinfo fake_freeaddrinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000338#include "getaddrinfo.c"
339#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000340#if !defined(HAVE_GETNAMEINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000341#define getnameinfo fake_getnameinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000342#include "getnameinfo.c"
343#endif
344
Guido van Rossumbcc20741998-08-04 22:53:56 +0000345#if defined(MS_WINDOWS) || defined(__BEOS__)
346/* BeOS suffers from the same socket dichotomy as Win32... - [cjh] */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000347/* seem to be a few differences in the API */
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000348#define SOCKETCLOSE closesocket
Guido van Rossumbe32c891996-06-20 16:25:29 +0000349#define NO_DUP /* Actually it exists on NT 3.5, but what the heck... */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000350#endif
351
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000352#ifdef MS_WIN32
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000353#define EAFNOSUPPORT WSAEAFNOSUPPORT
354#define snprintf _snprintf
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000355#endif
Fred Drakea04eaad2000-06-30 02:46:07 +0000356
Andrew MacIntyreba43e872002-03-03 03:03:52 +0000357#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000358#define SOCKETCLOSE soclose
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000359#define NO_DUP /* Sockets are Not Actual File Handles under OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000360#endif
361
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000362#ifndef SOCKETCLOSE
363#define SOCKETCLOSE close
364#endif
365
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000366#ifdef __VMS
367/* TCP/IP Services for VMS uses a maximum send/revc buffer length of 65535 */
368#define SEGMENT_SIZE 65535
369#endif
370
Hye-Shik Chang81268602004-02-02 06:05:24 +0000371#if defined(HAVE_BLUETOOTH_H) || defined(HAVE_BLUETOOTH_BLUETOOTH_H)
372#define USE_BLUETOOTH 1
373#if defined(__FreeBSD__)
374#define BTPROTO_L2CAP BLUETOOTH_PROTO_L2CAP
375#define BTPROTO_RFCOMM BLUETOOTH_PROTO_RFCOMM
376#define sockaddr_l2 sockaddr_l2cap
377#define sockaddr_rc sockaddr_rfcomm
378#define _BT_SOCKADDR_MEMB(s, proto) &((s)->sock_addr)
379#define _BT_L2_MEMB(sa, memb) ((sa)->l2cap_##memb)
380#define _BT_RC_MEMB(sa, memb) ((sa)->rfcomm_##memb)
381#else
Anthony Baxter5d7c0672004-02-16 05:35:28 +0000382#define _BT_SOCKADDR_MEMB(s, proto) (&((s)->sock_addr).bt_##proto)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000383#define _BT_L2_MEMB(sa, memb) ((sa)->l2_##memb)
384#define _BT_RC_MEMB(sa, memb) ((sa)->rc_##memb)
385#define _BT_SCO_MEMB(sa, memb) ((sa)->sco_##memb)
386#endif
387#endif
388
Martin v. Löwise9416172003-05-03 10:12:45 +0000389/*
390 * Constants for getnameinfo()
391 */
392#if !defined(NI_MAXHOST)
393#define NI_MAXHOST 1025
394#endif
395#if !defined(NI_MAXSERV)
396#define NI_MAXSERV 32
397#endif
398
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000399/* XXX There's a problem here: *static* functions are not supposed to have
400 a Py prefix (or use CapitalizedWords). Later... */
401
Guido van Rossum30a685f1991-06-27 15:51:29 +0000402/* Global variable holding the exception type for errors detected
403 by this module (but not argument type or memory errors, etc.). */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000404static PyObject *socket_error;
405static PyObject *socket_herror;
406static PyObject *socket_gaierror;
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000407static PyObject *socket_timeout;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000408
Guido van Rossum48a680c2001-03-02 06:34:14 +0000409#ifdef RISCOS
410/* Global variable which is !=0 if Python is running in a RISC OS taskwindow */
411static int taskwindow;
412#endif
413
Tim Peters643a7fc2002-02-17 04:13:21 +0000414/* A forward reference to the socket type object.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000415 The sock_type variable contains pointers to various functions,
416 some of which call new_sockobject(), which uses sock_type, so
Tim Peters643a7fc2002-02-17 04:13:21 +0000417 there has to be a circular reference. */
Jeremy Hylton938ace62002-07-17 16:30:39 +0000418static PyTypeObject sock_type;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000419
Neal Norwitz082b2df2006-02-07 07:04:46 +0000420/* Can we call select() with this socket without a buffer overrun? */
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000421#ifdef Py_SOCKET_FD_CAN_BE_GE_FD_SETSIZE
422/* Platform can select file descriptors beyond FD_SETSIZE */
423#define IS_SELECTABLE(s) 1
424#else
425/* POSIX says selecting file descriptors beyond FD_SETSIZE
426 has undefined behaviour. */
Neal Norwitz082b2df2006-02-07 07:04:46 +0000427#define IS_SELECTABLE(s) ((s)->sock_fd < FD_SETSIZE)
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000428#endif
Neal Norwitz082b2df2006-02-07 07:04:46 +0000429
430static PyObject*
431select_error(void)
432{
433 PyErr_SetString(socket_error, "unable to select on socket");
434 return NULL;
435}
436
Guido van Rossum30a685f1991-06-27 15:51:29 +0000437/* Convenience function to raise an error according to errno
438 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000439
Guido van Rossum73624e91994-10-10 17:59:00 +0000440static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000441set_error(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000442{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000443#ifdef MS_WINDOWS
Mark Hammond46a733d2000-07-24 01:45:11 +0000444 int err_no = WSAGetLastError();
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000445 static struct {
446 int no;
447 const char *msg;
448 } *msgp, msgs[] = {
449 {WSAEINTR, "Interrupted system call"},
450 {WSAEBADF, "Bad file descriptor"},
451 {WSAEACCES, "Permission denied"},
452 {WSAEFAULT, "Bad address"},
453 {WSAEINVAL, "Invalid argument"},
454 {WSAEMFILE, "Too many open files"},
455 {WSAEWOULDBLOCK,
456 "The socket operation could not complete "
457 "without blocking"},
458 {WSAEINPROGRESS, "Operation now in progress"},
459 {WSAEALREADY, "Operation already in progress"},
460 {WSAENOTSOCK, "Socket operation on non-socket"},
461 {WSAEDESTADDRREQ, "Destination address required"},
462 {WSAEMSGSIZE, "Message too long"},
463 {WSAEPROTOTYPE, "Protocol wrong type for socket"},
464 {WSAENOPROTOOPT, "Protocol not available"},
465 {WSAEPROTONOSUPPORT, "Protocol not supported"},
466 {WSAESOCKTNOSUPPORT, "Socket type not supported"},
467 {WSAEOPNOTSUPP, "Operation not supported"},
468 {WSAEPFNOSUPPORT, "Protocol family not supported"},
469 {WSAEAFNOSUPPORT, "Address family not supported"},
470 {WSAEADDRINUSE, "Address already in use"},
471 {WSAEADDRNOTAVAIL, "Can't assign requested address"},
472 {WSAENETDOWN, "Network is down"},
473 {WSAENETUNREACH, "Network is unreachable"},
474 {WSAENETRESET, "Network dropped connection on reset"},
475 {WSAECONNABORTED, "Software caused connection abort"},
476 {WSAECONNRESET, "Connection reset by peer"},
477 {WSAENOBUFS, "No buffer space available"},
478 {WSAEISCONN, "Socket is already connected"},
479 {WSAENOTCONN, "Socket is not connected"},
480 {WSAESHUTDOWN, "Can't send after socket shutdown"},
481 {WSAETOOMANYREFS, "Too many references: can't splice"},
482 {WSAETIMEDOUT, "Operation timed out"},
483 {WSAECONNREFUSED, "Connection refused"},
484 {WSAELOOP, "Too many levels of symbolic links"},
485 {WSAENAMETOOLONG, "File name too long"},
486 {WSAEHOSTDOWN, "Host is down"},
487 {WSAEHOSTUNREACH, "No route to host"},
488 {WSAENOTEMPTY, "Directory not empty"},
489 {WSAEPROCLIM, "Too many processes"},
490 {WSAEUSERS, "Too many users"},
491 {WSAEDQUOT, "Disc quota exceeded"},
492 {WSAESTALE, "Stale NFS file handle"},
493 {WSAEREMOTE, "Too many levels of remote in path"},
494 {WSASYSNOTREADY, "Network subsystem is unvailable"},
495 {WSAVERNOTSUPPORTED, "WinSock version is not supported"},
496 {WSANOTINITIALISED,
497 "Successful WSAStartup() not yet performed"},
498 {WSAEDISCON, "Graceful shutdown in progress"},
499 /* Resolver errors */
500 {WSAHOST_NOT_FOUND, "No such host is known"},
501 {WSATRY_AGAIN, "Host not found, or server failed"},
502 {WSANO_RECOVERY, "Unexpected server error encountered"},
503 {WSANO_DATA, "Valid name without requested data"},
504 {WSANO_ADDRESS, "No address, look for MX record"},
505 {0, NULL}
506 };
Mark Hammond46a733d2000-07-24 01:45:11 +0000507 if (err_no) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000508 PyObject *v;
Mark Hammond46a733d2000-07-24 01:45:11 +0000509 const char *msg = "winsock error";
Guido van Rossum48a680c2001-03-02 06:34:14 +0000510
Mark Hammond46a733d2000-07-24 01:45:11 +0000511 for (msgp = msgs; msgp->msg; msgp++) {
512 if (err_no == msgp->no) {
513 msg = msgp->msg;
514 break;
515 }
516 }
517
518 v = Py_BuildValue("(is)", err_no, msg);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000519 if (v != NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000520 PyErr_SetObject(socket_error, v);
Guido van Rossum73624e91994-10-10 17:59:00 +0000521 Py_DECREF(v);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000522 }
523 return NULL;
524 }
525 else
526#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000527
Andrew MacIntyreba43e872002-03-03 03:03:52 +0000528#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000529 if (sock_errno() != NO_ERROR) {
530 APIRET rc;
531 ULONG msglen;
532 char outbuf[100];
533 int myerrorcode = sock_errno();
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000534
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000535 /* Retrieve socket-related error message from MPTN.MSG file */
536 rc = DosGetMessage(NULL, 0, outbuf, sizeof(outbuf),
537 myerrorcode - SOCBASEERR + 26,
538 "mptn.msg",
539 &msglen);
540 if (rc == NO_ERROR) {
541 PyObject *v;
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000542
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000543 /* OS/2 doesn't guarantee a terminator */
544 outbuf[msglen] = '\0';
545 if (strlen(outbuf) > 0) {
546 /* If non-empty msg, trim CRLF */
547 char *lastc = &outbuf[ strlen(outbuf)-1 ];
Neal Norwitz30b5c5d2005-12-19 06:05:18 +0000548 while (lastc > outbuf &&
549 isspace(Py_CHARMASK(*lastc))) {
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000550 /* Trim trailing whitespace (CRLF) */
551 *lastc-- = '\0';
552 }
553 }
554 v = Py_BuildValue("(is)", myerrorcode, outbuf);
555 if (v != NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000556 PyErr_SetObject(socket_error, v);
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000557 Py_DECREF(v);
558 }
559 return NULL;
560 }
561 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000562#endif
563
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000564#if defined(RISCOS)
565 if (_inet_error.errnum != NULL) {
566 PyObject *v;
567 v = Py_BuildValue("(is)", errno, _inet_err());
568 if (v != NULL) {
569 PyErr_SetObject(socket_error, v);
570 Py_DECREF(v);
571 }
572 return NULL;
573 }
574#endif
575
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000576 return PyErr_SetFromErrno(socket_error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000577}
578
Guido van Rossum30a685f1991-06-27 15:51:29 +0000579
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000580static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000581set_herror(int h_error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000582{
583 PyObject *v;
584
585#ifdef HAVE_HSTRERROR
586 v = Py_BuildValue("(is)", h_error, (char *)hstrerror(h_error));
587#else
588 v = Py_BuildValue("(is)", h_error, "host not found");
589#endif
590 if (v != NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000591 PyErr_SetObject(socket_herror, v);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000592 Py_DECREF(v);
593 }
594
595 return NULL;
596}
597
598
599static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000600set_gaierror(int error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000601{
602 PyObject *v;
603
Martin v. Löwis272cb402002-03-01 08:31:07 +0000604#ifdef EAI_SYSTEM
605 /* EAI_SYSTEM is not available on Windows XP. */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000606 if (error == EAI_SYSTEM)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000607 return set_error();
Martin v. Löwis272cb402002-03-01 08:31:07 +0000608#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000609
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000610#ifdef HAVE_GAI_STRERROR
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000611 v = Py_BuildValue("(is)", error, gai_strerror(error));
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000612#else
613 v = Py_BuildValue("(is)", error, "getaddrinfo failed");
614#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000615 if (v != NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000616 PyErr_SetObject(socket_gaierror, v);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000617 Py_DECREF(v);
618 }
619
620 return NULL;
621}
622
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000623/* Function to perform the setting of socket blocking mode
624 internally. block = (1 | 0). */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000625static int
626internal_setblocking(PySocketSockObject *s, int block)
627{
628#ifndef RISCOS
629#ifndef MS_WINDOWS
630 int delay_flag;
631#endif
632#endif
633
634 Py_BEGIN_ALLOW_THREADS
635#ifdef __BEOS__
636 block = !block;
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000637 setsockopt(s->sock_fd, SOL_SOCKET, SO_NONBLOCK,
638 (void *)(&block), sizeof(int));
Guido van Rossum67f7a382002-06-06 21:08:16 +0000639#else
640#ifndef RISCOS
641#ifndef MS_WINDOWS
642#if defined(PYOS_OS2) && !defined(PYCC_GCC)
643 block = !block;
644 ioctl(s->sock_fd, FIONBIO, (caddr_t)&block, sizeof(block));
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000645#elif defined(__VMS)
646 block = !block;
647 ioctl(s->sock_fd, FIONBIO, (char *)&block);
648#else /* !PYOS_OS2 && !_VMS */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000649 delay_flag = fcntl(s->sock_fd, F_GETFL, 0);
650 if (block)
Neal Norwitz39d22e52002-11-02 19:55:21 +0000651 delay_flag &= (~O_NONBLOCK);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000652 else
Neal Norwitz39d22e52002-11-02 19:55:21 +0000653 delay_flag |= O_NONBLOCK;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000654 fcntl(s->sock_fd, F_SETFL, delay_flag);
655#endif /* !PYOS_OS2 */
656#else /* MS_WINDOWS */
657 block = !block;
658 ioctlsocket(s->sock_fd, FIONBIO, (u_long*)&block);
659#endif /* MS_WINDOWS */
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000660#else /* RISCOS */
661 block = !block;
662 socketioctl(s->sock_fd, FIONBIO, (u_long*)&block);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000663#endif /* RISCOS */
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000664#endif /* __BEOS__ */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000665 Py_END_ALLOW_THREADS
666
667 /* Since these don't return anything */
668 return 1;
669}
670
Guido van Rossum11ba0942002-06-13 15:07:44 +0000671/* Do a select() on the socket, if necessary (sock_timeout > 0).
672 The argument writing indicates the direction.
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000673 This does not raise an exception; we'll let our caller do that
674 after they've reacquired the interpreter lock.
675 Returns 1 on timeout, 0 otherwise. */
676static int
Guido van Rossumb9e916a2002-06-07 01:42:47 +0000677internal_select(PySocketSockObject *s, int writing)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000678{
679 fd_set fds;
680 struct timeval tv;
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000681 int n;
Guido van Rossum11ba0942002-06-13 15:07:44 +0000682
Guido van Rossumad654902002-07-19 12:44:59 +0000683 /* Nothing to do unless we're in timeout mode (not non-blocking) */
Guido van Rossum11ba0942002-06-13 15:07:44 +0000684 if (s->sock_timeout <= 0.0)
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000685 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000686
Guido van Rossumad654902002-07-19 12:44:59 +0000687 /* Guard against closed socket */
688 if (s->sock_fd < 0)
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000689 return 0;
Guido van Rossumad654902002-07-19 12:44:59 +0000690
Guido van Rossum67f7a382002-06-06 21:08:16 +0000691 /* Construct the arguments to select */
692 tv.tv_sec = (int)s->sock_timeout;
Guido van Rossumb9e916a2002-06-07 01:42:47 +0000693 tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000694 FD_ZERO(&fds);
695 FD_SET(s->sock_fd, &fds);
696
697 /* See if the socket is ready */
Guido van Rossumb9e916a2002-06-07 01:42:47 +0000698 if (writing)
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000699 n = select(s->sock_fd+1, NULL, &fds, NULL, &tv);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000700 else
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000701 n = select(s->sock_fd+1, &fds, NULL, NULL, &tv);
702 if (n == 0)
703 return 1;
704 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000705}
706
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000707/* Initialize a new socket object. */
708
Tim Petersa12b4cf2002-07-18 22:38:44 +0000709static double defaulttimeout = -1.0; /* Default timeout for new sockets */
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000710
Mark Hammond62b1ab12002-07-23 06:31:15 +0000711PyMODINIT_FUNC
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000712init_sockobject(PySocketSockObject *s,
713 SOCKET_T fd, int family, int type, int proto)
714{
715#ifdef RISCOS
716 int block = 1;
717#endif
718 s->sock_fd = fd;
719 s->sock_family = family;
720 s->sock_type = type;
721 s->sock_proto = proto;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000722 s->sock_timeout = defaulttimeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000723
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000724 s->errorhandler = &set_error;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000725
726 if (defaulttimeout >= 0.0)
727 internal_setblocking(s, 0);
728
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000729#ifdef RISCOS
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000730 if (taskwindow)
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000731 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000732#endif
733}
734
735
Guido van Rossum30a685f1991-06-27 15:51:29 +0000736/* Create a new socket object.
737 This just creates the object and initializes it.
738 If the creation fails, return NULL and set an exception (implicit
739 in NEWOBJ()). */
740
Guido van Rossum73624e91994-10-10 17:59:00 +0000741static PySocketSockObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000742new_sockobject(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000743{
Guido van Rossum73624e91994-10-10 17:59:00 +0000744 PySocketSockObject *s;
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000745 s = (PySocketSockObject *)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000746 PyType_GenericNew(&sock_type, NULL, NULL);
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000747 if (s != NULL)
748 init_sockobject(s, fd, family, type, proto);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000749 return s;
750}
751
Guido van Rossum30a685f1991-06-27 15:51:29 +0000752
Guido van Rossum48a680c2001-03-02 06:34:14 +0000753/* Lock to allow python interpreter to continue, but only allow one
Just van Rossum1040d2c2003-05-09 07:53:18 +0000754 thread to be in gethostbyname or getaddrinfo */
755#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
756PyThread_type_lock netdb_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000757#endif
758
759
Guido van Rossum30a685f1991-06-27 15:51:29 +0000760/* Convert a string specifying a host name or one of a few symbolic
761 names to a numeric IP address. This usually calls gethostbyname()
762 to do the work; the names "" and "<broadcast>" are special.
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000763 Return the length (IPv4 should be 4 bytes), or negative if
Guido van Rossum30a685f1991-06-27 15:51:29 +0000764 an error occurred; then an exception is raised. */
765
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000766static int
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000767setipaddr(char *name, struct sockaddr *addr_ret, size_t addr_ret_size, int af)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000768{
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000769 struct addrinfo hints, *res;
770 int error;
Anthony Baxter0e85f9d2003-05-02 15:40:46 +0000771 int d1, d2, d3, d4;
772 char ch;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000773
Guido van Rossuma376cc51996-12-05 23:43:35 +0000774 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
Guido van Rossum30a685f1991-06-27 15:51:29 +0000775 if (name[0] == '\0') {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000776 int siz;
777 memset(&hints, 0, sizeof(hints));
778 hints.ai_family = af;
779 hints.ai_socktype = SOCK_DGRAM; /*dummy*/
780 hints.ai_flags = AI_PASSIVE;
Just van Rossum1040d2c2003-05-09 07:53:18 +0000781 Py_BEGIN_ALLOW_THREADS
782 ACQUIRE_GETADDRINFO_LOCK
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000783 error = getaddrinfo(NULL, "0", &hints, &res);
Just van Rossum1040d2c2003-05-09 07:53:18 +0000784 Py_END_ALLOW_THREADS
785 /* We assume that those thread-unsafe getaddrinfo() versions
786 *are* safe regarding their return value, ie. that a
787 subsequent call to getaddrinfo() does not destroy the
788 outcome of the first call. */
789 RELEASE_GETADDRINFO_LOCK
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000790 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000791 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000792 return -1;
793 }
794 switch (res->ai_family) {
795 case AF_INET:
796 siz = 4;
797 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000798#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000799 case AF_INET6:
800 siz = 16;
801 break;
802#endif
803 default:
804 freeaddrinfo(res);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000805 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000806 "unsupported address family");
807 return -1;
808 }
809 if (res->ai_next) {
Martin v. Löwisf0b11d22001-11-07 08:31:03 +0000810 freeaddrinfo(res);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000811 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000812 "wildcard resolved to multiple address");
813 return -1;
814 }
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000815 if (res->ai_addrlen < addr_ret_size)
816 addr_ret_size = res->ai_addrlen;
817 memcpy(addr_ret, res->ai_addr, addr_ret_size);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000818 freeaddrinfo(res);
819 return siz;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000820 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000821 if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000822 struct sockaddr_in *sin;
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +0000823 if (af != AF_INET && af != AF_UNSPEC) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000824 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000825 "address family mismatched");
826 return -1;
827 }
828 sin = (struct sockaddr_in *)addr_ret;
829 memset((void *) sin, '\0', sizeof(*sin));
830 sin->sin_family = AF_INET;
831#ifdef HAVE_SOCKADDR_SA_LEN
832 sin->sin_len = sizeof(*sin);
833#endif
834 sin->sin_addr.s_addr = INADDR_BROADCAST;
835 return sizeof(sin->sin_addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000836 }
Anthony Baxter0e85f9d2003-05-02 15:40:46 +0000837 if (sscanf(name, "%d.%d.%d.%d%c", &d1, &d2, &d3, &d4, &ch) == 4 &&
838 0 <= d1 && d1 <= 255 && 0 <= d2 && d2 <= 255 &&
839 0 <= d3 && d3 <= 255 && 0 <= d4 && d4 <= 255) {
840 struct sockaddr_in *sin;
841 sin = (struct sockaddr_in *)addr_ret;
842 sin->sin_addr.s_addr = htonl(
843 ((long) d1 << 24) | ((long) d2 << 16) |
844 ((long) d3 << 8) | ((long) d4 << 0));
845 sin->sin_family = AF_INET;
846#ifdef HAVE_SOCKADDR_SA_LEN
847 sin->sin_len = sizeof(*sin);
848#endif
849 return 4;
850 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000851 memset(&hints, 0, sizeof(hints));
852 hints.ai_family = af;
Just van Rossum1040d2c2003-05-09 07:53:18 +0000853 Py_BEGIN_ALLOW_THREADS
854 ACQUIRE_GETADDRINFO_LOCK
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000855 error = getaddrinfo(name, NULL, &hints, &res);
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000856#if defined(__digital__) && defined(__unix__)
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000857 if (error == EAI_NONAME && af == AF_UNSPEC) {
858 /* On Tru64 V5.1, numeric-to-addr conversion fails
859 if no address family is given. Assume IPv4 for now.*/
860 hints.ai_family = AF_INET;
861 error = getaddrinfo(name, NULL, &hints, &res);
862 }
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000863#endif
Just van Rossum1040d2c2003-05-09 07:53:18 +0000864 Py_END_ALLOW_THREADS
865 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000866 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000867 set_gaierror(error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000868 return -1;
869 }
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000870 if (res->ai_addrlen < addr_ret_size)
871 addr_ret_size = res->ai_addrlen;
872 memcpy((char *) addr_ret, res->ai_addr, addr_ret_size);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000873 freeaddrinfo(res);
874 switch (addr_ret->sa_family) {
875 case AF_INET:
876 return 4;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000877#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000878 case AF_INET6:
879 return 16;
Guido van Rossum955becc1999-03-22 20:14:53 +0000880#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000881 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000882 PyErr_SetString(socket_error, "unknown address family");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000883 return -1;
884 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000885}
886
Guido van Rossum30a685f1991-06-27 15:51:29 +0000887
Guido van Rossum30a685f1991-06-27 15:51:29 +0000888/* Create a string object representing an IP address.
889 This is always a string of the form 'dd.dd.dd.dd' (with variable
890 size numbers). */
891
Guido van Rossum73624e91994-10-10 17:59:00 +0000892static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000893makeipaddr(struct sockaddr *addr, int addrlen)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000894{
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000895 char buf[NI_MAXHOST];
896 int error;
897
898 error = getnameinfo(addr, addrlen, buf, sizeof(buf), NULL, 0,
899 NI_NUMERICHOST);
900 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000901 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000902 return NULL;
903 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000904 return PyString_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000905}
906
907
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000908#ifdef USE_BLUETOOTH
909/* Convert a string representation of a Bluetooth address into a numeric
910 address. Returns the length (6), or raises an exception and returns -1 if
911 an error occurred. */
912
913static int
914setbdaddr(char *name, bdaddr_t *bdaddr)
915{
916 unsigned int b0, b1, b2, b3, b4, b5;
917 char ch;
918 int n;
919
920 n = sscanf(name, "%X:%X:%X:%X:%X:%X%c",
921 &b5, &b4, &b3, &b2, &b1, &b0, &ch);
922 if (n == 6 && (b0 | b1 | b2 | b3 | b4 | b5) < 256) {
923 bdaddr->b[0] = b0;
924 bdaddr->b[1] = b1;
925 bdaddr->b[2] = b2;
926 bdaddr->b[3] = b3;
927 bdaddr->b[4] = b4;
928 bdaddr->b[5] = b5;
929 return 6;
930 } else {
931 PyErr_SetString(socket_error, "bad bluetooth address");
932 return -1;
933 }
934}
935
936/* Create a string representation of the Bluetooth address. This is always a
937 string of the form 'XX:XX:XX:XX:XX:XX' where XX is a two digit hexadecimal
938 value (zero padded if necessary). */
939
940static PyObject *
941makebdaddr(bdaddr_t *bdaddr)
942{
943 char buf[(6 * 2) + 5 + 1];
944
945 sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X",
946 bdaddr->b[5], bdaddr->b[4], bdaddr->b[3],
947 bdaddr->b[2], bdaddr->b[1], bdaddr->b[0]);
948 return PyString_FromString(buf);
949}
950#endif
951
952
Guido van Rossum30a685f1991-06-27 15:51:29 +0000953/* Create an object representing the given socket address,
954 suitable for passing it back to bind(), connect() etc.
955 The family field of the sockaddr structure is inspected
956 to determine what kind of address it really is. */
957
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000958/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000959static PyObject *
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000960makesockaddr(int sockfd, struct sockaddr *addr, int addrlen, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000961{
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000962 if (addrlen == 0) {
963 /* No address -- may be recvfrom() from known socket */
Guido van Rossum73624e91994-10-10 17:59:00 +0000964 Py_INCREF(Py_None);
965 return Py_None;
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000966 }
967
Guido van Rossumbcc20741998-08-04 22:53:56 +0000968#ifdef __BEOS__
Guido van Rossum2c8bcb82000-04-25 21:34:53 +0000969 /* XXX: BeOS version of accept() doesn't set family correctly */
Guido van Rossumbcc20741998-08-04 22:53:56 +0000970 addr->sa_family = AF_INET;
971#endif
972
Guido van Rossum30a685f1991-06-27 15:51:29 +0000973 switch (addr->sa_family) {
974
975 case AF_INET:
976 {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000977 struct sockaddr_in *a;
978 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
Barry Warsaw752300b1997-01-03 17:18:10 +0000979 PyObject *ret = NULL;
980 if (addrobj) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000981 a = (struct sockaddr_in *)addr;
Barry Warsaw752300b1997-01-03 17:18:10 +0000982 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
983 Py_DECREF(addrobj);
984 }
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000985 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000986 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000987
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +0000988#if defined(AF_UNIX)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000989 case AF_UNIX:
990 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000991 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Armin Rigoa9017c32006-04-19 11:50:27 +0000992#ifdef linux
993 if (a->sun_path[0] == 0) { /* Linux abstract namespace */
994 addrlen -= (sizeof(*a) - sizeof(a->sun_path));
995 return PyString_FromStringAndSize(a->sun_path,
996 addrlen);
997 }
998 else
999#endif /* linux */
1000 {
1001 /* regular NULL-terminated string */
1002 return PyString_FromString(a->sun_path);
1003 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001004 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001005#endif /* AF_UNIX */
1006
Martin v. Löwis11017b12006-01-14 18:12:57 +00001007#if defined(AF_NETLINK)
1008 case AF_NETLINK:
1009 {
1010 struct sockaddr_nl *a = (struct sockaddr_nl *) addr;
Martin v. Löwisd0560052006-01-15 07:49:20 +00001011 return Py_BuildValue("II", a->nl_pid, a->nl_groups);
Martin v. Löwis11017b12006-01-14 18:12:57 +00001012 }
1013#endif /* AF_NETLINK */
1014
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001015#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001016 case AF_INET6:
1017 {
1018 struct sockaddr_in6 *a;
1019 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
1020 PyObject *ret = NULL;
1021 if (addrobj) {
1022 a = (struct sockaddr_in6 *)addr;
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001023 ret = Py_BuildValue("Oiii",
1024 addrobj,
1025 ntohs(a->sin6_port),
1026 a->sin6_flowinfo,
1027 a->sin6_scope_id);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001028 Py_DECREF(addrobj);
1029 }
1030 return ret;
1031 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001032#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001033
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001034#ifdef USE_BLUETOOTH
1035 case AF_BLUETOOTH:
1036 switch (proto) {
1037
1038 case BTPROTO_L2CAP:
1039 {
1040 struct sockaddr_l2 *a = (struct sockaddr_l2 *) addr;
1041 PyObject *addrobj = makebdaddr(&_BT_L2_MEMB(a, bdaddr));
1042 PyObject *ret = NULL;
1043 if (addrobj) {
1044 ret = Py_BuildValue("Oi",
1045 addrobj,
1046 _BT_L2_MEMB(a, psm));
1047 Py_DECREF(addrobj);
1048 }
1049 return ret;
1050 }
1051
1052 case BTPROTO_RFCOMM:
1053 {
1054 struct sockaddr_rc *a = (struct sockaddr_rc *) addr;
1055 PyObject *addrobj = makebdaddr(&_BT_RC_MEMB(a, bdaddr));
1056 PyObject *ret = NULL;
1057 if (addrobj) {
1058 ret = Py_BuildValue("Oi",
1059 addrobj,
1060 _BT_RC_MEMB(a, channel));
1061 Py_DECREF(addrobj);
1062 }
1063 return ret;
1064 }
1065
1066#if !defined(__FreeBSD__)
1067 case BTPROTO_SCO:
1068 {
1069 struct sockaddr_sco *a = (struct sockaddr_sco *) addr;
1070 return makebdaddr(&_BT_SCO_MEMB(a, bdaddr));
1071 }
1072#endif
1073
1074 }
1075#endif
1076
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00001077#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +00001078 case AF_PACKET:
1079 {
1080 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
1081 char *ifname = "";
1082 struct ifreq ifr;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001083 /* need to look up interface name give index */
1084 if (a->sll_ifindex) {
Jeremy Hylton22308652001-02-02 03:23:09 +00001085 ifr.ifr_ifindex = a->sll_ifindex;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001086 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
Jeremy Hylton22308652001-02-02 03:23:09 +00001087 ifname = ifr.ifr_name;
Jeremy Hylton22308652001-02-02 03:23:09 +00001088 }
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001089 return Py_BuildValue("shbhs#",
1090 ifname,
1091 ntohs(a->sll_protocol),
1092 a->sll_pkttype,
1093 a->sll_hatype,
1094 a->sll_addr,
1095 a->sll_halen);
Jeremy Hylton22308652001-02-02 03:23:09 +00001096 }
1097#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001098
Guido van Rossum30a685f1991-06-27 15:51:29 +00001099 /* More cases here... */
1100
1101 default:
Guido van Rossumaa948df1997-05-07 17:41:48 +00001102 /* If we don't know the address family, don't raise an
1103 exception -- return it as a tuple. */
1104 return Py_BuildValue("is#",
1105 addr->sa_family,
1106 addr->sa_data,
1107 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001108
Guido van Rossum30a685f1991-06-27 15:51:29 +00001109 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001110}
1111
Guido van Rossum30a685f1991-06-27 15:51:29 +00001112
1113/* Parse a socket address argument according to the socket object's
1114 address family. Return 1 if the address was in the proper format,
1115 0 of not. The address is returned through addr_ret, its length
1116 through len_ret. */
1117
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001118static int
Guido van Rossum48a680c2001-03-02 06:34:14 +00001119getsockaddrarg(PySocketSockObject *s, PyObject *args,
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001120 struct sockaddr **addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001121{
Guido van Rossum30a685f1991-06-27 15:51:29 +00001122 switch (s->sock_family) {
1123
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001124#if defined(AF_UNIX)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001125 case AF_UNIX:
1126 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001127 struct sockaddr_un* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001128 char *path;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001129 int len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001130 addr = (struct sockaddr_un*)&(s->sock_addr).un;
Guido van Rossum7e488981998-10-08 02:25:24 +00001131 if (!PyArg_Parse(args, "t#", &path, &len))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001132 return 0;
Armin Rigoa9017c32006-04-19 11:50:27 +00001133#ifdef linux
1134 if (len > 0 && path[0] == 0) {
1135 /* Linux abstract namespace extension */
1136 if (len > sizeof addr->sun_path) {
1137 PyErr_SetString(socket_error,
1138 "AF_UNIX path too long");
1139 return 0;
1140 }
1141 }
1142 else
1143#endif /* linux */
1144 {
1145 /* regular NULL-terminated string */
1146 if (len >= sizeof addr->sun_path) {
1147 PyErr_SetString(socket_error,
1148 "AF_UNIX path too long");
1149 return 0;
1150 }
1151 addr->sun_path[len] = 0;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001152 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001153 addr->sun_family = s->sock_family;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001154 memcpy(addr->sun_path, path, len);
1155 *addr_ret = (struct sockaddr *) addr;
Andrew MacIntyredaedf212004-04-11 12:03:57 +00001156#if defined(PYOS_OS2)
1157 *len_ret = sizeof(*addr);
1158#else
Guido van Rossum65af28a1996-06-11 18:36:33 +00001159 *len_ret = len + sizeof(*addr) - sizeof(addr->sun_path);
Andrew MacIntyredaedf212004-04-11 12:03:57 +00001160#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001161 return 1;
1162 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001163#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001164
Martin v. Löwis11017b12006-01-14 18:12:57 +00001165#if defined(AF_NETLINK)
1166 case AF_NETLINK:
1167 {
1168 struct sockaddr_nl* addr;
1169 int pid, groups;
1170 addr = (struct sockaddr_nl *)&(s->sock_addr).nl;
1171 if (!PyTuple_Check(args)) {
1172 PyErr_Format(
1173 PyExc_TypeError,
1174 "getsockaddrarg: "
1175 "AF_NETLINK address must be tuple, not %.500s",
1176 args->ob_type->tp_name);
1177 return 0;
1178 }
1179 if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &pid, &groups))
1180 return 0;
1181 addr->nl_family = AF_NETLINK;
1182 addr->nl_pid = pid;
1183 addr->nl_groups = groups;
1184 *addr_ret = (struct sockaddr *) addr;
1185 *len_ret = sizeof(*addr);
1186 return 1;
1187 }
1188#endif
1189
Guido van Rossum30a685f1991-06-27 15:51:29 +00001190 case AF_INET:
1191 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001192 struct sockaddr_in* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001193 char *host;
Martin v. Löwis5db099a2003-08-07 11:55:15 +00001194 int port, result;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001195 addr=(struct sockaddr_in*)&(s->sock_addr).in;
Guido van Rossume4dad902000-12-01 13:13:11 +00001196 if (!PyTuple_Check(args)) {
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001197 PyErr_Format(
1198 PyExc_TypeError,
1199 "getsockaddrarg: "
1200 "AF_INET address must be tuple, not %.500s",
1201 args->ob_type->tp_name);
Guido van Rossume4dad902000-12-01 13:13:11 +00001202 return 0;
1203 }
Martin Blais2856e5f2006-05-26 12:03:27 +00001204 if (!PyArg_ParseTuple(args, "eti:getsockaddrarg",
Martin v. Löwis2548c732003-04-18 10:39:54 +00001205 "idna", &host, &port))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001206 return 0;
Martin Blais2856e5f2006-05-26 12:03:27 +00001207 result = setipaddr(host, (struct sockaddr *)addr,
Martin v. Löwis5db099a2003-08-07 11:55:15 +00001208 sizeof(*addr), AF_INET);
1209 PyMem_Free(host);
1210 if (result < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001211 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001212 addr->sin_family = AF_INET;
Guido van Rossum644a12b1997-04-09 19:24:53 +00001213 addr->sin_port = htons((short)port);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001214 *addr_ret = (struct sockaddr *) addr;
1215 *len_ret = sizeof *addr;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001216 return 1;
1217 }
1218
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001219#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001220 case AF_INET6:
1221 {
1222 struct sockaddr_in6* addr;
1223 char *host;
Martin v. Löwis5db099a2003-08-07 11:55:15 +00001224 int port, flowinfo, scope_id, result;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001225 addr = (struct sockaddr_in6*)&(s->sock_addr).in6;
1226 flowinfo = scope_id = 0;
Thomas Wouters04520492006-04-25 15:08:10 +00001227 if (!PyTuple_Check(args)) {
1228 PyErr_Format(
1229 PyExc_TypeError,
1230 "getsockaddrarg: "
1231 "AF_INET6 address must be tuple, not %.500s",
1232 args->ob_type->tp_name);
1233 return 0;
1234 }
Martin Blais2856e5f2006-05-26 12:03:27 +00001235 if (!PyArg_ParseTuple(args, "eti|ii",
Martin v. Löwis2548c732003-04-18 10:39:54 +00001236 "idna", &host, &port, &flowinfo,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001237 &scope_id)) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001238 return 0;
1239 }
Martin Blais2856e5f2006-05-26 12:03:27 +00001240 result = setipaddr(host, (struct sockaddr *)addr,
Martin v. Löwis5db099a2003-08-07 11:55:15 +00001241 sizeof(*addr), AF_INET6);
1242 PyMem_Free(host);
1243 if (result < 0)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001244 return 0;
1245 addr->sin6_family = s->sock_family;
1246 addr->sin6_port = htons((short)port);
1247 addr->sin6_flowinfo = flowinfo;
1248 addr->sin6_scope_id = scope_id;
1249 *addr_ret = (struct sockaddr *) addr;
1250 *len_ret = sizeof *addr;
1251 return 1;
1252 }
1253#endif
1254
Hye-Shik Chang81268602004-02-02 06:05:24 +00001255#ifdef USE_BLUETOOTH
Martin v. Löwis12af0482004-01-31 12:34:17 +00001256 case AF_BLUETOOTH:
1257 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001258 switch (s->sock_proto) {
1259 case BTPROTO_L2CAP:
Martin v. Löwis12af0482004-01-31 12:34:17 +00001260 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001261 struct sockaddr_l2 *addr = (struct sockaddr_l2 *) _BT_SOCKADDR_MEMB(s, l2);
1262 char *straddr;
Martin v. Löwis12af0482004-01-31 12:34:17 +00001263
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001264 _BT_L2_MEMB(addr, family) = AF_BLUETOOTH;
1265 if (!PyArg_ParseTuple(args, "si", &straddr,
1266 &_BT_L2_MEMB(addr, psm))) {
1267 PyErr_SetString(socket_error, "getsockaddrarg: "
1268 "wrong format");
Martin v. Löwis12af0482004-01-31 12:34:17 +00001269 return 0;
1270 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001271 if (setbdaddr(straddr, &_BT_L2_MEMB(addr, bdaddr)) < 0)
1272 return 0;
1273
1274 *addr_ret = (struct sockaddr *) addr;
1275 *len_ret = sizeof *addr;
1276 return 1;
1277 }
1278 case BTPROTO_RFCOMM:
1279 {
1280 struct sockaddr_rc *addr = (struct sockaddr_rc *) _BT_SOCKADDR_MEMB(s, rc);
1281 char *straddr;
1282
1283 _BT_RC_MEMB(addr, family) = AF_BLUETOOTH;
1284 if (!PyArg_ParseTuple(args, "si", &straddr,
1285 &_BT_RC_MEMB(addr, channel))) {
1286 PyErr_SetString(socket_error, "getsockaddrarg: "
1287 "wrong format");
1288 return 0;
1289 }
1290 if (setbdaddr(straddr, &_BT_RC_MEMB(addr, bdaddr)) < 0)
1291 return 0;
1292
1293 *addr_ret = (struct sockaddr *) addr;
1294 *len_ret = sizeof *addr;
1295 return 1;
1296 }
1297#if !defined(__FreeBSD__)
1298 case BTPROTO_SCO:
1299 {
1300 struct sockaddr_sco *addr = (struct sockaddr_sco *) _BT_SOCKADDR_MEMB(s, sco);
1301 char *straddr;
1302
1303 _BT_SCO_MEMB(addr, family) = AF_BLUETOOTH;
1304 straddr = PyString_AsString(args);
1305 if (straddr == NULL) {
1306 PyErr_SetString(socket_error, "getsockaddrarg: "
1307 "wrong format");
1308 return 0;
1309 }
1310 if (setbdaddr(straddr, &_BT_SCO_MEMB(addr, bdaddr)) < 0)
1311 return 0;
1312
1313 *addr_ret = (struct sockaddr *) addr;
1314 *len_ret = sizeof *addr;
1315 return 1;
1316 }
1317#endif
1318 default:
1319 PyErr_SetString(socket_error, "getsockaddrarg: unknown Bluetooth protocol");
1320 return 0;
Martin v. Löwis12af0482004-01-31 12:34:17 +00001321 }
1322 }
1323#endif
1324
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00001325#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +00001326 case AF_PACKET:
1327 {
1328 struct sockaddr_ll* addr;
1329 struct ifreq ifr;
1330 char *interfaceName;
1331 int protoNumber;
1332 int hatype = 0;
1333 int pkttype = 0;
Andrew M. Kuchlingb8e17172004-07-10 23:39:35 +00001334 char *haddr = NULL;
1335 unsigned int halen = 0;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001336
Thomas Wouters04520492006-04-25 15:08:10 +00001337 if (!PyTuple_Check(args)) {
1338 PyErr_Format(
1339 PyExc_TypeError,
1340 "getsockaddrarg: "
1341 "AF_PACKET address must be tuple, not %.500s",
1342 args->ob_type->tp_name);
1343 return 0;
1344 }
Andrew M. Kuchlingb8e17172004-07-10 23:39:35 +00001345 if (!PyArg_ParseTuple(args, "si|iis#", &interfaceName,
1346 &protoNumber, &pkttype, &hatype,
1347 &haddr, &halen))
Jeremy Hylton22308652001-02-02 03:23:09 +00001348 return 0;
1349 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
1350 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001351 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001352 s->errorhandler();
Jeremy Hylton22308652001-02-02 03:23:09 +00001353 return 0;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001354 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001355 addr = &(s->sock_addr.ll);
1356 addr->sll_family = AF_PACKET;
1357 addr->sll_protocol = htons((short)protoNumber);
1358 addr->sll_ifindex = ifr.ifr_ifindex;
1359 addr->sll_pkttype = pkttype;
1360 addr->sll_hatype = hatype;
Andrew M. Kuchlingb8e17172004-07-10 23:39:35 +00001361 if (halen > 8) {
1362 PyErr_SetString(PyExc_ValueError,
1363 "Hardware address must be 8 bytes or less");
1364 return 0;
1365 }
1366 if (halen != 0) {
1367 memcpy(&addr->sll_addr, haddr, halen);
1368 }
1369 addr->sll_halen = halen;
Jeremy Hylton22308652001-02-02 03:23:09 +00001370 *addr_ret = (struct sockaddr *) addr;
1371 *len_ret = sizeof *addr;
1372 return 1;
1373 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00001374#endif
1375
Guido van Rossum30a685f1991-06-27 15:51:29 +00001376 /* More cases here... */
1377
1378 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001379 PyErr_SetString(socket_error, "getsockaddrarg: bad family");
Guido van Rossum30a685f1991-06-27 15:51:29 +00001380 return 0;
1381
1382 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001383}
1384
Guido van Rossum30a685f1991-06-27 15:51:29 +00001385
Guido van Rossum48a680c2001-03-02 06:34:14 +00001386/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +00001387 Return 1 if the family is known, 0 otherwise. The length is returned
1388 through len_ret. */
1389
1390static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +00001391getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +00001392{
1393 switch (s->sock_family) {
1394
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001395#if defined(AF_UNIX)
Guido van Rossum710e1df1992-06-12 10:39:36 +00001396 case AF_UNIX:
1397 {
1398 *len_ret = sizeof (struct sockaddr_un);
1399 return 1;
1400 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001401#endif /* AF_UNIX */
Martin v. Löwis11017b12006-01-14 18:12:57 +00001402#if defined(AF_NETLINK)
1403 case AF_NETLINK:
1404 {
1405 *len_ret = sizeof (struct sockaddr_nl);
1406 return 1;
1407 }
1408#endif
Guido van Rossum710e1df1992-06-12 10:39:36 +00001409
1410 case AF_INET:
1411 {
1412 *len_ret = sizeof (struct sockaddr_in);
1413 return 1;
1414 }
1415
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001416#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001417 case AF_INET6:
1418 {
1419 *len_ret = sizeof (struct sockaddr_in6);
1420 return 1;
1421 }
1422#endif
1423
Hye-Shik Chang81268602004-02-02 06:05:24 +00001424#ifdef USE_BLUETOOTH
Martin v. Löwis12af0482004-01-31 12:34:17 +00001425 case AF_BLUETOOTH:
1426 {
1427 switch(s->sock_proto)
1428 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001429
1430 case BTPROTO_L2CAP:
1431 *len_ret = sizeof (struct sockaddr_l2);
1432 return 1;
1433 case BTPROTO_RFCOMM:
1434 *len_ret = sizeof (struct sockaddr_rc);
1435 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00001436#if !defined(__FreeBSD__)
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001437 case BTPROTO_SCO:
1438 *len_ret = sizeof (struct sockaddr_sco);
1439 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00001440#endif
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001441 default:
1442 PyErr_SetString(socket_error, "getsockaddrlen: "
1443 "unknown BT protocol");
1444 return 0;
1445
Martin v. Löwis12af0482004-01-31 12:34:17 +00001446 }
1447 }
1448#endif
1449
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00001450#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +00001451 case AF_PACKET:
1452 {
1453 *len_ret = sizeof (struct sockaddr_ll);
1454 return 1;
1455 }
1456#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001457
Guido van Rossum710e1df1992-06-12 10:39:36 +00001458 /* More cases here... */
1459
1460 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001461 PyErr_SetString(socket_error, "getsockaddrlen: bad family");
Guido van Rossum710e1df1992-06-12 10:39:36 +00001462 return 0;
1463
1464 }
1465}
1466
1467
Guido van Rossum30a685f1991-06-27 15:51:29 +00001468/* s.accept() method */
1469
Guido van Rossum73624e91994-10-10 17:59:00 +00001470static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001471sock_accept(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001472{
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001473 sock_addr_t addrbuf;
Fred Drakea04eaad2000-06-30 02:46:07 +00001474 SOCKET_T newfd;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001475 socklen_t addrlen;
Barry Warsaw752300b1997-01-03 17:18:10 +00001476 PyObject *sock = NULL;
1477 PyObject *addr = NULL;
1478 PyObject *res = NULL;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001479 int timeout;
Barry Warsaw752300b1997-01-03 17:18:10 +00001480
Guido van Rossum710e1df1992-06-12 10:39:36 +00001481 if (!getsockaddrlen(s, &addrlen))
1482 return NULL;
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001483 memset(&addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001484
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001485#ifdef MS_WINDOWS
1486 newfd = INVALID_SOCKET;
1487#else
1488 newfd = -1;
1489#endif
1490
Neal Norwitz082b2df2006-02-07 07:04:46 +00001491 if (!IS_SELECTABLE(s))
1492 return select_error();
1493
Guido van Rossum73624e91994-10-10 17:59:00 +00001494 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001495 timeout = internal_select(s, 0);
1496 if (!timeout)
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001497 newfd = accept(s->sock_fd, (struct sockaddr *) &addrbuf,
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001498 &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001499 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001500
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001501 if (timeout) {
1502 PyErr_SetString(socket_timeout, "timed out");
1503 return NULL;
1504 }
1505
Fred Drakea04eaad2000-06-30 02:46:07 +00001506#ifdef MS_WINDOWS
1507 if (newfd == INVALID_SOCKET)
1508#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001509 if (newfd < 0)
Fred Drakea04eaad2000-06-30 02:46:07 +00001510#endif
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001511 return s->errorhandler();
Barry Warsaw752300b1997-01-03 17:18:10 +00001512
Guido van Rossum30a685f1991-06-27 15:51:29 +00001513 /* Create the new object with unspecified family,
1514 to avoid calls to bind() etc. on it. */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001515 sock = (PyObject *) new_sockobject(newfd,
1516 s->sock_family,
1517 s->sock_type,
1518 s->sock_proto);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001519
Barry Warsaw752300b1997-01-03 17:18:10 +00001520 if (sock == NULL) {
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001521 SOCKETCLOSE(newfd);
Barry Warsaw752300b1997-01-03 17:18:10 +00001522 goto finally;
1523 }
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001524 addr = makesockaddr(s->sock_fd, (struct sockaddr *) &addrbuf,
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001525 addrlen, s->sock_proto);
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001526 if (addr == NULL)
Barry Warsaw752300b1997-01-03 17:18:10 +00001527 goto finally;
1528
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001529 res = PyTuple_Pack(2, sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00001530
Guido van Rossum67f7a382002-06-06 21:08:16 +00001531finally:
Guido van Rossum73624e91994-10-10 17:59:00 +00001532 Py_XDECREF(sock);
1533 Py_XDECREF(addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001534 return res;
1535}
1536
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001537PyDoc_STRVAR(accept_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001538"accept() -> (socket object, address info)\n\
1539\n\
1540Wait for an incoming connection. Return a new socket representing the\n\
1541connection, and the address of the client. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001542info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001543
Guido van Rossum11ba0942002-06-13 15:07:44 +00001544/* s.setblocking(flag) method. Argument:
1545 False -- non-blocking mode; same as settimeout(0)
1546 True -- blocking mode; same as settimeout(None)
1547*/
Guido van Rossume4485b01994-09-07 14:32:49 +00001548
Guido van Rossum73624e91994-10-10 17:59:00 +00001549static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001550sock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00001551{
1552 int block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001553
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001554 block = PyInt_AsLong(arg);
1555 if (block == -1 && PyErr_Occurred())
Guido van Rossume4485b01994-09-07 14:32:49 +00001556 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001557
Guido van Rossum11ba0942002-06-13 15:07:44 +00001558 s->sock_timeout = block ? -1.0 : 0.0;
Guido van Rossume8008f02002-06-07 03:36:20 +00001559 internal_setblocking(s, block);
Guido van Rossume4485b01994-09-07 14:32:49 +00001560
Guido van Rossum73624e91994-10-10 17:59:00 +00001561 Py_INCREF(Py_None);
1562 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +00001563}
Guido van Rossume4485b01994-09-07 14:32:49 +00001564
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001565PyDoc_STRVAR(setblocking_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001566"setblocking(flag)\n\
1567\n\
1568Set the socket to blocking (flag is true) or non-blocking (false).\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00001569setblocking(True) is equivalent to settimeout(None);\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001570setblocking(False) is equivalent to settimeout(0.0).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001571
Guido van Rossum11ba0942002-06-13 15:07:44 +00001572/* s.settimeout(timeout) method. Argument:
1573 None -- no timeout, blocking mode; same as setblocking(True)
1574 0.0 -- non-blocking mode; same as setblocking(False)
1575 > 0 -- timeout mode; operations time out after timeout seconds
1576 < 0 -- illegal; raises an exception
1577*/
Guido van Rossum67f7a382002-06-06 21:08:16 +00001578static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001579sock_settimeout(PySocketSockObject *s, PyObject *arg)
Guido van Rossum67f7a382002-06-06 21:08:16 +00001580{
Guido van Rossum11ba0942002-06-13 15:07:44 +00001581 double timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001582
1583 if (arg == Py_None)
Guido van Rossum11ba0942002-06-13 15:07:44 +00001584 timeout = -1.0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001585 else {
Guido van Rossum11ba0942002-06-13 15:07:44 +00001586 timeout = PyFloat_AsDouble(arg);
1587 if (timeout < 0.0) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00001588 if (!PyErr_Occurred())
1589 PyErr_SetString(PyExc_ValueError,
Guido van Rossum11ba0942002-06-13 15:07:44 +00001590 "Timeout value out of range");
Guido van Rossum67f7a382002-06-06 21:08:16 +00001591 return NULL;
1592 }
1593 }
1594
Guido van Rossum11ba0942002-06-13 15:07:44 +00001595 s->sock_timeout = timeout;
1596 internal_setblocking(s, timeout < 0.0);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001597
1598 Py_INCREF(Py_None);
1599 return Py_None;
1600}
1601
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001602PyDoc_STRVAR(settimeout_doc,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001603"settimeout(timeout)\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00001604\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00001605Set a timeout on socket operations. 'timeout' can be a float,\n\
1606giving in seconds, or None. Setting a timeout of None disables\n\
1607the timeout feature and is equivalent to setblocking(1).\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001608Setting a timeout of zero is the same as setblocking(0).");
Guido van Rossum67f7a382002-06-06 21:08:16 +00001609
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001610/* s.gettimeout() method.
1611 Returns the timeout associated with a socket. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00001612static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001613sock_gettimeout(PySocketSockObject *s)
Guido van Rossum67f7a382002-06-06 21:08:16 +00001614{
1615 if (s->sock_timeout < 0.0) {
1616 Py_INCREF(Py_None);
1617 return Py_None;
1618 }
1619 else
1620 return PyFloat_FromDouble(s->sock_timeout);
1621}
1622
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001623PyDoc_STRVAR(gettimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00001624"gettimeout() -> timeout\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00001625\n\
1626Returns the timeout in floating seconds associated with socket \n\
1627operations. A timeout of None indicates that timeouts on socket \n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001628operations are disabled.");
Guido van Rossume4485b01994-09-07 14:32:49 +00001629
Guido van Rossum48a680c2001-03-02 06:34:14 +00001630#ifdef RISCOS
1631/* s.sleeptaskw(1 | 0) method */
1632
1633static PyObject *
Martin v. Löwisa94568a2003-05-10 07:36:56 +00001634sock_sleeptaskw(PySocketSockObject *s,PyObject *arg)
Guido van Rossum48a680c2001-03-02 06:34:14 +00001635{
Guido van Rossum67f7a382002-06-06 21:08:16 +00001636 int block;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00001637 block = PyInt_AsLong(arg);
1638 if (block == -1 && PyErr_Occurred())
Guido van Rossum67f7a382002-06-06 21:08:16 +00001639 return NULL;
1640 Py_BEGIN_ALLOW_THREADS
1641 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
1642 Py_END_ALLOW_THREADS
Guido van Rossum48a680c2001-03-02 06:34:14 +00001643
Guido van Rossum67f7a382002-06-06 21:08:16 +00001644 Py_INCREF(Py_None);
1645 return Py_None;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001646}
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001647PyDoc_STRVAR(sleeptaskw_doc,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001648"sleeptaskw(flag)\n\
1649\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001650Allow sleeps in taskwindows.");
Guido van Rossum48a680c2001-03-02 06:34:14 +00001651#endif
1652
1653
Guido van Rossumaee08791992-09-08 09:05:33 +00001654/* s.setsockopt() method.
1655 With an integer third argument, sets an integer option.
1656 With a string third argument, sets an option from a buffer;
1657 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001658
Guido van Rossum73624e91994-10-10 17:59:00 +00001659static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001660sock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001661{
1662 int level;
1663 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001664 int res;
Guido van Rossumaee08791992-09-08 09:05:33 +00001665 char *buf;
1666 int buflen;
1667 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001668
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001669 if (PyArg_ParseTuple(args, "iii:setsockopt",
1670 &level, &optname, &flag)) {
Guido van Rossumaee08791992-09-08 09:05:33 +00001671 buf = (char *) &flag;
1672 buflen = sizeof flag;
1673 }
1674 else {
Guido van Rossum73624e91994-10-10 17:59:00 +00001675 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001676 if (!PyArg_ParseTuple(args, "iis#:setsockopt",
1677 &level, &optname, &buf, &buflen))
Guido van Rossumaee08791992-09-08 09:05:33 +00001678 return NULL;
1679 }
Thomas Wouters334fb892000-07-25 12:56:38 +00001680 res = setsockopt(s->sock_fd, level, optname, (void *)buf, buflen);
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001681 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001682 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001683 Py_INCREF(Py_None);
1684 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001685}
1686
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001687PyDoc_STRVAR(setsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001688"setsockopt(level, option, value)\n\
1689\n\
1690Set a socket option. See the Unix manual for level and option.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001691The value argument can either be an integer or a string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001692
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001693
Guido van Rossumaee08791992-09-08 09:05:33 +00001694/* s.getsockopt() method.
1695 With two arguments, retrieves an integer option.
1696 With a third integer argument, retrieves a string buffer of that size;
1697 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001698
Guido van Rossum73624e91994-10-10 17:59:00 +00001699static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001700sock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001701{
1702 int level;
1703 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001704 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +00001705 PyObject *buf;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001706 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001707
Guido van Rossumbcc20741998-08-04 22:53:56 +00001708#ifdef __BEOS__
Fred Drake564a6cc2001-05-11 20:12:26 +00001709 /* We have incomplete socket support. */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001710 PyErr_SetString(socket_error, "getsockopt not supported");
Guido van Rossumbcc20741998-08-04 22:53:56 +00001711 return NULL;
1712#else
1713
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001714 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
1715 &level, &optname, &buflen))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001716 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001717
Guido van Rossumbe32c891996-06-20 16:25:29 +00001718 if (buflen == 0) {
Guido van Rossumaee08791992-09-08 09:05:33 +00001719 int flag = 0;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001720 socklen_t flagsize = sizeof flag;
Guido van Rossumb376a4a1993-11-23 17:53:17 +00001721 res = getsockopt(s->sock_fd, level, optname,
Thomas Wouters334fb892000-07-25 12:56:38 +00001722 (void *)&flag, &flagsize);
Guido van Rossumaee08791992-09-08 09:05:33 +00001723 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001724 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001725 return PyInt_FromLong(flag);
Guido van Rossumaee08791992-09-08 09:05:33 +00001726 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001727#ifdef __VMS
1728 if (buflen > 1024) {
1729#else
Guido van Rossumaee08791992-09-08 09:05:33 +00001730 if (buflen <= 0 || buflen > 1024) {
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001731#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001732 PyErr_SetString(socket_error,
Barry Warsaw752300b1997-01-03 17:18:10 +00001733 "getsockopt buflen out of range");
Guido van Rossumaee08791992-09-08 09:05:33 +00001734 return NULL;
1735 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001736 buf = PyString_FromStringAndSize((char *)NULL, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001737 if (buf == NULL)
1738 return NULL;
Guido van Rossumb376a4a1993-11-23 17:53:17 +00001739 res = getsockopt(s->sock_fd, level, optname,
Fred Drake564a6cc2001-05-11 20:12:26 +00001740 (void *)PyString_AS_STRING(buf), &buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001741 if (res < 0) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001742 Py_DECREF(buf);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001743 return s->errorhandler();
Guido van Rossumaee08791992-09-08 09:05:33 +00001744 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001745 _PyString_Resize(&buf, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001746 return buf;
Guido van Rossumbcc20741998-08-04 22:53:56 +00001747#endif /* __BEOS__ */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001748}
1749
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001750PyDoc_STRVAR(getsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001751"getsockopt(level, option[, buffersize]) -> value\n\
1752\n\
1753Get a socket option. See the Unix manual for level and option.\n\
1754If a nonzero buffersize argument is given, the return value is a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001755string of that length; otherwise it is an integer.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001756
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001757
Fred Drake728819a2000-07-01 03:40:12 +00001758/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001759
Guido van Rossum73624e91994-10-10 17:59:00 +00001760static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001761sock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001762{
1763 struct sockaddr *addr;
1764 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001765 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001766
Fred Drake728819a2000-07-01 03:40:12 +00001767 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001768 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001769 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001770 res = bind(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001771 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001772 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001773 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001774 Py_INCREF(Py_None);
1775 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001776}
1777
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001778PyDoc_STRVAR(bind_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001779"bind(address)\n\
1780\n\
1781Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00001782pair (host, port); the host must refer to the local host. For raw packet\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001783sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001784
Guido van Rossum30a685f1991-06-27 15:51:29 +00001785
1786/* s.close() method.
1787 Set the file descriptor to -1 so operations tried subsequently
1788 will surely fail. */
1789
Guido van Rossum73624e91994-10-10 17:59:00 +00001790static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001791sock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001792{
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001793 SOCKET_T fd;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001794
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001795 if ((fd = s->sock_fd) != -1) {
1796 s->sock_fd = -1;
Guido van Rossum08481461996-10-12 14:07:22 +00001797 Py_BEGIN_ALLOW_THREADS
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001798 (void) SOCKETCLOSE(fd);
Guido van Rossum08481461996-10-12 14:07:22 +00001799 Py_END_ALLOW_THREADS
1800 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001801 Py_INCREF(Py_None);
1802 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001803}
1804
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001805PyDoc_STRVAR(close_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001806"close()\n\
1807\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001808Close the socket. It cannot be used after this call.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001809
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001810static int
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001811internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen,
1812 int *timeoutp)
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001813{
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001814 int res, timeout;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001815
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001816 timeout = 0;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001817 res = connect(s->sock_fd, addr, addrlen);
1818
1819#ifdef MS_WINDOWS
1820
1821 if (s->sock_timeout > 0.0) {
Neal Norwitz082b2df2006-02-07 07:04:46 +00001822 if (res < 0 && WSAGetLastError() == WSAEWOULDBLOCK &&
1823 IS_SELECTABLE(s)) {
Guido van Rossumb76bdf82003-02-19 17:50:16 +00001824 /* This is a mess. Best solution: trust select */
1825 fd_set fds;
Mark Hammonda57ec932004-08-03 05:06:26 +00001826 fd_set fds_exc;
Guido van Rossumb76bdf82003-02-19 17:50:16 +00001827 struct timeval tv;
1828 tv.tv_sec = (int)s->sock_timeout;
1829 tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6);
1830 FD_ZERO(&fds);
1831 FD_SET(s->sock_fd, &fds);
Mark Hammonda57ec932004-08-03 05:06:26 +00001832 FD_ZERO(&fds_exc);
1833 FD_SET(s->sock_fd, &fds_exc);
1834 res = select(s->sock_fd+1, NULL, &fds, &fds_exc, &tv);
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001835 if (res == 0) {
Guido van Rossumb76bdf82003-02-19 17:50:16 +00001836 res = WSAEWOULDBLOCK;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001837 timeout = 1;
Mark Hammonda57ec932004-08-03 05:06:26 +00001838 } else if (res > 0) {
1839 if (FD_ISSET(s->sock_fd, &fds))
1840 /* The socket is in the writeable set - this
1841 means connected */
1842 res = 0;
1843 else {
1844 /* As per MS docs, we need to call getsockopt()
1845 to get the underlying error */
1846 int res_size = sizeof res;
1847 /* It must be in the exception set */
1848 assert(FD_ISSET(s->sock_fd, &fds_exc));
Martin Blais2856e5f2006-05-26 12:03:27 +00001849 if (0 == getsockopt(s->sock_fd, SOL_SOCKET, SO_ERROR,
Mark Hammonda57ec932004-08-03 05:06:26 +00001850 (char *)&res, &res_size))
1851 /* getsockopt also clears WSAGetLastError,
1852 so reset it back. */
1853 WSASetLastError(res);
1854 else
1855 res = WSAGetLastError();
1856 }
1857 }
Guido van Rossumb76bdf82003-02-19 17:50:16 +00001858 /* else if (res < 0) an error occurred */
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001859 }
1860 }
1861
1862 if (res < 0)
1863 res = WSAGetLastError();
1864
1865#else
1866
1867 if (s->sock_timeout > 0.0) {
Neal Norwitz082b2df2006-02-07 07:04:46 +00001868 if (res < 0 && errno == EINPROGRESS && IS_SELECTABLE(s)) {
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001869 timeout = internal_select(s, 1);
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001870 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum12e3c712002-08-08 20:39:30 +00001871 if (res < 0 && errno == EISCONN)
1872 res = 0;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001873 }
1874 }
1875
1876 if (res < 0)
1877 res = errno;
1878
1879#endif
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001880 *timeoutp = timeout;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001881
1882 return res;
1883}
Guido van Rossum30a685f1991-06-27 15:51:29 +00001884
Fred Drake728819a2000-07-01 03:40:12 +00001885/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001886
Guido van Rossum73624e91994-10-10 17:59:00 +00001887static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001888sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001889{
1890 struct sockaddr *addr;
1891 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001892 int res;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001893 int timeout;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001894
Fred Drake728819a2000-07-01 03:40:12 +00001895 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001896 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001897
Guido van Rossum73624e91994-10-10 17:59:00 +00001898 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001899 res = internal_connect(s, addr, addrlen, &timeout);
Guido van Rossum11ba0942002-06-13 15:07:44 +00001900 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001901
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001902 if (timeout) {
1903 PyErr_SetString(socket_timeout, "timed out");
1904 return NULL;
1905 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001906 if (res != 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001907 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001908 Py_INCREF(Py_None);
1909 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001910}
1911
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001912PyDoc_STRVAR(connect_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001913"connect(address)\n\
1914\n\
1915Connect the socket to a remote address. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001916is a pair (host, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001917
Guido van Rossum30a685f1991-06-27 15:51:29 +00001918
Fred Drake728819a2000-07-01 03:40:12 +00001919/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001920
1921static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001922sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001923{
1924 struct sockaddr *addr;
1925 int addrlen;
1926 int res;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001927 int timeout;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001928
Fred Drake728819a2000-07-01 03:40:12 +00001929 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001930 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001931
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001932 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001933 res = internal_connect(s, addr, addrlen, &timeout);
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001934 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001935
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001936 return PyInt_FromLong((long) res);
1937}
1938
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001939PyDoc_STRVAR(connect_ex_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00001940"connect_ex(address) -> errno\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00001941\n\
1942This is like connect(address), but returns an error code (the errno value)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001943instead of raising an exception when an error occurs.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001944
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001945
Guido van Rossumed233a51992-06-23 09:07:03 +00001946/* s.fileno() method */
1947
Guido van Rossum73624e91994-10-10 17:59:00 +00001948static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001949sock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00001950{
Fred Drakea04eaad2000-06-30 02:46:07 +00001951#if SIZEOF_SOCKET_T <= SIZEOF_LONG
Guido van Rossum73624e91994-10-10 17:59:00 +00001952 return PyInt_FromLong((long) s->sock_fd);
Fred Drakea04eaad2000-06-30 02:46:07 +00001953#else
Martin v. Löwisb9a0f912003-03-29 10:06:18 +00001954 return PyLong_FromLongLong((PY_LONG_LONG)s->sock_fd);
Fred Drakea04eaad2000-06-30 02:46:07 +00001955#endif
Guido van Rossumed233a51992-06-23 09:07:03 +00001956}
1957
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001958PyDoc_STRVAR(fileno_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001959"fileno() -> integer\n\
1960\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001961Return the integer file descriptor of the socket.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001962
Guido van Rossumed233a51992-06-23 09:07:03 +00001963
Guido van Rossumbe32c891996-06-20 16:25:29 +00001964#ifndef NO_DUP
1965/* s.dup() method */
1966
1967static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001968sock_dup(PySocketSockObject *s)
Guido van Rossumbe32c891996-06-20 16:25:29 +00001969{
Fred Drakea04eaad2000-06-30 02:46:07 +00001970 SOCKET_T newfd;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001971 PyObject *sock;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001972
Guido van Rossumbe32c891996-06-20 16:25:29 +00001973 newfd = dup(s->sock_fd);
1974 if (newfd < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001975 return s->errorhandler();
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001976 sock = (PyObject *) new_sockobject(newfd,
1977 s->sock_family,
1978 s->sock_type,
1979 s->sock_proto);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001980 if (sock == NULL)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001981 SOCKETCLOSE(newfd);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001982 return sock;
1983}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001984
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001985PyDoc_STRVAR(dup_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001986"dup() -> socket object\n\
1987\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001988Return a new socket object connected to the same system resource.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001989
Guido van Rossumbe32c891996-06-20 16:25:29 +00001990#endif
1991
1992
Guido van Rossumc89705d1992-11-26 08:54:07 +00001993/* s.getsockname() method */
1994
Guido van Rossum73624e91994-10-10 17:59:00 +00001995static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001996sock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001997{
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001998 sock_addr_t addrbuf;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001999 int res;
2000 socklen_t addrlen;
2001
Guido van Rossumc89705d1992-11-26 08:54:07 +00002002 if (!getsockaddrlen(s, &addrlen))
2003 return NULL;
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00002004 memset(&addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00002005 Py_BEGIN_ALLOW_THREADS
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00002006 res = getsockname(s->sock_fd, (struct sockaddr *) &addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00002007 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00002008 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002009 return s->errorhandler();
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00002010 return makesockaddr(s->sock_fd, (struct sockaddr *) &addrbuf, addrlen,
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00002011 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002012}
2013
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002014PyDoc_STRVAR(getsockname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002015"getsockname() -> address info\n\
2016\n\
2017Return the address of the local endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002018info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002019
Guido van Rossumc89705d1992-11-26 08:54:07 +00002020
Guido van Rossumb6775db1994-08-01 11:34:53 +00002021#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002022/* s.getpeername() method */
2023
Guido van Rossum73624e91994-10-10 17:59:00 +00002024static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002025sock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002026{
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00002027 sock_addr_t addrbuf;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002028 int res;
2029 socklen_t addrlen;
2030
Guido van Rossumc89705d1992-11-26 08:54:07 +00002031 if (!getsockaddrlen(s, &addrlen))
2032 return NULL;
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00002033 memset(&addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00002034 Py_BEGIN_ALLOW_THREADS
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00002035 res = getpeername(s->sock_fd, (struct sockaddr *) &addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00002036 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00002037 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002038 return s->errorhandler();
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00002039 return makesockaddr(s->sock_fd, (struct sockaddr *) &addrbuf, addrlen,
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00002040 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002041}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002042
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002043PyDoc_STRVAR(getpeername_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002044"getpeername() -> address info\n\
2045\n\
2046Return the address of the remote endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002047info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002048
Guido van Rossumb6775db1994-08-01 11:34:53 +00002049#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002050
2051
Guido van Rossum30a685f1991-06-27 15:51:29 +00002052/* s.listen(n) method */
2053
Guido van Rossum73624e91994-10-10 17:59:00 +00002054static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002055sock_listen(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002056{
2057 int backlog;
Guido van Rossumff4949e1992-08-05 19:58:53 +00002058 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002059
2060 backlog = PyInt_AsLong(arg);
2061 if (backlog == -1 && PyErr_Occurred())
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002062 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00002063 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +00002064 if (backlog < 1)
2065 backlog = 1;
Guido van Rossumff4949e1992-08-05 19:58:53 +00002066 res = listen(s->sock_fd, backlog);
Guido van Rossum73624e91994-10-10 17:59:00 +00002067 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002068 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002069 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00002070 Py_INCREF(Py_None);
2071 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002072}
2073
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002074PyDoc_STRVAR(listen_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002075"listen(backlog)\n\
2076\n\
2077Enable a server to accept connections. The backlog argument must be at\n\
2078least 1; it specifies the number of unaccepted connection that the system\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002079will allow before refusing new connections.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002080
2081
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002082#ifndef NO_DUP
Guido van Rossum30a685f1991-06-27 15:51:29 +00002083/* s.makefile(mode) method.
2084 Create a new open file object referring to a dupped version of
2085 the socket's file descriptor. (The dup() call is necessary so
2086 that the open file and socket objects may be closed independent
2087 of each other.)
2088 The mode argument specifies 'r' or 'w' passed to fdopen(). */
2089
Guido van Rossum73624e91994-10-10 17:59:00 +00002090static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002091sock_makefile(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002092{
Tim Petersdbd9ba62000-07-09 03:09:57 +00002093 extern int fclose(FILE *);
Guido van Rossum6b144911995-03-14 15:05:13 +00002094 char *mode = "r";
2095 int bufsize = -1;
Fred Drakea04eaad2000-06-30 02:46:07 +00002096#ifdef MS_WIN32
Tim Peters79248aa2001-08-29 21:37:10 +00002097 Py_intptr_t fd;
Fred Drakea04eaad2000-06-30 02:46:07 +00002098#else
Guido van Rossum30a685f1991-06-27 15:51:29 +00002099 int fd;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002100#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00002101 FILE *fp;
Guido van Rossum6b144911995-03-14 15:05:13 +00002102 PyObject *f;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002103#ifdef __VMS
2104 char *mode_r = "r";
2105 char *mode_w = "w";
2106#endif
Guido van Rossum6b144911995-03-14 15:05:13 +00002107
Guido van Rossum43713e52000-02-29 13:59:29 +00002108 if (!PyArg_ParseTuple(args, "|si:makefile", &mode, &bufsize))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002109 return NULL;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002110#ifdef __VMS
2111 if (strcmp(mode,"rb") == 0) {
2112 mode = mode_r;
2113 }
2114 else {
2115 if (strcmp(mode,"wb") == 0) {
2116 mode = mode_w;
2117 }
2118 }
2119#endif
Guido van Rossum8d665e61996-06-26 18:22:49 +00002120#ifdef MS_WIN32
Guido van Rossum82a5c661998-07-07 20:45:43 +00002121 if (((fd = _open_osfhandle(s->sock_fd, _O_BINARY)) < 0) ||
2122 ((fd = dup(fd)) < 0) || ((fp = fdopen(fd, mode)) == NULL))
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00002123#else
Guido van Rossum82a5c661998-07-07 20:45:43 +00002124 if ((fd = dup(s->sock_fd)) < 0 || (fp = fdopen(fd, mode)) == NULL)
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00002125#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00002126 {
Guido van Rossum6b144911995-03-14 15:05:13 +00002127 if (fd >= 0)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00002128 SOCKETCLOSE(fd);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002129 return s->errorhandler();
Guido van Rossum6b144911995-03-14 15:05:13 +00002130 }
2131 f = PyFile_FromFile(fp, "<socket>", mode, fclose);
2132 if (f != NULL)
2133 PyFile_SetBufSize(f, bufsize);
2134 return f;
Guido van Rossum30a685f1991-06-27 15:51:29 +00002135}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002136
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002137PyDoc_STRVAR(makefile_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002138"makefile([mode[, buffersize]]) -> file object\n\
2139\n\
2140Return a regular file object corresponding to the socket.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002141The mode and buffersize arguments are as for the built-in open() function.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002142
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002143#endif /* NO_DUP */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002144
Martin Blais2856e5f2006-05-26 12:03:27 +00002145/*
Martin Blaisaf2ae722006-06-04 13:49:49 +00002146 * This is the guts of the recv() and recv_into() methods, which reads into a
Martin Blais2856e5f2006-05-26 12:03:27 +00002147 * char buffer. If you have any inc/def ref to do to the objects that contain
2148 * the buffer, do it in the caller. This function returns the number of bytes
2149 * succesfully read. If there was an error, it returns -1. Note that it is
2150 * also possible that we return a number of bytes smaller than the request
2151 * bytes.
2152 */
Martin Blaisaf2ae722006-06-04 13:49:49 +00002153static ssize_t
Martin Blais2856e5f2006-05-26 12:03:27 +00002154sock_recv_guts(PySocketSockObject *s, char* cbuf, int len, int flags)
2155{
Martin Blaisaf2ae722006-06-04 13:49:49 +00002156 ssize_t outlen = 0;
2157 int timeout;
Martin Blais2856e5f2006-05-26 12:03:27 +00002158#ifdef __VMS
2159 int remaining, nread;
2160 char *read_buf;
2161#endif
2162
2163 if (!IS_SELECTABLE(s)) {
2164 select_error();
2165 return -1;
2166 }
2167
2168#ifndef __VMS
2169 Py_BEGIN_ALLOW_THREADS
2170 timeout = internal_select(s, 0);
2171 if (!timeout)
2172 outlen = recv(s->sock_fd, cbuf, len, flags);
2173 Py_END_ALLOW_THREADS
2174
2175 if (timeout) {
2176 PyErr_SetString(socket_timeout, "timed out");
2177 return -1;
2178 }
2179 if (outlen < 0) {
2180 /* Note: the call to errorhandler() ALWAYS indirectly returned
2181 NULL, so ignore its return value */
2182 s->errorhandler();
2183 return -1;
2184 }
2185#else
2186 read_buf = cbuf;
2187 remaining = len;
2188 while (remaining != 0) {
2189 unsigned int segment;
2190
2191 segment = remaining /SEGMENT_SIZE;
2192 if (segment != 0) {
2193 segment = SEGMENT_SIZE;
2194 }
2195 else {
2196 segment = remaining;
2197 }
2198
2199 Py_BEGIN_ALLOW_THREADS
2200 timeout = internal_select(s, 0);
2201 if (!timeout)
2202 nread = recv(s->sock_fd, read_buf, segment, flags);
2203 Py_END_ALLOW_THREADS
2204
2205 if (timeout) {
2206 PyErr_SetString(socket_timeout, "timed out");
2207 return -1;
2208 }
2209 if (nread < 0) {
2210 s->errorhandler();
2211 return -1;
2212 }
2213 if (nread != remaining) {
2214 read_buf += nread;
2215 break;
2216 }
2217
2218 remaining -= segment;
2219 read_buf += segment;
2220 }
2221 outlen = read_buf - cbuf;
2222#endif /* !__VMS */
2223
2224 return outlen;
2225}
2226
Guido van Rossum48a680c2001-03-02 06:34:14 +00002227
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002228/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002229
Guido van Rossum73624e91994-10-10 17:59:00 +00002230static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002231sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002232{
Martin Blaisaf2ae722006-06-04 13:49:49 +00002233 int recvlen, flags = 0;
2234 ssize_t outlen;
Guido van Rossum73624e91994-10-10 17:59:00 +00002235 PyObject *buf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002236
Martin Blais2856e5f2006-05-26 12:03:27 +00002237 if (!PyArg_ParseTuple(args, "i|i:recv", &recvlen, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00002238 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002239
Martin Blais2856e5f2006-05-26 12:03:27 +00002240 if (recvlen < 0) {
Martin v. Löwisfba64e12001-11-19 10:41:26 +00002241 PyErr_SetString(PyExc_ValueError,
Guido van Rossum11ba0942002-06-13 15:07:44 +00002242 "negative buffersize in recv");
Martin v. Löwisfba64e12001-11-19 10:41:26 +00002243 return NULL;
2244 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002245
Martin Blais2856e5f2006-05-26 12:03:27 +00002246 /* Allocate a new string. */
2247 buf = PyString_FromStringAndSize((char *) 0, recvlen);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002248 if (buf == NULL)
2249 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002250
Martin Blais2856e5f2006-05-26 12:03:27 +00002251 /* Call the guts */
Martin Blaisaf2ae722006-06-04 13:49:49 +00002252 outlen = sock_recv_guts(s, PyString_AS_STRING(buf), recvlen, flags);
Martin Blais2856e5f2006-05-26 12:03:27 +00002253 if (outlen < 0) {
2254 /* An error occured, release the string and return an
2255 error. */
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002256 Py_DECREF(buf);
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002257 return NULL;
2258 }
Martin Blais2856e5f2006-05-26 12:03:27 +00002259 if (outlen != recvlen) {
2260 /* We did not read as many bytes as we anticipated, resize the
2261 string if possible and be succesful. */
2262 if (_PyString_Resize(&buf, outlen) < 0)
2263 /* Oopsy, not so succesful after all. */
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002264 return NULL;
Martin Blais2856e5f2006-05-26 12:03:27 +00002265 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002266
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002267 return buf;
2268}
2269
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002270PyDoc_STRVAR(recv_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002271"recv(buffersize[, flags]) -> data\n\
2272\n\
2273Receive up to buffersize bytes from the socket. For the optional flags\n\
2274argument, see the Unix manual. When no data is available, block until\n\
2275at least one byte is available or until the remote end is closed. When\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002276the remote end is closed and all data is read, return the empty string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002277
Guido van Rossum30a685f1991-06-27 15:51:29 +00002278
Martin Blaisaf2ae722006-06-04 13:49:49 +00002279/* s.recv_into(buffer, [nbytes [,flags]]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002280
Martin Blais2856e5f2006-05-26 12:03:27 +00002281static PyObject*
Martin Blaisaf2ae722006-06-04 13:49:49 +00002282sock_recv_into(PySocketSockObject *s, PyObject *args, PyObject *kwds)
Martin Blais2856e5f2006-05-26 12:03:27 +00002283{
2284 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
2285
Martin Blaisaf2ae722006-06-04 13:49:49 +00002286 int recvlen = 0, flags = 0;
2287 ssize_t readlen;
Martin Blais2856e5f2006-05-26 12:03:27 +00002288 char *buf;
2289 int buflen;
2290
2291 /* Get the buffer's memory */
Martin Blaisaf2ae722006-06-04 13:49:49 +00002292 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w#|ii:recv", kwlist,
Martin Blais2856e5f2006-05-26 12:03:27 +00002293 &buf, &buflen, &recvlen, &flags))
2294 return NULL;
2295 assert(buf != 0 && buflen > 0);
2296
2297 if (recvlen < 0) {
2298 PyErr_SetString(PyExc_ValueError,
2299 "negative buffersize in recv");
2300 return NULL;
2301 }
2302 if (recvlen == 0) {
2303 /* If nbytes was not specified, use the buffer's length */
2304 recvlen = buflen;
2305 }
2306
2307 /* Check if the buffer is large enough */
2308 if (buflen < recvlen) {
2309 PyErr_SetString(PyExc_ValueError,
2310 "buffer too small for requested bytes");
2311 return NULL;
2312 }
2313
2314 /* Call the guts */
2315 readlen = sock_recv_guts(s, buf, recvlen, flags);
2316 if (readlen < 0) {
2317 /* Return an error. */
2318 return NULL;
2319 }
2320
2321 /* Return the number of bytes read. Note that we do not do anything
2322 special here in the case that readlen < recvlen. */
Martin Blaisaf2ae722006-06-04 13:49:49 +00002323 return PyInt_FromSsize_t(readlen);
Martin Blais2856e5f2006-05-26 12:03:27 +00002324}
2325
Martin Blaisaf2ae722006-06-04 13:49:49 +00002326PyDoc_STRVAR(recv_into_doc,
2327"recv_into(buffer, [nbytes[, flags]]) -> nbytes_read\n\
Martin Blais2856e5f2006-05-26 12:03:27 +00002328\n\
2329A version of recv() that stores its data into a buffer rather than creating \n\
2330a new string. Receive up to buffersize bytes from the socket. If buffersize \n\
2331is not specified (or 0), receive up to the size available in the given buffer.\n\
2332\n\
2333See recv() for documentation about the flags.");
2334
2335
2336/*
Martin Blaisaf2ae722006-06-04 13:49:49 +00002337 * This is the guts of the recv() and recv_into() methods, which reads into a
Martin Blais2856e5f2006-05-26 12:03:27 +00002338 * char buffer. If you have any inc/def ref to do to the objects that contain
2339 * the buffer, do it in the caller. This function returns the number of bytes
2340 * succesfully read. If there was an error, it returns -1. Note that it is
2341 * also possible that we return a number of bytes smaller than the request
2342 * bytes.
2343 *
2344 * 'addr' is a return value for the address object. Note that you must decref
2345 * it yourself.
2346 */
Martin Blaisaf2ae722006-06-04 13:49:49 +00002347static ssize_t
Martin Blais2856e5f2006-05-26 12:03:27 +00002348sock_recvfrom_guts(PySocketSockObject *s, char* cbuf, int len, int flags,
2349 PyObject** addr)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002350{
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00002351 sock_addr_t addrbuf;
Martin Blaisaf2ae722006-06-04 13:49:49 +00002352 int timeout;
2353 ssize_t n = 0;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002354 socklen_t addrlen;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002355
Martin Blais2856e5f2006-05-26 12:03:27 +00002356 *addr = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002357
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00002358 if (!getsockaddrlen(s, &addrlen))
Martin Blais2856e5f2006-05-26 12:03:27 +00002359 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002360
Martin Blais2856e5f2006-05-26 12:03:27 +00002361 if (!IS_SELECTABLE(s)) {
2362 select_error();
2363 return -1;
2364 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00002365
Guido van Rossum73624e91994-10-10 17:59:00 +00002366 Py_BEGIN_ALLOW_THREADS
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00002367 memset(&addrbuf, 0, addrlen);
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002368 timeout = internal_select(s, 0);
Martin v. Löwis7e75f1a2006-04-15 08:35:59 +00002369 if (!timeout) {
Guido van Rossum8d665e61996-06-26 18:22:49 +00002370#ifndef MS_WINDOWS
Andrew MacIntyreba43e872002-03-03 03:03:52 +00002371#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Martin Blais2856e5f2006-05-26 12:03:27 +00002372 n = recvfrom(s->sock_fd, cbuf, len, flags,
Martin v. Löwis7e75f1a2006-04-15 08:35:59 +00002373 (struct sockaddr *) &addrbuf, &addrlen);
Guido van Rossum32c575d1997-12-02 20:37:32 +00002374#else
Martin Blais2856e5f2006-05-26 12:03:27 +00002375 n = recvfrom(s->sock_fd, cbuf, len, flags,
Martin v. Löwis7e75f1a2006-04-15 08:35:59 +00002376 (void *) &addrbuf, &addrlen);
Guido van Rossum32c575d1997-12-02 20:37:32 +00002377#endif
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002378#else
Martin Blais2856e5f2006-05-26 12:03:27 +00002379 n = recvfrom(s->sock_fd, cbuf, len, flags,
Martin v. Löwis7e75f1a2006-04-15 08:35:59 +00002380 (struct sockaddr *) &addrbuf, &addrlen);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002381#endif
Martin v. Löwis7e75f1a2006-04-15 08:35:59 +00002382 }
Guido van Rossum73624e91994-10-10 17:59:00 +00002383 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002384
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002385 if (timeout) {
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002386 PyErr_SetString(socket_timeout, "timed out");
Martin Blais2856e5f2006-05-26 12:03:27 +00002387 return -1;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002388 }
Guido van Rossum7c53b771995-09-13 18:39:47 +00002389 if (n < 0) {
Martin Blais2856e5f2006-05-26 12:03:27 +00002390 s->errorhandler();
2391 return -1;
Guido van Rossum7c53b771995-09-13 18:39:47 +00002392 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002393
Martin Blais2856e5f2006-05-26 12:03:27 +00002394 if (!(*addr = makesockaddr(s->sock_fd, (struct sockaddr *) &addrbuf,
2395 addrlen, s->sock_proto)))
2396 return -1;
2397
2398 return n;
2399}
2400
2401/* s.recvfrom(nbytes [,flags]) method */
2402
2403static PyObject *
2404sock_recvfrom(PySocketSockObject *s, PyObject *args)
2405{
2406 PyObject *buf = NULL;
2407 PyObject *addr = NULL;
2408 PyObject *ret = NULL;
Martin Blaisaf2ae722006-06-04 13:49:49 +00002409 int recvlen, flags = 0;
2410 ssize_t outlen;
Martin Blais2856e5f2006-05-26 12:03:27 +00002411
2412 if (!PyArg_ParseTuple(args, "i|i:recvfrom", &recvlen, &flags))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002413 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002414
Martin Blais2856e5f2006-05-26 12:03:27 +00002415 buf = PyString_FromStringAndSize((char *) 0, recvlen);
2416 if (buf == NULL)
2417 return NULL;
2418
2419 outlen = sock_recvfrom_guts(s, PyString_AS_STRING(buf),
2420 recvlen, flags, &addr);
2421 if (outlen < 0) {
Barry Warsaw752300b1997-01-03 17:18:10 +00002422 goto finally;
Martin Blais2856e5f2006-05-26 12:03:27 +00002423 }
2424
2425 if (outlen != recvlen) {
2426 /* We did not read as many bytes as we anticipated, resize the
2427 string if possible and be succesful. */
2428 if (_PyString_Resize(&buf, outlen) < 0)
2429 /* Oopsy, not so succesful after all. */
2430 goto finally;
2431 }
Barry Warsaw752300b1997-01-03 17:18:10 +00002432
Raymond Hettinger8ae46892003-10-12 19:09:37 +00002433 ret = PyTuple_Pack(2, buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002434
2435finally:
Guido van Rossum73624e91994-10-10 17:59:00 +00002436 Py_XDECREF(buf);
Martin Blais2856e5f2006-05-26 12:03:27 +00002437 Py_XDECREF(addr);
Guido van Rossum6f5afc91993-02-05 09:46:15 +00002438 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002439}
2440
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002441PyDoc_STRVAR(recvfrom_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002442"recvfrom(buffersize[, flags]) -> (data, address info)\n\
2443\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002444Like recv(buffersize, flags) but also return the sender's address info.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002445
Martin Blais2856e5f2006-05-26 12:03:27 +00002446
Martin Blaisaf2ae722006-06-04 13:49:49 +00002447/* s.recvfrom_into(buffer[, nbytes [,flags]]) method */
Martin Blais2856e5f2006-05-26 12:03:27 +00002448
2449static PyObject *
Martin Blaisaf2ae722006-06-04 13:49:49 +00002450sock_recvfrom_into(PySocketSockObject *s, PyObject *args, PyObject* kwds)
Martin Blais2856e5f2006-05-26 12:03:27 +00002451{
2452 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
2453
Martin Blaisaf2ae722006-06-04 13:49:49 +00002454 int recvlen = 0, flags = 0;
2455 ssize_t readlen;
Martin Blais2856e5f2006-05-26 12:03:27 +00002456 char *buf;
2457 int buflen;
2458
2459 PyObject *addr = NULL;
Martin Blais2856e5f2006-05-26 12:03:27 +00002460
Martin Blaisaf2ae722006-06-04 13:49:49 +00002461 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w#|ii:recvfrom", kwlist,
Martin Blais2856e5f2006-05-26 12:03:27 +00002462 &buf, &buflen, &recvlen, &flags))
2463 return NULL;
2464 assert(buf != 0 && buflen > 0);
2465
2466 if (recvlen < 0) {
2467 PyErr_SetString(PyExc_ValueError,
2468 "negative buffersize in recv");
2469 return NULL;
2470 }
2471 if (recvlen == 0) {
2472 /* If nbytes was not specified, use the buffer's length */
2473 recvlen = buflen;
2474 }
2475
2476 readlen = sock_recvfrom_guts(s, buf, recvlen, flags, &addr);
2477 if (readlen < 0) {
2478 /* Return an error */
Martin Blaisaf2ae722006-06-04 13:49:49 +00002479 Py_XDECREF(addr);
2480 return NULL;
Martin Blais2856e5f2006-05-26 12:03:27 +00002481 }
2482
2483 /* Return the number of bytes read and the address. Note that we do
2484 not do anything special here in the case that readlen < recvlen. */
Neal Norwitzf0cab1f2006-06-08 05:12:45 +00002485 return Py_BuildValue("lN", readlen, addr);
Martin Blais2856e5f2006-05-26 12:03:27 +00002486}
2487
Martin Blaisaf2ae722006-06-04 13:49:49 +00002488PyDoc_STRVAR(recvfrom_into_doc,
2489"recvfrom_into(buffer[, nbytes[, flags]]) -> (nbytes, address info)\n\
Martin Blais2856e5f2006-05-26 12:03:27 +00002490\n\
Martin Blaisaf2ae722006-06-04 13:49:49 +00002491Like recv_into(buffer[, nbytes[, flags]]) but also return the sender's address info.");
Martin Blais2856e5f2006-05-26 12:03:27 +00002492
2493
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002494/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002495
Guido van Rossum73624e91994-10-10 17:59:00 +00002496static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002497sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002498{
Guido van Rossumff4949e1992-08-05 19:58:53 +00002499 char *buf;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002500 int len, n = 0, flags = 0, timeout;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002501#ifdef __VMS
2502 int send_length;
2503#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00002504
Guido van Rossum43713e52000-02-29 13:59:29 +00002505 if (!PyArg_ParseTuple(args, "s#|i:send", &buf, &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00002506 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002507
Neal Norwitz082b2df2006-02-07 07:04:46 +00002508 if (!IS_SELECTABLE(s))
2509 return select_error();
2510
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002511#ifndef __VMS
Guido van Rossum73624e91994-10-10 17:59:00 +00002512 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002513 timeout = internal_select(s, 1);
2514 if (!timeout)
2515 n = send(s->sock_fd, buf, len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00002516 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002517
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002518 if (timeout) {
2519 PyErr_SetString(socket_timeout, "timed out");
2520 return NULL;
2521 }
Guido van Rossum30a685f1991-06-27 15:51:29 +00002522 if (n < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002523 return s->errorhandler();
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002524#else
2525 /* Divide packet into smaller segments for */
2526 /* TCP/IP Services for OpenVMS */
2527 send_length = len;
2528 while (send_length != 0) {
2529 unsigned int segment;
2530
2531 segment = send_length / SEGMENT_SIZE;
2532 if (segment != 0) {
2533 segment = SEGMENT_SIZE;
2534 }
2535 else {
2536 segment = send_length;
2537 }
2538 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002539 timeout = internal_select(s, 1);
2540 if (!timeout)
2541 n = send(s->sock_fd, buf, segment, flags);
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002542 Py_END_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002543 if (timeout) {
2544 PyErr_SetString(socket_timeout, "timed out");
2545 return NULL;
2546 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002547 if (n < 0) {
2548 return s->errorhandler();
2549 }
2550 send_length -= segment;
2551 buf += segment;
2552 } /* end while */
2553#endif /* !__VMS */
Guido van Rossum73624e91994-10-10 17:59:00 +00002554 return PyInt_FromLong((long)n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00002555}
2556
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002557PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002558"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002559\n\
2560Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002561argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002562sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002563
2564
2565/* s.sendall(data [,flags]) method */
2566
2567static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002568sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002569{
2570 char *buf;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002571 int len, n = 0, flags = 0, timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002572
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002573 if (!PyArg_ParseTuple(args, "s#|i:sendall", &buf, &len, &flags))
2574 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002575
Neal Norwitz082b2df2006-02-07 07:04:46 +00002576 if (!IS_SELECTABLE(s))
2577 return select_error();
2578
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002579 Py_BEGIN_ALLOW_THREADS
2580 do {
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002581 timeout = internal_select(s, 1);
2582 if (timeout)
2583 break;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002584 n = send(s->sock_fd, buf, len, flags);
2585 if (n < 0)
2586 break;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002587 buf += n;
2588 len -= n;
2589 } while (len > 0);
2590 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002591
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002592 if (timeout) {
2593 PyErr_SetString(socket_timeout, "timed out");
2594 return NULL;
2595 }
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002596 if (n < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002597 return s->errorhandler();
Guido van Rossum67f7a382002-06-06 21:08:16 +00002598
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002599 Py_INCREF(Py_None);
2600 return Py_None;
2601}
2602
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002603PyDoc_STRVAR(sendall_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002604"sendall(data[, flags])\n\
2605\n\
2606Send a data string to the socket. For the optional flags\n\
2607argument, see the Unix manual. This calls send() repeatedly\n\
2608until all data is sent. If an error occurs, it's impossible\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002609to tell how much data has been sent.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002610
Guido van Rossum30a685f1991-06-27 15:51:29 +00002611
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002612/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002613
Guido van Rossum73624e91994-10-10 17:59:00 +00002614static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002615sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002616{
Guido van Rossum73624e91994-10-10 17:59:00 +00002617 PyObject *addro;
Guido van Rossumff4949e1992-08-05 19:58:53 +00002618 char *buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002619 struct sockaddr *addr;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002620 int addrlen, len, n = 0, flags, timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002621
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002622 flags = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002623 if (!PyArg_ParseTuple(args, "s#O:sendto", &buf, &len, &addro)) {
Guido van Rossum73624e91994-10-10 17:59:00 +00002624 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002625 if (!PyArg_ParseTuple(args, "s#iO:sendto",
2626 &buf, &len, &flags, &addro))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002627 return NULL;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002628 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002629
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002630 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002631 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002632
Neal Norwitz082b2df2006-02-07 07:04:46 +00002633 if (!IS_SELECTABLE(s))
2634 return select_error();
2635
Guido van Rossum73624e91994-10-10 17:59:00 +00002636 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002637 timeout = internal_select(s, 1);
2638 if (!timeout)
2639 n = sendto(s->sock_fd, buf, len, flags, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00002640 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002641
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002642 if (timeout) {
2643 PyErr_SetString(socket_timeout, "timed out");
2644 return NULL;
2645 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002646 if (n < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002647 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00002648 return PyInt_FromLong((long)n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002649}
2650
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002651PyDoc_STRVAR(sendto_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002652"sendto(data[, flags], address) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002653\n\
2654Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002655For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002656
Guido van Rossum30a685f1991-06-27 15:51:29 +00002657
2658/* s.shutdown(how) method */
2659
Guido van Rossum73624e91994-10-10 17:59:00 +00002660static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002661sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002662{
2663 int how;
Guido van Rossumff4949e1992-08-05 19:58:53 +00002664 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002665
2666 how = PyInt_AsLong(arg);
2667 if (how == -1 && PyErr_Occurred())
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002668 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00002669 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002670 res = shutdown(s->sock_fd, how);
Guido van Rossum73624e91994-10-10 17:59:00 +00002671 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002672 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002673 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00002674 Py_INCREF(Py_None);
2675 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002676}
2677
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002678PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002679"shutdown(flag)\n\
2680\n\
Martin v. Löwis94681fc2003-11-27 19:40:22 +00002681Shut down the reading side of the socket (flag == SHUT_RD), the writing side\n\
2682of the socket (flag == SHUT_WR), or both ends (flag == SHUT_RDWR).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002683
Guido van Rossum30a685f1991-06-27 15:51:29 +00002684
2685/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002686
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002687static PyMethodDef sock_methods[] = {
Martin Blais2856e5f2006-05-26 12:03:27 +00002688 {"accept", (PyCFunction)sock_accept, METH_NOARGS,
2689 accept_doc},
2690 {"bind", (PyCFunction)sock_bind, METH_O,
2691 bind_doc},
2692 {"close", (PyCFunction)sock_close, METH_NOARGS,
2693 close_doc},
2694 {"connect", (PyCFunction)sock_connect, METH_O,
2695 connect_doc},
2696 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
2697 connect_ex_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00002698#ifndef NO_DUP
Martin Blais2856e5f2006-05-26 12:03:27 +00002699 {"dup", (PyCFunction)sock_dup, METH_NOARGS,
2700 dup_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00002701#endif
Martin Blais2856e5f2006-05-26 12:03:27 +00002702 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
2703 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00002704#ifdef HAVE_GETPEERNAME
Martin Blais2856e5f2006-05-26 12:03:27 +00002705 {"getpeername", (PyCFunction)sock_getpeername,
2706 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00002707#endif
Martin Blais2856e5f2006-05-26 12:03:27 +00002708 {"getsockname", (PyCFunction)sock_getsockname,
2709 METH_NOARGS, getsockname_doc},
2710 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
2711 getsockopt_doc},
2712 {"listen", (PyCFunction)sock_listen, METH_O,
2713 listen_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002714#ifndef NO_DUP
Martin Blais2856e5f2006-05-26 12:03:27 +00002715 {"makefile", (PyCFunction)sock_makefile, METH_VARARGS,
2716 makefile_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002717#endif
Martin Blais2856e5f2006-05-26 12:03:27 +00002718 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
2719 recv_doc},
Martin Blaisaf2ae722006-06-04 13:49:49 +00002720 {"recv_into", (PyCFunction)sock_recv_into, METH_VARARGS | METH_KEYWORDS,
2721 recv_into_doc},
Martin Blais2856e5f2006-05-26 12:03:27 +00002722 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
2723 recvfrom_doc},
Martin Blaisaf2ae722006-06-04 13:49:49 +00002724 {"recvfrom_into", (PyCFunction)sock_recvfrom_into, METH_VARARGS | METH_KEYWORDS,
2725 recvfrom_into_doc},
Martin Blais2856e5f2006-05-26 12:03:27 +00002726 {"send", (PyCFunction)sock_send, METH_VARARGS,
2727 send_doc},
2728 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
2729 sendall_doc},
2730 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
2731 sendto_doc},
2732 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
2733 setblocking_doc},
2734 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
2735 settimeout_doc},
2736 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
2737 gettimeout_doc},
2738 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
2739 setsockopt_doc},
2740 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
2741 shutdown_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002742#ifdef RISCOS
Martin Blais2856e5f2006-05-26 12:03:27 +00002743 {"sleeptaskw", (PyCFunction)sock_sleeptaskw, METH_O,
2744 sleeptaskw_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002745#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +00002746 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002747};
2748
Georg Brandlbc45a3f2006-03-17 19:17:34 +00002749/* SockObject members */
2750static PyMemberDef sock_memberlist[] = {
2751 {"family", T_INT, offsetof(PySocketSockObject, sock_family), READONLY, "the socket family"},
2752 {"type", T_INT, offsetof(PySocketSockObject, sock_type), READONLY, "the socket type"},
2753 {"proto", T_INT, offsetof(PySocketSockObject, sock_proto), READONLY, "the socket protocol"},
2754 {"timeout", T_DOUBLE, offsetof(PySocketSockObject, sock_timeout), READONLY, "the socket timeout"},
2755 {0},
2756};
Guido van Rossum30a685f1991-06-27 15:51:29 +00002757
Guido van Rossum73624e91994-10-10 17:59:00 +00002758/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00002759 First close the file description. */
2760
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002761static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002762sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002763{
Guido van Rossumfa972c92000-04-10 12:45:45 +00002764 if (s->sock_fd != -1)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00002765 (void) SOCKETCLOSE(s->sock_fd);
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002766 s->ob_type->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002767}
2768
Guido van Rossum30a685f1991-06-27 15:51:29 +00002769
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002770static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002771sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002772{
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002773 char buf[512];
Fred Drakea04eaad2000-06-30 02:46:07 +00002774#if SIZEOF_SOCKET_T > SIZEOF_LONG
2775 if (s->sock_fd > LONG_MAX) {
2776 /* this can occur on Win64, and actually there is a special
2777 ugly printf formatter for decimal pointer length integer
2778 printing, only bother if necessary*/
2779 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002780 "no printf formatter to display "
2781 "the socket descriptor in decimal");
Fred Drakea04eaad2000-06-30 02:46:07 +00002782 return NULL;
2783 }
2784#endif
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002785 PyOS_snprintf(
2786 buf, sizeof(buf),
2787 "<socket object, fd=%ld, family=%d, type=%d, protocol=%d>",
2788 (long)s->sock_fd, s->sock_family,
2789 s->sock_type,
2790 s->sock_proto);
Guido van Rossumdc1c64a1996-02-27 15:21:19 +00002791 return PyString_FromString(buf);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002792}
2793
2794
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002795/* Create a new, uninitialized socket object. */
2796
2797static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002798sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002799{
2800 PyObject *new;
2801
2802 new = type->tp_alloc(type, 0);
Guido van Rossume1c478f2002-06-06 20:08:25 +00002803 if (new != NULL) {
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002804 ((PySocketSockObject *)new)->sock_fd = -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002805 ((PySocketSockObject *)new)->sock_timeout = -1.0;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002806 ((PySocketSockObject *)new)->errorhandler = &set_error;
Guido van Rossume1c478f2002-06-06 20:08:25 +00002807 }
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002808 return new;
2809}
2810
2811
2812/* Initialize a new socket object. */
2813
2814/*ARGSUSED*/
2815static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00002816sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002817{
2818 PySocketSockObject *s = (PySocketSockObject *)self;
2819 SOCKET_T fd;
2820 int family = AF_INET, type = SOCK_STREAM, proto = 0;
Martin v. Löwis02cbf4a2006-02-27 17:20:04 +00002821 static char *keywords[] = {"family", "type", "proto", 0};
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002822
2823 if (!PyArg_ParseTupleAndKeywords(args, kwds,
2824 "|iii:socket", keywords,
2825 &family, &type, &proto))
2826 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002827
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002828 Py_BEGIN_ALLOW_THREADS
2829 fd = socket(family, type, proto);
2830 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002831
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002832#ifdef MS_WINDOWS
2833 if (fd == INVALID_SOCKET)
2834#else
2835 if (fd < 0)
2836#endif
2837 {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002838 set_error();
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002839 return -1;
2840 }
2841 init_sockobject(s, fd, family, type, proto);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002842
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002843 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002844
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002845}
2846
2847
Guido van Rossumb6775db1994-08-01 11:34:53 +00002848/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002849
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002850static PyTypeObject sock_type = {
Guido van Rossum55558541996-05-23 22:54:50 +00002851 PyObject_HEAD_INIT(0) /* Must fill in type value later */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002852 0, /* ob_size */
Guido van Rossumca6dfa52001-10-28 12:31:33 +00002853 "_socket.socket", /* tp_name */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002854 sizeof(PySocketSockObject), /* tp_basicsize */
2855 0, /* tp_itemsize */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002856 (destructor)sock_dealloc, /* tp_dealloc */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002857 0, /* tp_print */
2858 0, /* tp_getattr */
2859 0, /* tp_setattr */
2860 0, /* tp_compare */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002861 (reprfunc)sock_repr, /* tp_repr */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002862 0, /* tp_as_number */
2863 0, /* tp_as_sequence */
2864 0, /* tp_as_mapping */
2865 0, /* tp_hash */
2866 0, /* tp_call */
2867 0, /* tp_str */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002868 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002869 0, /* tp_setattro */
2870 0, /* tp_as_buffer */
2871 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002872 sock_doc, /* tp_doc */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002873 0, /* tp_traverse */
2874 0, /* tp_clear */
2875 0, /* tp_richcompare */
2876 0, /* tp_weaklistoffset */
2877 0, /* tp_iter */
2878 0, /* tp_iternext */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002879 sock_methods, /* tp_methods */
Georg Brandlbc45a3f2006-03-17 19:17:34 +00002880 sock_memberlist, /* tp_members */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002881 0, /* tp_getset */
2882 0, /* tp_base */
2883 0, /* tp_dict */
2884 0, /* tp_descr_get */
2885 0, /* tp_descr_set */
2886 0, /* tp_dictoffset */
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00002887 sock_initobj, /* tp_init */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002888 PyType_GenericAlloc, /* tp_alloc */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002889 sock_new, /* tp_new */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002890 PyObject_Del, /* tp_free */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002891};
2892
Guido van Rossum30a685f1991-06-27 15:51:29 +00002893
Guido van Rossum81194471991-07-27 21:42:02 +00002894/* Python interface to gethostname(). */
2895
2896/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002897static PyObject *
Georg Brandl96a8c392006-05-29 21:04:52 +00002898socket_gethostname(PyObject *self, PyObject *unused)
Guido van Rossum81194471991-07-27 21:42:02 +00002899{
2900 char buf[1024];
Guido van Rossumff4949e1992-08-05 19:58:53 +00002901 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +00002902 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002903 res = gethostname(buf, (int) sizeof buf - 1);
Guido van Rossum73624e91994-10-10 17:59:00 +00002904 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002905 if (res < 0)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002906 return set_error();
Guido van Rossum81194471991-07-27 21:42:02 +00002907 buf[sizeof buf - 1] = '\0';
Guido van Rossum73624e91994-10-10 17:59:00 +00002908 return PyString_FromString(buf);
Guido van Rossum81194471991-07-27 21:42:02 +00002909}
Guido van Rossumff4949e1992-08-05 19:58:53 +00002910
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002911PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002912"gethostname() -> string\n\
2913\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002914Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002915
Guido van Rossumff4949e1992-08-05 19:58:53 +00002916
Guido van Rossum30a685f1991-06-27 15:51:29 +00002917/* Python interface to gethostbyname(name). */
2918
2919/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002920static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002921socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002922{
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002923 char *name;
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00002924 sock_addr_t addrbuf;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002925
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002926 if (!PyArg_ParseTuple(args, "s:gethostbyname", &name))
Guido van Rossum30a685f1991-06-27 15:51:29 +00002927 return NULL;
Martin v. Löwisddc6f472002-07-28 16:10:31 +00002928 if (setipaddr(name, (struct sockaddr *)&addrbuf, sizeof(addrbuf), AF_INET) < 0)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002929 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002930 return makeipaddr((struct sockaddr *)&addrbuf,
2931 sizeof(struct sockaddr_in));
Guido van Rossum30a685f1991-06-27 15:51:29 +00002932}
2933
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002934PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002935"gethostbyname(host) -> address\n\
2936\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002937Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002938
2939
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002940/* Convenience function common to gethostbyname_ex and gethostbyaddr */
2941
2942static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002943gethost_common(struct hostent *h, struct sockaddr *addr, int alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002944{
2945 char **pch;
2946 PyObject *rtn_tuple = (PyObject *)NULL;
2947 PyObject *name_list = (PyObject *)NULL;
2948 PyObject *addr_list = (PyObject *)NULL;
2949 PyObject *tmp;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002950
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002951 if (h == NULL) {
Guido van Rossum48a680c2001-03-02 06:34:14 +00002952 /* Let's get real error message to return */
Guido van Rossume2ae77b2001-10-24 20:42:55 +00002953#ifndef RISCOS
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002954 set_herror(h_errno);
Guido van Rossume2ae77b2001-10-24 20:42:55 +00002955#else
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002956 PyErr_SetString(socket_error, "host not found");
Guido van Rossume2ae77b2001-10-24 20:42:55 +00002957#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002958 return NULL;
2959 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002960
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002961 if (h->h_addrtype != af) {
2962#ifdef HAVE_STRERROR
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002963 /* Let's get real error message to return */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002964 PyErr_SetString(socket_error,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002965 (char *)strerror(EAFNOSUPPORT));
2966#else
2967 PyErr_SetString(
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002968 socket_error,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002969 "Address family not supported by protocol family");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002970#endif
2971 return NULL;
2972 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002973
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002974 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00002975
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002976 case AF_INET:
2977 if (alen < sizeof(struct sockaddr_in))
2978 return NULL;
2979 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002980
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002981#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002982 case AF_INET6:
2983 if (alen < sizeof(struct sockaddr_in6))
2984 return NULL;
2985 break;
2986#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00002987
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002988 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002989
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002990 if ((name_list = PyList_New(0)) == NULL)
2991 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002992
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002993 if ((addr_list = PyList_New(0)) == NULL)
2994 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002995
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002996 for (pch = h->h_aliases; *pch != NULL; pch++) {
2997 int status;
2998 tmp = PyString_FromString(*pch);
2999 if (tmp == NULL)
3000 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003001
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003002 status = PyList_Append(name_list, tmp);
3003 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003004
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003005 if (status)
3006 goto err;
3007 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003008
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003009 for (pch = h->h_addr_list; *pch != NULL; pch++) {
3010 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003011
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003012 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00003013
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003014 case AF_INET:
3015 {
3016 struct sockaddr_in sin;
3017 memset(&sin, 0, sizeof(sin));
3018 sin.sin_family = af;
3019#ifdef HAVE_SOCKADDR_SA_LEN
3020 sin.sin_len = sizeof(sin);
3021#endif
3022 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
3023 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
Guido van Rossum67f7a382002-06-06 21:08:16 +00003024
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003025 if (pch == h->h_addr_list && alen >= sizeof(sin))
3026 memcpy((char *) addr, &sin, sizeof(sin));
3027 break;
3028 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003029
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00003030#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003031 case AF_INET6:
3032 {
3033 struct sockaddr_in6 sin6;
3034 memset(&sin6, 0, sizeof(sin6));
3035 sin6.sin6_family = af;
3036#ifdef HAVE_SOCKADDR_SA_LEN
3037 sin6.sin6_len = sizeof(sin6);
3038#endif
3039 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
3040 tmp = makeipaddr((struct sockaddr *)&sin6,
3041 sizeof(sin6));
Guido van Rossum67f7a382002-06-06 21:08:16 +00003042
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003043 if (pch == h->h_addr_list && alen >= sizeof(sin6))
3044 memcpy((char *) addr, &sin6, sizeof(sin6));
3045 break;
3046 }
3047#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00003048
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003049 default: /* can't happen */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003050 PyErr_SetString(socket_error,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003051 "unsupported address family");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003052 return NULL;
3053 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003054
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003055 if (tmp == NULL)
3056 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003057
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003058 status = PyList_Append(addr_list, tmp);
3059 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003060
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003061 if (status)
3062 goto err;
3063 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003064
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003065 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003066
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003067 err:
3068 Py_XDECREF(name_list);
3069 Py_XDECREF(addr_list);
3070 return rtn_tuple;
3071}
3072
3073
3074/* Python interface to gethostbyname_ex(name). */
3075
3076/*ARGSUSED*/
3077static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003078socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003079{
3080 char *name;
3081 struct hostent *h;
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00003082#ifdef ENABLE_IPV6
3083 struct sockaddr_storage addr;
3084#else
3085 struct sockaddr_in addr;
3086#endif
Martin v. Löwis9db2f572001-07-23 01:30:10 +00003087 struct sockaddr *sa;
Guido van Rossum955becc1999-03-22 20:14:53 +00003088 PyObject *ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003089#ifdef HAVE_GETHOSTBYNAME_R
3090 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003091#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
3092 struct hostent_data data;
3093#else
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003094 char buf[16384];
3095 int buf_len = (sizeof buf) - 1;
3096 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003097#endif
3098#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00003099 int result;
3100#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003101#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003102
Guido van Rossum27fc3c02000-03-24 20:56:56 +00003103 if (!PyArg_ParseTuple(args, "s:gethostbyname_ex", &name))
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003104 return NULL;
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00003105 if (setipaddr(name, (struct sockaddr *)&addr, sizeof(addr), AF_INET) < 0)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003106 return NULL;
3107 Py_BEGIN_ALLOW_THREADS
3108#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003109#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003110 result = gethostbyname_r(name, &hp_allocated, buf, buf_len,
3111 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003112#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003113 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003114#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00003115 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003116 result = gethostbyname_r(name, &hp_allocated, &data);
3117 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00003118#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003119#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00003120#ifdef USE_GETHOSTBYNAME_LOCK
Just van Rossum1040d2c2003-05-09 07:53:18 +00003121 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003122#endif
3123 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003124#endif /* HAVE_GETHOSTBYNAME_R */
3125 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00003126 /* Some C libraries would require addr.__ss_family instead of
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003127 addr.ss_family.
3128 Therefore, we cast the sockaddr_storage into sockaddr to
3129 access sa_family. */
Martin v. Löwis9db2f572001-07-23 01:30:10 +00003130 sa = (struct sockaddr*)&addr;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003131 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr),
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003132 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00003133#ifdef USE_GETHOSTBYNAME_LOCK
Just van Rossum1040d2c2003-05-09 07:53:18 +00003134 PyThread_release_lock(netdb_lock);
Guido van Rossum955becc1999-03-22 20:14:53 +00003135#endif
3136 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003137}
3138
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003139PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003140"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
3141\n\
3142Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003143for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003144
3145
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003146/* Python interface to gethostbyaddr(IP). */
3147
3148/*ARGSUSED*/
3149static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003150socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003151{
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00003152#ifdef ENABLE_IPV6
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003153 struct sockaddr_storage addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003154#else
Guido van Rossum48a680c2001-03-02 06:34:14 +00003155 struct sockaddr_in addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003156#endif
3157 struct sockaddr *sa = (struct sockaddr *)&addr;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003158 char *ip_num;
3159 struct hostent *h;
Guido van Rossum3baaa131999-03-22 21:44:51 +00003160 PyObject *ret;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003161#ifdef HAVE_GETHOSTBYNAME_R
3162 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003163#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
3164 struct hostent_data data;
3165#else
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003166 char buf[16384];
3167 int buf_len = (sizeof buf) - 1;
3168 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003169#endif
3170#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00003171 int result;
3172#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003173#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003174 char *ap;
3175 int al;
3176 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003177
Guido van Rossum27fc3c02000-03-24 20:56:56 +00003178 if (!PyArg_ParseTuple(args, "s:gethostbyaddr", &ip_num))
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003179 return NULL;
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00003180 af = AF_UNSPEC;
Martin v. Löwisddc6f472002-07-28 16:10:31 +00003181 if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003182 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003183 af = sa->sa_family;
3184 ap = NULL;
3185 al = 0;
3186 switch (af) {
3187 case AF_INET:
3188 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
3189 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
3190 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00003191#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003192 case AF_INET6:
3193 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
3194 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
3195 break;
3196#endif
3197 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003198 PyErr_SetString(socket_error, "unsupported address family");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003199 return NULL;
3200 }
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003201 Py_BEGIN_ALLOW_THREADS
3202#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003203#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003204 result = gethostbyaddr_r(ap, al, af,
3205 &hp_allocated, buf, buf_len,
Guido van Rossume9cd07b1999-03-15 21:40:14 +00003206 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003207#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003208 h = gethostbyaddr_r(ap, al, af,
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003209 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003210#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00003211 memset((void *) &data, '\0', sizeof(data));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003212 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003213 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00003214#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003215#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00003216#ifdef USE_GETHOSTBYNAME_LOCK
Just van Rossum1040d2c2003-05-09 07:53:18 +00003217 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003218#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003219 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003220#endif /* HAVE_GETHOSTBYNAME_R */
3221 Py_END_ALLOW_THREADS
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003222 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00003223#ifdef USE_GETHOSTBYNAME_LOCK
Just van Rossum1040d2c2003-05-09 07:53:18 +00003224 PyThread_release_lock(netdb_lock);
Guido van Rossum3baaa131999-03-22 21:44:51 +00003225#endif
3226 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003227}
3228
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003229PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003230"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
3231\n\
3232Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003233for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003234
Guido van Rossum30a685f1991-06-27 15:51:29 +00003235
3236/* Python interface to getservbyname(name).
3237 This only returns the port number, since the other info is already
3238 known or not useful (like the list of aliases). */
3239
3240/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00003241static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003242socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003243{
Barry Warsaw11b91a02004-06-28 00:50:43 +00003244 char *name, *proto=NULL;
Guido van Rossum30a685f1991-06-27 15:51:29 +00003245 struct servent *sp;
Barry Warsaw11b91a02004-06-28 00:50:43 +00003246 if (!PyArg_ParseTuple(args, "s|s:getservbyname", &name, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +00003247 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00003248 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00003249 sp = getservbyname(name, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00003250 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00003251 if (sp == NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003252 PyErr_SetString(socket_error, "service/proto not found");
Guido van Rossum30a685f1991-06-27 15:51:29 +00003253 return NULL;
3254 }
Guido van Rossum73624e91994-10-10 17:59:00 +00003255 return PyInt_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00003256}
3257
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003258PyDoc_STRVAR(getservbyname_doc,
Barry Warsaw11b91a02004-06-28 00:50:43 +00003259"getservbyname(servicename[, protocolname]) -> integer\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003260\n\
3261Return a port number from a service name and protocol name.\n\
Barry Warsaw11b91a02004-06-28 00:50:43 +00003262The optional protocol name, if given, should be 'tcp' or 'udp',\n\
3263otherwise any protocol will match.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003264
Guido van Rossum30a685f1991-06-27 15:51:29 +00003265
Barry Warsaw11b91a02004-06-28 00:50:43 +00003266/* Python interface to getservbyport(port).
3267 This only returns the service name, since the other info is already
3268 known or not useful (like the list of aliases). */
3269
3270/*ARGSUSED*/
3271static PyObject *
3272socket_getservbyport(PyObject *self, PyObject *args)
3273{
Raymond Hettinger87de0ca2004-09-28 02:19:40 +00003274 unsigned short port;
Barry Warsaw11b91a02004-06-28 00:50:43 +00003275 char *proto=NULL;
3276 struct servent *sp;
Raymond Hettinger87de0ca2004-09-28 02:19:40 +00003277 if (!PyArg_ParseTuple(args, "H|s:getservbyport", &port, &proto))
Barry Warsaw11b91a02004-06-28 00:50:43 +00003278 return NULL;
3279 Py_BEGIN_ALLOW_THREADS
3280 sp = getservbyport(htons(port), proto);
3281 Py_END_ALLOW_THREADS
3282 if (sp == NULL) {
3283 PyErr_SetString(socket_error, "port/proto not found");
3284 return NULL;
3285 }
3286 return PyString_FromString(sp->s_name);
3287}
3288
3289PyDoc_STRVAR(getservbyport_doc,
3290"getservbyport(port[, protocolname]) -> string\n\
3291\n\
3292Return the service name from a port number and protocol name.\n\
3293The optional protocol name, if given, should be 'tcp' or 'udp',\n\
3294otherwise any protocol will match.");
3295
Guido van Rossum3901d851996-12-19 16:35:04 +00003296/* Python interface to getprotobyname(name).
3297 This only returns the protocol number, since the other info is
3298 already known or not useful (like the list of aliases). */
3299
3300/*ARGSUSED*/
3301static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003302socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00003303{
3304 char *name;
3305 struct protoent *sp;
Guido van Rossumbcc20741998-08-04 22:53:56 +00003306#ifdef __BEOS__
3307/* Not available in BeOS yet. - [cjh] */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003308 PyErr_SetString(socket_error, "getprotobyname not supported");
Guido van Rossumbcc20741998-08-04 22:53:56 +00003309 return NULL;
3310#else
Guido van Rossum27fc3c02000-03-24 20:56:56 +00003311 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
Guido van Rossum3901d851996-12-19 16:35:04 +00003312 return NULL;
3313 Py_BEGIN_ALLOW_THREADS
3314 sp = getprotobyname(name);
3315 Py_END_ALLOW_THREADS
3316 if (sp == NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003317 PyErr_SetString(socket_error, "protocol not found");
Guido van Rossum3901d851996-12-19 16:35:04 +00003318 return NULL;
3319 }
3320 return PyInt_FromLong((long) sp->p_proto);
Guido van Rossumbcc20741998-08-04 22:53:56 +00003321#endif
Guido van Rossum3901d851996-12-19 16:35:04 +00003322}
3323
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003324PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003325"getprotobyname(name) -> integer\n\
3326\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003327Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003328
Guido van Rossum3901d851996-12-19 16:35:04 +00003329
Dave Cole331708b2004-08-09 04:51:41 +00003330#ifdef HAVE_SOCKETPAIR
3331/* Create a pair of sockets using the socketpair() function.
Dave Cole07fda7e2004-08-23 05:16:23 +00003332 Arguments as for socket() except the default family is AF_UNIX if
Dave Colee8bbfe42004-08-26 00:51:16 +00003333 defined on the platform; otherwise, the default is AF_INET. */
Dave Cole331708b2004-08-09 04:51:41 +00003334
3335/*ARGSUSED*/
3336static PyObject *
3337socket_socketpair(PyObject *self, PyObject *args)
3338{
3339 PySocketSockObject *s0 = NULL, *s1 = NULL;
3340 SOCKET_T sv[2];
3341 int family, type = SOCK_STREAM, proto = 0;
3342 PyObject *res = NULL;
3343
3344#if defined(AF_UNIX)
3345 family = AF_UNIX;
3346#else
3347 family = AF_INET;
3348#endif
3349 if (!PyArg_ParseTuple(args, "|iii:socketpair",
3350 &family, &type, &proto))
3351 return NULL;
3352 /* Create a pair of socket fds */
3353 if (socketpair(family, type, proto, sv) < 0)
3354 return set_error();
Dave Cole331708b2004-08-09 04:51:41 +00003355 s0 = new_sockobject(sv[0], family, type, proto);
3356 if (s0 == NULL)
3357 goto finally;
3358 s1 = new_sockobject(sv[1], family, type, proto);
3359 if (s1 == NULL)
3360 goto finally;
3361 res = PyTuple_Pack(2, s0, s1);
3362
3363finally:
3364 if (res == NULL) {
3365 if (s0 == NULL)
3366 SOCKETCLOSE(sv[0]);
3367 if (s1 == NULL)
3368 SOCKETCLOSE(sv[1]);
3369 }
3370 Py_XDECREF(s0);
3371 Py_XDECREF(s1);
3372 return res;
3373}
3374
3375PyDoc_STRVAR(socketpair_doc,
3376"socketpair([family[, type[, proto]]]) -> (socket object, socket object)\n\
3377\n\
3378Create a pair of socket objects from the sockets returned by the platform\n\
3379socketpair() function.\n\
Dave Cole07fda7e2004-08-23 05:16:23 +00003380The arguments are the same as for socket() except the default family is\n\
Dave Colee8bbfe42004-08-26 00:51:16 +00003381AF_UNIX if defined on the platform; otherwise, the default is AF_INET.");
Dave Cole331708b2004-08-09 04:51:41 +00003382
3383#endif /* HAVE_SOCKETPAIR */
3384
3385
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00003386#ifndef NO_DUP
Guido van Rossum2a7178e1992-12-08 13:38:24 +00003387/* Create a socket object from a numeric file description.
3388 Useful e.g. if stdin is a socket.
3389 Additional arguments as for socket(). */
3390
3391/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00003392static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003393socket_fromfd(PyObject *self, PyObject *args)
Guido van Rossum2a7178e1992-12-08 13:38:24 +00003394{
Guido van Rossum73624e91994-10-10 17:59:00 +00003395 PySocketSockObject *s;
Fred Drakea04eaad2000-06-30 02:46:07 +00003396 SOCKET_T fd;
3397 int family, type, proto = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00003398 if (!PyArg_ParseTuple(args, "iii|i:fromfd",
3399 &fd, &family, &type, &proto))
Guido van Rossumbe32c891996-06-20 16:25:29 +00003400 return NULL;
Guido van Rossum5f59d601992-12-14 16:59:51 +00003401 /* Dup the fd so it and the socket can be closed independently */
3402 fd = dup(fd);
3403 if (fd < 0)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003404 return set_error();
3405 s = new_sockobject(fd, family, type, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00003406 return (PyObject *) s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00003407}
Guido van Rossum82a5c661998-07-07 20:45:43 +00003408
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003409PyDoc_STRVAR(fromfd_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003410"fromfd(fd, family, type[, proto]) -> socket object\n\
3411\n\
Georg Brandldcfdae72006-04-01 07:33:08 +00003412Create a socket object from a duplicate of the given\n\
3413file descriptor.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003414The remaining arguments are the same as for socket().");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003415
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00003416#endif /* NO_DUP */
Guido van Rossum2a7178e1992-12-08 13:38:24 +00003417
Guido van Rossum82a5c661998-07-07 20:45:43 +00003418
Guido van Rossum006bf911996-06-12 04:04:55 +00003419static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003420socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00003421{
3422 int x1, x2;
3423
Guido van Rossum27fc3c02000-03-24 20:56:56 +00003424 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00003425 return NULL;
3426 }
3427 x2 = (int)ntohs((short)x1);
3428 return PyInt_FromLong(x2);
3429}
3430
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003431PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003432"ntohs(integer) -> integer\n\
3433\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003434Convert a 16-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003435
3436
Guido van Rossum006bf911996-06-12 04:04:55 +00003437static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003438socket_ntohl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00003439{
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003440 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00003441
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003442 if (PyInt_Check(arg)) {
3443 x = PyInt_AS_LONG(arg);
Jeremy Hylton825e47b2002-07-25 16:37:51 +00003444 if (x == (unsigned long) -1 && PyErr_Occurred())
3445 return NULL;
Guido van Rossum006bf911996-06-12 04:04:55 +00003446 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003447 else if (PyLong_Check(arg)) {
3448 x = PyLong_AsUnsignedLong(arg);
Jeremy Hylton825e47b2002-07-25 16:37:51 +00003449 if (x == (unsigned long) -1 && PyErr_Occurred())
3450 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003451#if SIZEOF_LONG > 4
3452 {
3453 unsigned long y;
3454 /* only want the trailing 32 bits */
3455 y = x & 0xFFFFFFFFUL;
3456 if (y ^ x)
3457 return PyErr_Format(PyExc_OverflowError,
3458 "long int larger than 32 bits");
3459 x = y;
Tim Peters58141872002-08-06 22:25:02 +00003460 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003461#endif
3462 }
3463 else
Tim Peters58141872002-08-06 22:25:02 +00003464 return PyErr_Format(PyExc_TypeError,
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003465 "expected int/long, %s found",
3466 arg->ob_type->tp_name);
3467 if (x == (unsigned long) -1 && PyErr_Occurred())
3468 return NULL;
3469 return PyInt_FromLong(ntohl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00003470}
3471
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003472PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003473"ntohl(integer) -> integer\n\
3474\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003475Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003476
3477
Guido van Rossum006bf911996-06-12 04:04:55 +00003478static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003479socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00003480{
Hye-Shik Changa7b673f2003-12-17 09:40:23 +00003481 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00003482
Guido van Rossum27fc3c02000-03-24 20:56:56 +00003483 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00003484 return NULL;
3485 }
3486 x2 = (int)htons((short)x1);
3487 return PyInt_FromLong(x2);
3488}
3489
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003490PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003491"htons(integer) -> integer\n\
3492\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003493Convert a 16-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003494
3495
Guido van Rossum006bf911996-06-12 04:04:55 +00003496static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003497socket_htonl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00003498{
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003499 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00003500
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003501 if (PyInt_Check(arg)) {
3502 x = PyInt_AS_LONG(arg);
Jeremy Hylton825e47b2002-07-25 16:37:51 +00003503 if (x == (unsigned long) -1 && PyErr_Occurred())
3504 return NULL;
Guido van Rossum006bf911996-06-12 04:04:55 +00003505 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003506 else if (PyLong_Check(arg)) {
3507 x = PyLong_AsUnsignedLong(arg);
Jeremy Hylton825e47b2002-07-25 16:37:51 +00003508 if (x == (unsigned long) -1 && PyErr_Occurred())
3509 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003510#if SIZEOF_LONG > 4
3511 {
3512 unsigned long y;
3513 /* only want the trailing 32 bits */
3514 y = x & 0xFFFFFFFFUL;
3515 if (y ^ x)
3516 return PyErr_Format(PyExc_OverflowError,
3517 "long int larger than 32 bits");
3518 x = y;
Tim Peters58141872002-08-06 22:25:02 +00003519 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003520#endif
3521 }
3522 else
Tim Peters58141872002-08-06 22:25:02 +00003523 return PyErr_Format(PyExc_TypeError,
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003524 "expected int/long, %s found",
3525 arg->ob_type->tp_name);
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003526 return PyInt_FromLong(htonl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00003527}
3528
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003529PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003530"htonl(integer) -> integer\n\
3531\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003532Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003533
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003534/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003535
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003536PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003537"inet_aton(string) -> packed 32-bit IP representation\n\
3538\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003539Convert 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 +00003540binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003541
3542static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003543socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003544{
Guido van Rossuma2e48551999-09-09 15:42:59 +00003545#ifndef INADDR_NONE
3546#define INADDR_NONE (-1)
3547#endif
Neal Norwitz88f115b2003-02-13 02:15:42 +00003548#ifdef HAVE_INET_ATON
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003549 struct in_addr buf;
Ronald Oussorend06b6f22006-04-23 11:59:25 +00003550#endif
3551
3552#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
Tim Peters1df9fdd2003-02-13 03:13:40 +00003553 /* Have to use inet_addr() instead */
3554 unsigned long packed_addr;
3555#endif
3556 char *ip_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003557
Tim Peters1df9fdd2003-02-13 03:13:40 +00003558 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003559 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003560
Tim Peters1df9fdd2003-02-13 03:13:40 +00003561
3562#ifdef HAVE_INET_ATON
Ronald Oussorend06b6f22006-04-23 11:59:25 +00003563
3564#ifdef USE_INET_ATON_WEAKLINK
3565 if (inet_aton != NULL) {
3566#endif
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003567 if (inet_aton(ip_addr, &buf))
3568 return PyString_FromStringAndSize((char *)(&buf),
3569 sizeof(buf));
3570
3571 PyErr_SetString(socket_error,
3572 "illegal IP address string passed to inet_aton");
3573 return NULL;
3574
Ronald Oussorend06b6f22006-04-23 11:59:25 +00003575#ifdef USE_INET_ATON_WEAKLINK
3576 } else {
3577#endif
3578
3579#endif
3580
3581#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
3582
Georg Brandld2e3ba72005-08-26 08:34:00 +00003583 /* special-case this address as inet_addr might return INADDR_NONE
3584 * for this */
3585 if (strcmp(ip_addr, "255.255.255.255") == 0) {
3586 packed_addr = 0xFFFFFFFF;
3587 } else {
Martin Blais2856e5f2006-05-26 12:03:27 +00003588
Georg Brandld2e3ba72005-08-26 08:34:00 +00003589 packed_addr = inet_addr(ip_addr);
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003590
Georg Brandld2e3ba72005-08-26 08:34:00 +00003591 if (packed_addr == INADDR_NONE) { /* invalid address */
3592 PyErr_SetString(socket_error,
3593 "illegal IP address string passed to inet_aton");
3594 return NULL;
3595 }
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003596 }
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003597 return PyString_FromStringAndSize((char *) &packed_addr,
3598 sizeof(packed_addr));
Ronald Oussorend06b6f22006-04-23 11:59:25 +00003599
3600#ifdef USE_INET_ATON_WEAKLINK
3601 }
3602#endif
3603
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003604#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003605}
3606
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003607PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00003608"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003609\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003610Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003611
3612static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003613socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003614{
3615 char *packed_str;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003616 int addr_len;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003617 struct in_addr packed_addr;
3618
Guido van Rossum27fc3c02000-03-24 20:56:56 +00003619 if (!PyArg_ParseTuple(args, "s#:inet_ntoa", &packed_str, &addr_len)) {
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003620 return NULL;
3621 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00003622
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003623 if (addr_len != sizeof(packed_addr)) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003624 PyErr_SetString(socket_error,
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003625 "packed IP wrong length for inet_ntoa");
3626 return NULL;
3627 }
3628
3629 memcpy(&packed_addr, packed_str, addr_len);
3630
3631 return PyString_FromString(inet_ntoa(packed_addr));
3632}
Guido van Rossum82a5c661998-07-07 20:45:43 +00003633
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003634#ifdef HAVE_INET_PTON
3635
3636PyDoc_STRVAR(inet_pton_doc,
3637"inet_pton(af, ip) -> packed IP address string\n\
3638\n\
3639Convert an IP address from string format to a packed string suitable\n\
3640for use with low-level network functions.");
3641
3642static PyObject *
3643socket_inet_pton(PyObject *self, PyObject *args)
3644{
3645 int af;
3646 char* ip;
3647 int retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003648#ifdef ENABLE_IPV6
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003649 char packed[MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003650#else
3651 char packed[sizeof(struct in_addr)];
3652#endif
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003653 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
3654 return NULL;
3655 }
3656
Martin v. Löwis04697e82004-06-02 12:35:29 +00003657#if !defined(ENABLE_IPV6) && defined(AF_INET6)
Martin v. Löwis10649092003-08-05 06:25:06 +00003658 if(af == AF_INET6) {
3659 PyErr_SetString(socket_error,
3660 "can't use AF_INET6, IPv6 is disabled");
3661 return NULL;
3662 }
Martin Blais2856e5f2006-05-26 12:03:27 +00003663#endif
Martin v. Löwis10649092003-08-05 06:25:06 +00003664
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003665 retval = inet_pton(af, ip, packed);
3666 if (retval < 0) {
3667 PyErr_SetFromErrno(socket_error);
3668 return NULL;
3669 } else if (retval == 0) {
3670 PyErr_SetString(socket_error,
3671 "illegal IP address string passed to inet_pton");
3672 return NULL;
3673 } else if (af == AF_INET) {
3674 return PyString_FromStringAndSize(packed,
3675 sizeof(struct in_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003676#ifdef ENABLE_IPV6
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003677 } else if (af == AF_INET6) {
3678 return PyString_FromStringAndSize(packed,
3679 sizeof(struct in6_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003680#endif
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003681 } else {
3682 PyErr_SetString(socket_error, "unknown address family");
3683 return NULL;
3684 }
3685}
Martin Blais2856e5f2006-05-26 12:03:27 +00003686
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003687PyDoc_STRVAR(inet_ntop_doc,
3688"inet_ntop(af, packed_ip) -> string formatted IP address\n\
3689\n\
3690Convert a packed IP address of the given family to string format.");
3691
3692static PyObject *
3693socket_inet_ntop(PyObject *self, PyObject *args)
3694{
3695 int af;
3696 char* packed;
3697 int len;
3698 const char* retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003699#ifdef ENABLE_IPV6
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003700 char ip[MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003701#else
3702 char ip[INET_ADDRSTRLEN + 1];
3703#endif
Martin Blais2856e5f2006-05-26 12:03:27 +00003704
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003705 /* Guarantee NUL-termination for PyString_FromString() below */
Jeremy Hylton80961f32004-11-07 14:24:25 +00003706 memset((void *) &ip[0], '\0', sizeof(ip));
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003707
3708 if (!PyArg_ParseTuple(args, "is#:inet_ntop", &af, &packed, &len)) {
3709 return NULL;
3710 }
3711
3712 if (af == AF_INET) {
3713 if (len != sizeof(struct in_addr)) {
3714 PyErr_SetString(PyExc_ValueError,
3715 "invalid length of packed IP address string");
3716 return NULL;
3717 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003718#ifdef ENABLE_IPV6
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003719 } else if (af == AF_INET6) {
3720 if (len != sizeof(struct in6_addr)) {
3721 PyErr_SetString(PyExc_ValueError,
3722 "invalid length of packed IP address string");
3723 return NULL;
3724 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003725#endif
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003726 } else {
3727 PyErr_Format(PyExc_ValueError,
3728 "unknown address family %d", af);
3729 return NULL;
3730 }
3731
3732 retval = inet_ntop(af, packed, ip, sizeof(ip));
3733 if (!retval) {
3734 PyErr_SetFromErrno(socket_error);
3735 return NULL;
3736 } else {
3737 return PyString_FromString(retval);
3738 }
3739
3740 /* NOTREACHED */
3741 PyErr_SetString(PyExc_RuntimeError, "invalid handling of inet_ntop");
3742 return NULL;
3743}
3744
3745#endif /* HAVE_INET_PTON */
3746
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003747/* Python interface to getaddrinfo(host, port). */
3748
3749/*ARGSUSED*/
3750static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003751socket_getaddrinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003752{
Martin v. Löwisf0b11d22001-11-07 08:31:03 +00003753 struct addrinfo hints, *res;
3754 struct addrinfo *res0 = NULL;
Martin v. Löwis2548c732003-04-18 10:39:54 +00003755 PyObject *hobj = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003756 PyObject *pobj = (PyObject *)NULL;
Martin v. Löwisf65b1a12001-08-12 09:28:40 +00003757 char pbuf[30];
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003758 char *hptr, *pptr;
3759 int family, socktype, protocol, flags;
3760 int error;
3761 PyObject *all = (PyObject *)NULL;
3762 PyObject *single = (PyObject *)NULL;
Martin v. Löwis2548c732003-04-18 10:39:54 +00003763 PyObject *idna = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003764
3765 family = socktype = protocol = flags = 0;
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00003766 family = AF_UNSPEC;
Martin v. Löwis2548c732003-04-18 10:39:54 +00003767 if (!PyArg_ParseTuple(args, "OO|iiii:getaddrinfo",
3768 &hobj, &pobj, &family, &socktype,
3769 &protocol, &flags)) {
3770 return NULL;
3771 }
3772 if (hobj == Py_None) {
3773 hptr = NULL;
3774 } else if (PyUnicode_Check(hobj)) {
3775 idna = PyObject_CallMethod(hobj, "encode", "s", "idna");
3776 if (!idna)
3777 return NULL;
3778 hptr = PyString_AsString(idna);
3779 } else if (PyString_Check(hobj)) {
3780 hptr = PyString_AsString(hobj);
3781 } else {
Martin Blais2856e5f2006-05-26 12:03:27 +00003782 PyErr_SetString(PyExc_TypeError,
Martin v. Löwis2548c732003-04-18 10:39:54 +00003783 "getaddrinfo() argument 1 must be string or None");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003784 return NULL;
3785 }
3786 if (PyInt_Check(pobj)) {
Marc-André Lemburg03d1b182001-07-31 18:05:33 +00003787 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", PyInt_AsLong(pobj));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003788 pptr = pbuf;
3789 } else if (PyString_Check(pobj)) {
3790 pptr = PyString_AsString(pobj);
3791 } else if (pobj == Py_None) {
3792 pptr = (char *)NULL;
3793 } else {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003794 PyErr_SetString(socket_error, "Int or String expected");
Martin v. Löwis5db099a2003-08-07 11:55:15 +00003795 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003796 }
3797 memset(&hints, 0, sizeof(hints));
3798 hints.ai_family = family;
3799 hints.ai_socktype = socktype;
3800 hints.ai_protocol = protocol;
3801 hints.ai_flags = flags;
Just van Rossum1040d2c2003-05-09 07:53:18 +00003802 Py_BEGIN_ALLOW_THREADS
3803 ACQUIRE_GETADDRINFO_LOCK
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003804 error = getaddrinfo(hptr, pptr, &hints, &res0);
Just van Rossum1040d2c2003-05-09 07:53:18 +00003805 Py_END_ALLOW_THREADS
3806 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003807 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003808 set_gaierror(error);
Martin v. Löwis5db099a2003-08-07 11:55:15 +00003809 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003810 }
3811
3812 if ((all = PyList_New(0)) == NULL)
3813 goto err;
3814 for (res = res0; res; res = res->ai_next) {
Guido van Rossum716aac02001-10-12 18:59:27 +00003815 PyObject *addr =
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00003816 makesockaddr(-1, res->ai_addr, res->ai_addrlen, protocol);
Guido van Rossum716aac02001-10-12 18:59:27 +00003817 if (addr == NULL)
3818 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003819 single = Py_BuildValue("iiisO", res->ai_family,
3820 res->ai_socktype, res->ai_protocol,
3821 res->ai_canonname ? res->ai_canonname : "",
Guido van Rossum716aac02001-10-12 18:59:27 +00003822 addr);
3823 Py_DECREF(addr);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003824 if (single == NULL)
3825 goto err;
3826
3827 if (PyList_Append(all, single))
3828 goto err;
3829 Py_XDECREF(single);
3830 }
Martin v. Löwis2548c732003-04-18 10:39:54 +00003831 Py_XDECREF(idna);
Neal Norwitz90128ba2002-08-09 03:37:42 +00003832 if (res0)
3833 freeaddrinfo(res0);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003834 return all;
3835 err:
3836 Py_XDECREF(single);
3837 Py_XDECREF(all);
Martin v. Löwis2548c732003-04-18 10:39:54 +00003838 Py_XDECREF(idna);
Martin v. Löwisf0b11d22001-11-07 08:31:03 +00003839 if (res0)
3840 freeaddrinfo(res0);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003841 return (PyObject *)NULL;
3842}
3843
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003844PyDoc_STRVAR(getaddrinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003845"getaddrinfo(host, port [, family, socktype, proto, flags])\n\
3846 -> list of (family, socktype, proto, canonname, sockaddr)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003847\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003848Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003849
3850/* Python interface to getnameinfo(sa, flags). */
3851
3852/*ARGSUSED*/
3853static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003854socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003855{
3856 PyObject *sa = (PyObject *)NULL;
3857 int flags;
3858 char *hostp;
Martin v. Löwis06b1d212001-11-02 23:34:52 +00003859 int port, flowinfo, scope_id;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003860 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
3861 struct addrinfo hints, *res = NULL;
3862 int error;
3863 PyObject *ret = (PyObject *)NULL;
3864
3865 flags = flowinfo = scope_id = 0;
Martin v. Löwis06b1d212001-11-02 23:34:52 +00003866 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003867 return NULL;
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003868 if (!PyArg_ParseTuple(sa, "si|ii",
3869 &hostp, &port, &flowinfo, &scope_id))
Martin v. Löwis06b1d212001-11-02 23:34:52 +00003870 return NULL;
Marc-André Lemburg03d1b182001-07-31 18:05:33 +00003871 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003872 memset(&hints, 0, sizeof(hints));
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00003873 hints.ai_family = AF_UNSPEC;
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003874 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Just van Rossum1040d2c2003-05-09 07:53:18 +00003875 Py_BEGIN_ALLOW_THREADS
3876 ACQUIRE_GETADDRINFO_LOCK
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003877 error = getaddrinfo(hostp, pbuf, &hints, &res);
Just van Rossum1040d2c2003-05-09 07:53:18 +00003878 Py_END_ALLOW_THREADS
3879 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003880 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003881 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003882 goto fail;
3883 }
3884 if (res->ai_next) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003885 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003886 "sockaddr resolved to multiple addresses");
3887 goto fail;
3888 }
3889 switch (res->ai_family) {
3890 case AF_INET:
3891 {
3892 char *t1;
3893 int t2;
3894 if (PyArg_ParseTuple(sa, "si", &t1, &t2) == 0) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003895 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003896 "IPv4 sockaddr must be 2 tuple");
3897 goto fail;
3898 }
3899 break;
3900 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00003901#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003902 case AF_INET6:
3903 {
3904 struct sockaddr_in6 *sin6;
3905 sin6 = (struct sockaddr_in6 *)res->ai_addr;
3906 sin6->sin6_flowinfo = flowinfo;
3907 sin6->sin6_scope_id = scope_id;
3908 break;
3909 }
3910#endif
3911 }
3912 error = getnameinfo(res->ai_addr, res->ai_addrlen,
3913 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
3914 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003915 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003916 goto fail;
3917 }
3918 ret = Py_BuildValue("ss", hbuf, pbuf);
3919
3920fail:
3921 if (res)
3922 freeaddrinfo(res);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003923 return ret;
3924}
3925
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003926PyDoc_STRVAR(getnameinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003927"getnameinfo(sockaddr, flags) --> (host, port)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003928\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003929Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003930
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00003931
3932/* Python API to getting and setting the default timeout value. */
3933
3934static PyObject *
3935socket_getdefaulttimeout(PyObject *self)
3936{
3937 if (defaulttimeout < 0.0) {
3938 Py_INCREF(Py_None);
3939 return Py_None;
3940 }
3941 else
3942 return PyFloat_FromDouble(defaulttimeout);
3943}
3944
3945PyDoc_STRVAR(getdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003946"getdefaulttimeout() -> timeout\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00003947\n\
3948Returns the default timeout in floating seconds for new socket objects.\n\
3949A value of None indicates that new socket objects have no timeout.\n\
3950When the socket module is first imported, the default is None.");
3951
3952static PyObject *
3953socket_setdefaulttimeout(PyObject *self, PyObject *arg)
3954{
3955 double timeout;
3956
3957 if (arg == Py_None)
3958 timeout = -1.0;
3959 else {
3960 timeout = PyFloat_AsDouble(arg);
3961 if (timeout < 0.0) {
3962 if (!PyErr_Occurred())
3963 PyErr_SetString(PyExc_ValueError,
3964 "Timeout value out of range");
3965 return NULL;
3966 }
3967 }
3968
3969 defaulttimeout = timeout;
3970
3971 Py_INCREF(Py_None);
3972 return Py_None;
3973}
3974
3975PyDoc_STRVAR(setdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003976"setdefaulttimeout(timeout)\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00003977\n\
3978Set the default timeout in floating seconds for new socket objects.\n\
3979A value of None indicates that new socket objects have no timeout.\n\
3980When the socket module is first imported, the default is None.");
3981
3982
Guido van Rossum30a685f1991-06-27 15:51:29 +00003983/* List of functions exported by this module. */
3984
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003985static PyMethodDef socket_methods[] = {
3986 {"gethostbyname", socket_gethostbyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003987 METH_VARARGS, gethostbyname_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003988 {"gethostbyname_ex", socket_gethostbyname_ex,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003989 METH_VARARGS, ghbn_ex_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003990 {"gethostbyaddr", socket_gethostbyaddr,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003991 METH_VARARGS, gethostbyaddr_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003992 {"gethostname", socket_gethostname,
Georg Brandl96a8c392006-05-29 21:04:52 +00003993 METH_NOARGS, gethostname_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003994 {"getservbyname", socket_getservbyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003995 METH_VARARGS, getservbyname_doc},
Barry Warsaw11b91a02004-06-28 00:50:43 +00003996 {"getservbyport", socket_getservbyport,
3997 METH_VARARGS, getservbyport_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003998 {"getprotobyname", socket_getprotobyname,
Georg Brandl96a8c392006-05-29 21:04:52 +00003999 METH_VARARGS, getprotobyname_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004000#ifndef NO_DUP
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004001 {"fromfd", socket_fromfd,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00004002 METH_VARARGS, fromfd_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004003#endif
Dave Cole331708b2004-08-09 04:51:41 +00004004#ifdef HAVE_SOCKETPAIR
4005 {"socketpair", socket_socketpair,
4006 METH_VARARGS, socketpair_doc},
4007#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004008 {"ntohs", socket_ntohs,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00004009 METH_VARARGS, ntohs_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004010 {"ntohl", socket_ntohl,
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004011 METH_O, ntohl_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004012 {"htons", socket_htons,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00004013 METH_VARARGS, htons_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004014 {"htonl", socket_htonl,
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004015 METH_O, htonl_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004016 {"inet_aton", socket_inet_aton,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00004017 METH_VARARGS, inet_aton_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004018 {"inet_ntoa", socket_inet_ntoa,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00004019 METH_VARARGS, inet_ntoa_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004020#ifdef HAVE_INET_PTON
4021 {"inet_pton", socket_inet_pton,
4022 METH_VARARGS, inet_pton_doc},
4023 {"inet_ntop", socket_inet_ntop,
4024 METH_VARARGS, inet_ntop_doc},
4025#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004026 {"getaddrinfo", socket_getaddrinfo,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004027 METH_VARARGS, getaddrinfo_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004028 {"getnameinfo", socket_getnameinfo,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004029 METH_VARARGS, getnameinfo_doc},
Guido van Rossum1693ba82002-07-18 21:11:26 +00004030 {"getdefaulttimeout", (PyCFunction)socket_getdefaulttimeout,
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004031 METH_NOARGS, getdefaulttimeout_doc},
4032 {"setdefaulttimeout", socket_setdefaulttimeout,
4033 METH_O, setdefaulttimeout_doc},
Guido van Rossum30a685f1991-06-27 15:51:29 +00004034 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004035};
4036
Guido van Rossum30a685f1991-06-27 15:51:29 +00004037
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004038#ifdef RISCOS
4039#define OS_INIT_DEFINED
Guido van Rossumbe32c891996-06-20 16:25:29 +00004040
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004041static int
4042os_init(void)
4043{
4044 _kernel_swi_regs r;
4045
4046 r.r[0] = 0;
4047 _kernel_swi(0x43380, &r, &r);
4048 taskwindow = r.r[0];
4049
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004050 return 1;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004051}
4052
4053#endif /* RISCOS */
4054
4055
4056#ifdef MS_WINDOWS
4057#define OS_INIT_DEFINED
4058
4059/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00004060
4061static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004062os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00004063{
4064 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00004065}
4066
4067static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004068os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00004069{
4070 WSADATA WSAData;
4071 int ret;
4072 char buf[100];
4073 ret = WSAStartup(0x0101, &WSAData);
4074 switch (ret) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004075 case 0: /* No error */
Mark Hammond14350ab2003-07-09 04:57:46 +00004076 Py_AtExit(os_cleanup);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004077 return 1; /* Success */
Guido van Rossumbe32c891996-06-20 16:25:29 +00004078 case WSASYSNOTREADY:
4079 PyErr_SetString(PyExc_ImportError,
4080 "WSAStartup failed: network not ready");
4081 break;
4082 case WSAVERNOTSUPPORTED:
4083 case WSAEINVAL:
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004084 PyErr_SetString(
4085 PyExc_ImportError,
4086 "WSAStartup failed: requested version not supported");
Guido van Rossumbe32c891996-06-20 16:25:29 +00004087 break;
4088 default:
Tim Peters885d4572001-11-28 20:27:42 +00004089 PyOS_snprintf(buf, sizeof(buf),
4090 "WSAStartup failed: error code %d", ret);
Guido van Rossumbe32c891996-06-20 16:25:29 +00004091 PyErr_SetString(PyExc_ImportError, buf);
4092 break;
4093 }
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004094 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00004095}
4096
Guido van Rossum8d665e61996-06-26 18:22:49 +00004097#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00004098
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004099
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004100#ifdef PYOS_OS2
4101#define OS_INIT_DEFINED
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004102
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004103/* Additional initialization for OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004104
4105static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004106os_init(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004107{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004108#ifndef PYCC_GCC
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004109 char reason[64];
4110 int rc = sock_init();
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004111
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004112 if (rc == 0) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004113 return 1; /* Success */
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004114 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004115
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004116 PyOS_snprintf(reason, sizeof(reason),
4117 "OS/2 TCP/IP Error# %d", sock_errno());
4118 PyErr_SetString(PyExc_ImportError, reason);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004119
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004120 return 0; /* Failure */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00004121#else
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004122 /* No need to initialise sockets with GCC/EMX */
4123 return 1; /* Success */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00004124#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004125}
4126
4127#endif /* PYOS_OS2 */
4128
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004129
4130#ifndef OS_INIT_DEFINED
4131static int
4132os_init(void)
4133{
4134 return 1; /* Success */
4135}
4136#endif
4137
4138
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00004139/* C API table - always add new things to the end for binary
4140 compatibility. */
4141static
4142PySocketModule_APIObject PySocketModuleAPI =
4143{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004144 &sock_type,
Brett Cannon06c34792004-03-23 23:16:54 +00004145 NULL
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00004146};
4147
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004148
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004149/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004150
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004151 This module is actually called "_socket", and there's a wrapper
4152 "socket.py" which implements some additional functionality. On some
4153 platforms (e.g. Windows and OS/2), socket.py also implements a
4154 wrapper for the socket type that provides missing functionality such
4155 as makefile(), dup() and fromfd(). The import of "_socket" may fail
4156 with an ImportError exception if os-specific initialization fails.
4157 On Windows, this does WINSOCK initialization. When WINSOCK is
4158 initialized succesfully, a call to WSACleanup() is scheduled to be
4159 made at exit time.
4160*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004161
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004162PyDoc_STRVAR(socket_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004163"Implementation module for socket operations.\n\
4164\n\
4165See the socket module for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004166
Mark Hammondfe51c6d2002-08-02 02:27:13 +00004167PyMODINIT_FUNC
Thomas Wouters1e0c2f42000-07-24 16:06:23 +00004168init_socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004169{
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004170 PyObject *m, *has_ipv6;
Fred Drake4baedc12002-04-01 14:53:37 +00004171
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004172 if (!os_init())
Guido van Rossum0cb96de1997-10-01 04:29:29 +00004173 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004174
4175 sock_type.ob_type = &PyType_Type;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004176 m = Py_InitModule3(PySocket_MODULE_NAME,
4177 socket_methods,
4178 socket_doc);
Neal Norwitz1ac754f2006-01-19 06:09:39 +00004179 if (m == NULL)
4180 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004181
4182 socket_error = PyErr_NewException("socket.error", NULL, NULL);
4183 if (socket_error == NULL)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004184 return;
Brett Cannon06c34792004-03-23 23:16:54 +00004185 PySocketModuleAPI.error = socket_error;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004186 Py_INCREF(socket_error);
4187 PyModule_AddObject(m, "error", socket_error);
4188 socket_herror = PyErr_NewException("socket.herror",
4189 socket_error, NULL);
4190 if (socket_herror == NULL)
4191 return;
4192 Py_INCREF(socket_herror);
4193 PyModule_AddObject(m, "herror", socket_herror);
4194 socket_gaierror = PyErr_NewException("socket.gaierror", socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004195 NULL);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004196 if (socket_gaierror == NULL)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004197 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004198 Py_INCREF(socket_gaierror);
4199 PyModule_AddObject(m, "gaierror", socket_gaierror);
Raymond Hettingeref7343c2003-06-29 03:08:05 +00004200 socket_timeout = PyErr_NewException("socket.timeout",
4201 socket_error, NULL);
4202 if (socket_timeout == NULL)
4203 return;
4204 Py_INCREF(socket_timeout);
4205 PyModule_AddObject(m, "timeout", socket_timeout);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004206 Py_INCREF((PyObject *)&sock_type);
Fred Drake4baedc12002-04-01 14:53:37 +00004207 if (PyModule_AddObject(m, "SocketType",
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004208 (PyObject *)&sock_type) != 0)
Guido van Rossum0cb96de1997-10-01 04:29:29 +00004209 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004210 Py_INCREF((PyObject *)&sock_type);
Fred Drake4baedc12002-04-01 14:53:37 +00004211 if (PyModule_AddObject(m, "socket",
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004212 (PyObject *)&sock_type) != 0)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004213 return;
Guido van Rossum09be4091999-08-09 14:40:40 +00004214
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004215#ifdef ENABLE_IPV6
4216 has_ipv6 = Py_True;
4217#else
4218 has_ipv6 = Py_False;
4219#endif
4220 Py_INCREF(has_ipv6);
4221 PyModule_AddObject(m, "has_ipv6", has_ipv6);
4222
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00004223 /* Export C API */
Fred Drake4baedc12002-04-01 14:53:37 +00004224 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00004225 PyCObject_FromVoidPtr((void *)&PySocketModuleAPI, NULL)
4226 ) != 0)
4227 return;
4228
Guido van Rossum09be4091999-08-09 14:40:40 +00004229 /* Address families (we only support AF_INET and AF_UNIX) */
4230#ifdef AF_UNSPEC
Fred Drake4baedc12002-04-01 14:53:37 +00004231 PyModule_AddIntConstant(m, "AF_UNSPEC", AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00004232#endif
Fred Drake4baedc12002-04-01 14:53:37 +00004233 PyModule_AddIntConstant(m, "AF_INET", AF_INET);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004234#ifdef AF_INET6
Fred Drake4baedc12002-04-01 14:53:37 +00004235 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004236#endif /* AF_INET6 */
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00004237#if defined(AF_UNIX)
Fred Drake4baedc12002-04-01 14:53:37 +00004238 PyModule_AddIntConstant(m, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00004239#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00004240#ifdef AF_AX25
Fred Drake4baedc12002-04-01 14:53:37 +00004241 /* Amateur Radio AX.25 */
4242 PyModule_AddIntConstant(m, "AF_AX25", AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00004243#endif
4244#ifdef AF_IPX
Fred Drake4baedc12002-04-01 14:53:37 +00004245 PyModule_AddIntConstant(m, "AF_IPX", AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00004246#endif
4247#ifdef AF_APPLETALK
Fred Drake4baedc12002-04-01 14:53:37 +00004248 /* Appletalk DDP */
4249 PyModule_AddIntConstant(m, "AF_APPLETALK", AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00004250#endif
4251#ifdef AF_NETROM
Fred Drake4baedc12002-04-01 14:53:37 +00004252 /* Amateur radio NetROM */
4253 PyModule_AddIntConstant(m, "AF_NETROM", AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00004254#endif
4255#ifdef AF_BRIDGE
Fred Drake4baedc12002-04-01 14:53:37 +00004256 /* Multiprotocol bridge */
4257 PyModule_AddIntConstant(m, "AF_BRIDGE", AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00004258#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004259#ifdef AF_ATMPVC
4260 /* ATM PVCs */
4261 PyModule_AddIntConstant(m, "AF_ATMPVC", AF_ATMPVC);
4262#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00004263#ifdef AF_AAL5
Fred Drake4baedc12002-04-01 14:53:37 +00004264 /* Reserved for Werner's ATM */
4265 PyModule_AddIntConstant(m, "AF_AAL5", AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00004266#endif
4267#ifdef AF_X25
Fred Drake4baedc12002-04-01 14:53:37 +00004268 /* Reserved for X.25 project */
4269 PyModule_AddIntConstant(m, "AF_X25", AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00004270#endif
4271#ifdef AF_INET6
Fred Drake4baedc12002-04-01 14:53:37 +00004272 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00004273#endif
4274#ifdef AF_ROSE
Fred Drake4baedc12002-04-01 14:53:37 +00004275 /* Amateur Radio X.25 PLP */
4276 PyModule_AddIntConstant(m, "AF_ROSE", AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00004277#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004278#ifdef AF_DECnet
4279 /* Reserved for DECnet project */
4280 PyModule_AddIntConstant(m, "AF_DECnet", AF_DECnet);
4281#endif
4282#ifdef AF_NETBEUI
4283 /* Reserved for 802.2LLC project */
4284 PyModule_AddIntConstant(m, "AF_NETBEUI", AF_NETBEUI);
4285#endif
4286#ifdef AF_SECURITY
4287 /* Security callback pseudo AF */
4288 PyModule_AddIntConstant(m, "AF_SECURITY", AF_SECURITY);
4289#endif
4290#ifdef AF_KEY
4291 /* PF_KEY key management API */
4292 PyModule_AddIntConstant(m, "AF_KEY", AF_KEY);
4293#endif
4294#ifdef AF_NETLINK
4295 /* */
4296 PyModule_AddIntConstant(m, "AF_NETLINK", AF_NETLINK);
Martin v. Löwis11017b12006-01-14 18:12:57 +00004297 PyModule_AddIntConstant(m, "NETLINK_ROUTE", NETLINK_ROUTE);
Martin v. Löwis5fe60e72006-04-06 22:29:33 +00004298#ifdef NETLINK_SKIP
Martin v. Löwis11017b12006-01-14 18:12:57 +00004299 PyModule_AddIntConstant(m, "NETLINK_SKIP", NETLINK_SKIP);
Martin v. Löwis5fe60e72006-04-06 22:29:33 +00004300#endif
4301#ifdef NETLINK_W1
4302 PyModule_AddIntConstant(m, "NETLINK_W1", NETLINK_W1);
4303#endif
Martin v. Löwis11017b12006-01-14 18:12:57 +00004304 PyModule_AddIntConstant(m, "NETLINK_USERSOCK", NETLINK_USERSOCK);
4305 PyModule_AddIntConstant(m, "NETLINK_FIREWALL", NETLINK_FIREWALL);
Guido van Rossum668a94a2006-02-21 01:07:27 +00004306#ifdef NETLINK_TCPDIAG
Martin v. Löwis11017b12006-01-14 18:12:57 +00004307 PyModule_AddIntConstant(m, "NETLINK_TCPDIAG", NETLINK_TCPDIAG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00004308#endif
4309#ifdef NETLINK_NFLOG
Martin v. Löwis11017b12006-01-14 18:12:57 +00004310 PyModule_AddIntConstant(m, "NETLINK_NFLOG", NETLINK_NFLOG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00004311#endif
Neal Norwitz65851662006-01-16 04:31:40 +00004312#ifdef NETLINK_XFRM
Martin v. Löwis11017b12006-01-14 18:12:57 +00004313 PyModule_AddIntConstant(m, "NETLINK_XFRM", NETLINK_XFRM);
Neal Norwitz65851662006-01-16 04:31:40 +00004314#endif
Martin v. Löwis5fe60e72006-04-06 22:29:33 +00004315#ifdef NETLINK_ARPD
Martin v. Löwis11017b12006-01-14 18:12:57 +00004316 PyModule_AddIntConstant(m, "NETLINK_ARPD", NETLINK_ARPD);
Martin v. Löwis5fe60e72006-04-06 22:29:33 +00004317#endif
4318#ifdef NETLINK_ROUTE6
Martin v. Löwis11017b12006-01-14 18:12:57 +00004319 PyModule_AddIntConstant(m, "NETLINK_ROUTE6", NETLINK_ROUTE6);
Martin v. Löwis5fe60e72006-04-06 22:29:33 +00004320#endif
Martin v. Löwis11017b12006-01-14 18:12:57 +00004321 PyModule_AddIntConstant(m, "NETLINK_IP6_FW", NETLINK_IP6_FW);
4322 PyModule_AddIntConstant(m, "NETLINK_DNRTMSG", NETLINK_DNRTMSG);
Martin v. Löwis5fe60e72006-04-06 22:29:33 +00004323#ifdef NETLINK_TAPBASE
Martin v. Löwis11017b12006-01-14 18:12:57 +00004324 PyModule_AddIntConstant(m, "NETLINK_TAPBASE", NETLINK_TAPBASE);
Martin v. Löwis5fe60e72006-04-06 22:29:33 +00004325#endif
Georg Brandldcfdae72006-04-01 07:33:08 +00004326#endif /* AF_NETLINK */
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004327#ifdef AF_ROUTE
4328 /* Alias to emulate 4.4BSD */
4329 PyModule_AddIntConstant(m, "AF_ROUTE", AF_ROUTE);
4330#endif
4331#ifdef AF_ASH
4332 /* Ash */
4333 PyModule_AddIntConstant(m, "AF_ASH", AF_ASH);
4334#endif
4335#ifdef AF_ECONET
4336 /* Acorn Econet */
4337 PyModule_AddIntConstant(m, "AF_ECONET", AF_ECONET);
4338#endif
4339#ifdef AF_ATMSVC
4340 /* ATM SVCs */
4341 PyModule_AddIntConstant(m, "AF_ATMSVC", AF_ATMSVC);
4342#endif
4343#ifdef AF_SNA
4344 /* Linux SNA Project (nutters!) */
4345 PyModule_AddIntConstant(m, "AF_SNA", AF_SNA);
4346#endif
4347#ifdef AF_IRDA
4348 /* IRDA sockets */
4349 PyModule_AddIntConstant(m, "AF_IRDA", AF_IRDA);
4350#endif
4351#ifdef AF_PPPOX
4352 /* PPPoX sockets */
4353 PyModule_AddIntConstant(m, "AF_PPPOX", AF_PPPOX);
4354#endif
4355#ifdef AF_WANPIPE
4356 /* Wanpipe API Sockets */
4357 PyModule_AddIntConstant(m, "AF_WANPIPE", AF_WANPIPE);
4358#endif
4359#ifdef AF_LLC
4360 /* Linux LLC */
4361 PyModule_AddIntConstant(m, "AF_LLC", AF_LLC);
4362#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00004363
Hye-Shik Chang81268602004-02-02 06:05:24 +00004364#ifdef USE_BLUETOOTH
Martin v. Löwis12af0482004-01-31 12:34:17 +00004365 PyModule_AddIntConstant(m, "AF_BLUETOOTH", AF_BLUETOOTH);
4366 PyModule_AddIntConstant(m, "BTPROTO_L2CAP", BTPROTO_L2CAP);
Hye-Shik Chang81268602004-02-02 06:05:24 +00004367#if !defined(__FreeBSD__)
Martin v. Löwis12af0482004-01-31 12:34:17 +00004368 PyModule_AddIntConstant(m, "BTPROTO_SCO", BTPROTO_SCO);
Hye-Shik Chang81268602004-02-02 06:05:24 +00004369#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00004370 PyModule_AddIntConstant(m, "BTPROTO_RFCOMM", BTPROTO_RFCOMM);
Neal Norwitz1e44ca92006-05-30 03:18:50 +00004371 PyModule_AddStringConstant(m, "BDADDR_ANY", "00:00:00:00:00:00");
4372 PyModule_AddStringConstant(m, "BDADDR_LOCAL", "00:00:00:FF:FF:FF");
Martin v. Löwis12af0482004-01-31 12:34:17 +00004373#endif
4374
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00004375#ifdef HAVE_NETPACKET_PACKET_H
Fred Drake4baedc12002-04-01 14:53:37 +00004376 PyModule_AddIntConstant(m, "AF_PACKET", AF_PACKET);
4377 PyModule_AddIntConstant(m, "PF_PACKET", PF_PACKET);
4378 PyModule_AddIntConstant(m, "PACKET_HOST", PACKET_HOST);
4379 PyModule_AddIntConstant(m, "PACKET_BROADCAST", PACKET_BROADCAST);
4380 PyModule_AddIntConstant(m, "PACKET_MULTICAST", PACKET_MULTICAST);
4381 PyModule_AddIntConstant(m, "PACKET_OTHERHOST", PACKET_OTHERHOST);
4382 PyModule_AddIntConstant(m, "PACKET_OUTGOING", PACKET_OUTGOING);
4383 PyModule_AddIntConstant(m, "PACKET_LOOPBACK", PACKET_LOOPBACK);
4384 PyModule_AddIntConstant(m, "PACKET_FASTROUTE", PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00004385#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00004386
4387 /* Socket types */
Fred Drake4baedc12002-04-01 14:53:37 +00004388 PyModule_AddIntConstant(m, "SOCK_STREAM", SOCK_STREAM);
4389 PyModule_AddIntConstant(m, "SOCK_DGRAM", SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00004390#ifndef __BEOS__
4391/* We have incomplete socket support. */
Fred Drake4baedc12002-04-01 14:53:37 +00004392 PyModule_AddIntConstant(m, "SOCK_RAW", SOCK_RAW);
4393 PyModule_AddIntConstant(m, "SOCK_SEQPACKET", SOCK_SEQPACKET);
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00004394#if defined(SOCK_RDM)
Fred Drake4baedc12002-04-01 14:53:37 +00004395 PyModule_AddIntConstant(m, "SOCK_RDM", SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00004396#endif
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00004397#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004398
4399#ifdef SO_DEBUG
Fred Drake4baedc12002-04-01 14:53:37 +00004400 PyModule_AddIntConstant(m, "SO_DEBUG", SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004401#endif
4402#ifdef SO_ACCEPTCONN
Fred Drake4baedc12002-04-01 14:53:37 +00004403 PyModule_AddIntConstant(m, "SO_ACCEPTCONN", SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004404#endif
4405#ifdef SO_REUSEADDR
Fred Drake4baedc12002-04-01 14:53:37 +00004406 PyModule_AddIntConstant(m, "SO_REUSEADDR", SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004407#endif
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00004408#ifdef SO_EXCLUSIVEADDRUSE
4409 PyModule_AddIntConstant(m, "SO_EXCLUSIVEADDRUSE", SO_EXCLUSIVEADDRUSE);
4410#endif
4411
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004412#ifdef SO_KEEPALIVE
Fred Drake4baedc12002-04-01 14:53:37 +00004413 PyModule_AddIntConstant(m, "SO_KEEPALIVE", SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004414#endif
4415#ifdef SO_DONTROUTE
Fred Drake4baedc12002-04-01 14:53:37 +00004416 PyModule_AddIntConstant(m, "SO_DONTROUTE", SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004417#endif
4418#ifdef SO_BROADCAST
Fred Drake4baedc12002-04-01 14:53:37 +00004419 PyModule_AddIntConstant(m, "SO_BROADCAST", SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004420#endif
4421#ifdef SO_USELOOPBACK
Fred Drake4baedc12002-04-01 14:53:37 +00004422 PyModule_AddIntConstant(m, "SO_USELOOPBACK", SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004423#endif
4424#ifdef SO_LINGER
Fred Drake4baedc12002-04-01 14:53:37 +00004425 PyModule_AddIntConstant(m, "SO_LINGER", SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004426#endif
4427#ifdef SO_OOBINLINE
Fred Drake4baedc12002-04-01 14:53:37 +00004428 PyModule_AddIntConstant(m, "SO_OOBINLINE", SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004429#endif
4430#ifdef SO_REUSEPORT
Fred Drake4baedc12002-04-01 14:53:37 +00004431 PyModule_AddIntConstant(m, "SO_REUSEPORT", SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004432#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004433#ifdef SO_SNDBUF
Fred Drake4baedc12002-04-01 14:53:37 +00004434 PyModule_AddIntConstant(m, "SO_SNDBUF", SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004435#endif
4436#ifdef SO_RCVBUF
Fred Drake4baedc12002-04-01 14:53:37 +00004437 PyModule_AddIntConstant(m, "SO_RCVBUF", SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004438#endif
4439#ifdef SO_SNDLOWAT
Fred Drake4baedc12002-04-01 14:53:37 +00004440 PyModule_AddIntConstant(m, "SO_SNDLOWAT", SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004441#endif
4442#ifdef SO_RCVLOWAT
Fred Drake4baedc12002-04-01 14:53:37 +00004443 PyModule_AddIntConstant(m, "SO_RCVLOWAT", SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004444#endif
4445#ifdef SO_SNDTIMEO
Fred Drake4baedc12002-04-01 14:53:37 +00004446 PyModule_AddIntConstant(m, "SO_SNDTIMEO", SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004447#endif
4448#ifdef SO_RCVTIMEO
Fred Drake4baedc12002-04-01 14:53:37 +00004449 PyModule_AddIntConstant(m, "SO_RCVTIMEO", SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004450#endif
4451#ifdef SO_ERROR
Fred Drake4baedc12002-04-01 14:53:37 +00004452 PyModule_AddIntConstant(m, "SO_ERROR", SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004453#endif
4454#ifdef SO_TYPE
Fred Drake4baedc12002-04-01 14:53:37 +00004455 PyModule_AddIntConstant(m, "SO_TYPE", SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004456#endif
4457
4458 /* Maximum number of connections for "listen" */
4459#ifdef SOMAXCONN
Fred Drake4baedc12002-04-01 14:53:37 +00004460 PyModule_AddIntConstant(m, "SOMAXCONN", SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004461#else
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004462 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004463#endif
4464
4465 /* Flags for send, recv */
4466#ifdef MSG_OOB
Fred Drake4baedc12002-04-01 14:53:37 +00004467 PyModule_AddIntConstant(m, "MSG_OOB", MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004468#endif
4469#ifdef MSG_PEEK
Fred Drake4baedc12002-04-01 14:53:37 +00004470 PyModule_AddIntConstant(m, "MSG_PEEK", MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004471#endif
4472#ifdef MSG_DONTROUTE
Fred Drake4baedc12002-04-01 14:53:37 +00004473 PyModule_AddIntConstant(m, "MSG_DONTROUTE", MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004474#endif
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00004475#ifdef MSG_DONTWAIT
Fred Drake4baedc12002-04-01 14:53:37 +00004476 PyModule_AddIntConstant(m, "MSG_DONTWAIT", MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00004477#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004478#ifdef MSG_EOR
Fred Drake4baedc12002-04-01 14:53:37 +00004479 PyModule_AddIntConstant(m, "MSG_EOR", MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004480#endif
4481#ifdef MSG_TRUNC
Fred Drake4baedc12002-04-01 14:53:37 +00004482 PyModule_AddIntConstant(m, "MSG_TRUNC", MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004483#endif
4484#ifdef MSG_CTRUNC
Fred Drake4baedc12002-04-01 14:53:37 +00004485 PyModule_AddIntConstant(m, "MSG_CTRUNC", MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004486#endif
4487#ifdef MSG_WAITALL
Fred Drake4baedc12002-04-01 14:53:37 +00004488 PyModule_AddIntConstant(m, "MSG_WAITALL", MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004489#endif
4490#ifdef MSG_BTAG
Fred Drake4baedc12002-04-01 14:53:37 +00004491 PyModule_AddIntConstant(m, "MSG_BTAG", MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004492#endif
4493#ifdef MSG_ETAG
Fred Drake4baedc12002-04-01 14:53:37 +00004494 PyModule_AddIntConstant(m, "MSG_ETAG", MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004495#endif
4496
4497 /* Protocol level and numbers, usable for [gs]etsockopt */
4498#ifdef SOL_SOCKET
Fred Drake4baedc12002-04-01 14:53:37 +00004499 PyModule_AddIntConstant(m, "SOL_SOCKET", SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004500#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00004501#ifdef SOL_IP
Fred Drake4baedc12002-04-01 14:53:37 +00004502 PyModule_AddIntConstant(m, "SOL_IP", SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00004503#else
Fred Drake4baedc12002-04-01 14:53:37 +00004504 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00004505#endif
4506#ifdef SOL_IPX
Fred Drake4baedc12002-04-01 14:53:37 +00004507 PyModule_AddIntConstant(m, "SOL_IPX", SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00004508#endif
4509#ifdef SOL_AX25
Fred Drake4baedc12002-04-01 14:53:37 +00004510 PyModule_AddIntConstant(m, "SOL_AX25", SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00004511#endif
4512#ifdef SOL_ATALK
Fred Drake4baedc12002-04-01 14:53:37 +00004513 PyModule_AddIntConstant(m, "SOL_ATALK", SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00004514#endif
4515#ifdef SOL_NETROM
Fred Drake4baedc12002-04-01 14:53:37 +00004516 PyModule_AddIntConstant(m, "SOL_NETROM", SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00004517#endif
4518#ifdef SOL_ROSE
Fred Drake4baedc12002-04-01 14:53:37 +00004519 PyModule_AddIntConstant(m, "SOL_ROSE", SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00004520#endif
4521#ifdef SOL_TCP
Fred Drake4baedc12002-04-01 14:53:37 +00004522 PyModule_AddIntConstant(m, "SOL_TCP", SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00004523#else
Fred Drake4baedc12002-04-01 14:53:37 +00004524 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00004525#endif
4526#ifdef SOL_UDP
Fred Drake4baedc12002-04-01 14:53:37 +00004527 PyModule_AddIntConstant(m, "SOL_UDP", SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00004528#else
Fred Drake4baedc12002-04-01 14:53:37 +00004529 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00004530#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004531#ifdef IPPROTO_IP
Fred Drake4baedc12002-04-01 14:53:37 +00004532 PyModule_AddIntConstant(m, "IPPROTO_IP", IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00004533#else
Fred Drake4baedc12002-04-01 14:53:37 +00004534 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004535#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004536#ifdef IPPROTO_HOPOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00004537 PyModule_AddIntConstant(m, "IPPROTO_HOPOPTS", IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004538#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004539#ifdef IPPROTO_ICMP
Fred Drake4baedc12002-04-01 14:53:37 +00004540 PyModule_AddIntConstant(m, "IPPROTO_ICMP", IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00004541#else
Fred Drake4baedc12002-04-01 14:53:37 +00004542 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004543#endif
4544#ifdef IPPROTO_IGMP
Fred Drake4baedc12002-04-01 14:53:37 +00004545 PyModule_AddIntConstant(m, "IPPROTO_IGMP", IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004546#endif
4547#ifdef IPPROTO_GGP
Fred Drake4baedc12002-04-01 14:53:37 +00004548 PyModule_AddIntConstant(m, "IPPROTO_GGP", IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004549#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004550#ifdef IPPROTO_IPV4
Fred Drake4baedc12002-04-01 14:53:37 +00004551 PyModule_AddIntConstant(m, "IPPROTO_IPV4", IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004552#endif
Martin v. Löwisa0f17342003-10-03 13:56:20 +00004553#ifdef IPPROTO_IPV6
4554 PyModule_AddIntConstant(m, "IPPROTO_IPV6", IPPROTO_IPV6);
4555#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004556#ifdef IPPROTO_IPIP
Fred Drake4baedc12002-04-01 14:53:37 +00004557 PyModule_AddIntConstant(m, "IPPROTO_IPIP", IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004558#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004559#ifdef IPPROTO_TCP
Fred Drake4baedc12002-04-01 14:53:37 +00004560 PyModule_AddIntConstant(m, "IPPROTO_TCP", IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00004561#else
Fred Drake4baedc12002-04-01 14:53:37 +00004562 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004563#endif
4564#ifdef IPPROTO_EGP
Fred Drake4baedc12002-04-01 14:53:37 +00004565 PyModule_AddIntConstant(m, "IPPROTO_EGP", IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004566#endif
4567#ifdef IPPROTO_PUP
Fred Drake4baedc12002-04-01 14:53:37 +00004568 PyModule_AddIntConstant(m, "IPPROTO_PUP", IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004569#endif
4570#ifdef IPPROTO_UDP
Fred Drake4baedc12002-04-01 14:53:37 +00004571 PyModule_AddIntConstant(m, "IPPROTO_UDP", IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00004572#else
Fred Drake4baedc12002-04-01 14:53:37 +00004573 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004574#endif
4575#ifdef IPPROTO_IDP
Fred Drake4baedc12002-04-01 14:53:37 +00004576 PyModule_AddIntConstant(m, "IPPROTO_IDP", IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004577#endif
4578#ifdef IPPROTO_HELLO
Fred Drake4baedc12002-04-01 14:53:37 +00004579 PyModule_AddIntConstant(m, "IPPROTO_HELLO", IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004580#endif
4581#ifdef IPPROTO_ND
Fred Drake4baedc12002-04-01 14:53:37 +00004582 PyModule_AddIntConstant(m, "IPPROTO_ND", IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004583#endif
4584#ifdef IPPROTO_TP
Fred Drake4baedc12002-04-01 14:53:37 +00004585 PyModule_AddIntConstant(m, "IPPROTO_TP", IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004586#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004587#ifdef IPPROTO_IPV6
Fred Drake4baedc12002-04-01 14:53:37 +00004588 PyModule_AddIntConstant(m, "IPPROTO_IPV6", IPPROTO_IPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004589#endif
4590#ifdef IPPROTO_ROUTING
Fred Drake4baedc12002-04-01 14:53:37 +00004591 PyModule_AddIntConstant(m, "IPPROTO_ROUTING", IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004592#endif
4593#ifdef IPPROTO_FRAGMENT
Fred Drake4baedc12002-04-01 14:53:37 +00004594 PyModule_AddIntConstant(m, "IPPROTO_FRAGMENT", IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004595#endif
4596#ifdef IPPROTO_RSVP
Fred Drake4baedc12002-04-01 14:53:37 +00004597 PyModule_AddIntConstant(m, "IPPROTO_RSVP", IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004598#endif
4599#ifdef IPPROTO_GRE
Fred Drake4baedc12002-04-01 14:53:37 +00004600 PyModule_AddIntConstant(m, "IPPROTO_GRE", IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004601#endif
4602#ifdef IPPROTO_ESP
Fred Drake4baedc12002-04-01 14:53:37 +00004603 PyModule_AddIntConstant(m, "IPPROTO_ESP", IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004604#endif
4605#ifdef IPPROTO_AH
Fred Drake4baedc12002-04-01 14:53:37 +00004606 PyModule_AddIntConstant(m, "IPPROTO_AH", IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004607#endif
4608#ifdef IPPROTO_MOBILE
Fred Drake4baedc12002-04-01 14:53:37 +00004609 PyModule_AddIntConstant(m, "IPPROTO_MOBILE", IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004610#endif
4611#ifdef IPPROTO_ICMPV6
Fred Drake4baedc12002-04-01 14:53:37 +00004612 PyModule_AddIntConstant(m, "IPPROTO_ICMPV6", IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004613#endif
4614#ifdef IPPROTO_NONE
Fred Drake4baedc12002-04-01 14:53:37 +00004615 PyModule_AddIntConstant(m, "IPPROTO_NONE", IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004616#endif
4617#ifdef IPPROTO_DSTOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00004618 PyModule_AddIntConstant(m, "IPPROTO_DSTOPTS", IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004619#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004620#ifdef IPPROTO_XTP
Fred Drake4baedc12002-04-01 14:53:37 +00004621 PyModule_AddIntConstant(m, "IPPROTO_XTP", IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004622#endif
4623#ifdef IPPROTO_EON
Fred Drake4baedc12002-04-01 14:53:37 +00004624 PyModule_AddIntConstant(m, "IPPROTO_EON", IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004625#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004626#ifdef IPPROTO_PIM
Fred Drake4baedc12002-04-01 14:53:37 +00004627 PyModule_AddIntConstant(m, "IPPROTO_PIM", IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004628#endif
4629#ifdef IPPROTO_IPCOMP
Fred Drake4baedc12002-04-01 14:53:37 +00004630 PyModule_AddIntConstant(m, "IPPROTO_IPCOMP", IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004631#endif
4632#ifdef IPPROTO_VRRP
Fred Drake4baedc12002-04-01 14:53:37 +00004633 PyModule_AddIntConstant(m, "IPPROTO_VRRP", IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004634#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004635#ifdef IPPROTO_BIP
Fred Drake4baedc12002-04-01 14:53:37 +00004636 PyModule_AddIntConstant(m, "IPPROTO_BIP", IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004637#endif
4638/**/
4639#ifdef IPPROTO_RAW
Fred Drake4baedc12002-04-01 14:53:37 +00004640 PyModule_AddIntConstant(m, "IPPROTO_RAW", IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00004641#else
Fred Drake4baedc12002-04-01 14:53:37 +00004642 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004643#endif
4644#ifdef IPPROTO_MAX
Fred Drake4baedc12002-04-01 14:53:37 +00004645 PyModule_AddIntConstant(m, "IPPROTO_MAX", IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004646#endif
4647
4648 /* Some port configuration */
4649#ifdef IPPORT_RESERVED
Fred Drake4baedc12002-04-01 14:53:37 +00004650 PyModule_AddIntConstant(m, "IPPORT_RESERVED", IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004651#else
Fred Drake4baedc12002-04-01 14:53:37 +00004652 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004653#endif
4654#ifdef IPPORT_USERRESERVED
Fred Drake4baedc12002-04-01 14:53:37 +00004655 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004656#else
Fred Drake4baedc12002-04-01 14:53:37 +00004657 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004658#endif
4659
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004660 /* Some reserved IP v.4 addresses */
4661#ifdef INADDR_ANY
Fred Drake4baedc12002-04-01 14:53:37 +00004662 PyModule_AddIntConstant(m, "INADDR_ANY", INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004663#else
Fred Drake4baedc12002-04-01 14:53:37 +00004664 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004665#endif
4666#ifdef INADDR_BROADCAST
Fred Drake4baedc12002-04-01 14:53:37 +00004667 PyModule_AddIntConstant(m, "INADDR_BROADCAST", INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004668#else
Fred Drake4baedc12002-04-01 14:53:37 +00004669 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004670#endif
4671#ifdef INADDR_LOOPBACK
Fred Drake4baedc12002-04-01 14:53:37 +00004672 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004673#else
Fred Drake4baedc12002-04-01 14:53:37 +00004674 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004675#endif
4676#ifdef INADDR_UNSPEC_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00004677 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004678#else
Fred Drake4baedc12002-04-01 14:53:37 +00004679 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004680#endif
4681#ifdef INADDR_ALLHOSTS_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00004682 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
4683 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004684#else
Fred Drake4baedc12002-04-01 14:53:37 +00004685 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004686#endif
4687#ifdef INADDR_MAX_LOCAL_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00004688 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP",
4689 INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004690#else
Fred Drake4baedc12002-04-01 14:53:37 +00004691 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004692#endif
4693#ifdef INADDR_NONE
Fred Drake4baedc12002-04-01 14:53:37 +00004694 PyModule_AddIntConstant(m, "INADDR_NONE", INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004695#else
Fred Drake4baedc12002-04-01 14:53:37 +00004696 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004697#endif
4698
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004699 /* IPv4 [gs]etsockopt options */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004700#ifdef IP_OPTIONS
Fred Drake4baedc12002-04-01 14:53:37 +00004701 PyModule_AddIntConstant(m, "IP_OPTIONS", IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004702#endif
4703#ifdef IP_HDRINCL
Fred Drake4baedc12002-04-01 14:53:37 +00004704 PyModule_AddIntConstant(m, "IP_HDRINCL", IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004705#endif
4706#ifdef IP_TOS
Fred Drake4baedc12002-04-01 14:53:37 +00004707 PyModule_AddIntConstant(m, "IP_TOS", IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004708#endif
4709#ifdef IP_TTL
Fred Drake4baedc12002-04-01 14:53:37 +00004710 PyModule_AddIntConstant(m, "IP_TTL", IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004711#endif
4712#ifdef IP_RECVOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00004713 PyModule_AddIntConstant(m, "IP_RECVOPTS", IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004714#endif
4715#ifdef IP_RECVRETOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00004716 PyModule_AddIntConstant(m, "IP_RECVRETOPTS", IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004717#endif
4718#ifdef IP_RECVDSTADDR
Fred Drake4baedc12002-04-01 14:53:37 +00004719 PyModule_AddIntConstant(m, "IP_RECVDSTADDR", IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004720#endif
4721#ifdef IP_RETOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00004722 PyModule_AddIntConstant(m, "IP_RETOPTS", IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004723#endif
4724#ifdef IP_MULTICAST_IF
Fred Drake4baedc12002-04-01 14:53:37 +00004725 PyModule_AddIntConstant(m, "IP_MULTICAST_IF", IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004726#endif
4727#ifdef IP_MULTICAST_TTL
Fred Drake4baedc12002-04-01 14:53:37 +00004728 PyModule_AddIntConstant(m, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004729#endif
4730#ifdef IP_MULTICAST_LOOP
Fred Drake4baedc12002-04-01 14:53:37 +00004731 PyModule_AddIntConstant(m, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004732#endif
4733#ifdef IP_ADD_MEMBERSHIP
Fred Drake4baedc12002-04-01 14:53:37 +00004734 PyModule_AddIntConstant(m, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004735#endif
4736#ifdef IP_DROP_MEMBERSHIP
Fred Drake4baedc12002-04-01 14:53:37 +00004737 PyModule_AddIntConstant(m, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004738#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00004739#ifdef IP_DEFAULT_MULTICAST_TTL
Fred Drake4baedc12002-04-01 14:53:37 +00004740 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_TTL",
4741 IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00004742#endif
4743#ifdef IP_DEFAULT_MULTICAST_LOOP
Fred Drake4baedc12002-04-01 14:53:37 +00004744 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_LOOP",
4745 IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00004746#endif
4747#ifdef IP_MAX_MEMBERSHIPS
Fred Drake4baedc12002-04-01 14:53:37 +00004748 PyModule_AddIntConstant(m, "IP_MAX_MEMBERSHIPS", IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00004749#endif
4750
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004751 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
4752#ifdef IPV6_JOIN_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00004753 PyModule_AddIntConstant(m, "IPV6_JOIN_GROUP", IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004754#endif
4755#ifdef IPV6_LEAVE_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00004756 PyModule_AddIntConstant(m, "IPV6_LEAVE_GROUP", IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004757#endif
4758#ifdef IPV6_MULTICAST_HOPS
Fred Drake4baedc12002-04-01 14:53:37 +00004759 PyModule_AddIntConstant(m, "IPV6_MULTICAST_HOPS", IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004760#endif
4761#ifdef IPV6_MULTICAST_IF
Fred Drake4baedc12002-04-01 14:53:37 +00004762 PyModule_AddIntConstant(m, "IPV6_MULTICAST_IF", IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004763#endif
4764#ifdef IPV6_MULTICAST_LOOP
Fred Drake4baedc12002-04-01 14:53:37 +00004765 PyModule_AddIntConstant(m, "IPV6_MULTICAST_LOOP", IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004766#endif
4767#ifdef IPV6_UNICAST_HOPS
Fred Drake4baedc12002-04-01 14:53:37 +00004768 PyModule_AddIntConstant(m, "IPV6_UNICAST_HOPS", IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004769#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00004770 /* Additional IPV6 socket options, defined in RFC 3493 */
4771#ifdef IPV6_V6ONLY
4772 PyModule_AddIntConstant(m, "IPV6_V6ONLY", IPV6_V6ONLY);
4773#endif
4774 /* Advanced IPV6 socket options, from RFC 3542 */
4775#ifdef IPV6_CHECKSUM
4776 PyModule_AddIntConstant(m, "IPV6_CHECKSUM", IPV6_CHECKSUM);
4777#endif
4778#ifdef IPV6_DONTFRAG
4779 PyModule_AddIntConstant(m, "IPV6_DONTFRAG", IPV6_DONTFRAG);
4780#endif
4781#ifdef IPV6_DSTOPTS
4782 PyModule_AddIntConstant(m, "IPV6_DSTOPTS", IPV6_DSTOPTS);
4783#endif
4784#ifdef IPV6_HOPLIMIT
4785 PyModule_AddIntConstant(m, "IPV6_HOPLIMIT", IPV6_HOPLIMIT);
4786#endif
4787#ifdef IPV6_HOPOPTS
4788 PyModule_AddIntConstant(m, "IPV6_HOPOPTS", IPV6_HOPOPTS);
4789#endif
4790#ifdef IPV6_NEXTHOP
4791 PyModule_AddIntConstant(m, "IPV6_NEXTHOP", IPV6_NEXTHOP);
4792#endif
4793#ifdef IPV6_PATHMTU
4794 PyModule_AddIntConstant(m, "IPV6_PATHMTU", IPV6_PATHMTU);
4795#endif
4796#ifdef IPV6_PKTINFO
4797 PyModule_AddIntConstant(m, "IPV6_PKTINFO", IPV6_PKTINFO);
4798#endif
4799#ifdef IPV6_RECVDSTOPTS
4800 PyModule_AddIntConstant(m, "IPV6_RECVDSTOPTS", IPV6_RECVDSTOPTS);
4801#endif
4802#ifdef IPV6_RECVHOPLIMIT
4803 PyModule_AddIntConstant(m, "IPV6_RECVHOPLIMIT", IPV6_RECVHOPLIMIT);
4804#endif
4805#ifdef IPV6_RECVHOPOPTS
4806 PyModule_AddIntConstant(m, "IPV6_RECVHOPOPTS", IPV6_RECVHOPOPTS);
4807#endif
4808#ifdef IPV6_RECVPKTINFO
4809 PyModule_AddIntConstant(m, "IPV6_RECVPKTINFO", IPV6_RECVPKTINFO);
4810#endif
4811#ifdef IPV6_RECVRTHDR
4812 PyModule_AddIntConstant(m, "IPV6_RECVRTHDR", IPV6_RECVRTHDR);
4813#endif
4814#ifdef IPV6_RECVTCLASS
4815 PyModule_AddIntConstant(m, "IPV6_RECVTCLASS", IPV6_RECVTCLASS);
4816#endif
4817#ifdef IPV6_RTHDR
4818 PyModule_AddIntConstant(m, "IPV6_RTHDR", IPV6_RTHDR);
4819#endif
4820#ifdef IPV6_RTHDRDSTOPTS
4821 PyModule_AddIntConstant(m, "IPV6_RTHDRDSTOPTS", IPV6_RTHDRDSTOPTS);
4822#endif
4823#ifdef IPV6_RTHDR_TYPE_0
4824 PyModule_AddIntConstant(m, "IPV6_RTHDR_TYPE_0", IPV6_RTHDR_TYPE_0);
4825#endif
4826#ifdef IPV6_RECVPATHMTU
4827 PyModule_AddIntConstant(m, "IPV6_RECVPATHMTU", IPV6_RECVPATHMTU);
4828#endif
4829#ifdef IPV6_TCLASS
4830 PyModule_AddIntConstant(m, "IPV6_TCLASS", IPV6_TCLASS);
4831#endif
4832#ifdef IPV6_USE_MIN_MTU
4833 PyModule_AddIntConstant(m, "IPV6_USE_MIN_MTU", IPV6_USE_MIN_MTU);
4834#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004835
Guido van Rossum09be4091999-08-09 14:40:40 +00004836 /* TCP options */
4837#ifdef TCP_NODELAY
Fred Drake4baedc12002-04-01 14:53:37 +00004838 PyModule_AddIntConstant(m, "TCP_NODELAY", TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00004839#endif
4840#ifdef TCP_MAXSEG
Fred Drake4baedc12002-04-01 14:53:37 +00004841 PyModule_AddIntConstant(m, "TCP_MAXSEG", TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00004842#endif
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004843#ifdef TCP_CORK
Fred Drake4baedc12002-04-01 14:53:37 +00004844 PyModule_AddIntConstant(m, "TCP_CORK", TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004845#endif
4846#ifdef TCP_KEEPIDLE
Fred Drake4baedc12002-04-01 14:53:37 +00004847 PyModule_AddIntConstant(m, "TCP_KEEPIDLE", TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004848#endif
4849#ifdef TCP_KEEPINTVL
Fred Drake4baedc12002-04-01 14:53:37 +00004850 PyModule_AddIntConstant(m, "TCP_KEEPINTVL", TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004851#endif
4852#ifdef TCP_KEEPCNT
Fred Drake4baedc12002-04-01 14:53:37 +00004853 PyModule_AddIntConstant(m, "TCP_KEEPCNT", TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004854#endif
4855#ifdef TCP_SYNCNT
Fred Drake4baedc12002-04-01 14:53:37 +00004856 PyModule_AddIntConstant(m, "TCP_SYNCNT", TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004857#endif
4858#ifdef TCP_LINGER2
Fred Drake4baedc12002-04-01 14:53:37 +00004859 PyModule_AddIntConstant(m, "TCP_LINGER2", TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004860#endif
4861#ifdef TCP_DEFER_ACCEPT
Fred Drake4baedc12002-04-01 14:53:37 +00004862 PyModule_AddIntConstant(m, "TCP_DEFER_ACCEPT", TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004863#endif
4864#ifdef TCP_WINDOW_CLAMP
Fred Drake4baedc12002-04-01 14:53:37 +00004865 PyModule_AddIntConstant(m, "TCP_WINDOW_CLAMP", TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004866#endif
4867#ifdef TCP_INFO
Fred Drake4baedc12002-04-01 14:53:37 +00004868 PyModule_AddIntConstant(m, "TCP_INFO", TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004869#endif
4870#ifdef TCP_QUICKACK
Fred Drake4baedc12002-04-01 14:53:37 +00004871 PyModule_AddIntConstant(m, "TCP_QUICKACK", TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004872#endif
4873
Guido van Rossum09be4091999-08-09 14:40:40 +00004874
4875 /* IPX options */
4876#ifdef IPX_TYPE
Fred Drake4baedc12002-04-01 14:53:37 +00004877 PyModule_AddIntConstant(m, "IPX_TYPE", IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00004878#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004879
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004880 /* get{addr,name}info parameters */
4881#ifdef EAI_ADDRFAMILY
Fred Drake4baedc12002-04-01 14:53:37 +00004882 PyModule_AddIntConstant(m, "EAI_ADDRFAMILY", EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004883#endif
4884#ifdef EAI_AGAIN
Fred Drake4baedc12002-04-01 14:53:37 +00004885 PyModule_AddIntConstant(m, "EAI_AGAIN", EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004886#endif
4887#ifdef EAI_BADFLAGS
Fred Drake4baedc12002-04-01 14:53:37 +00004888 PyModule_AddIntConstant(m, "EAI_BADFLAGS", EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004889#endif
4890#ifdef EAI_FAIL
Fred Drake4baedc12002-04-01 14:53:37 +00004891 PyModule_AddIntConstant(m, "EAI_FAIL", EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004892#endif
4893#ifdef EAI_FAMILY
Fred Drake4baedc12002-04-01 14:53:37 +00004894 PyModule_AddIntConstant(m, "EAI_FAMILY", EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004895#endif
4896#ifdef EAI_MEMORY
Fred Drake4baedc12002-04-01 14:53:37 +00004897 PyModule_AddIntConstant(m, "EAI_MEMORY", EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004898#endif
4899#ifdef EAI_NODATA
Fred Drake4baedc12002-04-01 14:53:37 +00004900 PyModule_AddIntConstant(m, "EAI_NODATA", EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004901#endif
4902#ifdef EAI_NONAME
Fred Drake4baedc12002-04-01 14:53:37 +00004903 PyModule_AddIntConstant(m, "EAI_NONAME", EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004904#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00004905#ifdef EAI_OVERFLOW
4906 PyModule_AddIntConstant(m, "EAI_OVERFLOW", EAI_OVERFLOW);
4907#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004908#ifdef EAI_SERVICE
Fred Drake4baedc12002-04-01 14:53:37 +00004909 PyModule_AddIntConstant(m, "EAI_SERVICE", EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004910#endif
4911#ifdef EAI_SOCKTYPE
Fred Drake4baedc12002-04-01 14:53:37 +00004912 PyModule_AddIntConstant(m, "EAI_SOCKTYPE", EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004913#endif
4914#ifdef EAI_SYSTEM
Fred Drake4baedc12002-04-01 14:53:37 +00004915 PyModule_AddIntConstant(m, "EAI_SYSTEM", EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004916#endif
4917#ifdef EAI_BADHINTS
Fred Drake4baedc12002-04-01 14:53:37 +00004918 PyModule_AddIntConstant(m, "EAI_BADHINTS", EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004919#endif
4920#ifdef EAI_PROTOCOL
Fred Drake4baedc12002-04-01 14:53:37 +00004921 PyModule_AddIntConstant(m, "EAI_PROTOCOL", EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004922#endif
4923#ifdef EAI_MAX
Fred Drake4baedc12002-04-01 14:53:37 +00004924 PyModule_AddIntConstant(m, "EAI_MAX", EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004925#endif
4926#ifdef AI_PASSIVE
Fred Drake4baedc12002-04-01 14:53:37 +00004927 PyModule_AddIntConstant(m, "AI_PASSIVE", AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004928#endif
4929#ifdef AI_CANONNAME
Fred Drake4baedc12002-04-01 14:53:37 +00004930 PyModule_AddIntConstant(m, "AI_CANONNAME", AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004931#endif
4932#ifdef AI_NUMERICHOST
Fred Drake4baedc12002-04-01 14:53:37 +00004933 PyModule_AddIntConstant(m, "AI_NUMERICHOST", AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004934#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00004935#ifdef AI_NUMERICSERV
4936 PyModule_AddIntConstant(m, "AI_NUMERICSERV", AI_NUMERICSERV);
4937#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004938#ifdef AI_MASK
Fred Drake4baedc12002-04-01 14:53:37 +00004939 PyModule_AddIntConstant(m, "AI_MASK", AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004940#endif
4941#ifdef AI_ALL
Fred Drake4baedc12002-04-01 14:53:37 +00004942 PyModule_AddIntConstant(m, "AI_ALL", AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004943#endif
4944#ifdef AI_V4MAPPED_CFG
Fred Drake4baedc12002-04-01 14:53:37 +00004945 PyModule_AddIntConstant(m, "AI_V4MAPPED_CFG", AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004946#endif
4947#ifdef AI_ADDRCONFIG
Fred Drake4baedc12002-04-01 14:53:37 +00004948 PyModule_AddIntConstant(m, "AI_ADDRCONFIG", AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004949#endif
4950#ifdef AI_V4MAPPED
Fred Drake4baedc12002-04-01 14:53:37 +00004951 PyModule_AddIntConstant(m, "AI_V4MAPPED", AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004952#endif
4953#ifdef AI_DEFAULT
Fred Drake4baedc12002-04-01 14:53:37 +00004954 PyModule_AddIntConstant(m, "AI_DEFAULT", AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004955#endif
4956#ifdef NI_MAXHOST
Fred Drake4baedc12002-04-01 14:53:37 +00004957 PyModule_AddIntConstant(m, "NI_MAXHOST", NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004958#endif
4959#ifdef NI_MAXSERV
Fred Drake4baedc12002-04-01 14:53:37 +00004960 PyModule_AddIntConstant(m, "NI_MAXSERV", NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004961#endif
4962#ifdef NI_NOFQDN
Fred Drake4baedc12002-04-01 14:53:37 +00004963 PyModule_AddIntConstant(m, "NI_NOFQDN", NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004964#endif
4965#ifdef NI_NUMERICHOST
Fred Drake4baedc12002-04-01 14:53:37 +00004966 PyModule_AddIntConstant(m, "NI_NUMERICHOST", NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004967#endif
4968#ifdef NI_NAMEREQD
Fred Drake4baedc12002-04-01 14:53:37 +00004969 PyModule_AddIntConstant(m, "NI_NAMEREQD", NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004970#endif
4971#ifdef NI_NUMERICSERV
Fred Drake4baedc12002-04-01 14:53:37 +00004972 PyModule_AddIntConstant(m, "NI_NUMERICSERV", NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004973#endif
4974#ifdef NI_DGRAM
Fred Drake4baedc12002-04-01 14:53:37 +00004975 PyModule_AddIntConstant(m, "NI_DGRAM", NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004976#endif
4977
Martin v. Löwis94681fc2003-11-27 19:40:22 +00004978 /* shutdown() parameters */
4979#ifdef SHUT_RD
4980 PyModule_AddIntConstant(m, "SHUT_RD", SHUT_RD);
4981#elif defined(SD_RECEIVE)
4982 PyModule_AddIntConstant(m, "SHUT_RD", SD_RECEIVE);
4983#else
4984 PyModule_AddIntConstant(m, "SHUT_RD", 0);
4985#endif
4986#ifdef SHUT_WR
4987 PyModule_AddIntConstant(m, "SHUT_WR", SHUT_WR);
4988#elif defined(SD_SEND)
4989 PyModule_AddIntConstant(m, "SHUT_WR", SD_SEND);
4990#else
4991 PyModule_AddIntConstant(m, "SHUT_WR", 1);
4992#endif
4993#ifdef SHUT_RDWR
4994 PyModule_AddIntConstant(m, "SHUT_RDWR", SHUT_RDWR);
4995#elif defined(SD_BOTH)
4996 PyModule_AddIntConstant(m, "SHUT_RDWR", SD_BOTH);
4997#else
4998 PyModule_AddIntConstant(m, "SHUT_RDWR", 2);
4999#endif
5000
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005001 /* Initialize gethostbyname lock */
Just van Rossum1040d2c2003-05-09 07:53:18 +00005002#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
5003 netdb_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005004#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005005}
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005006
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005007
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005008#ifndef HAVE_INET_PTON
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005009
5010/* Simplistic emulation code for inet_pton that only works for IPv4 */
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005011/* These are not exposed because they do not set errno properly */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005012
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005013int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005014inet_pton(int af, const char *src, void *dst)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005015{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005016 if (af == AF_INET) {
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005017 long packed_addr;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005018 packed_addr = inet_addr(src);
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005019 if (packed_addr == INADDR_NONE)
5020 return 0;
5021 memcpy(dst, &packed_addr, 4);
5022 return 1;
5023 }
5024 /* Should set errno to EAFNOSUPPORT */
5025 return -1;
5026}
5027
Martin v. Löwisc925b1532001-07-21 09:42:15 +00005028const char *
5029inet_ntop(int af, const void *src, char *dst, socklen_t size)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005030{
5031 if (af == AF_INET) {
5032 struct in_addr packed_addr;
5033 if (size < 16)
5034 /* Should set errno to ENOSPC. */
5035 return NULL;
5036 memcpy(&packed_addr, src, sizeof(packed_addr));
5037 return strncpy(dst, inet_ntoa(packed_addr), size);
5038 }
5039 /* Should set errno to EAFNOSUPPORT */
5040 return NULL;
5041}
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005042
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005043#endif