blob: 55539ca69908bc1787e28de19cd24f5dac3736bb [file] [log] [blame]
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001/* Socket module */
2
3/*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005This module provides an interface to Berkeley socket IPC.
6
7Limitations:
8
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00009- Only AF_INET, AF_INET6 and AF_UNIX address families are supported in a
Martin v. Löwis11017b12006-01-14 18:12:57 +000010 portable manner, though AF_PACKET and AF_NETLINK are supported under Linux.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000011- No read/write operations (use sendall/recv or makefile instead).
12- Additional restrictions apply on some non-Unix platforms (compensated
13 for by socket.py).
Guido van Rossum6574b3e1991-06-25 21:36:08 +000014
Guido van Rossum27e177d1995-03-16 15:43:47 +000015Module interface:
Guido van Rossum6574b3e1991-06-25 21:36:08 +000016
Guido van Rossum27e177d1995-03-16 15:43:47 +000017- socket.error: exception raised for socket specific errors
Martin v. Löwis2d8d4272001-07-21 18:05:31 +000018- socket.gaierror: exception raised for getaddrinfo/getnameinfo errors,
19 a subclass of socket.error
20- socket.herror: exception raised for gethostby* errors,
21 a subclass of socket.error
Guido van Rossum83a072d2002-09-03 19:10:18 +000022- socket.fromfd(fd, family, type[, proto]) --> new socket object (created
23 from an existing file descriptor)
Guido van Rossum30a685f1991-06-27 15:51:29 +000024- socket.gethostbyname(hostname) --> host IP address (string: 'dd.dd.dd.dd')
Guido van Rossum3bbc62e1995-01-02 19:30:30 +000025- socket.gethostbyaddr(IP address) --> (hostname, [alias, ...], [IP addr, ...])
Guido van Rossum27e177d1995-03-16 15:43:47 +000026- socket.gethostname() --> host name (string: 'spam' or 'spam.domain.com')
Guido van Rossum25405c71996-12-19 16:42:52 +000027- socket.getprotobyname(protocolname) --> protocol number
Barry Warsaw11b91a02004-06-28 00:50:43 +000028- socket.getservbyname(servicename[, protocolname]) --> port number
29- socket.getservbyport(portnumber[, protocolname]) --> service name
Guido van Rossum83a072d2002-09-03 19:10:18 +000030- socket.socket([family[, type [, proto]]]) --> new socket object
Dave Cole331708b2004-08-09 04:51:41 +000031- socket.socketpair([family[, type [, proto]]]) --> (socket, socket)
Guido van Rossum006bf911996-06-12 04:04:55 +000032- socket.ntohs(16 bit value) --> new int object
33- socket.ntohl(32 bit value) --> new int object
34- socket.htons(16 bit value) --> new int object
35- socket.htonl(32 bit value) --> new int object
Martin v. Löwis2d8d4272001-07-21 18:05:31 +000036- socket.getaddrinfo(host, port [, family, socktype, proto, flags])
37 --> List of (family, socktype, proto, canonname, sockaddr)
38- socket.getnameinfo(sockaddr, flags) --> (host, port)
Guido van Rossum27e177d1995-03-16 15:43:47 +000039- socket.AF_INET, socket.SOCK_STREAM, etc.: constants from <socket.h>
Guido van Rossum47dfa4a2003-04-25 05:48:32 +000040- socket.has_ipv6: boolean value indicating if IPv6 is supported
Guido van Rossum5c9eb211999-08-20 18:21:51 +000041- socket.inet_aton(IP address) -> 32-bit packed IP representation
42- socket.inet_ntoa(packed IP) -> IP address string
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +000043- socket.getdefaulttimeout() -> None | float
44- socket.setdefaulttimeout(None | float)
Guido van Rossum6574b3e1991-06-25 21:36:08 +000045- an Internet socket address is a pair (hostname, port)
46 where hostname can be anything recognized by gethostbyname()
47 (including the dd.dd.dd.dd notation) and port is in host byte order
48- where a hostname is returned, the dd.dd.dd.dd notation is used
Guido van Rossum27e177d1995-03-16 15:43:47 +000049- a UNIX domain socket address is a string specifying the pathname
Jeremy Hylton22308652001-02-02 03:23:09 +000050- an AF_PACKET socket address is a tuple containing a string
51 specifying the ethernet interface and an integer specifying
52 the Ethernet protocol number to be received. For example:
Jeremy Hyltondbfb6622001-02-02 19:55:17 +000053 ("eth0",0x1234). Optional 3rd,4th,5th elements in the tuple
Andrew M. Kuchlingb8e17172004-07-10 23:39:35 +000054 specify packet-type and ha-type/addr.
Guido van Rossum6574b3e1991-06-25 21:36:08 +000055
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000056Local naming conventions:
Guido van Rossum6574b3e1991-06-25 21:36:08 +000057
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000058- names starting with sock_ are socket object methods
59- names starting with socket_ are module-level functions
60- names starting with PySocket are exported through socketmodule.h
Guido van Rossum30a685f1991-06-27 15:51:29 +000061
Guido van Rossum6574b3e1991-06-25 21:36:08 +000062*/
63
Ronald Oussorend06b6f22006-04-23 11:59:25 +000064#ifdef __APPLE__
65 /*
66 * inet_aton is not available on OSX 10.3, yet we want to use a binary
67 * that was build on 10.4 or later to work on that release, weak linking
68 * comes to the rescue.
69 */
70# pragma weak inet_aton
71#endif
72
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000073#include "Python.h"
Georg Brandlbc45a3f2006-03-17 19:17:34 +000074#include "structmember.h"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000075
Guido van Rossum47dfa4a2003-04-25 05:48:32 +000076#undef MAX
77#define MAX(x, y) ((x) < (y) ? (y) : (x))
78
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000079/* Socket object documentation */
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000080PyDoc_STRVAR(sock_doc,
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000081"socket([family[, type[, proto]]]) -> socket object\n\
82\n\
83Open a socket of the given type. The family argument specifies the\n\
84address family; it defaults to AF_INET. The type argument specifies\n\
85whether this is a stream (SOCK_STREAM, this is the default)\n\
86or datagram (SOCK_DGRAM) socket. The protocol argument defaults to 0,\n\
87specifying the default protocol. Keyword arguments are accepted.\n\
88\n\
89A socket object represents one endpoint of a network connection.\n\
90\n\
91Methods of socket objects (keyword arguments not allowed):\n\
92\n\
93accept() -- accept a connection, returning new socket and client address\n\
94bind(addr) -- bind the socket to a local address\n\
95close() -- close the socket\n\
96connect(addr) -- connect the socket to a remote address\n\
97connect_ex(addr) -- connect, return an error code instead of an exception\n\
98dup() -- return a new socket object identical to the current one [*]\n\
99fileno() -- return underlying file descriptor\n\
100getpeername() -- return remote address [*]\n\
101getsockname() -- return local address\n\
102getsockopt(level, optname[, buflen]) -- get socket options\n\
103gettimeout() -- return timeout or None\n\
104listen(n) -- start listening for incoming connections\n\
105makefile([mode, [bufsize]]) -- return a file object for the socket [*]\n\
106recv(buflen[, flags]) -- receive data\n\
Martin Blaisaf2ae722006-06-04 13:49:49 +0000107recv_into(buffer[, nbytes[, flags]]) -- receive data (into a buffer)\n\
Martin Blais2856e5f2006-05-26 12:03:27 +0000108recvfrom(buflen[, flags]) -- receive data and sender\'s address\n\
Martin Blaisaf2ae722006-06-04 13:49:49 +0000109recvfrom_into(buffer[, nbytes, [, flags])\n\
Martin Blais2856e5f2006-05-26 12:03:27 +0000110 -- receive data and sender\'s address (into a buffer)\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000111sendall(data[, flags]) -- send all data\n\
112send(data[, flags]) -- send data, may not send all of it\n\
113sendto(data[, flags], addr) -- send data to a given address\n\
114setblocking(0 | 1) -- set or clear the blocking I/O flag\n\
115setsockopt(level, optname, value) -- set socket options\n\
116settimeout(None | float) -- set or clear the timeout\n\
117shutdown(how) -- shut down traffic in one or both directions\n\
118\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000119 [*] not available on all platforms!");
Guido van Rossum3baaa131999-03-22 21:44:51 +0000120
Walter Dörwaldf0dfc7a2003-10-20 14:01:56 +0000121/* XXX This is a terrible mess of platform-dependent preprocessor hacks.
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000122 I hope some day someone can clean this up please... */
123
Guido van Rossum9376b741999-09-15 22:01:40 +0000124/* Hacks for gethostbyname_r(). On some non-Linux platforms, the configure
125 script doesn't get this right, so we hardcode some platform checks below.
126 On the other hand, not all Linux versions agree, so there the settings
127 computed by the configure script are needed! */
128
129#ifndef linux
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000130# undef HAVE_GETHOSTBYNAME_R_3_ARG
131# undef HAVE_GETHOSTBYNAME_R_5_ARG
132# undef HAVE_GETHOSTBYNAME_R_6_ARG
Guido van Rossum9376b741999-09-15 22:01:40 +0000133#endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000134
Guido van Rossum7a122991999-04-13 04:07:32 +0000135#ifndef WITH_THREAD
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000136# undef HAVE_GETHOSTBYNAME_R
Guido van Rossum7a122991999-04-13 04:07:32 +0000137#endif
138
Guido van Rossume7de2061999-03-24 17:24:33 +0000139#ifdef HAVE_GETHOSTBYNAME_R
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000140# if defined(_AIX) || defined(__osf__)
141# define HAVE_GETHOSTBYNAME_R_3_ARG
142# elif defined(__sun) || defined(__sgi)
143# define HAVE_GETHOSTBYNAME_R_5_ARG
144# elif defined(linux)
Guido van Rossum9376b741999-09-15 22:01:40 +0000145/* Rely on the configure script */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000146# else
147# undef HAVE_GETHOSTBYNAME_R
148# endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000149#endif
150
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000151#if !defined(HAVE_GETHOSTBYNAME_R) && defined(WITH_THREAD) && \
152 !defined(MS_WINDOWS)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000153# define USE_GETHOSTBYNAME_LOCK
Guido van Rossum3baaa131999-03-22 21:44:51 +0000154#endif
155
Hye-Shik Chang9ceebd52005-09-24 14:58:47 +0000156/* To use __FreeBSD_version */
157#ifdef HAVE_SYS_PARAM_H
158#include <sys/param.h>
159#endif
Just van Rossum1040d2c2003-05-09 07:53:18 +0000160/* On systems on which getaddrinfo() is believed to not be thread-safe,
Just van Rossum09aecd72003-05-09 08:03:44 +0000161 (this includes the getaddrinfo emulation) protect access with a lock. */
Hye-Shik Chang9ceebd52005-09-24 14:58:47 +0000162#if defined(WITH_THREAD) && (defined(__APPLE__) || \
163 (defined(__FreeBSD__) && __FreeBSD_version+0 < 503000) || \
Neal Norwitz2a30cd02006-07-10 01:18:57 +0000164 defined(__OpenBSD__) || defined(__NetBSD__) || \
165 defined(__VMS) || !defined(HAVE_GETADDRINFO))
Just van Rossum1040d2c2003-05-09 07:53:18 +0000166#define USE_GETADDRINFO_LOCK
167#endif
168
169#ifdef USE_GETADDRINFO_LOCK
170#define ACQUIRE_GETADDRINFO_LOCK PyThread_acquire_lock(netdb_lock, 1);
171#define RELEASE_GETADDRINFO_LOCK PyThread_release_lock(netdb_lock);
172#else
173#define ACQUIRE_GETADDRINFO_LOCK
174#define RELEASE_GETADDRINFO_LOCK
175#endif
176
177#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000178# include "pythread.h"
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000179#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000180
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000181#if defined(PYCC_VACPP)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000182# include <types.h>
183# include <io.h>
184# include <sys/ioctl.h>
185# include <utils.h>
186# include <ctype.h>
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000187#endif
188
Martin v. Löwis9e437302002-12-06 12:57:26 +0000189#if defined(__VMS)
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000190# include <ioctl.h>
191#endif
192
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000193#if defined(PYOS_OS2)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000194# define INCL_DOS
195# define INCL_DOSERRORS
196# define INCL_NOPMAPI
197# include <os2.h>
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000198#endif
199
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000200#if defined(__sgi) && _COMPILER_VERSION>700 && !_SGIAPI
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000201/* make sure that the reentrant (gethostbyaddr_r etc)
202 functions are declared correctly if compiling with
203 MIPSPro 7.x in ANSI C mode (default) */
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000204
Martin Blais2856e5f2006-05-26 12:03:27 +0000205/* XXX Using _SGIAPI is the wrong thing,
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000206 but I don't know what the right thing is. */
Trent Mick8ea5bdf2004-09-13 17:48:41 +0000207#undef _SGIAPI /* to avoid warning */
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000208#define _SGIAPI 1
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000209
Trent Mick8ea5bdf2004-09-13 17:48:41 +0000210#undef _XOPEN_SOURCE
211#include <sys/socket.h>
212#include <sys/types.h>
213#include <netinet/in.h>
214#ifdef _SS_ALIGNSIZE
215#define HAVE_GETADDRINFO 1
216#define HAVE_GETNAMEINFO 1
217#endif
218
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000219#define HAVE_INET_PTON
220#include <netdb.h>
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000221#endif
222
Martin Blais2856e5f2006-05-26 12:03:27 +0000223/* Irix 6.5 fails to define this variable at all. This is needed
224 for both GCC and SGI's compiler. I'd say that the SGI headers
Georg Brandldbd83392006-02-20 09:42:33 +0000225 are just busted. Same thing for Solaris. */
226#if (defined(__sgi) || defined(sun)) && !defined(INET_ADDRSTRLEN)
Anthony Baxterbab23cf2003-10-04 08:00:49 +0000227#define INET_ADDRSTRLEN 16
228#endif
229
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000230/* Generic includes */
Martin v. Löwis0e8bd7e2006-06-10 12:23:46 +0000231#ifdef HAVE_SYS_TYPES_H
Guido van Rossumb6775db1994-08-01 11:34:53 +0000232#include <sys/types.h>
Martin v. Löwis0e8bd7e2006-06-10 12:23:46 +0000233#endif
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000234
Marc-André Lemburg976ade62002-02-16 18:47:07 +0000235/* Generic socket object definitions and includes */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000236#define PySocket_BUILDING_SOCKET
Marc-André Lemburgbb8b78b2002-02-16 18:44:52 +0000237#include "socketmodule.h"
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000238
239/* Addressing includes */
240
Guido van Rossum6f489d91996-06-28 20:15:15 +0000241#ifndef MS_WINDOWS
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000242
243/* Non-MS WINDOWS includes */
244# include <netdb.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000245
Guido van Rossum9376b741999-09-15 22:01:40 +0000246/* Headers needed for inet_ntoa() and inet_addr() */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000247# ifdef __BEOS__
248# include <net/netdb.h>
249# elif defined(PYOS_OS2) && defined(PYCC_VACPP)
250# include <netdb.h>
Tim Peters603c6832001-11-05 02:45:59 +0000251typedef size_t socklen_t;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000252# else
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000253# include <arpa/inet.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000254# endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000255
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000256# ifndef RISCOS
257# include <fcntl.h>
258# else
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000259# include <sys/ioctl.h>
260# include <socklib.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000261# define NO_DUP
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000262int h_errno; /* not used */
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000263# define INET_ADDRSTRLEN 16
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000264# endif
265
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000266#else
Guido van Rossum48a680c2001-03-02 06:34:14 +0000267
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000268/* MS_WINDOWS includes */
Martin v. Löwis0e8bd7e2006-06-10 12:23:46 +0000269# ifdef HAVE_FCNTL_H
270# include <fcntl.h>
271# endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000272
Jeremy Hylton22308652001-02-02 03:23:09 +0000273#endif
274
Skip Montanaro7befb992004-02-10 16:50:21 +0000275#include <stddef.h>
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000276
277#ifndef offsetof
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000278# define offsetof(type, member) ((size_t)(&((type *)0)->member))
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000279#endif
280
Neal Norwitz39d22e52002-11-02 19:55:21 +0000281#ifndef O_NONBLOCK
282# define O_NONBLOCK O_NDELAY
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000283#endif
284
Trent Micka708d6e2004-09-07 17:48:26 +0000285/* include Python's addrinfo.h unless it causes trouble */
286#if defined(__sgi) && _COMPILER_VERSION>700 && defined(_SS_ALIGNSIZE)
287 /* Do not include addinfo.h on some newer IRIX versions.
288 * _SS_ALIGNSIZE is defined in sys/socket.h by 6.5.21,
289 * for example, but not by 6.5.10.
290 */
Martin v. Löwis0e8bd7e2006-06-10 12:23:46 +0000291#elif defined(_MSC_VER) && _MSC_VER>1201
Trent Micka708d6e2004-09-07 17:48:26 +0000292 /* Do not include addrinfo.h for MSVC7 or greater. 'addrinfo' and
293 * EAI_* constants are defined in (the already included) ws2tcpip.h.
294 */
295#else
296# include "addrinfo.h"
297#endif
Jason Tishlerc246cb72004-08-09 13:25:59 +0000298
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000299#ifndef HAVE_INET_PTON
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000300int inet_pton(int af, const char *src, void *dst);
Martin v. Löwisc925b1532001-07-21 09:42:15 +0000301const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000302#endif
303
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000304#ifdef __APPLE__
305/* On OS X, getaddrinfo returns no error indication of lookup
306 failure, so we must use the emulation instead of the libinfo
307 implementation. Unfortunately, performing an autoconf test
308 for this bug would require DNS access for the machine performing
309 the configuration, which is not acceptable. Therefore, we
310 determine the bug just by checking for __APPLE__. If this bug
311 gets ever fixed, perhaps checking for sys/version.h would be
312 appropriate, which is 10/0 on the system with the bug. */
Jack Jansen84262fb2002-07-02 14:40:42 +0000313#ifndef HAVE_GETNAMEINFO
314/* This bug seems to be fixed in Jaguar. Ths easiest way I could
315 Find to check for Jaguar is that it has getnameinfo(), which
316 older releases don't have */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000317#undef HAVE_GETADDRINFO
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000318#endif
Ronald Oussorend06b6f22006-04-23 11:59:25 +0000319
320#ifdef HAVE_INET_ATON
321#define USE_INET_ATON_WEAKLINK
322#endif
323
Jack Jansen84262fb2002-07-02 14:40:42 +0000324#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000325
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000326/* I know this is a bad practice, but it is the easiest... */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000327#if !defined(HAVE_GETADDRINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000328/* avoid clashes with the C library definition of the symbol. */
329#define getaddrinfo fake_getaddrinfo
330#define gai_strerror fake_gai_strerror
331#define freeaddrinfo fake_freeaddrinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000332#include "getaddrinfo.c"
333#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000334#if !defined(HAVE_GETNAMEINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000335#define getnameinfo fake_getnameinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000336#include "getnameinfo.c"
337#endif
338
Guido van Rossumbcc20741998-08-04 22:53:56 +0000339#if defined(MS_WINDOWS) || defined(__BEOS__)
340/* BeOS suffers from the same socket dichotomy as Win32... - [cjh] */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000341/* seem to be a few differences in the API */
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000342#define SOCKETCLOSE closesocket
Guido van Rossumbe32c891996-06-20 16:25:29 +0000343#define NO_DUP /* Actually it exists on NT 3.5, but what the heck... */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000344#endif
345
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000346#ifdef MS_WIN32
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000347#define EAFNOSUPPORT WSAEAFNOSUPPORT
348#define snprintf _snprintf
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000349#endif
Fred Drakea04eaad2000-06-30 02:46:07 +0000350
Andrew MacIntyreba43e872002-03-03 03:03:52 +0000351#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000352#define SOCKETCLOSE soclose
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000353#define NO_DUP /* Sockets are Not Actual File Handles under OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000354#endif
355
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000356#ifndef SOCKETCLOSE
357#define SOCKETCLOSE close
358#endif
359
Hye-Shik Chang81268602004-02-02 06:05:24 +0000360#if defined(HAVE_BLUETOOTH_H) || defined(HAVE_BLUETOOTH_BLUETOOTH_H)
361#define USE_BLUETOOTH 1
362#if defined(__FreeBSD__)
363#define BTPROTO_L2CAP BLUETOOTH_PROTO_L2CAP
364#define BTPROTO_RFCOMM BLUETOOTH_PROTO_RFCOMM
365#define sockaddr_l2 sockaddr_l2cap
366#define sockaddr_rc sockaddr_rfcomm
367#define _BT_SOCKADDR_MEMB(s, proto) &((s)->sock_addr)
368#define _BT_L2_MEMB(sa, memb) ((sa)->l2cap_##memb)
369#define _BT_RC_MEMB(sa, memb) ((sa)->rfcomm_##memb)
Matt Flemingec926502006-07-28 11:27:27 +0000370#elif defined(__NetBSD__)
371#define sockaddr_l2 sockaddr_bt
372#define sockaddr_rc sockaddr_bt
373#define sockaddr_sco sockaddr_bt
374#define _BT_SOCKADDR_MEMB(s, proto) &((s)->sock_addr)
375#define _BT_L2_MEMB(sa, memb) ((sa)->bt_##memb)
376#define _BT_RC_MEMB(sa, memb) ((sa)->bt_##memb)
377#define _BT_SCO_MEMB(sa, memb) ((sa)->bt_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000378#else
Anthony Baxter5d7c0672004-02-16 05:35:28 +0000379#define _BT_SOCKADDR_MEMB(s, proto) (&((s)->sock_addr).bt_##proto)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000380#define _BT_L2_MEMB(sa, memb) ((sa)->l2_##memb)
381#define _BT_RC_MEMB(sa, memb) ((sa)->rc_##memb)
382#define _BT_SCO_MEMB(sa, memb) ((sa)->sco_##memb)
383#endif
384#endif
385
Neal Norwitz2a30cd02006-07-10 01:18:57 +0000386#ifdef __VMS
387/* TCP/IP Services for VMS uses a maximum send/recv buffer length */
388#define SEGMENT_SIZE (32 * 1024 -1)
389#endif
390
Martin v. Löwise9416172003-05-03 10:12:45 +0000391/*
392 * Constants for getnameinfo()
393 */
394#if !defined(NI_MAXHOST)
395#define NI_MAXHOST 1025
396#endif
397#if !defined(NI_MAXSERV)
398#define NI_MAXSERV 32
399#endif
400
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000401/* XXX There's a problem here: *static* functions are not supposed to have
402 a Py prefix (or use CapitalizedWords). Later... */
403
Guido van Rossum30a685f1991-06-27 15:51:29 +0000404/* Global variable holding the exception type for errors detected
405 by this module (but not argument type or memory errors, etc.). */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000406static PyObject *socket_error;
407static PyObject *socket_herror;
408static PyObject *socket_gaierror;
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000409static PyObject *socket_timeout;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000410
Guido van Rossum48a680c2001-03-02 06:34:14 +0000411#ifdef RISCOS
412/* Global variable which is !=0 if Python is running in a RISC OS taskwindow */
413static int taskwindow;
414#endif
415
Tim Peters643a7fc2002-02-17 04:13:21 +0000416/* A forward reference to the socket type object.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000417 The sock_type variable contains pointers to various functions,
418 some of which call new_sockobject(), which uses sock_type, so
Tim Peters643a7fc2002-02-17 04:13:21 +0000419 there has to be a circular reference. */
Jeremy Hylton938ace62002-07-17 16:30:39 +0000420static PyTypeObject sock_type;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000421
Anthony Baxter93ab5fa2006-07-11 02:04:09 +0000422#if defined(HAVE_POLL_H)
423#include <poll.h>
424#elif defined(HAVE_SYS_POLL_H)
425#include <sys/poll.h>
426#endif
427
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000428#ifdef Py_SOCKET_FD_CAN_BE_GE_FD_SETSIZE
429/* Platform can select file descriptors beyond FD_SETSIZE */
430#define IS_SELECTABLE(s) 1
Anthony Baxter93ab5fa2006-07-11 02:04:09 +0000431#elif defined(HAVE_POLL)
432/* Instead of select(), we'll use poll() since poll() works on any fd. */
433#define IS_SELECTABLE(s) 1
434/* Can we call select() with this socket without a buffer overrun? */
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000435#else
436/* POSIX says selecting file descriptors beyond FD_SETSIZE
Anthony Baxter93ab5fa2006-07-11 02:04:09 +0000437 has undefined behaviour. If there's no timeout left, we don't have to
438 call select, so it's a safe, little white lie. */
439#define IS_SELECTABLE(s) ((s)->sock_fd < FD_SETSIZE || s->sock_timeout <= 0.0)
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000440#endif
Neal Norwitz082b2df2006-02-07 07:04:46 +0000441
442static PyObject*
443select_error(void)
444{
445 PyErr_SetString(socket_error, "unable to select on socket");
446 return NULL;
447}
448
Guido van Rossum30a685f1991-06-27 15:51:29 +0000449/* Convenience function to raise an error according to errno
450 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000451
Guido van Rossum73624e91994-10-10 17:59:00 +0000452static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000453set_error(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000454{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000455#ifdef MS_WINDOWS
Mark Hammond46a733d2000-07-24 01:45:11 +0000456 int err_no = WSAGetLastError();
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000457 static struct {
458 int no;
459 const char *msg;
460 } *msgp, msgs[] = {
461 {WSAEINTR, "Interrupted system call"},
462 {WSAEBADF, "Bad file descriptor"},
463 {WSAEACCES, "Permission denied"},
464 {WSAEFAULT, "Bad address"},
465 {WSAEINVAL, "Invalid argument"},
466 {WSAEMFILE, "Too many open files"},
467 {WSAEWOULDBLOCK,
468 "The socket operation could not complete "
469 "without blocking"},
470 {WSAEINPROGRESS, "Operation now in progress"},
471 {WSAEALREADY, "Operation already in progress"},
472 {WSAENOTSOCK, "Socket operation on non-socket"},
473 {WSAEDESTADDRREQ, "Destination address required"},
474 {WSAEMSGSIZE, "Message too long"},
475 {WSAEPROTOTYPE, "Protocol wrong type for socket"},
476 {WSAENOPROTOOPT, "Protocol not available"},
477 {WSAEPROTONOSUPPORT, "Protocol not supported"},
478 {WSAESOCKTNOSUPPORT, "Socket type not supported"},
479 {WSAEOPNOTSUPP, "Operation not supported"},
480 {WSAEPFNOSUPPORT, "Protocol family not supported"},
481 {WSAEAFNOSUPPORT, "Address family not supported"},
482 {WSAEADDRINUSE, "Address already in use"},
483 {WSAEADDRNOTAVAIL, "Can't assign requested address"},
484 {WSAENETDOWN, "Network is down"},
485 {WSAENETUNREACH, "Network is unreachable"},
486 {WSAENETRESET, "Network dropped connection on reset"},
487 {WSAECONNABORTED, "Software caused connection abort"},
488 {WSAECONNRESET, "Connection reset by peer"},
489 {WSAENOBUFS, "No buffer space available"},
490 {WSAEISCONN, "Socket is already connected"},
491 {WSAENOTCONN, "Socket is not connected"},
492 {WSAESHUTDOWN, "Can't send after socket shutdown"},
493 {WSAETOOMANYREFS, "Too many references: can't splice"},
494 {WSAETIMEDOUT, "Operation timed out"},
495 {WSAECONNREFUSED, "Connection refused"},
496 {WSAELOOP, "Too many levels of symbolic links"},
497 {WSAENAMETOOLONG, "File name too long"},
498 {WSAEHOSTDOWN, "Host is down"},
499 {WSAEHOSTUNREACH, "No route to host"},
500 {WSAENOTEMPTY, "Directory not empty"},
501 {WSAEPROCLIM, "Too many processes"},
502 {WSAEUSERS, "Too many users"},
503 {WSAEDQUOT, "Disc quota exceeded"},
504 {WSAESTALE, "Stale NFS file handle"},
505 {WSAEREMOTE, "Too many levels of remote in path"},
506 {WSASYSNOTREADY, "Network subsystem is unvailable"},
507 {WSAVERNOTSUPPORTED, "WinSock version is not supported"},
508 {WSANOTINITIALISED,
509 "Successful WSAStartup() not yet performed"},
510 {WSAEDISCON, "Graceful shutdown in progress"},
511 /* Resolver errors */
512 {WSAHOST_NOT_FOUND, "No such host is known"},
513 {WSATRY_AGAIN, "Host not found, or server failed"},
514 {WSANO_RECOVERY, "Unexpected server error encountered"},
515 {WSANO_DATA, "Valid name without requested data"},
516 {WSANO_ADDRESS, "No address, look for MX record"},
517 {0, NULL}
518 };
Mark Hammond46a733d2000-07-24 01:45:11 +0000519 if (err_no) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000520 PyObject *v;
Mark Hammond46a733d2000-07-24 01:45:11 +0000521 const char *msg = "winsock error";
Guido van Rossum48a680c2001-03-02 06:34:14 +0000522
Mark Hammond46a733d2000-07-24 01:45:11 +0000523 for (msgp = msgs; msgp->msg; msgp++) {
524 if (err_no == msgp->no) {
525 msg = msgp->msg;
526 break;
527 }
528 }
529
530 v = Py_BuildValue("(is)", err_no, msg);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000531 if (v != NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000532 PyErr_SetObject(socket_error, v);
Guido van Rossum73624e91994-10-10 17:59:00 +0000533 Py_DECREF(v);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000534 }
535 return NULL;
536 }
537 else
538#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000539
Andrew MacIntyreba43e872002-03-03 03:03:52 +0000540#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000541 if (sock_errno() != NO_ERROR) {
542 APIRET rc;
543 ULONG msglen;
544 char outbuf[100];
545 int myerrorcode = sock_errno();
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000546
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000547 /* Retrieve socket-related error message from MPTN.MSG file */
548 rc = DosGetMessage(NULL, 0, outbuf, sizeof(outbuf),
549 myerrorcode - SOCBASEERR + 26,
550 "mptn.msg",
551 &msglen);
552 if (rc == NO_ERROR) {
553 PyObject *v;
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000554
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000555 /* OS/2 doesn't guarantee a terminator */
556 outbuf[msglen] = '\0';
557 if (strlen(outbuf) > 0) {
558 /* If non-empty msg, trim CRLF */
559 char *lastc = &outbuf[ strlen(outbuf)-1 ];
Neal Norwitz30b5c5d2005-12-19 06:05:18 +0000560 while (lastc > outbuf &&
561 isspace(Py_CHARMASK(*lastc))) {
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000562 /* Trim trailing whitespace (CRLF) */
563 *lastc-- = '\0';
564 }
565 }
566 v = Py_BuildValue("(is)", myerrorcode, outbuf);
567 if (v != NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000568 PyErr_SetObject(socket_error, v);
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000569 Py_DECREF(v);
570 }
571 return NULL;
572 }
573 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000574#endif
575
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000576#if defined(RISCOS)
577 if (_inet_error.errnum != NULL) {
578 PyObject *v;
579 v = Py_BuildValue("(is)", errno, _inet_err());
580 if (v != NULL) {
581 PyErr_SetObject(socket_error, v);
582 Py_DECREF(v);
583 }
584 return NULL;
585 }
586#endif
587
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000588 return PyErr_SetFromErrno(socket_error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000589}
590
Guido van Rossum30a685f1991-06-27 15:51:29 +0000591
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000592static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000593set_herror(int h_error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000594{
595 PyObject *v;
596
597#ifdef HAVE_HSTRERROR
598 v = Py_BuildValue("(is)", h_error, (char *)hstrerror(h_error));
599#else
600 v = Py_BuildValue("(is)", h_error, "host not found");
601#endif
602 if (v != NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000603 PyErr_SetObject(socket_herror, v);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000604 Py_DECREF(v);
605 }
606
607 return NULL;
608}
609
610
611static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000612set_gaierror(int error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000613{
614 PyObject *v;
615
Martin v. Löwis272cb402002-03-01 08:31:07 +0000616#ifdef EAI_SYSTEM
617 /* EAI_SYSTEM is not available on Windows XP. */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000618 if (error == EAI_SYSTEM)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000619 return set_error();
Martin v. Löwis272cb402002-03-01 08:31:07 +0000620#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000621
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000622#ifdef HAVE_GAI_STRERROR
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000623 v = Py_BuildValue("(is)", error, gai_strerror(error));
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000624#else
625 v = Py_BuildValue("(is)", error, "getaddrinfo failed");
626#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000627 if (v != NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000628 PyErr_SetObject(socket_gaierror, v);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000629 Py_DECREF(v);
630 }
631
632 return NULL;
633}
634
Neal Norwitz2a30cd02006-07-10 01:18:57 +0000635#ifdef __VMS
636/* Function to send in segments */
637static int
638sendsegmented(int sock_fd, char *buf, int len, int flags)
639{
640 int n = 0;
641 int remaining = len;
642
643 while (remaining > 0) {
644 unsigned int segment;
645
646 segment = (remaining >= SEGMENT_SIZE ? SEGMENT_SIZE : remaining);
647 n = send(sock_fd, buf, segment, flags);
648 if (n < 0) {
649 return n;
650 }
651 remaining -= segment;
652 buf += segment;
653 } /* end while */
654
655 return len;
656}
657#endif
658
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000659/* Function to perform the setting of socket blocking mode
660 internally. block = (1 | 0). */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000661static int
662internal_setblocking(PySocketSockObject *s, int block)
663{
664#ifndef RISCOS
665#ifndef MS_WINDOWS
666 int delay_flag;
667#endif
668#endif
669
670 Py_BEGIN_ALLOW_THREADS
671#ifdef __BEOS__
672 block = !block;
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000673 setsockopt(s->sock_fd, SOL_SOCKET, SO_NONBLOCK,
674 (void *)(&block), sizeof(int));
Guido van Rossum67f7a382002-06-06 21:08:16 +0000675#else
676#ifndef RISCOS
677#ifndef MS_WINDOWS
678#if defined(PYOS_OS2) && !defined(PYCC_GCC)
679 block = !block;
680 ioctl(s->sock_fd, FIONBIO, (caddr_t)&block, sizeof(block));
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000681#elif defined(__VMS)
682 block = !block;
Neal Norwitz2a30cd02006-07-10 01:18:57 +0000683 ioctl(s->sock_fd, FIONBIO, (unsigned int *)&block);
684#else /* !PYOS_OS2 && !__VMS */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000685 delay_flag = fcntl(s->sock_fd, F_GETFL, 0);
686 if (block)
Neal Norwitz39d22e52002-11-02 19:55:21 +0000687 delay_flag &= (~O_NONBLOCK);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000688 else
Neal Norwitz39d22e52002-11-02 19:55:21 +0000689 delay_flag |= O_NONBLOCK;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000690 fcntl(s->sock_fd, F_SETFL, delay_flag);
691#endif /* !PYOS_OS2 */
692#else /* MS_WINDOWS */
693 block = !block;
694 ioctlsocket(s->sock_fd, FIONBIO, (u_long*)&block);
695#endif /* MS_WINDOWS */
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000696#else /* RISCOS */
697 block = !block;
698 socketioctl(s->sock_fd, FIONBIO, (u_long*)&block);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000699#endif /* RISCOS */
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000700#endif /* __BEOS__ */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000701 Py_END_ALLOW_THREADS
702
703 /* Since these don't return anything */
704 return 1;
705}
706
Anthony Baxter93ab5fa2006-07-11 02:04:09 +0000707/* Do a select()/poll() on the socket, if necessary (sock_timeout > 0).
Guido van Rossum11ba0942002-06-13 15:07:44 +0000708 The argument writing indicates the direction.
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000709 This does not raise an exception; we'll let our caller do that
710 after they've reacquired the interpreter lock.
711 Returns 1 on timeout, 0 otherwise. */
712static int
Guido van Rossumb9e916a2002-06-07 01:42:47 +0000713internal_select(PySocketSockObject *s, int writing)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000714{
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000715 int n;
Guido van Rossum11ba0942002-06-13 15:07:44 +0000716
Guido van Rossumad654902002-07-19 12:44:59 +0000717 /* Nothing to do unless we're in timeout mode (not non-blocking) */
Guido van Rossum11ba0942002-06-13 15:07:44 +0000718 if (s->sock_timeout <= 0.0)
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000719 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000720
Guido van Rossumad654902002-07-19 12:44:59 +0000721 /* Guard against closed socket */
722 if (s->sock_fd < 0)
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000723 return 0;
Guido van Rossumad654902002-07-19 12:44:59 +0000724
Anthony Baxter93ab5fa2006-07-11 02:04:09 +0000725 /* Prefer poll, if available, since you can poll() any fd
726 * which can't be done with select(). */
727#ifdef HAVE_POLL
728 {
729 struct pollfd pollfd;
730 int timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000731
Anthony Baxter93ab5fa2006-07-11 02:04:09 +0000732 pollfd.fd = s->sock_fd;
733 pollfd.events = writing ? POLLOUT : POLLIN;
734
735 /* s->sock_timeout is in seconds, timeout in ms */
736 timeout = (int)(s->sock_timeout * 1000 + 0.5);
737 n = poll(&pollfd, 1, timeout);
738 }
739#else
740 {
741 /* Construct the arguments to select */
742 fd_set fds;
743 struct timeval tv;
744 tv.tv_sec = (int)s->sock_timeout;
745 tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6);
746 FD_ZERO(&fds);
747 FD_SET(s->sock_fd, &fds);
748
749 /* See if the socket is ready */
750 if (writing)
751 n = select(s->sock_fd+1, NULL, &fds, NULL, &tv);
752 else
753 n = select(s->sock_fd+1, &fds, NULL, NULL, &tv);
754 }
755#endif
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000756 if (n == 0)
757 return 1;
758 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000759}
760
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000761/* Initialize a new socket object. */
762
Tim Petersa12b4cf2002-07-18 22:38:44 +0000763static double defaulttimeout = -1.0; /* Default timeout for new sockets */
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000764
Mark Hammond62b1ab12002-07-23 06:31:15 +0000765PyMODINIT_FUNC
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000766init_sockobject(PySocketSockObject *s,
767 SOCKET_T fd, int family, int type, int proto)
768{
769#ifdef RISCOS
770 int block = 1;
771#endif
772 s->sock_fd = fd;
773 s->sock_family = family;
774 s->sock_type = type;
775 s->sock_proto = proto;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000776 s->sock_timeout = defaulttimeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000777
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000778 s->errorhandler = &set_error;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000779
780 if (defaulttimeout >= 0.0)
781 internal_setblocking(s, 0);
782
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000783#ifdef RISCOS
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000784 if (taskwindow)
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000785 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000786#endif
787}
788
789
Guido van Rossum30a685f1991-06-27 15:51:29 +0000790/* Create a new socket object.
791 This just creates the object and initializes it.
792 If the creation fails, return NULL and set an exception (implicit
793 in NEWOBJ()). */
794
Guido van Rossum73624e91994-10-10 17:59:00 +0000795static PySocketSockObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000796new_sockobject(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000797{
Guido van Rossum73624e91994-10-10 17:59:00 +0000798 PySocketSockObject *s;
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000799 s = (PySocketSockObject *)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000800 PyType_GenericNew(&sock_type, NULL, NULL);
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000801 if (s != NULL)
802 init_sockobject(s, fd, family, type, proto);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000803 return s;
804}
805
Guido van Rossum30a685f1991-06-27 15:51:29 +0000806
Guido van Rossum48a680c2001-03-02 06:34:14 +0000807/* Lock to allow python interpreter to continue, but only allow one
Just van Rossum1040d2c2003-05-09 07:53:18 +0000808 thread to be in gethostbyname or getaddrinfo */
809#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
810PyThread_type_lock netdb_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000811#endif
812
813
Guido van Rossum30a685f1991-06-27 15:51:29 +0000814/* Convert a string specifying a host name or one of a few symbolic
815 names to a numeric IP address. This usually calls gethostbyname()
816 to do the work; the names "" and "<broadcast>" are special.
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000817 Return the length (IPv4 should be 4 bytes), or negative if
Guido van Rossum30a685f1991-06-27 15:51:29 +0000818 an error occurred; then an exception is raised. */
819
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000820static int
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000821setipaddr(char *name, struct sockaddr *addr_ret, size_t addr_ret_size, int af)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000822{
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000823 struct addrinfo hints, *res;
824 int error;
Anthony Baxter0e85f9d2003-05-02 15:40:46 +0000825 int d1, d2, d3, d4;
826 char ch;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000827
Guido van Rossuma376cc51996-12-05 23:43:35 +0000828 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
Guido van Rossum30a685f1991-06-27 15:51:29 +0000829 if (name[0] == '\0') {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000830 int siz;
831 memset(&hints, 0, sizeof(hints));
832 hints.ai_family = af;
833 hints.ai_socktype = SOCK_DGRAM; /*dummy*/
834 hints.ai_flags = AI_PASSIVE;
Just van Rossum1040d2c2003-05-09 07:53:18 +0000835 Py_BEGIN_ALLOW_THREADS
836 ACQUIRE_GETADDRINFO_LOCK
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000837 error = getaddrinfo(NULL, "0", &hints, &res);
Just van Rossum1040d2c2003-05-09 07:53:18 +0000838 Py_END_ALLOW_THREADS
839 /* We assume that those thread-unsafe getaddrinfo() versions
840 *are* safe regarding their return value, ie. that a
841 subsequent call to getaddrinfo() does not destroy the
842 outcome of the first call. */
843 RELEASE_GETADDRINFO_LOCK
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000844 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000845 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000846 return -1;
847 }
848 switch (res->ai_family) {
849 case AF_INET:
850 siz = 4;
851 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000852#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000853 case AF_INET6:
854 siz = 16;
855 break;
856#endif
857 default:
858 freeaddrinfo(res);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000859 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000860 "unsupported address family");
861 return -1;
862 }
863 if (res->ai_next) {
Martin v. Löwisf0b11d22001-11-07 08:31:03 +0000864 freeaddrinfo(res);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000865 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000866 "wildcard resolved to multiple address");
867 return -1;
868 }
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000869 if (res->ai_addrlen < addr_ret_size)
870 addr_ret_size = res->ai_addrlen;
871 memcpy(addr_ret, res->ai_addr, addr_ret_size);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000872 freeaddrinfo(res);
873 return siz;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000874 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000875 if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000876 struct sockaddr_in *sin;
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +0000877 if (af != AF_INET && af != AF_UNSPEC) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000878 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000879 "address family mismatched");
880 return -1;
881 }
882 sin = (struct sockaddr_in *)addr_ret;
883 memset((void *) sin, '\0', sizeof(*sin));
884 sin->sin_family = AF_INET;
885#ifdef HAVE_SOCKADDR_SA_LEN
886 sin->sin_len = sizeof(*sin);
887#endif
888 sin->sin_addr.s_addr = INADDR_BROADCAST;
889 return sizeof(sin->sin_addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000890 }
Anthony Baxter0e85f9d2003-05-02 15:40:46 +0000891 if (sscanf(name, "%d.%d.%d.%d%c", &d1, &d2, &d3, &d4, &ch) == 4 &&
892 0 <= d1 && d1 <= 255 && 0 <= d2 && d2 <= 255 &&
893 0 <= d3 && d3 <= 255 && 0 <= d4 && d4 <= 255) {
894 struct sockaddr_in *sin;
895 sin = (struct sockaddr_in *)addr_ret;
896 sin->sin_addr.s_addr = htonl(
897 ((long) d1 << 24) | ((long) d2 << 16) |
898 ((long) d3 << 8) | ((long) d4 << 0));
899 sin->sin_family = AF_INET;
900#ifdef HAVE_SOCKADDR_SA_LEN
901 sin->sin_len = sizeof(*sin);
902#endif
903 return 4;
904 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000905 memset(&hints, 0, sizeof(hints));
906 hints.ai_family = af;
Just van Rossum1040d2c2003-05-09 07:53:18 +0000907 Py_BEGIN_ALLOW_THREADS
908 ACQUIRE_GETADDRINFO_LOCK
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000909 error = getaddrinfo(name, NULL, &hints, &res);
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000910#if defined(__digital__) && defined(__unix__)
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000911 if (error == EAI_NONAME && af == AF_UNSPEC) {
912 /* On Tru64 V5.1, numeric-to-addr conversion fails
913 if no address family is given. Assume IPv4 for now.*/
914 hints.ai_family = AF_INET;
915 error = getaddrinfo(name, NULL, &hints, &res);
916 }
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000917#endif
Just van Rossum1040d2c2003-05-09 07:53:18 +0000918 Py_END_ALLOW_THREADS
919 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000920 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000921 set_gaierror(error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000922 return -1;
923 }
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000924 if (res->ai_addrlen < addr_ret_size)
925 addr_ret_size = res->ai_addrlen;
926 memcpy((char *) addr_ret, res->ai_addr, addr_ret_size);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000927 freeaddrinfo(res);
928 switch (addr_ret->sa_family) {
929 case AF_INET:
930 return 4;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000931#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000932 case AF_INET6:
933 return 16;
Guido van Rossum955becc1999-03-22 20:14:53 +0000934#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000935 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000936 PyErr_SetString(socket_error, "unknown address family");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000937 return -1;
938 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000939}
940
Guido van Rossum30a685f1991-06-27 15:51:29 +0000941
Guido van Rossum30a685f1991-06-27 15:51:29 +0000942/* Create a string object representing an IP address.
943 This is always a string of the form 'dd.dd.dd.dd' (with variable
944 size numbers). */
945
Guido van Rossum73624e91994-10-10 17:59:00 +0000946static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000947makeipaddr(struct sockaddr *addr, int addrlen)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000948{
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000949 char buf[NI_MAXHOST];
950 int error;
951
952 error = getnameinfo(addr, addrlen, buf, sizeof(buf), NULL, 0,
953 NI_NUMERICHOST);
954 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000955 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000956 return NULL;
957 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000958 return PyString_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000959}
960
961
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000962#ifdef USE_BLUETOOTH
963/* Convert a string representation of a Bluetooth address into a numeric
964 address. Returns the length (6), or raises an exception and returns -1 if
965 an error occurred. */
966
967static int
968setbdaddr(char *name, bdaddr_t *bdaddr)
969{
970 unsigned int b0, b1, b2, b3, b4, b5;
971 char ch;
972 int n;
973
974 n = sscanf(name, "%X:%X:%X:%X:%X:%X%c",
975 &b5, &b4, &b3, &b2, &b1, &b0, &ch);
976 if (n == 6 && (b0 | b1 | b2 | b3 | b4 | b5) < 256) {
977 bdaddr->b[0] = b0;
978 bdaddr->b[1] = b1;
979 bdaddr->b[2] = b2;
980 bdaddr->b[3] = b3;
981 bdaddr->b[4] = b4;
982 bdaddr->b[5] = b5;
983 return 6;
984 } else {
985 PyErr_SetString(socket_error, "bad bluetooth address");
986 return -1;
987 }
988}
989
990/* Create a string representation of the Bluetooth address. This is always a
991 string of the form 'XX:XX:XX:XX:XX:XX' where XX is a two digit hexadecimal
992 value (zero padded if necessary). */
993
994static PyObject *
995makebdaddr(bdaddr_t *bdaddr)
996{
997 char buf[(6 * 2) + 5 + 1];
998
999 sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X",
1000 bdaddr->b[5], bdaddr->b[4], bdaddr->b[3],
1001 bdaddr->b[2], bdaddr->b[1], bdaddr->b[0]);
1002 return PyString_FromString(buf);
1003}
1004#endif
1005
1006
Guido van Rossum30a685f1991-06-27 15:51:29 +00001007/* Create an object representing the given socket address,
1008 suitable for passing it back to bind(), connect() etc.
1009 The family field of the sockaddr structure is inspected
1010 to determine what kind of address it really is. */
1011
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001012/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001013static PyObject *
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001014makesockaddr(int sockfd, struct sockaddr *addr, int addrlen, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001015{
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001016 if (addrlen == 0) {
1017 /* No address -- may be recvfrom() from known socket */
Guido van Rossum73624e91994-10-10 17:59:00 +00001018 Py_INCREF(Py_None);
1019 return Py_None;
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001020 }
1021
Guido van Rossumbcc20741998-08-04 22:53:56 +00001022#ifdef __BEOS__
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00001023 /* XXX: BeOS version of accept() doesn't set family correctly */
Guido van Rossumbcc20741998-08-04 22:53:56 +00001024 addr->sa_family = AF_INET;
1025#endif
1026
Guido van Rossum30a685f1991-06-27 15:51:29 +00001027 switch (addr->sa_family) {
1028
1029 case AF_INET:
1030 {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001031 struct sockaddr_in *a;
1032 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
Barry Warsaw752300b1997-01-03 17:18:10 +00001033 PyObject *ret = NULL;
1034 if (addrobj) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001035 a = (struct sockaddr_in *)addr;
Barry Warsaw752300b1997-01-03 17:18:10 +00001036 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
1037 Py_DECREF(addrobj);
1038 }
Guido van Rossum6f5afc91993-02-05 09:46:15 +00001039 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001040 }
Guido van Rossum30a685f1991-06-27 15:51:29 +00001041
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001042#if defined(AF_UNIX)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001043 case AF_UNIX:
1044 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001045 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Armin Rigoa9017c32006-04-19 11:50:27 +00001046#ifdef linux
1047 if (a->sun_path[0] == 0) { /* Linux abstract namespace */
1048 addrlen -= (sizeof(*a) - sizeof(a->sun_path));
1049 return PyString_FromStringAndSize(a->sun_path,
1050 addrlen);
1051 }
1052 else
1053#endif /* linux */
1054 {
1055 /* regular NULL-terminated string */
1056 return PyString_FromString(a->sun_path);
1057 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001058 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001059#endif /* AF_UNIX */
1060
Martin v. Löwis11017b12006-01-14 18:12:57 +00001061#if defined(AF_NETLINK)
1062 case AF_NETLINK:
1063 {
1064 struct sockaddr_nl *a = (struct sockaddr_nl *) addr;
Martin v. Löwisd0560052006-01-15 07:49:20 +00001065 return Py_BuildValue("II", a->nl_pid, a->nl_groups);
Martin v. Löwis11017b12006-01-14 18:12:57 +00001066 }
1067#endif /* AF_NETLINK */
1068
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001069#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001070 case AF_INET6:
1071 {
1072 struct sockaddr_in6 *a;
1073 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
1074 PyObject *ret = NULL;
1075 if (addrobj) {
1076 a = (struct sockaddr_in6 *)addr;
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001077 ret = Py_BuildValue("Oiii",
1078 addrobj,
1079 ntohs(a->sin6_port),
1080 a->sin6_flowinfo,
1081 a->sin6_scope_id);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001082 Py_DECREF(addrobj);
1083 }
1084 return ret;
1085 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001086#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001087
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001088#ifdef USE_BLUETOOTH
1089 case AF_BLUETOOTH:
1090 switch (proto) {
1091
1092 case BTPROTO_L2CAP:
1093 {
1094 struct sockaddr_l2 *a = (struct sockaddr_l2 *) addr;
1095 PyObject *addrobj = makebdaddr(&_BT_L2_MEMB(a, bdaddr));
1096 PyObject *ret = NULL;
1097 if (addrobj) {
1098 ret = Py_BuildValue("Oi",
1099 addrobj,
1100 _BT_L2_MEMB(a, psm));
1101 Py_DECREF(addrobj);
1102 }
1103 return ret;
1104 }
1105
1106 case BTPROTO_RFCOMM:
1107 {
1108 struct sockaddr_rc *a = (struct sockaddr_rc *) addr;
1109 PyObject *addrobj = makebdaddr(&_BT_RC_MEMB(a, bdaddr));
1110 PyObject *ret = NULL;
1111 if (addrobj) {
1112 ret = Py_BuildValue("Oi",
1113 addrobj,
1114 _BT_RC_MEMB(a, channel));
1115 Py_DECREF(addrobj);
1116 }
1117 return ret;
1118 }
1119
1120#if !defined(__FreeBSD__)
1121 case BTPROTO_SCO:
1122 {
1123 struct sockaddr_sco *a = (struct sockaddr_sco *) addr;
1124 return makebdaddr(&_BT_SCO_MEMB(a, bdaddr));
1125 }
1126#endif
1127
1128 }
1129#endif
1130
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00001131#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +00001132 case AF_PACKET:
1133 {
1134 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
1135 char *ifname = "";
1136 struct ifreq ifr;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001137 /* need to look up interface name give index */
1138 if (a->sll_ifindex) {
Jeremy Hylton22308652001-02-02 03:23:09 +00001139 ifr.ifr_ifindex = a->sll_ifindex;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001140 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
Jeremy Hylton22308652001-02-02 03:23:09 +00001141 ifname = ifr.ifr_name;
Jeremy Hylton22308652001-02-02 03:23:09 +00001142 }
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001143 return Py_BuildValue("shbhs#",
1144 ifname,
1145 ntohs(a->sll_protocol),
1146 a->sll_pkttype,
1147 a->sll_hatype,
1148 a->sll_addr,
1149 a->sll_halen);
Jeremy Hylton22308652001-02-02 03:23:09 +00001150 }
1151#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001152
Guido van Rossum30a685f1991-06-27 15:51:29 +00001153 /* More cases here... */
1154
1155 default:
Guido van Rossumaa948df1997-05-07 17:41:48 +00001156 /* If we don't know the address family, don't raise an
1157 exception -- return it as a tuple. */
1158 return Py_BuildValue("is#",
1159 addr->sa_family,
1160 addr->sa_data,
1161 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001162
Guido van Rossum30a685f1991-06-27 15:51:29 +00001163 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001164}
1165
Guido van Rossum30a685f1991-06-27 15:51:29 +00001166
1167/* Parse a socket address argument according to the socket object's
1168 address family. Return 1 if the address was in the proper format,
1169 0 of not. The address is returned through addr_ret, its length
1170 through len_ret. */
1171
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001172static int
Guido van Rossum48a680c2001-03-02 06:34:14 +00001173getsockaddrarg(PySocketSockObject *s, PyObject *args,
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001174 struct sockaddr **addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001175{
Guido van Rossum30a685f1991-06-27 15:51:29 +00001176 switch (s->sock_family) {
1177
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001178#if defined(AF_UNIX)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001179 case AF_UNIX:
1180 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001181 struct sockaddr_un* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001182 char *path;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001183 int len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001184 addr = (struct sockaddr_un*)&(s->sock_addr).un;
Guido van Rossum7e488981998-10-08 02:25:24 +00001185 if (!PyArg_Parse(args, "t#", &path, &len))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001186 return 0;
Armin Rigoa9017c32006-04-19 11:50:27 +00001187#ifdef linux
1188 if (len > 0 && path[0] == 0) {
1189 /* Linux abstract namespace extension */
1190 if (len > sizeof addr->sun_path) {
1191 PyErr_SetString(socket_error,
1192 "AF_UNIX path too long");
1193 return 0;
1194 }
1195 }
1196 else
1197#endif /* linux */
1198 {
1199 /* regular NULL-terminated string */
1200 if (len >= sizeof addr->sun_path) {
1201 PyErr_SetString(socket_error,
1202 "AF_UNIX path too long");
1203 return 0;
1204 }
1205 addr->sun_path[len] = 0;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001206 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001207 addr->sun_family = s->sock_family;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001208 memcpy(addr->sun_path, path, len);
1209 *addr_ret = (struct sockaddr *) addr;
Andrew MacIntyredaedf212004-04-11 12:03:57 +00001210#if defined(PYOS_OS2)
1211 *len_ret = sizeof(*addr);
1212#else
Guido van Rossum65af28a1996-06-11 18:36:33 +00001213 *len_ret = len + sizeof(*addr) - sizeof(addr->sun_path);
Andrew MacIntyredaedf212004-04-11 12:03:57 +00001214#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001215 return 1;
1216 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001217#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001218
Martin v. Löwis11017b12006-01-14 18:12:57 +00001219#if defined(AF_NETLINK)
1220 case AF_NETLINK:
1221 {
1222 struct sockaddr_nl* addr;
1223 int pid, groups;
1224 addr = (struct sockaddr_nl *)&(s->sock_addr).nl;
1225 if (!PyTuple_Check(args)) {
1226 PyErr_Format(
1227 PyExc_TypeError,
1228 "getsockaddrarg: "
1229 "AF_NETLINK address must be tuple, not %.500s",
1230 args->ob_type->tp_name);
1231 return 0;
1232 }
1233 if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &pid, &groups))
1234 return 0;
1235 addr->nl_family = AF_NETLINK;
1236 addr->nl_pid = pid;
1237 addr->nl_groups = groups;
1238 *addr_ret = (struct sockaddr *) addr;
1239 *len_ret = sizeof(*addr);
1240 return 1;
1241 }
1242#endif
1243
Guido van Rossum30a685f1991-06-27 15:51:29 +00001244 case AF_INET:
1245 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001246 struct sockaddr_in* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001247 char *host;
Martin v. Löwis5db099a2003-08-07 11:55:15 +00001248 int port, result;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001249 addr=(struct sockaddr_in*)&(s->sock_addr).in;
Guido van Rossume4dad902000-12-01 13:13:11 +00001250 if (!PyTuple_Check(args)) {
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001251 PyErr_Format(
1252 PyExc_TypeError,
1253 "getsockaddrarg: "
1254 "AF_INET address must be tuple, not %.500s",
1255 args->ob_type->tp_name);
Guido van Rossume4dad902000-12-01 13:13:11 +00001256 return 0;
1257 }
Martin Blais2856e5f2006-05-26 12:03:27 +00001258 if (!PyArg_ParseTuple(args, "eti:getsockaddrarg",
Martin v. Löwis2548c732003-04-18 10:39:54 +00001259 "idna", &host, &port))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001260 return 0;
Martin Blais2856e5f2006-05-26 12:03:27 +00001261 result = setipaddr(host, (struct sockaddr *)addr,
Martin v. Löwis5db099a2003-08-07 11:55:15 +00001262 sizeof(*addr), AF_INET);
1263 PyMem_Free(host);
1264 if (result < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001265 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001266 addr->sin_family = AF_INET;
Guido van Rossum644a12b1997-04-09 19:24:53 +00001267 addr->sin_port = htons((short)port);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001268 *addr_ret = (struct sockaddr *) addr;
1269 *len_ret = sizeof *addr;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001270 return 1;
1271 }
1272
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001273#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001274 case AF_INET6:
1275 {
1276 struct sockaddr_in6* addr;
1277 char *host;
Martin v. Löwis5db099a2003-08-07 11:55:15 +00001278 int port, flowinfo, scope_id, result;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001279 addr = (struct sockaddr_in6*)&(s->sock_addr).in6;
1280 flowinfo = scope_id = 0;
Thomas Wouters04520492006-04-25 15:08:10 +00001281 if (!PyTuple_Check(args)) {
1282 PyErr_Format(
1283 PyExc_TypeError,
1284 "getsockaddrarg: "
1285 "AF_INET6 address must be tuple, not %.500s",
1286 args->ob_type->tp_name);
1287 return 0;
1288 }
Martin Blais2856e5f2006-05-26 12:03:27 +00001289 if (!PyArg_ParseTuple(args, "eti|ii",
Martin v. Löwis2548c732003-04-18 10:39:54 +00001290 "idna", &host, &port, &flowinfo,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001291 &scope_id)) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001292 return 0;
1293 }
Martin Blais2856e5f2006-05-26 12:03:27 +00001294 result = setipaddr(host, (struct sockaddr *)addr,
Martin v. Löwis5db099a2003-08-07 11:55:15 +00001295 sizeof(*addr), AF_INET6);
1296 PyMem_Free(host);
1297 if (result < 0)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001298 return 0;
1299 addr->sin6_family = s->sock_family;
1300 addr->sin6_port = htons((short)port);
1301 addr->sin6_flowinfo = flowinfo;
1302 addr->sin6_scope_id = scope_id;
1303 *addr_ret = (struct sockaddr *) addr;
1304 *len_ret = sizeof *addr;
1305 return 1;
1306 }
1307#endif
1308
Hye-Shik Chang81268602004-02-02 06:05:24 +00001309#ifdef USE_BLUETOOTH
Martin v. Löwis12af0482004-01-31 12:34:17 +00001310 case AF_BLUETOOTH:
1311 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001312 switch (s->sock_proto) {
1313 case BTPROTO_L2CAP:
Martin v. Löwis12af0482004-01-31 12:34:17 +00001314 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001315 struct sockaddr_l2 *addr = (struct sockaddr_l2 *) _BT_SOCKADDR_MEMB(s, l2);
1316 char *straddr;
Martin v. Löwis12af0482004-01-31 12:34:17 +00001317
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001318 _BT_L2_MEMB(addr, family) = AF_BLUETOOTH;
1319 if (!PyArg_ParseTuple(args, "si", &straddr,
1320 &_BT_L2_MEMB(addr, psm))) {
1321 PyErr_SetString(socket_error, "getsockaddrarg: "
1322 "wrong format");
Martin v. Löwis12af0482004-01-31 12:34:17 +00001323 return 0;
1324 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001325 if (setbdaddr(straddr, &_BT_L2_MEMB(addr, bdaddr)) < 0)
1326 return 0;
1327
1328 *addr_ret = (struct sockaddr *) addr;
1329 *len_ret = sizeof *addr;
1330 return 1;
1331 }
1332 case BTPROTO_RFCOMM:
1333 {
1334 struct sockaddr_rc *addr = (struct sockaddr_rc *) _BT_SOCKADDR_MEMB(s, rc);
1335 char *straddr;
1336
1337 _BT_RC_MEMB(addr, family) = AF_BLUETOOTH;
1338 if (!PyArg_ParseTuple(args, "si", &straddr,
1339 &_BT_RC_MEMB(addr, channel))) {
1340 PyErr_SetString(socket_error, "getsockaddrarg: "
1341 "wrong format");
1342 return 0;
1343 }
1344 if (setbdaddr(straddr, &_BT_RC_MEMB(addr, bdaddr)) < 0)
1345 return 0;
1346
1347 *addr_ret = (struct sockaddr *) addr;
1348 *len_ret = sizeof *addr;
1349 return 1;
1350 }
1351#if !defined(__FreeBSD__)
1352 case BTPROTO_SCO:
1353 {
1354 struct sockaddr_sco *addr = (struct sockaddr_sco *) _BT_SOCKADDR_MEMB(s, sco);
1355 char *straddr;
1356
1357 _BT_SCO_MEMB(addr, family) = AF_BLUETOOTH;
1358 straddr = PyString_AsString(args);
1359 if (straddr == NULL) {
1360 PyErr_SetString(socket_error, "getsockaddrarg: "
1361 "wrong format");
1362 return 0;
1363 }
1364 if (setbdaddr(straddr, &_BT_SCO_MEMB(addr, bdaddr)) < 0)
1365 return 0;
1366
1367 *addr_ret = (struct sockaddr *) addr;
1368 *len_ret = sizeof *addr;
1369 return 1;
1370 }
1371#endif
1372 default:
1373 PyErr_SetString(socket_error, "getsockaddrarg: unknown Bluetooth protocol");
1374 return 0;
Martin v. Löwis12af0482004-01-31 12:34:17 +00001375 }
1376 }
1377#endif
1378
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00001379#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +00001380 case AF_PACKET:
1381 {
1382 struct sockaddr_ll* addr;
1383 struct ifreq ifr;
1384 char *interfaceName;
1385 int protoNumber;
1386 int hatype = 0;
1387 int pkttype = 0;
Andrew M. Kuchlingb8e17172004-07-10 23:39:35 +00001388 char *haddr = NULL;
1389 unsigned int halen = 0;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001390
Thomas Wouters04520492006-04-25 15:08:10 +00001391 if (!PyTuple_Check(args)) {
1392 PyErr_Format(
1393 PyExc_TypeError,
1394 "getsockaddrarg: "
1395 "AF_PACKET address must be tuple, not %.500s",
1396 args->ob_type->tp_name);
1397 return 0;
1398 }
Andrew M. Kuchlingb8e17172004-07-10 23:39:35 +00001399 if (!PyArg_ParseTuple(args, "si|iis#", &interfaceName,
1400 &protoNumber, &pkttype, &hatype,
1401 &haddr, &halen))
Jeremy Hylton22308652001-02-02 03:23:09 +00001402 return 0;
1403 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
1404 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001405 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001406 s->errorhandler();
Jeremy Hylton22308652001-02-02 03:23:09 +00001407 return 0;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001408 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001409 addr = &(s->sock_addr.ll);
1410 addr->sll_family = AF_PACKET;
1411 addr->sll_protocol = htons((short)protoNumber);
1412 addr->sll_ifindex = ifr.ifr_ifindex;
1413 addr->sll_pkttype = pkttype;
1414 addr->sll_hatype = hatype;
Andrew M. Kuchlingb8e17172004-07-10 23:39:35 +00001415 if (halen > 8) {
1416 PyErr_SetString(PyExc_ValueError,
1417 "Hardware address must be 8 bytes or less");
1418 return 0;
1419 }
1420 if (halen != 0) {
1421 memcpy(&addr->sll_addr, haddr, halen);
1422 }
1423 addr->sll_halen = halen;
Jeremy Hylton22308652001-02-02 03:23:09 +00001424 *addr_ret = (struct sockaddr *) addr;
1425 *len_ret = sizeof *addr;
1426 return 1;
1427 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00001428#endif
1429
Guido van Rossum30a685f1991-06-27 15:51:29 +00001430 /* More cases here... */
1431
1432 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001433 PyErr_SetString(socket_error, "getsockaddrarg: bad family");
Guido van Rossum30a685f1991-06-27 15:51:29 +00001434 return 0;
1435
1436 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001437}
1438
Guido van Rossum30a685f1991-06-27 15:51:29 +00001439
Guido van Rossum48a680c2001-03-02 06:34:14 +00001440/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +00001441 Return 1 if the family is known, 0 otherwise. The length is returned
1442 through len_ret. */
1443
1444static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +00001445getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +00001446{
1447 switch (s->sock_family) {
1448
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001449#if defined(AF_UNIX)
Guido van Rossum710e1df1992-06-12 10:39:36 +00001450 case AF_UNIX:
1451 {
1452 *len_ret = sizeof (struct sockaddr_un);
1453 return 1;
1454 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001455#endif /* AF_UNIX */
Martin v. Löwis11017b12006-01-14 18:12:57 +00001456#if defined(AF_NETLINK)
1457 case AF_NETLINK:
1458 {
1459 *len_ret = sizeof (struct sockaddr_nl);
1460 return 1;
1461 }
1462#endif
Guido van Rossum710e1df1992-06-12 10:39:36 +00001463
1464 case AF_INET:
1465 {
1466 *len_ret = sizeof (struct sockaddr_in);
1467 return 1;
1468 }
1469
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001470#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001471 case AF_INET6:
1472 {
1473 *len_ret = sizeof (struct sockaddr_in6);
1474 return 1;
1475 }
1476#endif
1477
Hye-Shik Chang81268602004-02-02 06:05:24 +00001478#ifdef USE_BLUETOOTH
Martin v. Löwis12af0482004-01-31 12:34:17 +00001479 case AF_BLUETOOTH:
1480 {
1481 switch(s->sock_proto)
1482 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001483
1484 case BTPROTO_L2CAP:
1485 *len_ret = sizeof (struct sockaddr_l2);
1486 return 1;
1487 case BTPROTO_RFCOMM:
1488 *len_ret = sizeof (struct sockaddr_rc);
1489 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00001490#if !defined(__FreeBSD__)
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001491 case BTPROTO_SCO:
1492 *len_ret = sizeof (struct sockaddr_sco);
1493 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00001494#endif
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001495 default:
1496 PyErr_SetString(socket_error, "getsockaddrlen: "
1497 "unknown BT protocol");
1498 return 0;
1499
Martin v. Löwis12af0482004-01-31 12:34:17 +00001500 }
1501 }
1502#endif
1503
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00001504#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +00001505 case AF_PACKET:
1506 {
1507 *len_ret = sizeof (struct sockaddr_ll);
1508 return 1;
1509 }
1510#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001511
Guido van Rossum710e1df1992-06-12 10:39:36 +00001512 /* More cases here... */
1513
1514 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001515 PyErr_SetString(socket_error, "getsockaddrlen: bad family");
Guido van Rossum710e1df1992-06-12 10:39:36 +00001516 return 0;
1517
1518 }
1519}
1520
1521
Guido van Rossum30a685f1991-06-27 15:51:29 +00001522/* s.accept() method */
1523
Guido van Rossum73624e91994-10-10 17:59:00 +00001524static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001525sock_accept(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001526{
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001527 sock_addr_t addrbuf;
Fred Drakea04eaad2000-06-30 02:46:07 +00001528 SOCKET_T newfd;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001529 socklen_t addrlen;
Barry Warsaw752300b1997-01-03 17:18:10 +00001530 PyObject *sock = NULL;
1531 PyObject *addr = NULL;
1532 PyObject *res = NULL;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001533 int timeout;
Barry Warsaw752300b1997-01-03 17:18:10 +00001534
Guido van Rossum710e1df1992-06-12 10:39:36 +00001535 if (!getsockaddrlen(s, &addrlen))
1536 return NULL;
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001537 memset(&addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001538
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001539#ifdef MS_WINDOWS
1540 newfd = INVALID_SOCKET;
1541#else
1542 newfd = -1;
1543#endif
1544
Neal Norwitz082b2df2006-02-07 07:04:46 +00001545 if (!IS_SELECTABLE(s))
1546 return select_error();
1547
Guido van Rossum73624e91994-10-10 17:59:00 +00001548 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001549 timeout = internal_select(s, 0);
1550 if (!timeout)
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001551 newfd = accept(s->sock_fd, (struct sockaddr *) &addrbuf,
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001552 &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001553 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001554
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001555 if (timeout) {
1556 PyErr_SetString(socket_timeout, "timed out");
1557 return NULL;
1558 }
1559
Fred Drakea04eaad2000-06-30 02:46:07 +00001560#ifdef MS_WINDOWS
1561 if (newfd == INVALID_SOCKET)
1562#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001563 if (newfd < 0)
Fred Drakea04eaad2000-06-30 02:46:07 +00001564#endif
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001565 return s->errorhandler();
Barry Warsaw752300b1997-01-03 17:18:10 +00001566
Guido van Rossum30a685f1991-06-27 15:51:29 +00001567 /* Create the new object with unspecified family,
1568 to avoid calls to bind() etc. on it. */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001569 sock = (PyObject *) new_sockobject(newfd,
1570 s->sock_family,
1571 s->sock_type,
1572 s->sock_proto);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001573
Barry Warsaw752300b1997-01-03 17:18:10 +00001574 if (sock == NULL) {
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001575 SOCKETCLOSE(newfd);
Barry Warsaw752300b1997-01-03 17:18:10 +00001576 goto finally;
1577 }
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001578 addr = makesockaddr(s->sock_fd, (struct sockaddr *) &addrbuf,
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001579 addrlen, s->sock_proto);
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001580 if (addr == NULL)
Barry Warsaw752300b1997-01-03 17:18:10 +00001581 goto finally;
1582
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001583 res = PyTuple_Pack(2, sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00001584
Guido van Rossum67f7a382002-06-06 21:08:16 +00001585finally:
Guido van Rossum73624e91994-10-10 17:59:00 +00001586 Py_XDECREF(sock);
1587 Py_XDECREF(addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001588 return res;
1589}
1590
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001591PyDoc_STRVAR(accept_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001592"accept() -> (socket object, address info)\n\
1593\n\
1594Wait for an incoming connection. Return a new socket representing the\n\
1595connection, and the address of the client. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001596info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001597
Guido van Rossum11ba0942002-06-13 15:07:44 +00001598/* s.setblocking(flag) method. Argument:
1599 False -- non-blocking mode; same as settimeout(0)
1600 True -- blocking mode; same as settimeout(None)
1601*/
Guido van Rossume4485b01994-09-07 14:32:49 +00001602
Guido van Rossum73624e91994-10-10 17:59:00 +00001603static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001604sock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00001605{
1606 int block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001607
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001608 block = PyInt_AsLong(arg);
1609 if (block == -1 && PyErr_Occurred())
Guido van Rossume4485b01994-09-07 14:32:49 +00001610 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001611
Guido van Rossum11ba0942002-06-13 15:07:44 +00001612 s->sock_timeout = block ? -1.0 : 0.0;
Guido van Rossume8008f02002-06-07 03:36:20 +00001613 internal_setblocking(s, block);
Guido van Rossume4485b01994-09-07 14:32:49 +00001614
Guido van Rossum73624e91994-10-10 17:59:00 +00001615 Py_INCREF(Py_None);
1616 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +00001617}
Guido van Rossume4485b01994-09-07 14:32:49 +00001618
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001619PyDoc_STRVAR(setblocking_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001620"setblocking(flag)\n\
1621\n\
1622Set the socket to blocking (flag is true) or non-blocking (false).\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00001623setblocking(True) is equivalent to settimeout(None);\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001624setblocking(False) is equivalent to settimeout(0.0).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001625
Guido van Rossum11ba0942002-06-13 15:07:44 +00001626/* s.settimeout(timeout) method. Argument:
1627 None -- no timeout, blocking mode; same as setblocking(True)
1628 0.0 -- non-blocking mode; same as setblocking(False)
1629 > 0 -- timeout mode; operations time out after timeout seconds
1630 < 0 -- illegal; raises an exception
1631*/
Guido van Rossum67f7a382002-06-06 21:08:16 +00001632static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001633sock_settimeout(PySocketSockObject *s, PyObject *arg)
Guido van Rossum67f7a382002-06-06 21:08:16 +00001634{
Guido van Rossum11ba0942002-06-13 15:07:44 +00001635 double timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001636
1637 if (arg == Py_None)
Guido van Rossum11ba0942002-06-13 15:07:44 +00001638 timeout = -1.0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001639 else {
Guido van Rossum11ba0942002-06-13 15:07:44 +00001640 timeout = PyFloat_AsDouble(arg);
1641 if (timeout < 0.0) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00001642 if (!PyErr_Occurred())
1643 PyErr_SetString(PyExc_ValueError,
Guido van Rossum11ba0942002-06-13 15:07:44 +00001644 "Timeout value out of range");
Guido van Rossum67f7a382002-06-06 21:08:16 +00001645 return NULL;
1646 }
1647 }
1648
Guido van Rossum11ba0942002-06-13 15:07:44 +00001649 s->sock_timeout = timeout;
1650 internal_setblocking(s, timeout < 0.0);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001651
1652 Py_INCREF(Py_None);
1653 return Py_None;
1654}
1655
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001656PyDoc_STRVAR(settimeout_doc,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001657"settimeout(timeout)\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00001658\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00001659Set a timeout on socket operations. 'timeout' can be a float,\n\
1660giving in seconds, or None. Setting a timeout of None disables\n\
1661the timeout feature and is equivalent to setblocking(1).\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001662Setting a timeout of zero is the same as setblocking(0).");
Guido van Rossum67f7a382002-06-06 21:08:16 +00001663
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001664/* s.gettimeout() method.
1665 Returns the timeout associated with a socket. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00001666static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001667sock_gettimeout(PySocketSockObject *s)
Guido van Rossum67f7a382002-06-06 21:08:16 +00001668{
1669 if (s->sock_timeout < 0.0) {
1670 Py_INCREF(Py_None);
1671 return Py_None;
1672 }
1673 else
1674 return PyFloat_FromDouble(s->sock_timeout);
1675}
1676
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001677PyDoc_STRVAR(gettimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00001678"gettimeout() -> timeout\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00001679\n\
1680Returns the timeout in floating seconds associated with socket \n\
1681operations. A timeout of None indicates that timeouts on socket \n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001682operations are disabled.");
Guido van Rossume4485b01994-09-07 14:32:49 +00001683
Guido van Rossum48a680c2001-03-02 06:34:14 +00001684#ifdef RISCOS
1685/* s.sleeptaskw(1 | 0) method */
1686
1687static PyObject *
Martin v. Löwisa94568a2003-05-10 07:36:56 +00001688sock_sleeptaskw(PySocketSockObject *s,PyObject *arg)
Guido van Rossum48a680c2001-03-02 06:34:14 +00001689{
Guido van Rossum67f7a382002-06-06 21:08:16 +00001690 int block;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00001691 block = PyInt_AsLong(arg);
1692 if (block == -1 && PyErr_Occurred())
Guido van Rossum67f7a382002-06-06 21:08:16 +00001693 return NULL;
1694 Py_BEGIN_ALLOW_THREADS
1695 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
1696 Py_END_ALLOW_THREADS
Guido van Rossum48a680c2001-03-02 06:34:14 +00001697
Guido van Rossum67f7a382002-06-06 21:08:16 +00001698 Py_INCREF(Py_None);
1699 return Py_None;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001700}
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001701PyDoc_STRVAR(sleeptaskw_doc,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001702"sleeptaskw(flag)\n\
1703\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001704Allow sleeps in taskwindows.");
Guido van Rossum48a680c2001-03-02 06:34:14 +00001705#endif
1706
1707
Guido van Rossumaee08791992-09-08 09:05:33 +00001708/* s.setsockopt() method.
1709 With an integer third argument, sets an integer option.
1710 With a string third argument, sets an option from a buffer;
1711 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001712
Guido van Rossum73624e91994-10-10 17:59:00 +00001713static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001714sock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001715{
1716 int level;
1717 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001718 int res;
Guido van Rossumaee08791992-09-08 09:05:33 +00001719 char *buf;
1720 int buflen;
1721 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001722
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001723 if (PyArg_ParseTuple(args, "iii:setsockopt",
1724 &level, &optname, &flag)) {
Guido van Rossumaee08791992-09-08 09:05:33 +00001725 buf = (char *) &flag;
1726 buflen = sizeof flag;
1727 }
1728 else {
Guido van Rossum73624e91994-10-10 17:59:00 +00001729 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001730 if (!PyArg_ParseTuple(args, "iis#:setsockopt",
1731 &level, &optname, &buf, &buflen))
Guido van Rossumaee08791992-09-08 09:05:33 +00001732 return NULL;
1733 }
Thomas Wouters334fb892000-07-25 12:56:38 +00001734 res = setsockopt(s->sock_fd, level, optname, (void *)buf, buflen);
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001735 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001736 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001737 Py_INCREF(Py_None);
1738 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001739}
1740
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001741PyDoc_STRVAR(setsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001742"setsockopt(level, option, value)\n\
1743\n\
1744Set a socket option. See the Unix manual for level and option.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001745The value argument can either be an integer or a string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001746
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001747
Guido van Rossumaee08791992-09-08 09:05:33 +00001748/* s.getsockopt() method.
1749 With two arguments, retrieves an integer option.
1750 With a third integer argument, retrieves a string buffer of that size;
1751 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001752
Guido van Rossum73624e91994-10-10 17:59:00 +00001753static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001754sock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001755{
1756 int level;
1757 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001758 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +00001759 PyObject *buf;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001760 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001761
Guido van Rossumbcc20741998-08-04 22:53:56 +00001762#ifdef __BEOS__
Fred Drake564a6cc2001-05-11 20:12:26 +00001763 /* We have incomplete socket support. */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001764 PyErr_SetString(socket_error, "getsockopt not supported");
Guido van Rossumbcc20741998-08-04 22:53:56 +00001765 return NULL;
1766#else
1767
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001768 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
1769 &level, &optname, &buflen))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001770 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001771
Guido van Rossumbe32c891996-06-20 16:25:29 +00001772 if (buflen == 0) {
Guido van Rossumaee08791992-09-08 09:05:33 +00001773 int flag = 0;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001774 socklen_t flagsize = sizeof flag;
Guido van Rossumb376a4a1993-11-23 17:53:17 +00001775 res = getsockopt(s->sock_fd, level, optname,
Thomas Wouters334fb892000-07-25 12:56:38 +00001776 (void *)&flag, &flagsize);
Guido van Rossumaee08791992-09-08 09:05:33 +00001777 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001778 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001779 return PyInt_FromLong(flag);
Guido van Rossumaee08791992-09-08 09:05:33 +00001780 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001781#ifdef __VMS
Neal Norwitz2a30cd02006-07-10 01:18:57 +00001782 /* socklen_t is unsigned so no negative test is needed,
1783 test buflen == 0 is previously done */
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001784 if (buflen > 1024) {
1785#else
Guido van Rossumaee08791992-09-08 09:05:33 +00001786 if (buflen <= 0 || buflen > 1024) {
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001787#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001788 PyErr_SetString(socket_error,
Barry Warsaw752300b1997-01-03 17:18:10 +00001789 "getsockopt buflen out of range");
Guido van Rossumaee08791992-09-08 09:05:33 +00001790 return NULL;
1791 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001792 buf = PyString_FromStringAndSize((char *)NULL, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001793 if (buf == NULL)
1794 return NULL;
Guido van Rossumb376a4a1993-11-23 17:53:17 +00001795 res = getsockopt(s->sock_fd, level, optname,
Fred Drake564a6cc2001-05-11 20:12:26 +00001796 (void *)PyString_AS_STRING(buf), &buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001797 if (res < 0) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001798 Py_DECREF(buf);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001799 return s->errorhandler();
Guido van Rossumaee08791992-09-08 09:05:33 +00001800 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001801 _PyString_Resize(&buf, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001802 return buf;
Guido van Rossumbcc20741998-08-04 22:53:56 +00001803#endif /* __BEOS__ */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001804}
1805
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001806PyDoc_STRVAR(getsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001807"getsockopt(level, option[, buffersize]) -> value\n\
1808\n\
1809Get a socket option. See the Unix manual for level and option.\n\
1810If a nonzero buffersize argument is given, the return value is a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001811string of that length; otherwise it is an integer.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001812
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001813
Fred Drake728819a2000-07-01 03:40:12 +00001814/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001815
Guido van Rossum73624e91994-10-10 17:59:00 +00001816static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001817sock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001818{
1819 struct sockaddr *addr;
1820 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001821 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001822
Fred Drake728819a2000-07-01 03:40:12 +00001823 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001824 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001825 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001826 res = bind(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001827 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001828 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001829 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001830 Py_INCREF(Py_None);
1831 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001832}
1833
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001834PyDoc_STRVAR(bind_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001835"bind(address)\n\
1836\n\
1837Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00001838pair (host, port); the host must refer to the local host. For raw packet\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001839sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001840
Guido van Rossum30a685f1991-06-27 15:51:29 +00001841
1842/* s.close() method.
1843 Set the file descriptor to -1 so operations tried subsequently
1844 will surely fail. */
1845
Guido van Rossum73624e91994-10-10 17:59:00 +00001846static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001847sock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001848{
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001849 SOCKET_T fd;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001850
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001851 if ((fd = s->sock_fd) != -1) {
1852 s->sock_fd = -1;
Guido van Rossum08481461996-10-12 14:07:22 +00001853 Py_BEGIN_ALLOW_THREADS
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001854 (void) SOCKETCLOSE(fd);
Guido van Rossum08481461996-10-12 14:07:22 +00001855 Py_END_ALLOW_THREADS
1856 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001857 Py_INCREF(Py_None);
1858 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001859}
1860
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001861PyDoc_STRVAR(close_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001862"close()\n\
1863\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001864Close the socket. It cannot be used after this call.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001865
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001866static int
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001867internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen,
1868 int *timeoutp)
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001869{
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001870 int res, timeout;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001871
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001872 timeout = 0;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001873 res = connect(s->sock_fd, addr, addrlen);
1874
1875#ifdef MS_WINDOWS
1876
1877 if (s->sock_timeout > 0.0) {
Neal Norwitz082b2df2006-02-07 07:04:46 +00001878 if (res < 0 && WSAGetLastError() == WSAEWOULDBLOCK &&
1879 IS_SELECTABLE(s)) {
Guido van Rossumb76bdf82003-02-19 17:50:16 +00001880 /* This is a mess. Best solution: trust select */
1881 fd_set fds;
Mark Hammonda57ec932004-08-03 05:06:26 +00001882 fd_set fds_exc;
Guido van Rossumb76bdf82003-02-19 17:50:16 +00001883 struct timeval tv;
1884 tv.tv_sec = (int)s->sock_timeout;
1885 tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6);
1886 FD_ZERO(&fds);
1887 FD_SET(s->sock_fd, &fds);
Mark Hammonda57ec932004-08-03 05:06:26 +00001888 FD_ZERO(&fds_exc);
1889 FD_SET(s->sock_fd, &fds_exc);
1890 res = select(s->sock_fd+1, NULL, &fds, &fds_exc, &tv);
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001891 if (res == 0) {
Guido van Rossumb76bdf82003-02-19 17:50:16 +00001892 res = WSAEWOULDBLOCK;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001893 timeout = 1;
Mark Hammonda57ec932004-08-03 05:06:26 +00001894 } else if (res > 0) {
1895 if (FD_ISSET(s->sock_fd, &fds))
1896 /* The socket is in the writeable set - this
1897 means connected */
1898 res = 0;
1899 else {
1900 /* As per MS docs, we need to call getsockopt()
1901 to get the underlying error */
1902 int res_size = sizeof res;
1903 /* It must be in the exception set */
1904 assert(FD_ISSET(s->sock_fd, &fds_exc));
Martin Blais2856e5f2006-05-26 12:03:27 +00001905 if (0 == getsockopt(s->sock_fd, SOL_SOCKET, SO_ERROR,
Mark Hammonda57ec932004-08-03 05:06:26 +00001906 (char *)&res, &res_size))
1907 /* getsockopt also clears WSAGetLastError,
1908 so reset it back. */
1909 WSASetLastError(res);
1910 else
1911 res = WSAGetLastError();
1912 }
1913 }
Guido van Rossumb76bdf82003-02-19 17:50:16 +00001914 /* else if (res < 0) an error occurred */
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001915 }
1916 }
1917
1918 if (res < 0)
1919 res = WSAGetLastError();
1920
1921#else
1922
1923 if (s->sock_timeout > 0.0) {
Neal Norwitz082b2df2006-02-07 07:04:46 +00001924 if (res < 0 && errno == EINPROGRESS && IS_SELECTABLE(s)) {
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001925 timeout = internal_select(s, 1);
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001926 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum12e3c712002-08-08 20:39:30 +00001927 if (res < 0 && errno == EISCONN)
1928 res = 0;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001929 }
1930 }
1931
1932 if (res < 0)
1933 res = errno;
1934
1935#endif
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001936 *timeoutp = timeout;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001937
1938 return res;
1939}
Guido van Rossum30a685f1991-06-27 15:51:29 +00001940
Fred Drake728819a2000-07-01 03:40:12 +00001941/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001942
Guido van Rossum73624e91994-10-10 17:59:00 +00001943static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001944sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001945{
1946 struct sockaddr *addr;
1947 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001948 int res;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001949 int timeout;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001950
Fred Drake728819a2000-07-01 03:40:12 +00001951 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001952 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001953
Guido van Rossum73624e91994-10-10 17:59:00 +00001954 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001955 res = internal_connect(s, addr, addrlen, &timeout);
Guido van Rossum11ba0942002-06-13 15:07:44 +00001956 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001957
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001958 if (timeout) {
1959 PyErr_SetString(socket_timeout, "timed out");
1960 return NULL;
1961 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001962 if (res != 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001963 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001964 Py_INCREF(Py_None);
1965 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001966}
1967
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001968PyDoc_STRVAR(connect_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001969"connect(address)\n\
1970\n\
1971Connect the socket to a remote address. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001972is a pair (host, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001973
Guido van Rossum30a685f1991-06-27 15:51:29 +00001974
Fred Drake728819a2000-07-01 03:40:12 +00001975/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001976
1977static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001978sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001979{
1980 struct sockaddr *addr;
1981 int addrlen;
1982 int res;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001983 int timeout;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001984
Fred Drake728819a2000-07-01 03:40:12 +00001985 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001986 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001987
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001988 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001989 res = internal_connect(s, addr, addrlen, &timeout);
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001990 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001991
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001992 return PyInt_FromLong((long) res);
1993}
1994
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001995PyDoc_STRVAR(connect_ex_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00001996"connect_ex(address) -> errno\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00001997\n\
1998This is like connect(address), but returns an error code (the errno value)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001999instead of raising an exception when an error occurs.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002000
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002001
Guido van Rossumed233a51992-06-23 09:07:03 +00002002/* s.fileno() method */
2003
Guido van Rossum73624e91994-10-10 17:59:00 +00002004static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002005sock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00002006{
Fred Drakea04eaad2000-06-30 02:46:07 +00002007#if SIZEOF_SOCKET_T <= SIZEOF_LONG
Guido van Rossum73624e91994-10-10 17:59:00 +00002008 return PyInt_FromLong((long) s->sock_fd);
Fred Drakea04eaad2000-06-30 02:46:07 +00002009#else
Martin v. Löwisb9a0f912003-03-29 10:06:18 +00002010 return PyLong_FromLongLong((PY_LONG_LONG)s->sock_fd);
Fred Drakea04eaad2000-06-30 02:46:07 +00002011#endif
Guido van Rossumed233a51992-06-23 09:07:03 +00002012}
2013
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002014PyDoc_STRVAR(fileno_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002015"fileno() -> integer\n\
2016\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002017Return the integer file descriptor of the socket.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002018
Guido van Rossumed233a51992-06-23 09:07:03 +00002019
Guido van Rossumbe32c891996-06-20 16:25:29 +00002020#ifndef NO_DUP
2021/* s.dup() method */
2022
2023static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002024sock_dup(PySocketSockObject *s)
Guido van Rossumbe32c891996-06-20 16:25:29 +00002025{
Fred Drakea04eaad2000-06-30 02:46:07 +00002026 SOCKET_T newfd;
Guido van Rossumbe32c891996-06-20 16:25:29 +00002027 PyObject *sock;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002028
Guido van Rossumbe32c891996-06-20 16:25:29 +00002029 newfd = dup(s->sock_fd);
2030 if (newfd < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002031 return s->errorhandler();
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002032 sock = (PyObject *) new_sockobject(newfd,
2033 s->sock_family,
2034 s->sock_type,
2035 s->sock_proto);
Guido van Rossumbe32c891996-06-20 16:25:29 +00002036 if (sock == NULL)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00002037 SOCKETCLOSE(newfd);
Guido van Rossumbe32c891996-06-20 16:25:29 +00002038 return sock;
2039}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002040
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002041PyDoc_STRVAR(dup_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002042"dup() -> socket object\n\
2043\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002044Return a new socket object connected to the same system resource.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002045
Guido van Rossumbe32c891996-06-20 16:25:29 +00002046#endif
2047
2048
Guido van Rossumc89705d1992-11-26 08:54:07 +00002049/* s.getsockname() method */
2050
Guido van Rossum73624e91994-10-10 17:59:00 +00002051static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002052sock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002053{
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00002054 sock_addr_t addrbuf;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002055 int res;
2056 socklen_t addrlen;
2057
Guido van Rossumc89705d1992-11-26 08:54:07 +00002058 if (!getsockaddrlen(s, &addrlen))
2059 return NULL;
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00002060 memset(&addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00002061 Py_BEGIN_ALLOW_THREADS
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00002062 res = getsockname(s->sock_fd, (struct sockaddr *) &addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00002063 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00002064 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002065 return s->errorhandler();
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00002066 return makesockaddr(s->sock_fd, (struct sockaddr *) &addrbuf, addrlen,
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00002067 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002068}
2069
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002070PyDoc_STRVAR(getsockname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002071"getsockname() -> address info\n\
2072\n\
2073Return the address of the local endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002074info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002075
Guido van Rossumc89705d1992-11-26 08:54:07 +00002076
Guido van Rossumb6775db1994-08-01 11:34:53 +00002077#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002078/* s.getpeername() method */
2079
Guido van Rossum73624e91994-10-10 17:59:00 +00002080static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002081sock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002082{
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00002083 sock_addr_t addrbuf;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002084 int res;
2085 socklen_t addrlen;
2086
Guido van Rossumc89705d1992-11-26 08:54:07 +00002087 if (!getsockaddrlen(s, &addrlen))
2088 return NULL;
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00002089 memset(&addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00002090 Py_BEGIN_ALLOW_THREADS
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00002091 res = getpeername(s->sock_fd, (struct sockaddr *) &addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00002092 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00002093 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002094 return s->errorhandler();
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00002095 return makesockaddr(s->sock_fd, (struct sockaddr *) &addrbuf, addrlen,
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00002096 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002097}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002098
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002099PyDoc_STRVAR(getpeername_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002100"getpeername() -> address info\n\
2101\n\
2102Return the address of the remote endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002103info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002104
Guido van Rossumb6775db1994-08-01 11:34:53 +00002105#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002106
2107
Guido van Rossum30a685f1991-06-27 15:51:29 +00002108/* s.listen(n) method */
2109
Guido van Rossum73624e91994-10-10 17:59:00 +00002110static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002111sock_listen(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002112{
2113 int backlog;
Guido van Rossumff4949e1992-08-05 19:58:53 +00002114 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002115
2116 backlog = PyInt_AsLong(arg);
2117 if (backlog == -1 && PyErr_Occurred())
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002118 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00002119 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +00002120 if (backlog < 1)
2121 backlog = 1;
Guido van Rossumff4949e1992-08-05 19:58:53 +00002122 res = listen(s->sock_fd, backlog);
Guido van Rossum73624e91994-10-10 17:59:00 +00002123 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002124 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002125 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00002126 Py_INCREF(Py_None);
2127 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002128}
2129
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002130PyDoc_STRVAR(listen_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002131"listen(backlog)\n\
2132\n\
2133Enable a server to accept connections. The backlog argument must be at\n\
2134least 1; it specifies the number of unaccepted connection that the system\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002135will allow before refusing new connections.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002136
2137
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002138#ifndef NO_DUP
Guido van Rossum30a685f1991-06-27 15:51:29 +00002139/* s.makefile(mode) method.
2140 Create a new open file object referring to a dupped version of
2141 the socket's file descriptor. (The dup() call is necessary so
2142 that the open file and socket objects may be closed independent
2143 of each other.)
2144 The mode argument specifies 'r' or 'w' passed to fdopen(). */
2145
Guido van Rossum73624e91994-10-10 17:59:00 +00002146static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002147sock_makefile(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002148{
Tim Petersdbd9ba62000-07-09 03:09:57 +00002149 extern int fclose(FILE *);
Guido van Rossum6b144911995-03-14 15:05:13 +00002150 char *mode = "r";
2151 int bufsize = -1;
Fred Drakea04eaad2000-06-30 02:46:07 +00002152#ifdef MS_WIN32
Tim Peters79248aa2001-08-29 21:37:10 +00002153 Py_intptr_t fd;
Fred Drakea04eaad2000-06-30 02:46:07 +00002154#else
Guido van Rossum30a685f1991-06-27 15:51:29 +00002155 int fd;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002156#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00002157 FILE *fp;
Guido van Rossum6b144911995-03-14 15:05:13 +00002158 PyObject *f;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002159#ifdef __VMS
2160 char *mode_r = "r";
2161 char *mode_w = "w";
2162#endif
Guido van Rossum6b144911995-03-14 15:05:13 +00002163
Guido van Rossum43713e52000-02-29 13:59:29 +00002164 if (!PyArg_ParseTuple(args, "|si:makefile", &mode, &bufsize))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002165 return NULL;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002166#ifdef __VMS
2167 if (strcmp(mode,"rb") == 0) {
2168 mode = mode_r;
2169 }
2170 else {
2171 if (strcmp(mode,"wb") == 0) {
2172 mode = mode_w;
2173 }
2174 }
2175#endif
Guido van Rossum8d665e61996-06-26 18:22:49 +00002176#ifdef MS_WIN32
Guido van Rossum82a5c661998-07-07 20:45:43 +00002177 if (((fd = _open_osfhandle(s->sock_fd, _O_BINARY)) < 0) ||
2178 ((fd = dup(fd)) < 0) || ((fp = fdopen(fd, mode)) == NULL))
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00002179#else
Guido van Rossum82a5c661998-07-07 20:45:43 +00002180 if ((fd = dup(s->sock_fd)) < 0 || (fp = fdopen(fd, mode)) == NULL)
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00002181#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00002182 {
Guido van Rossum6b144911995-03-14 15:05:13 +00002183 if (fd >= 0)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00002184 SOCKETCLOSE(fd);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002185 return s->errorhandler();
Guido van Rossum6b144911995-03-14 15:05:13 +00002186 }
2187 f = PyFile_FromFile(fp, "<socket>", mode, fclose);
2188 if (f != NULL)
2189 PyFile_SetBufSize(f, bufsize);
2190 return f;
Guido van Rossum30a685f1991-06-27 15:51:29 +00002191}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002192
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002193PyDoc_STRVAR(makefile_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002194"makefile([mode[, buffersize]]) -> file object\n\
2195\n\
2196Return a regular file object corresponding to the socket.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002197The mode and buffersize arguments are as for the built-in open() function.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002198
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002199#endif /* NO_DUP */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002200
Martin Blais2856e5f2006-05-26 12:03:27 +00002201/*
Martin Blaisaf2ae722006-06-04 13:49:49 +00002202 * This is the guts of the recv() and recv_into() methods, which reads into a
Martin Blais2856e5f2006-05-26 12:03:27 +00002203 * char buffer. If you have any inc/def ref to do to the objects that contain
2204 * the buffer, do it in the caller. This function returns the number of bytes
2205 * succesfully read. If there was an error, it returns -1. Note that it is
2206 * also possible that we return a number of bytes smaller than the request
2207 * bytes.
2208 */
Martin Blaisaf2ae722006-06-04 13:49:49 +00002209static ssize_t
Martin Blais2856e5f2006-05-26 12:03:27 +00002210sock_recv_guts(PySocketSockObject *s, char* cbuf, int len, int flags)
2211{
Martin Blaisaf2ae722006-06-04 13:49:49 +00002212 ssize_t outlen = 0;
2213 int timeout;
Martin Blais2856e5f2006-05-26 12:03:27 +00002214#ifdef __VMS
2215 int remaining, nread;
2216 char *read_buf;
2217#endif
2218
2219 if (!IS_SELECTABLE(s)) {
2220 select_error();
2221 return -1;
2222 }
2223
2224#ifndef __VMS
2225 Py_BEGIN_ALLOW_THREADS
2226 timeout = internal_select(s, 0);
2227 if (!timeout)
2228 outlen = recv(s->sock_fd, cbuf, len, flags);
2229 Py_END_ALLOW_THREADS
2230
2231 if (timeout) {
2232 PyErr_SetString(socket_timeout, "timed out");
2233 return -1;
2234 }
2235 if (outlen < 0) {
2236 /* Note: the call to errorhandler() ALWAYS indirectly returned
2237 NULL, so ignore its return value */
2238 s->errorhandler();
2239 return -1;
2240 }
2241#else
2242 read_buf = cbuf;
2243 remaining = len;
2244 while (remaining != 0) {
2245 unsigned int segment;
2246
2247 segment = remaining /SEGMENT_SIZE;
2248 if (segment != 0) {
2249 segment = SEGMENT_SIZE;
2250 }
2251 else {
2252 segment = remaining;
2253 }
2254
2255 Py_BEGIN_ALLOW_THREADS
2256 timeout = internal_select(s, 0);
2257 if (!timeout)
2258 nread = recv(s->sock_fd, read_buf, segment, flags);
2259 Py_END_ALLOW_THREADS
2260
2261 if (timeout) {
2262 PyErr_SetString(socket_timeout, "timed out");
2263 return -1;
2264 }
2265 if (nread < 0) {
2266 s->errorhandler();
2267 return -1;
2268 }
2269 if (nread != remaining) {
2270 read_buf += nread;
2271 break;
2272 }
2273
2274 remaining -= segment;
2275 read_buf += segment;
2276 }
2277 outlen = read_buf - cbuf;
2278#endif /* !__VMS */
2279
2280 return outlen;
2281}
2282
Guido van Rossum48a680c2001-03-02 06:34:14 +00002283
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002284/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002285
Guido van Rossum73624e91994-10-10 17:59:00 +00002286static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002287sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002288{
Martin Blaisaf2ae722006-06-04 13:49:49 +00002289 int recvlen, flags = 0;
2290 ssize_t outlen;
Guido van Rossum73624e91994-10-10 17:59:00 +00002291 PyObject *buf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002292
Martin Blais2856e5f2006-05-26 12:03:27 +00002293 if (!PyArg_ParseTuple(args, "i|i:recv", &recvlen, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00002294 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002295
Martin Blais2856e5f2006-05-26 12:03:27 +00002296 if (recvlen < 0) {
Martin v. Löwisfba64e12001-11-19 10:41:26 +00002297 PyErr_SetString(PyExc_ValueError,
Guido van Rossum11ba0942002-06-13 15:07:44 +00002298 "negative buffersize in recv");
Martin v. Löwisfba64e12001-11-19 10:41:26 +00002299 return NULL;
2300 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002301
Martin Blais2856e5f2006-05-26 12:03:27 +00002302 /* Allocate a new string. */
2303 buf = PyString_FromStringAndSize((char *) 0, recvlen);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002304 if (buf == NULL)
2305 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002306
Martin Blais2856e5f2006-05-26 12:03:27 +00002307 /* Call the guts */
Martin Blaisaf2ae722006-06-04 13:49:49 +00002308 outlen = sock_recv_guts(s, PyString_AS_STRING(buf), recvlen, flags);
Martin Blais2856e5f2006-05-26 12:03:27 +00002309 if (outlen < 0) {
2310 /* An error occured, release the string and return an
2311 error. */
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002312 Py_DECREF(buf);
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002313 return NULL;
2314 }
Martin Blais2856e5f2006-05-26 12:03:27 +00002315 if (outlen != recvlen) {
2316 /* We did not read as many bytes as we anticipated, resize the
2317 string if possible and be succesful. */
2318 if (_PyString_Resize(&buf, outlen) < 0)
2319 /* Oopsy, not so succesful after all. */
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002320 return NULL;
Martin Blais2856e5f2006-05-26 12:03:27 +00002321 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002322
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002323 return buf;
2324}
2325
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002326PyDoc_STRVAR(recv_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002327"recv(buffersize[, flags]) -> data\n\
2328\n\
2329Receive up to buffersize bytes from the socket. For the optional flags\n\
2330argument, see the Unix manual. When no data is available, block until\n\
2331at least one byte is available or until the remote end is closed. When\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002332the remote end is closed and all data is read, return the empty string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002333
Guido van Rossum30a685f1991-06-27 15:51:29 +00002334
Martin Blaisaf2ae722006-06-04 13:49:49 +00002335/* s.recv_into(buffer, [nbytes [,flags]]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002336
Martin Blais2856e5f2006-05-26 12:03:27 +00002337static PyObject*
Martin Blaisaf2ae722006-06-04 13:49:49 +00002338sock_recv_into(PySocketSockObject *s, PyObject *args, PyObject *kwds)
Martin Blais2856e5f2006-05-26 12:03:27 +00002339{
2340 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
2341
Martin Blaisaf2ae722006-06-04 13:49:49 +00002342 int recvlen = 0, flags = 0;
2343 ssize_t readlen;
Martin Blais2856e5f2006-05-26 12:03:27 +00002344 char *buf;
2345 int buflen;
2346
2347 /* Get the buffer's memory */
Martin Blaisaf2ae722006-06-04 13:49:49 +00002348 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w#|ii:recv", kwlist,
Martin Blais2856e5f2006-05-26 12:03:27 +00002349 &buf, &buflen, &recvlen, &flags))
2350 return NULL;
2351 assert(buf != 0 && buflen > 0);
2352
2353 if (recvlen < 0) {
2354 PyErr_SetString(PyExc_ValueError,
2355 "negative buffersize in recv");
2356 return NULL;
2357 }
2358 if (recvlen == 0) {
2359 /* If nbytes was not specified, use the buffer's length */
2360 recvlen = buflen;
2361 }
2362
2363 /* Check if the buffer is large enough */
2364 if (buflen < recvlen) {
2365 PyErr_SetString(PyExc_ValueError,
2366 "buffer too small for requested bytes");
2367 return NULL;
2368 }
2369
2370 /* Call the guts */
2371 readlen = sock_recv_guts(s, buf, recvlen, flags);
2372 if (readlen < 0) {
2373 /* Return an error. */
2374 return NULL;
2375 }
2376
2377 /* Return the number of bytes read. Note that we do not do anything
2378 special here in the case that readlen < recvlen. */
Martin Blaisaf2ae722006-06-04 13:49:49 +00002379 return PyInt_FromSsize_t(readlen);
Martin Blais2856e5f2006-05-26 12:03:27 +00002380}
2381
Martin Blaisaf2ae722006-06-04 13:49:49 +00002382PyDoc_STRVAR(recv_into_doc,
2383"recv_into(buffer, [nbytes[, flags]]) -> nbytes_read\n\
Martin Blais2856e5f2006-05-26 12:03:27 +00002384\n\
2385A version of recv() that stores its data into a buffer rather than creating \n\
2386a new string. Receive up to buffersize bytes from the socket. If buffersize \n\
2387is not specified (or 0), receive up to the size available in the given buffer.\n\
2388\n\
2389See recv() for documentation about the flags.");
2390
2391
2392/*
Martin Blaisaf2ae722006-06-04 13:49:49 +00002393 * This is the guts of the recv() and recv_into() methods, which reads into a
Martin Blais2856e5f2006-05-26 12:03:27 +00002394 * char buffer. If you have any inc/def ref to do to the objects that contain
2395 * the buffer, do it in the caller. This function returns the number of bytes
2396 * succesfully read. If there was an error, it returns -1. Note that it is
2397 * also possible that we return a number of bytes smaller than the request
2398 * bytes.
2399 *
2400 * 'addr' is a return value for the address object. Note that you must decref
2401 * it yourself.
2402 */
Martin Blaisaf2ae722006-06-04 13:49:49 +00002403static ssize_t
Martin Blais2856e5f2006-05-26 12:03:27 +00002404sock_recvfrom_guts(PySocketSockObject *s, char* cbuf, int len, int flags,
2405 PyObject** addr)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002406{
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00002407 sock_addr_t addrbuf;
Martin Blaisaf2ae722006-06-04 13:49:49 +00002408 int timeout;
2409 ssize_t n = 0;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002410 socklen_t addrlen;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002411
Martin Blais2856e5f2006-05-26 12:03:27 +00002412 *addr = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002413
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00002414 if (!getsockaddrlen(s, &addrlen))
Martin Blais2856e5f2006-05-26 12:03:27 +00002415 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002416
Martin Blais2856e5f2006-05-26 12:03:27 +00002417 if (!IS_SELECTABLE(s)) {
2418 select_error();
2419 return -1;
2420 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00002421
Guido van Rossum73624e91994-10-10 17:59:00 +00002422 Py_BEGIN_ALLOW_THREADS
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00002423 memset(&addrbuf, 0, addrlen);
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002424 timeout = internal_select(s, 0);
Martin v. Löwis7e75f1a2006-04-15 08:35:59 +00002425 if (!timeout) {
Guido van Rossum8d665e61996-06-26 18:22:49 +00002426#ifndef MS_WINDOWS
Andrew MacIntyreba43e872002-03-03 03:03:52 +00002427#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Martin Blais2856e5f2006-05-26 12:03:27 +00002428 n = recvfrom(s->sock_fd, cbuf, len, flags,
Martin v. Löwis7e75f1a2006-04-15 08:35:59 +00002429 (struct sockaddr *) &addrbuf, &addrlen);
Guido van Rossum32c575d1997-12-02 20:37:32 +00002430#else
Martin Blais2856e5f2006-05-26 12:03:27 +00002431 n = recvfrom(s->sock_fd, cbuf, len, flags,
Martin v. Löwis7e75f1a2006-04-15 08:35:59 +00002432 (void *) &addrbuf, &addrlen);
Guido van Rossum32c575d1997-12-02 20:37:32 +00002433#endif
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002434#else
Martin Blais2856e5f2006-05-26 12:03:27 +00002435 n = recvfrom(s->sock_fd, cbuf, len, flags,
Martin v. Löwis7e75f1a2006-04-15 08:35:59 +00002436 (struct sockaddr *) &addrbuf, &addrlen);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002437#endif
Martin v. Löwis7e75f1a2006-04-15 08:35:59 +00002438 }
Guido van Rossum73624e91994-10-10 17:59:00 +00002439 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002440
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002441 if (timeout) {
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002442 PyErr_SetString(socket_timeout, "timed out");
Martin Blais2856e5f2006-05-26 12:03:27 +00002443 return -1;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002444 }
Guido van Rossum7c53b771995-09-13 18:39:47 +00002445 if (n < 0) {
Martin Blais2856e5f2006-05-26 12:03:27 +00002446 s->errorhandler();
2447 return -1;
Guido van Rossum7c53b771995-09-13 18:39:47 +00002448 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002449
Martin Blais2856e5f2006-05-26 12:03:27 +00002450 if (!(*addr = makesockaddr(s->sock_fd, (struct sockaddr *) &addrbuf,
2451 addrlen, s->sock_proto)))
2452 return -1;
2453
2454 return n;
2455}
2456
2457/* s.recvfrom(nbytes [,flags]) method */
2458
2459static PyObject *
2460sock_recvfrom(PySocketSockObject *s, PyObject *args)
2461{
2462 PyObject *buf = NULL;
2463 PyObject *addr = NULL;
2464 PyObject *ret = NULL;
Martin Blaisaf2ae722006-06-04 13:49:49 +00002465 int recvlen, flags = 0;
2466 ssize_t outlen;
Martin Blais2856e5f2006-05-26 12:03:27 +00002467
2468 if (!PyArg_ParseTuple(args, "i|i:recvfrom", &recvlen, &flags))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002469 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002470
Martin Blais2856e5f2006-05-26 12:03:27 +00002471 buf = PyString_FromStringAndSize((char *) 0, recvlen);
2472 if (buf == NULL)
2473 return NULL;
2474
2475 outlen = sock_recvfrom_guts(s, PyString_AS_STRING(buf),
2476 recvlen, flags, &addr);
2477 if (outlen < 0) {
Barry Warsaw752300b1997-01-03 17:18:10 +00002478 goto finally;
Martin Blais2856e5f2006-05-26 12:03:27 +00002479 }
2480
2481 if (outlen != recvlen) {
2482 /* We did not read as many bytes as we anticipated, resize the
2483 string if possible and be succesful. */
2484 if (_PyString_Resize(&buf, outlen) < 0)
2485 /* Oopsy, not so succesful after all. */
2486 goto finally;
2487 }
Barry Warsaw752300b1997-01-03 17:18:10 +00002488
Raymond Hettinger8ae46892003-10-12 19:09:37 +00002489 ret = PyTuple_Pack(2, buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002490
2491finally:
Guido van Rossum73624e91994-10-10 17:59:00 +00002492 Py_XDECREF(buf);
Martin Blais2856e5f2006-05-26 12:03:27 +00002493 Py_XDECREF(addr);
Guido van Rossum6f5afc91993-02-05 09:46:15 +00002494 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002495}
2496
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002497PyDoc_STRVAR(recvfrom_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002498"recvfrom(buffersize[, flags]) -> (data, address info)\n\
2499\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002500Like recv(buffersize, flags) but also return the sender's address info.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002501
Martin Blais2856e5f2006-05-26 12:03:27 +00002502
Martin Blaisaf2ae722006-06-04 13:49:49 +00002503/* s.recvfrom_into(buffer[, nbytes [,flags]]) method */
Martin Blais2856e5f2006-05-26 12:03:27 +00002504
2505static PyObject *
Martin Blaisaf2ae722006-06-04 13:49:49 +00002506sock_recvfrom_into(PySocketSockObject *s, PyObject *args, PyObject* kwds)
Martin Blais2856e5f2006-05-26 12:03:27 +00002507{
2508 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
2509
Martin Blaisaf2ae722006-06-04 13:49:49 +00002510 int recvlen = 0, flags = 0;
2511 ssize_t readlen;
Martin Blais2856e5f2006-05-26 12:03:27 +00002512 char *buf;
2513 int buflen;
2514
2515 PyObject *addr = NULL;
Martin Blais2856e5f2006-05-26 12:03:27 +00002516
Martin Blaisaf2ae722006-06-04 13:49:49 +00002517 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w#|ii:recvfrom", kwlist,
Martin Blais2856e5f2006-05-26 12:03:27 +00002518 &buf, &buflen, &recvlen, &flags))
2519 return NULL;
2520 assert(buf != 0 && buflen > 0);
2521
2522 if (recvlen < 0) {
2523 PyErr_SetString(PyExc_ValueError,
2524 "negative buffersize in recv");
2525 return NULL;
2526 }
2527 if (recvlen == 0) {
2528 /* If nbytes was not specified, use the buffer's length */
2529 recvlen = buflen;
2530 }
2531
2532 readlen = sock_recvfrom_guts(s, buf, recvlen, flags, &addr);
2533 if (readlen < 0) {
2534 /* Return an error */
Martin Blaisaf2ae722006-06-04 13:49:49 +00002535 Py_XDECREF(addr);
2536 return NULL;
Martin Blais2856e5f2006-05-26 12:03:27 +00002537 }
2538
2539 /* Return the number of bytes read and the address. Note that we do
2540 not do anything special here in the case that readlen < recvlen. */
Neal Norwitzf0cab1f2006-06-08 05:12:45 +00002541 return Py_BuildValue("lN", readlen, addr);
Martin Blais2856e5f2006-05-26 12:03:27 +00002542}
2543
Martin Blaisaf2ae722006-06-04 13:49:49 +00002544PyDoc_STRVAR(recvfrom_into_doc,
2545"recvfrom_into(buffer[, nbytes[, flags]]) -> (nbytes, address info)\n\
Martin Blais2856e5f2006-05-26 12:03:27 +00002546\n\
Martin Blaisaf2ae722006-06-04 13:49:49 +00002547Like recv_into(buffer[, nbytes[, flags]]) but also return the sender's address info.");
Martin Blais2856e5f2006-05-26 12:03:27 +00002548
2549
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002550/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002551
Guido van Rossum73624e91994-10-10 17:59:00 +00002552static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002553sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002554{
Guido van Rossumff4949e1992-08-05 19:58:53 +00002555 char *buf;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002556 int len, n = 0, flags = 0, timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002557
Guido van Rossum43713e52000-02-29 13:59:29 +00002558 if (!PyArg_ParseTuple(args, "s#|i:send", &buf, &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00002559 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002560
Neal Norwitz082b2df2006-02-07 07:04:46 +00002561 if (!IS_SELECTABLE(s))
2562 return select_error();
2563
Guido van Rossum73624e91994-10-10 17:59:00 +00002564 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002565 timeout = internal_select(s, 1);
2566 if (!timeout)
Neal Norwitz2a30cd02006-07-10 01:18:57 +00002567#ifdef __VMS
2568 n = sendsegmented(s->sock_fd, buf, len, flags);
2569#else
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002570 n = send(s->sock_fd, buf, len, flags);
Neal Norwitz2a30cd02006-07-10 01:18:57 +00002571#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00002572 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002573
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002574 if (timeout) {
2575 PyErr_SetString(socket_timeout, "timed out");
2576 return NULL;
2577 }
Guido van Rossum30a685f1991-06-27 15:51:29 +00002578 if (n < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002579 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00002580 return PyInt_FromLong((long)n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00002581}
2582
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002583PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002584"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002585\n\
2586Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002587argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002588sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002589
2590
2591/* s.sendall(data [,flags]) method */
2592
2593static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002594sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002595{
2596 char *buf;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002597 int len, n = 0, flags = 0, timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002598
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002599 if (!PyArg_ParseTuple(args, "s#|i:sendall", &buf, &len, &flags))
2600 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002601
Neal Norwitz082b2df2006-02-07 07:04:46 +00002602 if (!IS_SELECTABLE(s))
2603 return select_error();
2604
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002605 Py_BEGIN_ALLOW_THREADS
2606 do {
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002607 timeout = internal_select(s, 1);
2608 if (timeout)
2609 break;
Neal Norwitz2a30cd02006-07-10 01:18:57 +00002610#ifdef __VMS
2611 n = sendsegmented(s->sock_fd, buf, len, flags);
2612#else
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002613 n = send(s->sock_fd, buf, len, flags);
Neal Norwitz2a30cd02006-07-10 01:18:57 +00002614#endif
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002615 if (n < 0)
2616 break;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002617 buf += n;
2618 len -= n;
2619 } while (len > 0);
2620 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002621
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002622 if (timeout) {
2623 PyErr_SetString(socket_timeout, "timed out");
2624 return NULL;
2625 }
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002626 if (n < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002627 return s->errorhandler();
Guido van Rossum67f7a382002-06-06 21:08:16 +00002628
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002629 Py_INCREF(Py_None);
2630 return Py_None;
2631}
2632
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002633PyDoc_STRVAR(sendall_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002634"sendall(data[, flags])\n\
2635\n\
2636Send a data string to the socket. For the optional flags\n\
2637argument, see the Unix manual. This calls send() repeatedly\n\
2638until all data is sent. If an error occurs, it's impossible\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002639to tell how much data has been sent.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002640
Guido van Rossum30a685f1991-06-27 15:51:29 +00002641
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002642/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002643
Guido van Rossum73624e91994-10-10 17:59:00 +00002644static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002645sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002646{
Guido van Rossum73624e91994-10-10 17:59:00 +00002647 PyObject *addro;
Guido van Rossumff4949e1992-08-05 19:58:53 +00002648 char *buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002649 struct sockaddr *addr;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002650 int addrlen, len, n = 0, flags, timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002651
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002652 flags = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002653 if (!PyArg_ParseTuple(args, "s#O:sendto", &buf, &len, &addro)) {
Guido van Rossum73624e91994-10-10 17:59:00 +00002654 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002655 if (!PyArg_ParseTuple(args, "s#iO:sendto",
2656 &buf, &len, &flags, &addro))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002657 return NULL;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002658 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002659
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002660 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002661 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002662
Neal Norwitz082b2df2006-02-07 07:04:46 +00002663 if (!IS_SELECTABLE(s))
2664 return select_error();
2665
Guido van Rossum73624e91994-10-10 17:59:00 +00002666 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002667 timeout = internal_select(s, 1);
2668 if (!timeout)
2669 n = sendto(s->sock_fd, buf, len, flags, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00002670 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002671
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002672 if (timeout) {
2673 PyErr_SetString(socket_timeout, "timed out");
2674 return NULL;
2675 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002676 if (n < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002677 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00002678 return PyInt_FromLong((long)n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002679}
2680
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002681PyDoc_STRVAR(sendto_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002682"sendto(data[, flags], address) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002683\n\
2684Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002685For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002686
Guido van Rossum30a685f1991-06-27 15:51:29 +00002687
2688/* s.shutdown(how) method */
2689
Guido van Rossum73624e91994-10-10 17:59:00 +00002690static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002691sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002692{
2693 int how;
Guido van Rossumff4949e1992-08-05 19:58:53 +00002694 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002695
2696 how = PyInt_AsLong(arg);
2697 if (how == -1 && PyErr_Occurred())
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002698 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00002699 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002700 res = shutdown(s->sock_fd, how);
Guido van Rossum73624e91994-10-10 17:59:00 +00002701 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002702 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002703 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00002704 Py_INCREF(Py_None);
2705 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002706}
2707
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002708PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002709"shutdown(flag)\n\
2710\n\
Martin v. Löwis94681fc2003-11-27 19:40:22 +00002711Shut down the reading side of the socket (flag == SHUT_RD), the writing side\n\
2712of the socket (flag == SHUT_WR), or both ends (flag == SHUT_RDWR).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002713
Guido van Rossum30a685f1991-06-27 15:51:29 +00002714
2715/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002716
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002717static PyMethodDef sock_methods[] = {
Martin Blais2856e5f2006-05-26 12:03:27 +00002718 {"accept", (PyCFunction)sock_accept, METH_NOARGS,
2719 accept_doc},
2720 {"bind", (PyCFunction)sock_bind, METH_O,
2721 bind_doc},
2722 {"close", (PyCFunction)sock_close, METH_NOARGS,
2723 close_doc},
2724 {"connect", (PyCFunction)sock_connect, METH_O,
2725 connect_doc},
2726 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
2727 connect_ex_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00002728#ifndef NO_DUP
Martin Blais2856e5f2006-05-26 12:03:27 +00002729 {"dup", (PyCFunction)sock_dup, METH_NOARGS,
2730 dup_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00002731#endif
Martin Blais2856e5f2006-05-26 12:03:27 +00002732 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
2733 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00002734#ifdef HAVE_GETPEERNAME
Martin Blais2856e5f2006-05-26 12:03:27 +00002735 {"getpeername", (PyCFunction)sock_getpeername,
2736 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00002737#endif
Martin Blais2856e5f2006-05-26 12:03:27 +00002738 {"getsockname", (PyCFunction)sock_getsockname,
2739 METH_NOARGS, getsockname_doc},
2740 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
2741 getsockopt_doc},
2742 {"listen", (PyCFunction)sock_listen, METH_O,
2743 listen_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002744#ifndef NO_DUP
Martin Blais2856e5f2006-05-26 12:03:27 +00002745 {"makefile", (PyCFunction)sock_makefile, METH_VARARGS,
2746 makefile_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002747#endif
Martin Blais2856e5f2006-05-26 12:03:27 +00002748 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
2749 recv_doc},
Martin Blaisaf2ae722006-06-04 13:49:49 +00002750 {"recv_into", (PyCFunction)sock_recv_into, METH_VARARGS | METH_KEYWORDS,
2751 recv_into_doc},
Martin Blais2856e5f2006-05-26 12:03:27 +00002752 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
2753 recvfrom_doc},
Martin Blaisaf2ae722006-06-04 13:49:49 +00002754 {"recvfrom_into", (PyCFunction)sock_recvfrom_into, METH_VARARGS | METH_KEYWORDS,
2755 recvfrom_into_doc},
Martin Blais2856e5f2006-05-26 12:03:27 +00002756 {"send", (PyCFunction)sock_send, METH_VARARGS,
2757 send_doc},
2758 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
2759 sendall_doc},
2760 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
2761 sendto_doc},
2762 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
2763 setblocking_doc},
2764 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
2765 settimeout_doc},
2766 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
2767 gettimeout_doc},
2768 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
2769 setsockopt_doc},
2770 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
2771 shutdown_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002772#ifdef RISCOS
Martin Blais2856e5f2006-05-26 12:03:27 +00002773 {"sleeptaskw", (PyCFunction)sock_sleeptaskw, METH_O,
2774 sleeptaskw_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002775#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +00002776 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002777};
2778
Georg Brandlbc45a3f2006-03-17 19:17:34 +00002779/* SockObject members */
2780static PyMemberDef sock_memberlist[] = {
2781 {"family", T_INT, offsetof(PySocketSockObject, sock_family), READONLY, "the socket family"},
2782 {"type", T_INT, offsetof(PySocketSockObject, sock_type), READONLY, "the socket type"},
2783 {"proto", T_INT, offsetof(PySocketSockObject, sock_proto), READONLY, "the socket protocol"},
2784 {"timeout", T_DOUBLE, offsetof(PySocketSockObject, sock_timeout), READONLY, "the socket timeout"},
2785 {0},
2786};
Guido van Rossum30a685f1991-06-27 15:51:29 +00002787
Guido van Rossum73624e91994-10-10 17:59:00 +00002788/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00002789 First close the file description. */
2790
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002791static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002792sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002793{
Guido van Rossumfa972c92000-04-10 12:45:45 +00002794 if (s->sock_fd != -1)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00002795 (void) SOCKETCLOSE(s->sock_fd);
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002796 s->ob_type->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002797}
2798
Guido van Rossum30a685f1991-06-27 15:51:29 +00002799
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002800static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002801sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002802{
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002803 char buf[512];
Fred Drakea04eaad2000-06-30 02:46:07 +00002804#if SIZEOF_SOCKET_T > SIZEOF_LONG
2805 if (s->sock_fd > LONG_MAX) {
2806 /* this can occur on Win64, and actually there is a special
2807 ugly printf formatter for decimal pointer length integer
2808 printing, only bother if necessary*/
2809 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002810 "no printf formatter to display "
2811 "the socket descriptor in decimal");
Fred Drakea04eaad2000-06-30 02:46:07 +00002812 return NULL;
2813 }
2814#endif
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002815 PyOS_snprintf(
2816 buf, sizeof(buf),
2817 "<socket object, fd=%ld, family=%d, type=%d, protocol=%d>",
2818 (long)s->sock_fd, s->sock_family,
2819 s->sock_type,
2820 s->sock_proto);
Guido van Rossumdc1c64a1996-02-27 15:21:19 +00002821 return PyString_FromString(buf);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002822}
2823
2824
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002825/* Create a new, uninitialized socket object. */
2826
2827static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002828sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002829{
2830 PyObject *new;
2831
2832 new = type->tp_alloc(type, 0);
Guido van Rossume1c478f2002-06-06 20:08:25 +00002833 if (new != NULL) {
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002834 ((PySocketSockObject *)new)->sock_fd = -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002835 ((PySocketSockObject *)new)->sock_timeout = -1.0;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002836 ((PySocketSockObject *)new)->errorhandler = &set_error;
Guido van Rossume1c478f2002-06-06 20:08:25 +00002837 }
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002838 return new;
2839}
2840
2841
2842/* Initialize a new socket object. */
2843
2844/*ARGSUSED*/
2845static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00002846sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002847{
2848 PySocketSockObject *s = (PySocketSockObject *)self;
2849 SOCKET_T fd;
2850 int family = AF_INET, type = SOCK_STREAM, proto = 0;
Martin v. Löwis02cbf4a2006-02-27 17:20:04 +00002851 static char *keywords[] = {"family", "type", "proto", 0};
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002852
2853 if (!PyArg_ParseTupleAndKeywords(args, kwds,
2854 "|iii:socket", keywords,
2855 &family, &type, &proto))
2856 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002857
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002858 Py_BEGIN_ALLOW_THREADS
2859 fd = socket(family, type, proto);
2860 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002861
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002862#ifdef MS_WINDOWS
2863 if (fd == INVALID_SOCKET)
2864#else
2865 if (fd < 0)
2866#endif
2867 {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002868 set_error();
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002869 return -1;
2870 }
2871 init_sockobject(s, fd, family, type, proto);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002872
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002873 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002874
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002875}
2876
2877
Guido van Rossumb6775db1994-08-01 11:34:53 +00002878/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002879
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002880static PyTypeObject sock_type = {
Guido van Rossum55558541996-05-23 22:54:50 +00002881 PyObject_HEAD_INIT(0) /* Must fill in type value later */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002882 0, /* ob_size */
Guido van Rossumca6dfa52001-10-28 12:31:33 +00002883 "_socket.socket", /* tp_name */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002884 sizeof(PySocketSockObject), /* tp_basicsize */
2885 0, /* tp_itemsize */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002886 (destructor)sock_dealloc, /* tp_dealloc */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002887 0, /* tp_print */
2888 0, /* tp_getattr */
2889 0, /* tp_setattr */
2890 0, /* tp_compare */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002891 (reprfunc)sock_repr, /* tp_repr */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002892 0, /* tp_as_number */
2893 0, /* tp_as_sequence */
2894 0, /* tp_as_mapping */
2895 0, /* tp_hash */
2896 0, /* tp_call */
2897 0, /* tp_str */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002898 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002899 0, /* tp_setattro */
2900 0, /* tp_as_buffer */
2901 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002902 sock_doc, /* tp_doc */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002903 0, /* tp_traverse */
2904 0, /* tp_clear */
2905 0, /* tp_richcompare */
2906 0, /* tp_weaklistoffset */
2907 0, /* tp_iter */
2908 0, /* tp_iternext */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002909 sock_methods, /* tp_methods */
Georg Brandlbc45a3f2006-03-17 19:17:34 +00002910 sock_memberlist, /* tp_members */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002911 0, /* tp_getset */
2912 0, /* tp_base */
2913 0, /* tp_dict */
2914 0, /* tp_descr_get */
2915 0, /* tp_descr_set */
2916 0, /* tp_dictoffset */
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00002917 sock_initobj, /* tp_init */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002918 PyType_GenericAlloc, /* tp_alloc */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002919 sock_new, /* tp_new */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002920 PyObject_Del, /* tp_free */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002921};
2922
Guido van Rossum30a685f1991-06-27 15:51:29 +00002923
Guido van Rossum81194471991-07-27 21:42:02 +00002924/* Python interface to gethostname(). */
2925
2926/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002927static PyObject *
Georg Brandl96a8c392006-05-29 21:04:52 +00002928socket_gethostname(PyObject *self, PyObject *unused)
Guido van Rossum81194471991-07-27 21:42:02 +00002929{
2930 char buf[1024];
Guido van Rossumff4949e1992-08-05 19:58:53 +00002931 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +00002932 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002933 res = gethostname(buf, (int) sizeof buf - 1);
Guido van Rossum73624e91994-10-10 17:59:00 +00002934 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002935 if (res < 0)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002936 return set_error();
Guido van Rossum81194471991-07-27 21:42:02 +00002937 buf[sizeof buf - 1] = '\0';
Guido van Rossum73624e91994-10-10 17:59:00 +00002938 return PyString_FromString(buf);
Guido van Rossum81194471991-07-27 21:42:02 +00002939}
Guido van Rossumff4949e1992-08-05 19:58:53 +00002940
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002941PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002942"gethostname() -> string\n\
2943\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002944Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002945
Guido van Rossumff4949e1992-08-05 19:58:53 +00002946
Guido van Rossum30a685f1991-06-27 15:51:29 +00002947/* Python interface to gethostbyname(name). */
2948
2949/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002950static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002951socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002952{
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002953 char *name;
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00002954 sock_addr_t addrbuf;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002955
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002956 if (!PyArg_ParseTuple(args, "s:gethostbyname", &name))
Guido van Rossum30a685f1991-06-27 15:51:29 +00002957 return NULL;
Martin v. Löwisddc6f472002-07-28 16:10:31 +00002958 if (setipaddr(name, (struct sockaddr *)&addrbuf, sizeof(addrbuf), AF_INET) < 0)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002959 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002960 return makeipaddr((struct sockaddr *)&addrbuf,
2961 sizeof(struct sockaddr_in));
Guido van Rossum30a685f1991-06-27 15:51:29 +00002962}
2963
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002964PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002965"gethostbyname(host) -> address\n\
2966\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002967Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002968
2969
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002970/* Convenience function common to gethostbyname_ex and gethostbyaddr */
2971
2972static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002973gethost_common(struct hostent *h, struct sockaddr *addr, int alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002974{
2975 char **pch;
2976 PyObject *rtn_tuple = (PyObject *)NULL;
2977 PyObject *name_list = (PyObject *)NULL;
2978 PyObject *addr_list = (PyObject *)NULL;
2979 PyObject *tmp;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002980
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002981 if (h == NULL) {
Guido van Rossum48a680c2001-03-02 06:34:14 +00002982 /* Let's get real error message to return */
Guido van Rossume2ae77b2001-10-24 20:42:55 +00002983#ifndef RISCOS
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002984 set_herror(h_errno);
Guido van Rossume2ae77b2001-10-24 20:42:55 +00002985#else
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002986 PyErr_SetString(socket_error, "host not found");
Guido van Rossume2ae77b2001-10-24 20:42:55 +00002987#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002988 return NULL;
2989 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002990
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002991 if (h->h_addrtype != af) {
2992#ifdef HAVE_STRERROR
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002993 /* Let's get real error message to return */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002994 PyErr_SetString(socket_error,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002995 (char *)strerror(EAFNOSUPPORT));
2996#else
2997 PyErr_SetString(
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002998 socket_error,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002999 "Address family not supported by protocol family");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003000#endif
3001 return NULL;
3002 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003003
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003004 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00003005
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003006 case AF_INET:
3007 if (alen < sizeof(struct sockaddr_in))
3008 return NULL;
3009 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003010
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00003011#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003012 case AF_INET6:
3013 if (alen < sizeof(struct sockaddr_in6))
3014 return NULL;
3015 break;
3016#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00003017
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003018 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003019
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003020 if ((name_list = PyList_New(0)) == NULL)
3021 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003022
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003023 if ((addr_list = PyList_New(0)) == NULL)
3024 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003025
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003026 for (pch = h->h_aliases; *pch != NULL; pch++) {
3027 int status;
3028 tmp = PyString_FromString(*pch);
3029 if (tmp == NULL)
3030 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003031
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003032 status = PyList_Append(name_list, tmp);
3033 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003034
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003035 if (status)
3036 goto err;
3037 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003038
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003039 for (pch = h->h_addr_list; *pch != NULL; pch++) {
3040 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003041
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003042 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00003043
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003044 case AF_INET:
3045 {
3046 struct sockaddr_in sin;
3047 memset(&sin, 0, sizeof(sin));
3048 sin.sin_family = af;
3049#ifdef HAVE_SOCKADDR_SA_LEN
3050 sin.sin_len = sizeof(sin);
3051#endif
3052 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
3053 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
Guido van Rossum67f7a382002-06-06 21:08:16 +00003054
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003055 if (pch == h->h_addr_list && alen >= sizeof(sin))
3056 memcpy((char *) addr, &sin, sizeof(sin));
3057 break;
3058 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003059
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00003060#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003061 case AF_INET6:
3062 {
3063 struct sockaddr_in6 sin6;
3064 memset(&sin6, 0, sizeof(sin6));
3065 sin6.sin6_family = af;
3066#ifdef HAVE_SOCKADDR_SA_LEN
3067 sin6.sin6_len = sizeof(sin6);
3068#endif
3069 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
3070 tmp = makeipaddr((struct sockaddr *)&sin6,
3071 sizeof(sin6));
Guido van Rossum67f7a382002-06-06 21:08:16 +00003072
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003073 if (pch == h->h_addr_list && alen >= sizeof(sin6))
3074 memcpy((char *) addr, &sin6, sizeof(sin6));
3075 break;
3076 }
3077#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00003078
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003079 default: /* can't happen */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003080 PyErr_SetString(socket_error,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003081 "unsupported address family");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003082 return NULL;
3083 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003084
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003085 if (tmp == NULL)
3086 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003087
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003088 status = PyList_Append(addr_list, tmp);
3089 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003090
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003091 if (status)
3092 goto err;
3093 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003094
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003095 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003096
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003097 err:
3098 Py_XDECREF(name_list);
3099 Py_XDECREF(addr_list);
3100 return rtn_tuple;
3101}
3102
3103
3104/* Python interface to gethostbyname_ex(name). */
3105
3106/*ARGSUSED*/
3107static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003108socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003109{
3110 char *name;
3111 struct hostent *h;
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00003112#ifdef ENABLE_IPV6
3113 struct sockaddr_storage addr;
3114#else
3115 struct sockaddr_in addr;
3116#endif
Martin v. Löwis9db2f572001-07-23 01:30:10 +00003117 struct sockaddr *sa;
Guido van Rossum955becc1999-03-22 20:14:53 +00003118 PyObject *ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003119#ifdef HAVE_GETHOSTBYNAME_R
3120 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003121#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
3122 struct hostent_data data;
3123#else
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003124 char buf[16384];
3125 int buf_len = (sizeof buf) - 1;
3126 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003127#endif
3128#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00003129 int result;
3130#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003131#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003132
Guido van Rossum27fc3c02000-03-24 20:56:56 +00003133 if (!PyArg_ParseTuple(args, "s:gethostbyname_ex", &name))
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003134 return NULL;
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00003135 if (setipaddr(name, (struct sockaddr *)&addr, sizeof(addr), AF_INET) < 0)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003136 return NULL;
3137 Py_BEGIN_ALLOW_THREADS
3138#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003139#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003140 result = gethostbyname_r(name, &hp_allocated, buf, buf_len,
3141 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003142#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003143 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003144#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00003145 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003146 result = gethostbyname_r(name, &hp_allocated, &data);
3147 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00003148#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003149#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00003150#ifdef USE_GETHOSTBYNAME_LOCK
Just van Rossum1040d2c2003-05-09 07:53:18 +00003151 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003152#endif
3153 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003154#endif /* HAVE_GETHOSTBYNAME_R */
3155 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00003156 /* Some C libraries would require addr.__ss_family instead of
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003157 addr.ss_family.
3158 Therefore, we cast the sockaddr_storage into sockaddr to
3159 access sa_family. */
Martin v. Löwis9db2f572001-07-23 01:30:10 +00003160 sa = (struct sockaddr*)&addr;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003161 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr),
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003162 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00003163#ifdef USE_GETHOSTBYNAME_LOCK
Just van Rossum1040d2c2003-05-09 07:53:18 +00003164 PyThread_release_lock(netdb_lock);
Guido van Rossum955becc1999-03-22 20:14:53 +00003165#endif
3166 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003167}
3168
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003169PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003170"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
3171\n\
3172Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003173for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003174
3175
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003176/* Python interface to gethostbyaddr(IP). */
3177
3178/*ARGSUSED*/
3179static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003180socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003181{
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00003182#ifdef ENABLE_IPV6
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003183 struct sockaddr_storage addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003184#else
Guido van Rossum48a680c2001-03-02 06:34:14 +00003185 struct sockaddr_in addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003186#endif
3187 struct sockaddr *sa = (struct sockaddr *)&addr;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003188 char *ip_num;
3189 struct hostent *h;
Guido van Rossum3baaa131999-03-22 21:44:51 +00003190 PyObject *ret;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003191#ifdef HAVE_GETHOSTBYNAME_R
3192 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003193#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
3194 struct hostent_data data;
3195#else
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003196 char buf[16384];
3197 int buf_len = (sizeof buf) - 1;
3198 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003199#endif
3200#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00003201 int result;
3202#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003203#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003204 char *ap;
3205 int al;
3206 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003207
Guido van Rossum27fc3c02000-03-24 20:56:56 +00003208 if (!PyArg_ParseTuple(args, "s:gethostbyaddr", &ip_num))
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003209 return NULL;
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00003210 af = AF_UNSPEC;
Martin v. Löwisddc6f472002-07-28 16:10:31 +00003211 if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003212 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003213 af = sa->sa_family;
3214 ap = NULL;
3215 al = 0;
3216 switch (af) {
3217 case AF_INET:
3218 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
3219 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
3220 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00003221#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003222 case AF_INET6:
3223 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
3224 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
3225 break;
3226#endif
3227 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003228 PyErr_SetString(socket_error, "unsupported address family");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003229 return NULL;
3230 }
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003231 Py_BEGIN_ALLOW_THREADS
3232#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003233#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003234 result = gethostbyaddr_r(ap, al, af,
3235 &hp_allocated, buf, buf_len,
Guido van Rossume9cd07b1999-03-15 21:40:14 +00003236 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003237#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003238 h = gethostbyaddr_r(ap, al, af,
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003239 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003240#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00003241 memset((void *) &data, '\0', sizeof(data));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003242 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003243 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00003244#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003245#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00003246#ifdef USE_GETHOSTBYNAME_LOCK
Just van Rossum1040d2c2003-05-09 07:53:18 +00003247 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003248#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003249 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003250#endif /* HAVE_GETHOSTBYNAME_R */
3251 Py_END_ALLOW_THREADS
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003252 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00003253#ifdef USE_GETHOSTBYNAME_LOCK
Just van Rossum1040d2c2003-05-09 07:53:18 +00003254 PyThread_release_lock(netdb_lock);
Guido van Rossum3baaa131999-03-22 21:44:51 +00003255#endif
3256 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003257}
3258
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003259PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003260"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
3261\n\
3262Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003263for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003264
Guido van Rossum30a685f1991-06-27 15:51:29 +00003265
3266/* Python interface to getservbyname(name).
3267 This only returns the port number, since the other info is already
3268 known or not useful (like the list of aliases). */
3269
3270/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00003271static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003272socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003273{
Barry Warsaw11b91a02004-06-28 00:50:43 +00003274 char *name, *proto=NULL;
Guido van Rossum30a685f1991-06-27 15:51:29 +00003275 struct servent *sp;
Barry Warsaw11b91a02004-06-28 00:50:43 +00003276 if (!PyArg_ParseTuple(args, "s|s:getservbyname", &name, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +00003277 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00003278 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00003279 sp = getservbyname(name, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00003280 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00003281 if (sp == NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003282 PyErr_SetString(socket_error, "service/proto not found");
Guido van Rossum30a685f1991-06-27 15:51:29 +00003283 return NULL;
3284 }
Guido van Rossum73624e91994-10-10 17:59:00 +00003285 return PyInt_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00003286}
3287
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003288PyDoc_STRVAR(getservbyname_doc,
Barry Warsaw11b91a02004-06-28 00:50:43 +00003289"getservbyname(servicename[, protocolname]) -> integer\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003290\n\
3291Return a port number from a service name and protocol name.\n\
Barry Warsaw11b91a02004-06-28 00:50:43 +00003292The optional protocol name, if given, should be 'tcp' or 'udp',\n\
3293otherwise any protocol will match.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003294
Guido van Rossum30a685f1991-06-27 15:51:29 +00003295
Barry Warsaw11b91a02004-06-28 00:50:43 +00003296/* Python interface to getservbyport(port).
3297 This only returns the service name, since the other info is already
3298 known or not useful (like the list of aliases). */
3299
3300/*ARGSUSED*/
3301static PyObject *
3302socket_getservbyport(PyObject *self, PyObject *args)
3303{
Raymond Hettinger87de0ca2004-09-28 02:19:40 +00003304 unsigned short port;
Barry Warsaw11b91a02004-06-28 00:50:43 +00003305 char *proto=NULL;
3306 struct servent *sp;
Raymond Hettinger87de0ca2004-09-28 02:19:40 +00003307 if (!PyArg_ParseTuple(args, "H|s:getservbyport", &port, &proto))
Barry Warsaw11b91a02004-06-28 00:50:43 +00003308 return NULL;
3309 Py_BEGIN_ALLOW_THREADS
3310 sp = getservbyport(htons(port), proto);
3311 Py_END_ALLOW_THREADS
3312 if (sp == NULL) {
3313 PyErr_SetString(socket_error, "port/proto not found");
3314 return NULL;
3315 }
3316 return PyString_FromString(sp->s_name);
3317}
3318
3319PyDoc_STRVAR(getservbyport_doc,
3320"getservbyport(port[, protocolname]) -> string\n\
3321\n\
3322Return the service name from a port number and protocol name.\n\
3323The optional protocol name, if given, should be 'tcp' or 'udp',\n\
3324otherwise any protocol will match.");
3325
Guido van Rossum3901d851996-12-19 16:35:04 +00003326/* Python interface to getprotobyname(name).
3327 This only returns the protocol number, since the other info is
3328 already known or not useful (like the list of aliases). */
3329
3330/*ARGSUSED*/
3331static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003332socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00003333{
3334 char *name;
3335 struct protoent *sp;
Guido van Rossumbcc20741998-08-04 22:53:56 +00003336#ifdef __BEOS__
3337/* Not available in BeOS yet. - [cjh] */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003338 PyErr_SetString(socket_error, "getprotobyname not supported");
Guido van Rossumbcc20741998-08-04 22:53:56 +00003339 return NULL;
3340#else
Guido van Rossum27fc3c02000-03-24 20:56:56 +00003341 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
Guido van Rossum3901d851996-12-19 16:35:04 +00003342 return NULL;
3343 Py_BEGIN_ALLOW_THREADS
3344 sp = getprotobyname(name);
3345 Py_END_ALLOW_THREADS
3346 if (sp == NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003347 PyErr_SetString(socket_error, "protocol not found");
Guido van Rossum3901d851996-12-19 16:35:04 +00003348 return NULL;
3349 }
3350 return PyInt_FromLong((long) sp->p_proto);
Guido van Rossumbcc20741998-08-04 22:53:56 +00003351#endif
Guido van Rossum3901d851996-12-19 16:35:04 +00003352}
3353
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003354PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003355"getprotobyname(name) -> integer\n\
3356\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003357Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003358
Guido van Rossum3901d851996-12-19 16:35:04 +00003359
Dave Cole331708b2004-08-09 04:51:41 +00003360#ifdef HAVE_SOCKETPAIR
3361/* Create a pair of sockets using the socketpair() function.
Dave Cole07fda7e2004-08-23 05:16:23 +00003362 Arguments as for socket() except the default family is AF_UNIX if
Dave Colee8bbfe42004-08-26 00:51:16 +00003363 defined on the platform; otherwise, the default is AF_INET. */
Dave Cole331708b2004-08-09 04:51:41 +00003364
3365/*ARGSUSED*/
3366static PyObject *
3367socket_socketpair(PyObject *self, PyObject *args)
3368{
3369 PySocketSockObject *s0 = NULL, *s1 = NULL;
3370 SOCKET_T sv[2];
3371 int family, type = SOCK_STREAM, proto = 0;
3372 PyObject *res = NULL;
3373
3374#if defined(AF_UNIX)
3375 family = AF_UNIX;
3376#else
3377 family = AF_INET;
3378#endif
3379 if (!PyArg_ParseTuple(args, "|iii:socketpair",
3380 &family, &type, &proto))
3381 return NULL;
3382 /* Create a pair of socket fds */
3383 if (socketpair(family, type, proto, sv) < 0)
3384 return set_error();
Dave Cole331708b2004-08-09 04:51:41 +00003385 s0 = new_sockobject(sv[0], family, type, proto);
3386 if (s0 == NULL)
3387 goto finally;
3388 s1 = new_sockobject(sv[1], family, type, proto);
3389 if (s1 == NULL)
3390 goto finally;
3391 res = PyTuple_Pack(2, s0, s1);
3392
3393finally:
3394 if (res == NULL) {
3395 if (s0 == NULL)
3396 SOCKETCLOSE(sv[0]);
3397 if (s1 == NULL)
3398 SOCKETCLOSE(sv[1]);
3399 }
3400 Py_XDECREF(s0);
3401 Py_XDECREF(s1);
3402 return res;
3403}
3404
3405PyDoc_STRVAR(socketpair_doc,
3406"socketpair([family[, type[, proto]]]) -> (socket object, socket object)\n\
3407\n\
3408Create a pair of socket objects from the sockets returned by the platform\n\
3409socketpair() function.\n\
Dave Cole07fda7e2004-08-23 05:16:23 +00003410The arguments are the same as for socket() except the default family is\n\
Dave Colee8bbfe42004-08-26 00:51:16 +00003411AF_UNIX if defined on the platform; otherwise, the default is AF_INET.");
Dave Cole331708b2004-08-09 04:51:41 +00003412
3413#endif /* HAVE_SOCKETPAIR */
3414
3415
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00003416#ifndef NO_DUP
Guido van Rossum2a7178e1992-12-08 13:38:24 +00003417/* Create a socket object from a numeric file description.
3418 Useful e.g. if stdin is a socket.
3419 Additional arguments as for socket(). */
3420
3421/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00003422static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003423socket_fromfd(PyObject *self, PyObject *args)
Guido van Rossum2a7178e1992-12-08 13:38:24 +00003424{
Guido van Rossum73624e91994-10-10 17:59:00 +00003425 PySocketSockObject *s;
Fred Drakea04eaad2000-06-30 02:46:07 +00003426 SOCKET_T fd;
3427 int family, type, proto = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00003428 if (!PyArg_ParseTuple(args, "iii|i:fromfd",
3429 &fd, &family, &type, &proto))
Guido van Rossumbe32c891996-06-20 16:25:29 +00003430 return NULL;
Guido van Rossum5f59d601992-12-14 16:59:51 +00003431 /* Dup the fd so it and the socket can be closed independently */
3432 fd = dup(fd);
3433 if (fd < 0)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003434 return set_error();
3435 s = new_sockobject(fd, family, type, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00003436 return (PyObject *) s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00003437}
Guido van Rossum82a5c661998-07-07 20:45:43 +00003438
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003439PyDoc_STRVAR(fromfd_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003440"fromfd(fd, family, type[, proto]) -> socket object\n\
3441\n\
Georg Brandldcfdae72006-04-01 07:33:08 +00003442Create a socket object from a duplicate of the given\n\
3443file descriptor.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003444The remaining arguments are the same as for socket().");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003445
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00003446#endif /* NO_DUP */
Guido van Rossum2a7178e1992-12-08 13:38:24 +00003447
Guido van Rossum82a5c661998-07-07 20:45:43 +00003448
Guido van Rossum006bf911996-06-12 04:04:55 +00003449static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003450socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00003451{
3452 int x1, x2;
3453
Guido van Rossum27fc3c02000-03-24 20:56:56 +00003454 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00003455 return NULL;
3456 }
3457 x2 = (int)ntohs((short)x1);
3458 return PyInt_FromLong(x2);
3459}
3460
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003461PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003462"ntohs(integer) -> integer\n\
3463\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003464Convert a 16-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003465
3466
Guido van Rossum006bf911996-06-12 04:04:55 +00003467static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003468socket_ntohl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00003469{
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003470 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00003471
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003472 if (PyInt_Check(arg)) {
3473 x = PyInt_AS_LONG(arg);
Jeremy Hylton825e47b2002-07-25 16:37:51 +00003474 if (x == (unsigned long) -1 && PyErr_Occurred())
3475 return NULL;
Guido van Rossum006bf911996-06-12 04:04:55 +00003476 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003477 else if (PyLong_Check(arg)) {
3478 x = PyLong_AsUnsignedLong(arg);
Jeremy Hylton825e47b2002-07-25 16:37:51 +00003479 if (x == (unsigned long) -1 && PyErr_Occurred())
3480 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003481#if SIZEOF_LONG > 4
3482 {
3483 unsigned long y;
3484 /* only want the trailing 32 bits */
3485 y = x & 0xFFFFFFFFUL;
3486 if (y ^ x)
3487 return PyErr_Format(PyExc_OverflowError,
3488 "long int larger than 32 bits");
3489 x = y;
Tim Peters58141872002-08-06 22:25:02 +00003490 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003491#endif
3492 }
3493 else
Tim Peters58141872002-08-06 22:25:02 +00003494 return PyErr_Format(PyExc_TypeError,
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003495 "expected int/long, %s found",
3496 arg->ob_type->tp_name);
3497 if (x == (unsigned long) -1 && PyErr_Occurred())
3498 return NULL;
3499 return PyInt_FromLong(ntohl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00003500}
3501
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003502PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003503"ntohl(integer) -> integer\n\
3504\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003505Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003506
3507
Guido van Rossum006bf911996-06-12 04:04:55 +00003508static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003509socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00003510{
Hye-Shik Changa7b673f2003-12-17 09:40:23 +00003511 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00003512
Guido van Rossum27fc3c02000-03-24 20:56:56 +00003513 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00003514 return NULL;
3515 }
3516 x2 = (int)htons((short)x1);
3517 return PyInt_FromLong(x2);
3518}
3519
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003520PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003521"htons(integer) -> integer\n\
3522\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003523Convert a 16-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003524
3525
Guido van Rossum006bf911996-06-12 04:04:55 +00003526static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003527socket_htonl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00003528{
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003529 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00003530
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003531 if (PyInt_Check(arg)) {
3532 x = PyInt_AS_LONG(arg);
Jeremy Hylton825e47b2002-07-25 16:37:51 +00003533 if (x == (unsigned long) -1 && PyErr_Occurred())
3534 return NULL;
Guido van Rossum006bf911996-06-12 04:04:55 +00003535 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003536 else if (PyLong_Check(arg)) {
3537 x = PyLong_AsUnsignedLong(arg);
Jeremy Hylton825e47b2002-07-25 16:37:51 +00003538 if (x == (unsigned long) -1 && PyErr_Occurred())
3539 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003540#if SIZEOF_LONG > 4
3541 {
3542 unsigned long y;
3543 /* only want the trailing 32 bits */
3544 y = x & 0xFFFFFFFFUL;
3545 if (y ^ x)
3546 return PyErr_Format(PyExc_OverflowError,
3547 "long int larger than 32 bits");
3548 x = y;
Tim Peters58141872002-08-06 22:25:02 +00003549 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003550#endif
3551 }
3552 else
Tim Peters58141872002-08-06 22:25:02 +00003553 return PyErr_Format(PyExc_TypeError,
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003554 "expected int/long, %s found",
3555 arg->ob_type->tp_name);
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003556 return PyInt_FromLong(htonl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00003557}
3558
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003559PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003560"htonl(integer) -> integer\n\
3561\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003562Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003563
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003564/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003565
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003566PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003567"inet_aton(string) -> packed 32-bit IP representation\n\
3568\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003569Convert 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 +00003570binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003571
3572static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003573socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003574{
Guido van Rossuma2e48551999-09-09 15:42:59 +00003575#ifndef INADDR_NONE
3576#define INADDR_NONE (-1)
3577#endif
Neal Norwitz88f115b2003-02-13 02:15:42 +00003578#ifdef HAVE_INET_ATON
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003579 struct in_addr buf;
Ronald Oussorend06b6f22006-04-23 11:59:25 +00003580#endif
3581
3582#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
Tim Peters1df9fdd2003-02-13 03:13:40 +00003583 /* Have to use inet_addr() instead */
3584 unsigned long packed_addr;
3585#endif
3586 char *ip_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003587
Tim Peters1df9fdd2003-02-13 03:13:40 +00003588 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003589 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003590
Tim Peters1df9fdd2003-02-13 03:13:40 +00003591
3592#ifdef HAVE_INET_ATON
Ronald Oussorend06b6f22006-04-23 11:59:25 +00003593
3594#ifdef USE_INET_ATON_WEAKLINK
3595 if (inet_aton != NULL) {
3596#endif
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003597 if (inet_aton(ip_addr, &buf))
3598 return PyString_FromStringAndSize((char *)(&buf),
3599 sizeof(buf));
3600
3601 PyErr_SetString(socket_error,
3602 "illegal IP address string passed to inet_aton");
3603 return NULL;
3604
Ronald Oussorend06b6f22006-04-23 11:59:25 +00003605#ifdef USE_INET_ATON_WEAKLINK
3606 } else {
3607#endif
3608
3609#endif
3610
3611#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
3612
Georg Brandld2e3ba72005-08-26 08:34:00 +00003613 /* special-case this address as inet_addr might return INADDR_NONE
3614 * for this */
3615 if (strcmp(ip_addr, "255.255.255.255") == 0) {
3616 packed_addr = 0xFFFFFFFF;
3617 } else {
Martin Blais2856e5f2006-05-26 12:03:27 +00003618
Georg Brandld2e3ba72005-08-26 08:34:00 +00003619 packed_addr = inet_addr(ip_addr);
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003620
Georg Brandld2e3ba72005-08-26 08:34:00 +00003621 if (packed_addr == INADDR_NONE) { /* invalid address */
3622 PyErr_SetString(socket_error,
3623 "illegal IP address string passed to inet_aton");
3624 return NULL;
3625 }
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003626 }
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003627 return PyString_FromStringAndSize((char *) &packed_addr,
3628 sizeof(packed_addr));
Ronald Oussorend06b6f22006-04-23 11:59:25 +00003629
3630#ifdef USE_INET_ATON_WEAKLINK
3631 }
3632#endif
3633
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003634#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003635}
3636
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003637PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00003638"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003639\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003640Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003641
3642static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003643socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003644{
3645 char *packed_str;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003646 int addr_len;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003647 struct in_addr packed_addr;
3648
Guido van Rossum27fc3c02000-03-24 20:56:56 +00003649 if (!PyArg_ParseTuple(args, "s#:inet_ntoa", &packed_str, &addr_len)) {
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003650 return NULL;
3651 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00003652
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003653 if (addr_len != sizeof(packed_addr)) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003654 PyErr_SetString(socket_error,
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003655 "packed IP wrong length for inet_ntoa");
3656 return NULL;
3657 }
3658
3659 memcpy(&packed_addr, packed_str, addr_len);
3660
3661 return PyString_FromString(inet_ntoa(packed_addr));
3662}
Guido van Rossum82a5c661998-07-07 20:45:43 +00003663
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003664#ifdef HAVE_INET_PTON
3665
3666PyDoc_STRVAR(inet_pton_doc,
3667"inet_pton(af, ip) -> packed IP address string\n\
3668\n\
3669Convert an IP address from string format to a packed string suitable\n\
3670for use with low-level network functions.");
3671
3672static PyObject *
3673socket_inet_pton(PyObject *self, PyObject *args)
3674{
3675 int af;
3676 char* ip;
3677 int retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003678#ifdef ENABLE_IPV6
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003679 char packed[MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003680#else
3681 char packed[sizeof(struct in_addr)];
3682#endif
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003683 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
3684 return NULL;
3685 }
3686
Martin v. Löwis04697e82004-06-02 12:35:29 +00003687#if !defined(ENABLE_IPV6) && defined(AF_INET6)
Martin v. Löwis10649092003-08-05 06:25:06 +00003688 if(af == AF_INET6) {
3689 PyErr_SetString(socket_error,
3690 "can't use AF_INET6, IPv6 is disabled");
3691 return NULL;
3692 }
Martin Blais2856e5f2006-05-26 12:03:27 +00003693#endif
Martin v. Löwis10649092003-08-05 06:25:06 +00003694
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003695 retval = inet_pton(af, ip, packed);
3696 if (retval < 0) {
3697 PyErr_SetFromErrno(socket_error);
3698 return NULL;
3699 } else if (retval == 0) {
3700 PyErr_SetString(socket_error,
3701 "illegal IP address string passed to inet_pton");
3702 return NULL;
3703 } else if (af == AF_INET) {
3704 return PyString_FromStringAndSize(packed,
3705 sizeof(struct in_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003706#ifdef ENABLE_IPV6
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003707 } else if (af == AF_INET6) {
3708 return PyString_FromStringAndSize(packed,
3709 sizeof(struct in6_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003710#endif
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003711 } else {
3712 PyErr_SetString(socket_error, "unknown address family");
3713 return NULL;
3714 }
3715}
Martin Blais2856e5f2006-05-26 12:03:27 +00003716
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003717PyDoc_STRVAR(inet_ntop_doc,
3718"inet_ntop(af, packed_ip) -> string formatted IP address\n\
3719\n\
3720Convert a packed IP address of the given family to string format.");
3721
3722static PyObject *
3723socket_inet_ntop(PyObject *self, PyObject *args)
3724{
3725 int af;
3726 char* packed;
3727 int len;
3728 const char* retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003729#ifdef ENABLE_IPV6
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003730 char ip[MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003731#else
3732 char ip[INET_ADDRSTRLEN + 1];
3733#endif
Martin Blais2856e5f2006-05-26 12:03:27 +00003734
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003735 /* Guarantee NUL-termination for PyString_FromString() below */
Jeremy Hylton80961f32004-11-07 14:24:25 +00003736 memset((void *) &ip[0], '\0', sizeof(ip));
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003737
3738 if (!PyArg_ParseTuple(args, "is#:inet_ntop", &af, &packed, &len)) {
3739 return NULL;
3740 }
3741
3742 if (af == AF_INET) {
3743 if (len != sizeof(struct in_addr)) {
3744 PyErr_SetString(PyExc_ValueError,
3745 "invalid length of packed IP address string");
3746 return NULL;
3747 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003748#ifdef ENABLE_IPV6
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003749 } else if (af == AF_INET6) {
3750 if (len != sizeof(struct in6_addr)) {
3751 PyErr_SetString(PyExc_ValueError,
3752 "invalid length of packed IP address string");
3753 return NULL;
3754 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003755#endif
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003756 } else {
3757 PyErr_Format(PyExc_ValueError,
3758 "unknown address family %d", af);
3759 return NULL;
3760 }
3761
3762 retval = inet_ntop(af, packed, ip, sizeof(ip));
3763 if (!retval) {
3764 PyErr_SetFromErrno(socket_error);
3765 return NULL;
3766 } else {
3767 return PyString_FromString(retval);
3768 }
3769
3770 /* NOTREACHED */
3771 PyErr_SetString(PyExc_RuntimeError, "invalid handling of inet_ntop");
3772 return NULL;
3773}
3774
3775#endif /* HAVE_INET_PTON */
3776
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003777/* Python interface to getaddrinfo(host, port). */
3778
3779/*ARGSUSED*/
3780static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003781socket_getaddrinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003782{
Martin v. Löwisf0b11d22001-11-07 08:31:03 +00003783 struct addrinfo hints, *res;
3784 struct addrinfo *res0 = NULL;
Martin v. Löwis2548c732003-04-18 10:39:54 +00003785 PyObject *hobj = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003786 PyObject *pobj = (PyObject *)NULL;
Martin v. Löwisf65b1a12001-08-12 09:28:40 +00003787 char pbuf[30];
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003788 char *hptr, *pptr;
3789 int family, socktype, protocol, flags;
3790 int error;
3791 PyObject *all = (PyObject *)NULL;
3792 PyObject *single = (PyObject *)NULL;
Martin v. Löwis2548c732003-04-18 10:39:54 +00003793 PyObject *idna = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003794
3795 family = socktype = protocol = flags = 0;
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00003796 family = AF_UNSPEC;
Martin v. Löwis2548c732003-04-18 10:39:54 +00003797 if (!PyArg_ParseTuple(args, "OO|iiii:getaddrinfo",
3798 &hobj, &pobj, &family, &socktype,
3799 &protocol, &flags)) {
3800 return NULL;
3801 }
3802 if (hobj == Py_None) {
3803 hptr = NULL;
3804 } else if (PyUnicode_Check(hobj)) {
3805 idna = PyObject_CallMethod(hobj, "encode", "s", "idna");
3806 if (!idna)
3807 return NULL;
3808 hptr = PyString_AsString(idna);
3809 } else if (PyString_Check(hobj)) {
3810 hptr = PyString_AsString(hobj);
3811 } else {
Martin Blais2856e5f2006-05-26 12:03:27 +00003812 PyErr_SetString(PyExc_TypeError,
Martin v. Löwis2548c732003-04-18 10:39:54 +00003813 "getaddrinfo() argument 1 must be string or None");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003814 return NULL;
3815 }
3816 if (PyInt_Check(pobj)) {
Marc-André Lemburg03d1b182001-07-31 18:05:33 +00003817 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", PyInt_AsLong(pobj));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003818 pptr = pbuf;
3819 } else if (PyString_Check(pobj)) {
3820 pptr = PyString_AsString(pobj);
3821 } else if (pobj == Py_None) {
3822 pptr = (char *)NULL;
3823 } else {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003824 PyErr_SetString(socket_error, "Int or String expected");
Martin v. Löwis5db099a2003-08-07 11:55:15 +00003825 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003826 }
3827 memset(&hints, 0, sizeof(hints));
3828 hints.ai_family = family;
3829 hints.ai_socktype = socktype;
3830 hints.ai_protocol = protocol;
3831 hints.ai_flags = flags;
Just van Rossum1040d2c2003-05-09 07:53:18 +00003832 Py_BEGIN_ALLOW_THREADS
3833 ACQUIRE_GETADDRINFO_LOCK
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003834 error = getaddrinfo(hptr, pptr, &hints, &res0);
Just van Rossum1040d2c2003-05-09 07:53:18 +00003835 Py_END_ALLOW_THREADS
3836 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003837 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003838 set_gaierror(error);
Martin v. Löwis5db099a2003-08-07 11:55:15 +00003839 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003840 }
3841
3842 if ((all = PyList_New(0)) == NULL)
3843 goto err;
3844 for (res = res0; res; res = res->ai_next) {
Guido van Rossum716aac02001-10-12 18:59:27 +00003845 PyObject *addr =
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00003846 makesockaddr(-1, res->ai_addr, res->ai_addrlen, protocol);
Guido van Rossum716aac02001-10-12 18:59:27 +00003847 if (addr == NULL)
3848 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003849 single = Py_BuildValue("iiisO", res->ai_family,
3850 res->ai_socktype, res->ai_protocol,
3851 res->ai_canonname ? res->ai_canonname : "",
Guido van Rossum716aac02001-10-12 18:59:27 +00003852 addr);
3853 Py_DECREF(addr);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003854 if (single == NULL)
3855 goto err;
3856
3857 if (PyList_Append(all, single))
3858 goto err;
3859 Py_XDECREF(single);
3860 }
Martin v. Löwis2548c732003-04-18 10:39:54 +00003861 Py_XDECREF(idna);
Neal Norwitz90128ba2002-08-09 03:37:42 +00003862 if (res0)
3863 freeaddrinfo(res0);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003864 return all;
3865 err:
3866 Py_XDECREF(single);
3867 Py_XDECREF(all);
Martin v. Löwis2548c732003-04-18 10:39:54 +00003868 Py_XDECREF(idna);
Martin v. Löwisf0b11d22001-11-07 08:31:03 +00003869 if (res0)
3870 freeaddrinfo(res0);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003871 return (PyObject *)NULL;
3872}
3873
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003874PyDoc_STRVAR(getaddrinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003875"getaddrinfo(host, port [, family, socktype, proto, flags])\n\
3876 -> list of (family, socktype, proto, canonname, sockaddr)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003877\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003878Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003879
3880/* Python interface to getnameinfo(sa, flags). */
3881
3882/*ARGSUSED*/
3883static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003884socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003885{
3886 PyObject *sa = (PyObject *)NULL;
3887 int flags;
3888 char *hostp;
Martin v. Löwis06b1d212001-11-02 23:34:52 +00003889 int port, flowinfo, scope_id;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003890 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
3891 struct addrinfo hints, *res = NULL;
3892 int error;
3893 PyObject *ret = (PyObject *)NULL;
3894
3895 flags = flowinfo = scope_id = 0;
Martin v. Löwis06b1d212001-11-02 23:34:52 +00003896 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003897 return NULL;
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003898 if (!PyArg_ParseTuple(sa, "si|ii",
3899 &hostp, &port, &flowinfo, &scope_id))
Martin v. Löwis06b1d212001-11-02 23:34:52 +00003900 return NULL;
Marc-André Lemburg03d1b182001-07-31 18:05:33 +00003901 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003902 memset(&hints, 0, sizeof(hints));
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00003903 hints.ai_family = AF_UNSPEC;
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003904 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Just van Rossum1040d2c2003-05-09 07:53:18 +00003905 Py_BEGIN_ALLOW_THREADS
3906 ACQUIRE_GETADDRINFO_LOCK
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003907 error = getaddrinfo(hostp, pbuf, &hints, &res);
Just van Rossum1040d2c2003-05-09 07:53:18 +00003908 Py_END_ALLOW_THREADS
3909 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003910 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003911 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003912 goto fail;
3913 }
3914 if (res->ai_next) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003915 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003916 "sockaddr resolved to multiple addresses");
3917 goto fail;
3918 }
3919 switch (res->ai_family) {
3920 case AF_INET:
3921 {
3922 char *t1;
3923 int t2;
3924 if (PyArg_ParseTuple(sa, "si", &t1, &t2) == 0) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003925 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003926 "IPv4 sockaddr must be 2 tuple");
3927 goto fail;
3928 }
3929 break;
3930 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00003931#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003932 case AF_INET6:
3933 {
3934 struct sockaddr_in6 *sin6;
3935 sin6 = (struct sockaddr_in6 *)res->ai_addr;
3936 sin6->sin6_flowinfo = flowinfo;
3937 sin6->sin6_scope_id = scope_id;
3938 break;
3939 }
3940#endif
3941 }
3942 error = getnameinfo(res->ai_addr, res->ai_addrlen,
3943 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
3944 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003945 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003946 goto fail;
3947 }
3948 ret = Py_BuildValue("ss", hbuf, pbuf);
3949
3950fail:
3951 if (res)
3952 freeaddrinfo(res);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003953 return ret;
3954}
3955
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003956PyDoc_STRVAR(getnameinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003957"getnameinfo(sockaddr, flags) --> (host, port)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003958\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003959Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003960
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00003961
3962/* Python API to getting and setting the default timeout value. */
3963
3964static PyObject *
3965socket_getdefaulttimeout(PyObject *self)
3966{
3967 if (defaulttimeout < 0.0) {
3968 Py_INCREF(Py_None);
3969 return Py_None;
3970 }
3971 else
3972 return PyFloat_FromDouble(defaulttimeout);
3973}
3974
3975PyDoc_STRVAR(getdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003976"getdefaulttimeout() -> timeout\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00003977\n\
3978Returns 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
3982static PyObject *
3983socket_setdefaulttimeout(PyObject *self, PyObject *arg)
3984{
3985 double timeout;
3986
3987 if (arg == Py_None)
3988 timeout = -1.0;
3989 else {
3990 timeout = PyFloat_AsDouble(arg);
3991 if (timeout < 0.0) {
3992 if (!PyErr_Occurred())
3993 PyErr_SetString(PyExc_ValueError,
3994 "Timeout value out of range");
3995 return NULL;
3996 }
3997 }
3998
3999 defaulttimeout = timeout;
4000
4001 Py_INCREF(Py_None);
4002 return Py_None;
4003}
4004
4005PyDoc_STRVAR(setdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004006"setdefaulttimeout(timeout)\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004007\n\
4008Set the default timeout in floating seconds for new socket objects.\n\
4009A value of None indicates that new socket objects have no timeout.\n\
4010When the socket module is first imported, the default is None.");
4011
4012
Guido van Rossum30a685f1991-06-27 15:51:29 +00004013/* List of functions exported by this module. */
4014
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004015static PyMethodDef socket_methods[] = {
4016 {"gethostbyname", socket_gethostbyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00004017 METH_VARARGS, gethostbyname_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004018 {"gethostbyname_ex", socket_gethostbyname_ex,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00004019 METH_VARARGS, ghbn_ex_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004020 {"gethostbyaddr", socket_gethostbyaddr,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00004021 METH_VARARGS, gethostbyaddr_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004022 {"gethostname", socket_gethostname,
Georg Brandl96a8c392006-05-29 21:04:52 +00004023 METH_NOARGS, gethostname_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004024 {"getservbyname", socket_getservbyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00004025 METH_VARARGS, getservbyname_doc},
Barry Warsaw11b91a02004-06-28 00:50:43 +00004026 {"getservbyport", socket_getservbyport,
4027 METH_VARARGS, getservbyport_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004028 {"getprotobyname", socket_getprotobyname,
Georg Brandl96a8c392006-05-29 21:04:52 +00004029 METH_VARARGS, getprotobyname_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004030#ifndef NO_DUP
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004031 {"fromfd", socket_fromfd,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00004032 METH_VARARGS, fromfd_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004033#endif
Dave Cole331708b2004-08-09 04:51:41 +00004034#ifdef HAVE_SOCKETPAIR
4035 {"socketpair", socket_socketpair,
4036 METH_VARARGS, socketpair_doc},
4037#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004038 {"ntohs", socket_ntohs,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00004039 METH_VARARGS, ntohs_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004040 {"ntohl", socket_ntohl,
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004041 METH_O, ntohl_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004042 {"htons", socket_htons,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00004043 METH_VARARGS, htons_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004044 {"htonl", socket_htonl,
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004045 METH_O, htonl_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004046 {"inet_aton", socket_inet_aton,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00004047 METH_VARARGS, inet_aton_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004048 {"inet_ntoa", socket_inet_ntoa,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00004049 METH_VARARGS, inet_ntoa_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004050#ifdef HAVE_INET_PTON
4051 {"inet_pton", socket_inet_pton,
4052 METH_VARARGS, inet_pton_doc},
4053 {"inet_ntop", socket_inet_ntop,
4054 METH_VARARGS, inet_ntop_doc},
4055#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004056 {"getaddrinfo", socket_getaddrinfo,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004057 METH_VARARGS, getaddrinfo_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004058 {"getnameinfo", socket_getnameinfo,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004059 METH_VARARGS, getnameinfo_doc},
Guido van Rossum1693ba82002-07-18 21:11:26 +00004060 {"getdefaulttimeout", (PyCFunction)socket_getdefaulttimeout,
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004061 METH_NOARGS, getdefaulttimeout_doc},
4062 {"setdefaulttimeout", socket_setdefaulttimeout,
4063 METH_O, setdefaulttimeout_doc},
Guido van Rossum30a685f1991-06-27 15:51:29 +00004064 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004065};
4066
Guido van Rossum30a685f1991-06-27 15:51:29 +00004067
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004068#ifdef RISCOS
4069#define OS_INIT_DEFINED
Guido van Rossumbe32c891996-06-20 16:25:29 +00004070
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004071static int
4072os_init(void)
4073{
4074 _kernel_swi_regs r;
4075
4076 r.r[0] = 0;
4077 _kernel_swi(0x43380, &r, &r);
4078 taskwindow = r.r[0];
4079
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004080 return 1;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004081}
4082
4083#endif /* RISCOS */
4084
4085
4086#ifdef MS_WINDOWS
4087#define OS_INIT_DEFINED
4088
4089/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00004090
4091static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004092os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00004093{
4094 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00004095}
4096
4097static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004098os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00004099{
4100 WSADATA WSAData;
4101 int ret;
4102 char buf[100];
4103 ret = WSAStartup(0x0101, &WSAData);
4104 switch (ret) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004105 case 0: /* No error */
Mark Hammond14350ab2003-07-09 04:57:46 +00004106 Py_AtExit(os_cleanup);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004107 return 1; /* Success */
Guido van Rossumbe32c891996-06-20 16:25:29 +00004108 case WSASYSNOTREADY:
4109 PyErr_SetString(PyExc_ImportError,
4110 "WSAStartup failed: network not ready");
4111 break;
4112 case WSAVERNOTSUPPORTED:
4113 case WSAEINVAL:
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004114 PyErr_SetString(
4115 PyExc_ImportError,
4116 "WSAStartup failed: requested version not supported");
Guido van Rossumbe32c891996-06-20 16:25:29 +00004117 break;
4118 default:
Tim Peters885d4572001-11-28 20:27:42 +00004119 PyOS_snprintf(buf, sizeof(buf),
4120 "WSAStartup failed: error code %d", ret);
Guido van Rossumbe32c891996-06-20 16:25:29 +00004121 PyErr_SetString(PyExc_ImportError, buf);
4122 break;
4123 }
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004124 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00004125}
4126
Guido van Rossum8d665e61996-06-26 18:22:49 +00004127#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00004128
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004129
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004130#ifdef PYOS_OS2
4131#define OS_INIT_DEFINED
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004132
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004133/* Additional initialization for OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004134
4135static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004136os_init(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004137{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004138#ifndef PYCC_GCC
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004139 char reason[64];
4140 int rc = sock_init();
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004141
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004142 if (rc == 0) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004143 return 1; /* Success */
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004144 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004145
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004146 PyOS_snprintf(reason, sizeof(reason),
4147 "OS/2 TCP/IP Error# %d", sock_errno());
4148 PyErr_SetString(PyExc_ImportError, reason);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004149
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004150 return 0; /* Failure */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00004151#else
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004152 /* No need to initialise sockets with GCC/EMX */
4153 return 1; /* Success */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00004154#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004155}
4156
4157#endif /* PYOS_OS2 */
4158
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004159
4160#ifndef OS_INIT_DEFINED
4161static int
4162os_init(void)
4163{
4164 return 1; /* Success */
4165}
4166#endif
4167
4168
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00004169/* C API table - always add new things to the end for binary
4170 compatibility. */
4171static
4172PySocketModule_APIObject PySocketModuleAPI =
4173{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004174 &sock_type,
Brett Cannon06c34792004-03-23 23:16:54 +00004175 NULL
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00004176};
4177
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004178
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004179/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004180
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004181 This module is actually called "_socket", and there's a wrapper
4182 "socket.py" which implements some additional functionality. On some
4183 platforms (e.g. Windows and OS/2), socket.py also implements a
4184 wrapper for the socket type that provides missing functionality such
4185 as makefile(), dup() and fromfd(). The import of "_socket" may fail
4186 with an ImportError exception if os-specific initialization fails.
4187 On Windows, this does WINSOCK initialization. When WINSOCK is
4188 initialized succesfully, a call to WSACleanup() is scheduled to be
4189 made at exit time.
4190*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004191
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004192PyDoc_STRVAR(socket_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004193"Implementation module for socket operations.\n\
4194\n\
4195See the socket module for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004196
Mark Hammondfe51c6d2002-08-02 02:27:13 +00004197PyMODINIT_FUNC
Thomas Wouters1e0c2f42000-07-24 16:06:23 +00004198init_socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004199{
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004200 PyObject *m, *has_ipv6;
Fred Drake4baedc12002-04-01 14:53:37 +00004201
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004202 if (!os_init())
Guido van Rossum0cb96de1997-10-01 04:29:29 +00004203 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004204
4205 sock_type.ob_type = &PyType_Type;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004206 m = Py_InitModule3(PySocket_MODULE_NAME,
4207 socket_methods,
4208 socket_doc);
Neal Norwitz1ac754f2006-01-19 06:09:39 +00004209 if (m == NULL)
4210 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004211
4212 socket_error = PyErr_NewException("socket.error", NULL, NULL);
4213 if (socket_error == NULL)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004214 return;
Brett Cannon06c34792004-03-23 23:16:54 +00004215 PySocketModuleAPI.error = socket_error;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004216 Py_INCREF(socket_error);
4217 PyModule_AddObject(m, "error", socket_error);
4218 socket_herror = PyErr_NewException("socket.herror",
4219 socket_error, NULL);
4220 if (socket_herror == NULL)
4221 return;
4222 Py_INCREF(socket_herror);
4223 PyModule_AddObject(m, "herror", socket_herror);
4224 socket_gaierror = PyErr_NewException("socket.gaierror", socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004225 NULL);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004226 if (socket_gaierror == NULL)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004227 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004228 Py_INCREF(socket_gaierror);
4229 PyModule_AddObject(m, "gaierror", socket_gaierror);
Raymond Hettingeref7343c2003-06-29 03:08:05 +00004230 socket_timeout = PyErr_NewException("socket.timeout",
4231 socket_error, NULL);
4232 if (socket_timeout == NULL)
4233 return;
4234 Py_INCREF(socket_timeout);
4235 PyModule_AddObject(m, "timeout", socket_timeout);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004236 Py_INCREF((PyObject *)&sock_type);
Fred Drake4baedc12002-04-01 14:53:37 +00004237 if (PyModule_AddObject(m, "SocketType",
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004238 (PyObject *)&sock_type) != 0)
Guido van Rossum0cb96de1997-10-01 04:29:29 +00004239 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004240 Py_INCREF((PyObject *)&sock_type);
Fred Drake4baedc12002-04-01 14:53:37 +00004241 if (PyModule_AddObject(m, "socket",
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004242 (PyObject *)&sock_type) != 0)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004243 return;
Guido van Rossum09be4091999-08-09 14:40:40 +00004244
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004245#ifdef ENABLE_IPV6
4246 has_ipv6 = Py_True;
4247#else
4248 has_ipv6 = Py_False;
4249#endif
4250 Py_INCREF(has_ipv6);
4251 PyModule_AddObject(m, "has_ipv6", has_ipv6);
4252
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00004253 /* Export C API */
Fred Drake4baedc12002-04-01 14:53:37 +00004254 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00004255 PyCObject_FromVoidPtr((void *)&PySocketModuleAPI, NULL)
4256 ) != 0)
4257 return;
4258
Guido van Rossum09be4091999-08-09 14:40:40 +00004259 /* Address families (we only support AF_INET and AF_UNIX) */
4260#ifdef AF_UNSPEC
Fred Drake4baedc12002-04-01 14:53:37 +00004261 PyModule_AddIntConstant(m, "AF_UNSPEC", AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00004262#endif
Fred Drake4baedc12002-04-01 14:53:37 +00004263 PyModule_AddIntConstant(m, "AF_INET", AF_INET);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004264#ifdef AF_INET6
Fred Drake4baedc12002-04-01 14:53:37 +00004265 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004266#endif /* AF_INET6 */
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00004267#if defined(AF_UNIX)
Fred Drake4baedc12002-04-01 14:53:37 +00004268 PyModule_AddIntConstant(m, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00004269#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00004270#ifdef AF_AX25
Fred Drake4baedc12002-04-01 14:53:37 +00004271 /* Amateur Radio AX.25 */
4272 PyModule_AddIntConstant(m, "AF_AX25", AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00004273#endif
4274#ifdef AF_IPX
Fred Drake4baedc12002-04-01 14:53:37 +00004275 PyModule_AddIntConstant(m, "AF_IPX", AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00004276#endif
4277#ifdef AF_APPLETALK
Fred Drake4baedc12002-04-01 14:53:37 +00004278 /* Appletalk DDP */
4279 PyModule_AddIntConstant(m, "AF_APPLETALK", AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00004280#endif
4281#ifdef AF_NETROM
Fred Drake4baedc12002-04-01 14:53:37 +00004282 /* Amateur radio NetROM */
4283 PyModule_AddIntConstant(m, "AF_NETROM", AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00004284#endif
4285#ifdef AF_BRIDGE
Fred Drake4baedc12002-04-01 14:53:37 +00004286 /* Multiprotocol bridge */
4287 PyModule_AddIntConstant(m, "AF_BRIDGE", AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00004288#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004289#ifdef AF_ATMPVC
4290 /* ATM PVCs */
4291 PyModule_AddIntConstant(m, "AF_ATMPVC", AF_ATMPVC);
4292#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00004293#ifdef AF_AAL5
Fred Drake4baedc12002-04-01 14:53:37 +00004294 /* Reserved for Werner's ATM */
4295 PyModule_AddIntConstant(m, "AF_AAL5", AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00004296#endif
4297#ifdef AF_X25
Fred Drake4baedc12002-04-01 14:53:37 +00004298 /* Reserved for X.25 project */
4299 PyModule_AddIntConstant(m, "AF_X25", AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00004300#endif
4301#ifdef AF_INET6
Fred Drake4baedc12002-04-01 14:53:37 +00004302 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00004303#endif
4304#ifdef AF_ROSE
Fred Drake4baedc12002-04-01 14:53:37 +00004305 /* Amateur Radio X.25 PLP */
4306 PyModule_AddIntConstant(m, "AF_ROSE", AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00004307#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004308#ifdef AF_DECnet
4309 /* Reserved for DECnet project */
4310 PyModule_AddIntConstant(m, "AF_DECnet", AF_DECnet);
4311#endif
4312#ifdef AF_NETBEUI
4313 /* Reserved for 802.2LLC project */
4314 PyModule_AddIntConstant(m, "AF_NETBEUI", AF_NETBEUI);
4315#endif
4316#ifdef AF_SECURITY
4317 /* Security callback pseudo AF */
4318 PyModule_AddIntConstant(m, "AF_SECURITY", AF_SECURITY);
4319#endif
4320#ifdef AF_KEY
4321 /* PF_KEY key management API */
4322 PyModule_AddIntConstant(m, "AF_KEY", AF_KEY);
4323#endif
4324#ifdef AF_NETLINK
4325 /* */
4326 PyModule_AddIntConstant(m, "AF_NETLINK", AF_NETLINK);
Martin v. Löwis11017b12006-01-14 18:12:57 +00004327 PyModule_AddIntConstant(m, "NETLINK_ROUTE", NETLINK_ROUTE);
Martin v. Löwis5fe60e72006-04-06 22:29:33 +00004328#ifdef NETLINK_SKIP
Martin v. Löwis11017b12006-01-14 18:12:57 +00004329 PyModule_AddIntConstant(m, "NETLINK_SKIP", NETLINK_SKIP);
Martin v. Löwis5fe60e72006-04-06 22:29:33 +00004330#endif
4331#ifdef NETLINK_W1
4332 PyModule_AddIntConstant(m, "NETLINK_W1", NETLINK_W1);
4333#endif
Martin v. Löwis11017b12006-01-14 18:12:57 +00004334 PyModule_AddIntConstant(m, "NETLINK_USERSOCK", NETLINK_USERSOCK);
4335 PyModule_AddIntConstant(m, "NETLINK_FIREWALL", NETLINK_FIREWALL);
Guido van Rossum668a94a2006-02-21 01:07:27 +00004336#ifdef NETLINK_TCPDIAG
Martin v. Löwis11017b12006-01-14 18:12:57 +00004337 PyModule_AddIntConstant(m, "NETLINK_TCPDIAG", NETLINK_TCPDIAG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00004338#endif
4339#ifdef NETLINK_NFLOG
Martin v. Löwis11017b12006-01-14 18:12:57 +00004340 PyModule_AddIntConstant(m, "NETLINK_NFLOG", NETLINK_NFLOG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00004341#endif
Neal Norwitz65851662006-01-16 04:31:40 +00004342#ifdef NETLINK_XFRM
Martin v. Löwis11017b12006-01-14 18:12:57 +00004343 PyModule_AddIntConstant(m, "NETLINK_XFRM", NETLINK_XFRM);
Neal Norwitz65851662006-01-16 04:31:40 +00004344#endif
Martin v. Löwis5fe60e72006-04-06 22:29:33 +00004345#ifdef NETLINK_ARPD
Martin v. Löwis11017b12006-01-14 18:12:57 +00004346 PyModule_AddIntConstant(m, "NETLINK_ARPD", NETLINK_ARPD);
Martin v. Löwis5fe60e72006-04-06 22:29:33 +00004347#endif
4348#ifdef NETLINK_ROUTE6
Martin v. Löwis11017b12006-01-14 18:12:57 +00004349 PyModule_AddIntConstant(m, "NETLINK_ROUTE6", NETLINK_ROUTE6);
Martin v. Löwis5fe60e72006-04-06 22:29:33 +00004350#endif
Martin v. Löwis11017b12006-01-14 18:12:57 +00004351 PyModule_AddIntConstant(m, "NETLINK_IP6_FW", NETLINK_IP6_FW);
4352 PyModule_AddIntConstant(m, "NETLINK_DNRTMSG", NETLINK_DNRTMSG);
Martin v. Löwis5fe60e72006-04-06 22:29:33 +00004353#ifdef NETLINK_TAPBASE
Martin v. Löwis11017b12006-01-14 18:12:57 +00004354 PyModule_AddIntConstant(m, "NETLINK_TAPBASE", NETLINK_TAPBASE);
Martin v. Löwis5fe60e72006-04-06 22:29:33 +00004355#endif
Georg Brandldcfdae72006-04-01 07:33:08 +00004356#endif /* AF_NETLINK */
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004357#ifdef AF_ROUTE
4358 /* Alias to emulate 4.4BSD */
4359 PyModule_AddIntConstant(m, "AF_ROUTE", AF_ROUTE);
4360#endif
4361#ifdef AF_ASH
4362 /* Ash */
4363 PyModule_AddIntConstant(m, "AF_ASH", AF_ASH);
4364#endif
4365#ifdef AF_ECONET
4366 /* Acorn Econet */
4367 PyModule_AddIntConstant(m, "AF_ECONET", AF_ECONET);
4368#endif
4369#ifdef AF_ATMSVC
4370 /* ATM SVCs */
4371 PyModule_AddIntConstant(m, "AF_ATMSVC", AF_ATMSVC);
4372#endif
4373#ifdef AF_SNA
4374 /* Linux SNA Project (nutters!) */
4375 PyModule_AddIntConstant(m, "AF_SNA", AF_SNA);
4376#endif
4377#ifdef AF_IRDA
4378 /* IRDA sockets */
4379 PyModule_AddIntConstant(m, "AF_IRDA", AF_IRDA);
4380#endif
4381#ifdef AF_PPPOX
4382 /* PPPoX sockets */
4383 PyModule_AddIntConstant(m, "AF_PPPOX", AF_PPPOX);
4384#endif
4385#ifdef AF_WANPIPE
4386 /* Wanpipe API Sockets */
4387 PyModule_AddIntConstant(m, "AF_WANPIPE", AF_WANPIPE);
4388#endif
4389#ifdef AF_LLC
4390 /* Linux LLC */
4391 PyModule_AddIntConstant(m, "AF_LLC", AF_LLC);
4392#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00004393
Hye-Shik Chang81268602004-02-02 06:05:24 +00004394#ifdef USE_BLUETOOTH
Martin v. Löwis12af0482004-01-31 12:34:17 +00004395 PyModule_AddIntConstant(m, "AF_BLUETOOTH", AF_BLUETOOTH);
4396 PyModule_AddIntConstant(m, "BTPROTO_L2CAP", BTPROTO_L2CAP);
Hye-Shik Chang81268602004-02-02 06:05:24 +00004397#if !defined(__FreeBSD__)
Martin v. Löwis12af0482004-01-31 12:34:17 +00004398 PyModule_AddIntConstant(m, "BTPROTO_SCO", BTPROTO_SCO);
Hye-Shik Chang81268602004-02-02 06:05:24 +00004399#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00004400 PyModule_AddIntConstant(m, "BTPROTO_RFCOMM", BTPROTO_RFCOMM);
Neal Norwitz1e44ca92006-05-30 03:18:50 +00004401 PyModule_AddStringConstant(m, "BDADDR_ANY", "00:00:00:00:00:00");
4402 PyModule_AddStringConstant(m, "BDADDR_LOCAL", "00:00:00:FF:FF:FF");
Martin v. Löwis12af0482004-01-31 12:34:17 +00004403#endif
4404
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00004405#ifdef HAVE_NETPACKET_PACKET_H
Fred Drake4baedc12002-04-01 14:53:37 +00004406 PyModule_AddIntConstant(m, "AF_PACKET", AF_PACKET);
4407 PyModule_AddIntConstant(m, "PF_PACKET", PF_PACKET);
4408 PyModule_AddIntConstant(m, "PACKET_HOST", PACKET_HOST);
4409 PyModule_AddIntConstant(m, "PACKET_BROADCAST", PACKET_BROADCAST);
4410 PyModule_AddIntConstant(m, "PACKET_MULTICAST", PACKET_MULTICAST);
4411 PyModule_AddIntConstant(m, "PACKET_OTHERHOST", PACKET_OTHERHOST);
4412 PyModule_AddIntConstant(m, "PACKET_OUTGOING", PACKET_OUTGOING);
4413 PyModule_AddIntConstant(m, "PACKET_LOOPBACK", PACKET_LOOPBACK);
4414 PyModule_AddIntConstant(m, "PACKET_FASTROUTE", PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00004415#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00004416
4417 /* Socket types */
Fred Drake4baedc12002-04-01 14:53:37 +00004418 PyModule_AddIntConstant(m, "SOCK_STREAM", SOCK_STREAM);
4419 PyModule_AddIntConstant(m, "SOCK_DGRAM", SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00004420#ifndef __BEOS__
4421/* We have incomplete socket support. */
Fred Drake4baedc12002-04-01 14:53:37 +00004422 PyModule_AddIntConstant(m, "SOCK_RAW", SOCK_RAW);
4423 PyModule_AddIntConstant(m, "SOCK_SEQPACKET", SOCK_SEQPACKET);
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00004424#if defined(SOCK_RDM)
Fred Drake4baedc12002-04-01 14:53:37 +00004425 PyModule_AddIntConstant(m, "SOCK_RDM", SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00004426#endif
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00004427#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004428
4429#ifdef SO_DEBUG
Fred Drake4baedc12002-04-01 14:53:37 +00004430 PyModule_AddIntConstant(m, "SO_DEBUG", SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004431#endif
4432#ifdef SO_ACCEPTCONN
Fred Drake4baedc12002-04-01 14:53:37 +00004433 PyModule_AddIntConstant(m, "SO_ACCEPTCONN", SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004434#endif
4435#ifdef SO_REUSEADDR
Fred Drake4baedc12002-04-01 14:53:37 +00004436 PyModule_AddIntConstant(m, "SO_REUSEADDR", SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004437#endif
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00004438#ifdef SO_EXCLUSIVEADDRUSE
4439 PyModule_AddIntConstant(m, "SO_EXCLUSIVEADDRUSE", SO_EXCLUSIVEADDRUSE);
4440#endif
4441
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004442#ifdef SO_KEEPALIVE
Fred Drake4baedc12002-04-01 14:53:37 +00004443 PyModule_AddIntConstant(m, "SO_KEEPALIVE", SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004444#endif
4445#ifdef SO_DONTROUTE
Fred Drake4baedc12002-04-01 14:53:37 +00004446 PyModule_AddIntConstant(m, "SO_DONTROUTE", SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004447#endif
4448#ifdef SO_BROADCAST
Fred Drake4baedc12002-04-01 14:53:37 +00004449 PyModule_AddIntConstant(m, "SO_BROADCAST", SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004450#endif
4451#ifdef SO_USELOOPBACK
Fred Drake4baedc12002-04-01 14:53:37 +00004452 PyModule_AddIntConstant(m, "SO_USELOOPBACK", SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004453#endif
4454#ifdef SO_LINGER
Fred Drake4baedc12002-04-01 14:53:37 +00004455 PyModule_AddIntConstant(m, "SO_LINGER", SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004456#endif
4457#ifdef SO_OOBINLINE
Fred Drake4baedc12002-04-01 14:53:37 +00004458 PyModule_AddIntConstant(m, "SO_OOBINLINE", SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004459#endif
4460#ifdef SO_REUSEPORT
Fred Drake4baedc12002-04-01 14:53:37 +00004461 PyModule_AddIntConstant(m, "SO_REUSEPORT", SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004462#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004463#ifdef SO_SNDBUF
Fred Drake4baedc12002-04-01 14:53:37 +00004464 PyModule_AddIntConstant(m, "SO_SNDBUF", SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004465#endif
4466#ifdef SO_RCVBUF
Fred Drake4baedc12002-04-01 14:53:37 +00004467 PyModule_AddIntConstant(m, "SO_RCVBUF", SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004468#endif
4469#ifdef SO_SNDLOWAT
Fred Drake4baedc12002-04-01 14:53:37 +00004470 PyModule_AddIntConstant(m, "SO_SNDLOWAT", SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004471#endif
4472#ifdef SO_RCVLOWAT
Fred Drake4baedc12002-04-01 14:53:37 +00004473 PyModule_AddIntConstant(m, "SO_RCVLOWAT", SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004474#endif
4475#ifdef SO_SNDTIMEO
Fred Drake4baedc12002-04-01 14:53:37 +00004476 PyModule_AddIntConstant(m, "SO_SNDTIMEO", SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004477#endif
4478#ifdef SO_RCVTIMEO
Fred Drake4baedc12002-04-01 14:53:37 +00004479 PyModule_AddIntConstant(m, "SO_RCVTIMEO", SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004480#endif
4481#ifdef SO_ERROR
Fred Drake4baedc12002-04-01 14:53:37 +00004482 PyModule_AddIntConstant(m, "SO_ERROR", SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004483#endif
4484#ifdef SO_TYPE
Fred Drake4baedc12002-04-01 14:53:37 +00004485 PyModule_AddIntConstant(m, "SO_TYPE", SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004486#endif
4487
4488 /* Maximum number of connections for "listen" */
4489#ifdef SOMAXCONN
Fred Drake4baedc12002-04-01 14:53:37 +00004490 PyModule_AddIntConstant(m, "SOMAXCONN", SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004491#else
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004492 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004493#endif
4494
4495 /* Flags for send, recv */
4496#ifdef MSG_OOB
Fred Drake4baedc12002-04-01 14:53:37 +00004497 PyModule_AddIntConstant(m, "MSG_OOB", MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004498#endif
4499#ifdef MSG_PEEK
Fred Drake4baedc12002-04-01 14:53:37 +00004500 PyModule_AddIntConstant(m, "MSG_PEEK", MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004501#endif
4502#ifdef MSG_DONTROUTE
Fred Drake4baedc12002-04-01 14:53:37 +00004503 PyModule_AddIntConstant(m, "MSG_DONTROUTE", MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004504#endif
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00004505#ifdef MSG_DONTWAIT
Fred Drake4baedc12002-04-01 14:53:37 +00004506 PyModule_AddIntConstant(m, "MSG_DONTWAIT", MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00004507#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004508#ifdef MSG_EOR
Fred Drake4baedc12002-04-01 14:53:37 +00004509 PyModule_AddIntConstant(m, "MSG_EOR", MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004510#endif
4511#ifdef MSG_TRUNC
Fred Drake4baedc12002-04-01 14:53:37 +00004512 PyModule_AddIntConstant(m, "MSG_TRUNC", MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004513#endif
4514#ifdef MSG_CTRUNC
Fred Drake4baedc12002-04-01 14:53:37 +00004515 PyModule_AddIntConstant(m, "MSG_CTRUNC", MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004516#endif
4517#ifdef MSG_WAITALL
Fred Drake4baedc12002-04-01 14:53:37 +00004518 PyModule_AddIntConstant(m, "MSG_WAITALL", MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004519#endif
4520#ifdef MSG_BTAG
Fred Drake4baedc12002-04-01 14:53:37 +00004521 PyModule_AddIntConstant(m, "MSG_BTAG", MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004522#endif
4523#ifdef MSG_ETAG
Fred Drake4baedc12002-04-01 14:53:37 +00004524 PyModule_AddIntConstant(m, "MSG_ETAG", MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004525#endif
4526
4527 /* Protocol level and numbers, usable for [gs]etsockopt */
4528#ifdef SOL_SOCKET
Fred Drake4baedc12002-04-01 14:53:37 +00004529 PyModule_AddIntConstant(m, "SOL_SOCKET", SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004530#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00004531#ifdef SOL_IP
Fred Drake4baedc12002-04-01 14:53:37 +00004532 PyModule_AddIntConstant(m, "SOL_IP", SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00004533#else
Fred Drake4baedc12002-04-01 14:53:37 +00004534 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00004535#endif
4536#ifdef SOL_IPX
Fred Drake4baedc12002-04-01 14:53:37 +00004537 PyModule_AddIntConstant(m, "SOL_IPX", SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00004538#endif
4539#ifdef SOL_AX25
Fred Drake4baedc12002-04-01 14:53:37 +00004540 PyModule_AddIntConstant(m, "SOL_AX25", SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00004541#endif
4542#ifdef SOL_ATALK
Fred Drake4baedc12002-04-01 14:53:37 +00004543 PyModule_AddIntConstant(m, "SOL_ATALK", SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00004544#endif
4545#ifdef SOL_NETROM
Fred Drake4baedc12002-04-01 14:53:37 +00004546 PyModule_AddIntConstant(m, "SOL_NETROM", SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00004547#endif
4548#ifdef SOL_ROSE
Fred Drake4baedc12002-04-01 14:53:37 +00004549 PyModule_AddIntConstant(m, "SOL_ROSE", SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00004550#endif
4551#ifdef SOL_TCP
Fred Drake4baedc12002-04-01 14:53:37 +00004552 PyModule_AddIntConstant(m, "SOL_TCP", SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00004553#else
Fred Drake4baedc12002-04-01 14:53:37 +00004554 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00004555#endif
4556#ifdef SOL_UDP
Fred Drake4baedc12002-04-01 14:53:37 +00004557 PyModule_AddIntConstant(m, "SOL_UDP", SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00004558#else
Fred Drake4baedc12002-04-01 14:53:37 +00004559 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00004560#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004561#ifdef IPPROTO_IP
Fred Drake4baedc12002-04-01 14:53:37 +00004562 PyModule_AddIntConstant(m, "IPPROTO_IP", IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00004563#else
Fred Drake4baedc12002-04-01 14:53:37 +00004564 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004565#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004566#ifdef IPPROTO_HOPOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00004567 PyModule_AddIntConstant(m, "IPPROTO_HOPOPTS", IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004568#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004569#ifdef IPPROTO_ICMP
Fred Drake4baedc12002-04-01 14:53:37 +00004570 PyModule_AddIntConstant(m, "IPPROTO_ICMP", IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00004571#else
Fred Drake4baedc12002-04-01 14:53:37 +00004572 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004573#endif
4574#ifdef IPPROTO_IGMP
Fred Drake4baedc12002-04-01 14:53:37 +00004575 PyModule_AddIntConstant(m, "IPPROTO_IGMP", IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004576#endif
4577#ifdef IPPROTO_GGP
Fred Drake4baedc12002-04-01 14:53:37 +00004578 PyModule_AddIntConstant(m, "IPPROTO_GGP", IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004579#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004580#ifdef IPPROTO_IPV4
Fred Drake4baedc12002-04-01 14:53:37 +00004581 PyModule_AddIntConstant(m, "IPPROTO_IPV4", IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004582#endif
Martin v. Löwisa0f17342003-10-03 13:56:20 +00004583#ifdef IPPROTO_IPV6
4584 PyModule_AddIntConstant(m, "IPPROTO_IPV6", IPPROTO_IPV6);
4585#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004586#ifdef IPPROTO_IPIP
Fred Drake4baedc12002-04-01 14:53:37 +00004587 PyModule_AddIntConstant(m, "IPPROTO_IPIP", IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004588#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004589#ifdef IPPROTO_TCP
Fred Drake4baedc12002-04-01 14:53:37 +00004590 PyModule_AddIntConstant(m, "IPPROTO_TCP", IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00004591#else
Fred Drake4baedc12002-04-01 14:53:37 +00004592 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004593#endif
4594#ifdef IPPROTO_EGP
Fred Drake4baedc12002-04-01 14:53:37 +00004595 PyModule_AddIntConstant(m, "IPPROTO_EGP", IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004596#endif
4597#ifdef IPPROTO_PUP
Fred Drake4baedc12002-04-01 14:53:37 +00004598 PyModule_AddIntConstant(m, "IPPROTO_PUP", IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004599#endif
4600#ifdef IPPROTO_UDP
Fred Drake4baedc12002-04-01 14:53:37 +00004601 PyModule_AddIntConstant(m, "IPPROTO_UDP", IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00004602#else
Fred Drake4baedc12002-04-01 14:53:37 +00004603 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004604#endif
4605#ifdef IPPROTO_IDP
Fred Drake4baedc12002-04-01 14:53:37 +00004606 PyModule_AddIntConstant(m, "IPPROTO_IDP", IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004607#endif
4608#ifdef IPPROTO_HELLO
Fred Drake4baedc12002-04-01 14:53:37 +00004609 PyModule_AddIntConstant(m, "IPPROTO_HELLO", IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004610#endif
4611#ifdef IPPROTO_ND
Fred Drake4baedc12002-04-01 14:53:37 +00004612 PyModule_AddIntConstant(m, "IPPROTO_ND", IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004613#endif
4614#ifdef IPPROTO_TP
Fred Drake4baedc12002-04-01 14:53:37 +00004615 PyModule_AddIntConstant(m, "IPPROTO_TP", IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004616#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004617#ifdef IPPROTO_IPV6
Fred Drake4baedc12002-04-01 14:53:37 +00004618 PyModule_AddIntConstant(m, "IPPROTO_IPV6", IPPROTO_IPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004619#endif
4620#ifdef IPPROTO_ROUTING
Fred Drake4baedc12002-04-01 14:53:37 +00004621 PyModule_AddIntConstant(m, "IPPROTO_ROUTING", IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004622#endif
4623#ifdef IPPROTO_FRAGMENT
Fred Drake4baedc12002-04-01 14:53:37 +00004624 PyModule_AddIntConstant(m, "IPPROTO_FRAGMENT", IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004625#endif
4626#ifdef IPPROTO_RSVP
Fred Drake4baedc12002-04-01 14:53:37 +00004627 PyModule_AddIntConstant(m, "IPPROTO_RSVP", IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004628#endif
4629#ifdef IPPROTO_GRE
Fred Drake4baedc12002-04-01 14:53:37 +00004630 PyModule_AddIntConstant(m, "IPPROTO_GRE", IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004631#endif
4632#ifdef IPPROTO_ESP
Fred Drake4baedc12002-04-01 14:53:37 +00004633 PyModule_AddIntConstant(m, "IPPROTO_ESP", IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004634#endif
4635#ifdef IPPROTO_AH
Fred Drake4baedc12002-04-01 14:53:37 +00004636 PyModule_AddIntConstant(m, "IPPROTO_AH", IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004637#endif
4638#ifdef IPPROTO_MOBILE
Fred Drake4baedc12002-04-01 14:53:37 +00004639 PyModule_AddIntConstant(m, "IPPROTO_MOBILE", IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004640#endif
4641#ifdef IPPROTO_ICMPV6
Fred Drake4baedc12002-04-01 14:53:37 +00004642 PyModule_AddIntConstant(m, "IPPROTO_ICMPV6", IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004643#endif
4644#ifdef IPPROTO_NONE
Fred Drake4baedc12002-04-01 14:53:37 +00004645 PyModule_AddIntConstant(m, "IPPROTO_NONE", IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004646#endif
4647#ifdef IPPROTO_DSTOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00004648 PyModule_AddIntConstant(m, "IPPROTO_DSTOPTS", IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004649#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004650#ifdef IPPROTO_XTP
Fred Drake4baedc12002-04-01 14:53:37 +00004651 PyModule_AddIntConstant(m, "IPPROTO_XTP", IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004652#endif
4653#ifdef IPPROTO_EON
Fred Drake4baedc12002-04-01 14:53:37 +00004654 PyModule_AddIntConstant(m, "IPPROTO_EON", IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004655#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004656#ifdef IPPROTO_PIM
Fred Drake4baedc12002-04-01 14:53:37 +00004657 PyModule_AddIntConstant(m, "IPPROTO_PIM", IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004658#endif
4659#ifdef IPPROTO_IPCOMP
Fred Drake4baedc12002-04-01 14:53:37 +00004660 PyModule_AddIntConstant(m, "IPPROTO_IPCOMP", IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004661#endif
4662#ifdef IPPROTO_VRRP
Fred Drake4baedc12002-04-01 14:53:37 +00004663 PyModule_AddIntConstant(m, "IPPROTO_VRRP", IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004664#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004665#ifdef IPPROTO_BIP
Fred Drake4baedc12002-04-01 14:53:37 +00004666 PyModule_AddIntConstant(m, "IPPROTO_BIP", IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004667#endif
4668/**/
4669#ifdef IPPROTO_RAW
Fred Drake4baedc12002-04-01 14:53:37 +00004670 PyModule_AddIntConstant(m, "IPPROTO_RAW", IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00004671#else
Fred Drake4baedc12002-04-01 14:53:37 +00004672 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004673#endif
4674#ifdef IPPROTO_MAX
Fred Drake4baedc12002-04-01 14:53:37 +00004675 PyModule_AddIntConstant(m, "IPPROTO_MAX", IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004676#endif
4677
4678 /* Some port configuration */
4679#ifdef IPPORT_RESERVED
Fred Drake4baedc12002-04-01 14:53:37 +00004680 PyModule_AddIntConstant(m, "IPPORT_RESERVED", IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004681#else
Fred Drake4baedc12002-04-01 14:53:37 +00004682 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004683#endif
4684#ifdef IPPORT_USERRESERVED
Fred Drake4baedc12002-04-01 14:53:37 +00004685 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004686#else
Fred Drake4baedc12002-04-01 14:53:37 +00004687 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004688#endif
4689
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004690 /* Some reserved IP v.4 addresses */
4691#ifdef INADDR_ANY
Fred Drake4baedc12002-04-01 14:53:37 +00004692 PyModule_AddIntConstant(m, "INADDR_ANY", INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004693#else
Fred Drake4baedc12002-04-01 14:53:37 +00004694 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004695#endif
4696#ifdef INADDR_BROADCAST
Fred Drake4baedc12002-04-01 14:53:37 +00004697 PyModule_AddIntConstant(m, "INADDR_BROADCAST", INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004698#else
Fred Drake4baedc12002-04-01 14:53:37 +00004699 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004700#endif
4701#ifdef INADDR_LOOPBACK
Fred Drake4baedc12002-04-01 14:53:37 +00004702 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004703#else
Fred Drake4baedc12002-04-01 14:53:37 +00004704 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004705#endif
4706#ifdef INADDR_UNSPEC_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00004707 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004708#else
Fred Drake4baedc12002-04-01 14:53:37 +00004709 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004710#endif
4711#ifdef INADDR_ALLHOSTS_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00004712 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
4713 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004714#else
Fred Drake4baedc12002-04-01 14:53:37 +00004715 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004716#endif
4717#ifdef INADDR_MAX_LOCAL_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00004718 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP",
4719 INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004720#else
Fred Drake4baedc12002-04-01 14:53:37 +00004721 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004722#endif
4723#ifdef INADDR_NONE
Fred Drake4baedc12002-04-01 14:53:37 +00004724 PyModule_AddIntConstant(m, "INADDR_NONE", INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004725#else
Fred Drake4baedc12002-04-01 14:53:37 +00004726 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004727#endif
4728
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004729 /* IPv4 [gs]etsockopt options */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004730#ifdef IP_OPTIONS
Fred Drake4baedc12002-04-01 14:53:37 +00004731 PyModule_AddIntConstant(m, "IP_OPTIONS", IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004732#endif
4733#ifdef IP_HDRINCL
Fred Drake4baedc12002-04-01 14:53:37 +00004734 PyModule_AddIntConstant(m, "IP_HDRINCL", IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004735#endif
4736#ifdef IP_TOS
Fred Drake4baedc12002-04-01 14:53:37 +00004737 PyModule_AddIntConstant(m, "IP_TOS", IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004738#endif
4739#ifdef IP_TTL
Fred Drake4baedc12002-04-01 14:53:37 +00004740 PyModule_AddIntConstant(m, "IP_TTL", IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004741#endif
4742#ifdef IP_RECVOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00004743 PyModule_AddIntConstant(m, "IP_RECVOPTS", IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004744#endif
4745#ifdef IP_RECVRETOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00004746 PyModule_AddIntConstant(m, "IP_RECVRETOPTS", IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004747#endif
4748#ifdef IP_RECVDSTADDR
Fred Drake4baedc12002-04-01 14:53:37 +00004749 PyModule_AddIntConstant(m, "IP_RECVDSTADDR", IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004750#endif
4751#ifdef IP_RETOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00004752 PyModule_AddIntConstant(m, "IP_RETOPTS", IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004753#endif
4754#ifdef IP_MULTICAST_IF
Fred Drake4baedc12002-04-01 14:53:37 +00004755 PyModule_AddIntConstant(m, "IP_MULTICAST_IF", IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004756#endif
4757#ifdef IP_MULTICAST_TTL
Fred Drake4baedc12002-04-01 14:53:37 +00004758 PyModule_AddIntConstant(m, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004759#endif
4760#ifdef IP_MULTICAST_LOOP
Fred Drake4baedc12002-04-01 14:53:37 +00004761 PyModule_AddIntConstant(m, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004762#endif
4763#ifdef IP_ADD_MEMBERSHIP
Fred Drake4baedc12002-04-01 14:53:37 +00004764 PyModule_AddIntConstant(m, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004765#endif
4766#ifdef IP_DROP_MEMBERSHIP
Fred Drake4baedc12002-04-01 14:53:37 +00004767 PyModule_AddIntConstant(m, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004768#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00004769#ifdef IP_DEFAULT_MULTICAST_TTL
Fred Drake4baedc12002-04-01 14:53:37 +00004770 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_TTL",
4771 IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00004772#endif
4773#ifdef IP_DEFAULT_MULTICAST_LOOP
Fred Drake4baedc12002-04-01 14:53:37 +00004774 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_LOOP",
4775 IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00004776#endif
4777#ifdef IP_MAX_MEMBERSHIPS
Fred Drake4baedc12002-04-01 14:53:37 +00004778 PyModule_AddIntConstant(m, "IP_MAX_MEMBERSHIPS", IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00004779#endif
4780
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004781 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
4782#ifdef IPV6_JOIN_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00004783 PyModule_AddIntConstant(m, "IPV6_JOIN_GROUP", IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004784#endif
4785#ifdef IPV6_LEAVE_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00004786 PyModule_AddIntConstant(m, "IPV6_LEAVE_GROUP", IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004787#endif
4788#ifdef IPV6_MULTICAST_HOPS
Fred Drake4baedc12002-04-01 14:53:37 +00004789 PyModule_AddIntConstant(m, "IPV6_MULTICAST_HOPS", IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004790#endif
4791#ifdef IPV6_MULTICAST_IF
Fred Drake4baedc12002-04-01 14:53:37 +00004792 PyModule_AddIntConstant(m, "IPV6_MULTICAST_IF", IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004793#endif
4794#ifdef IPV6_MULTICAST_LOOP
Fred Drake4baedc12002-04-01 14:53:37 +00004795 PyModule_AddIntConstant(m, "IPV6_MULTICAST_LOOP", IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004796#endif
4797#ifdef IPV6_UNICAST_HOPS
Fred Drake4baedc12002-04-01 14:53:37 +00004798 PyModule_AddIntConstant(m, "IPV6_UNICAST_HOPS", IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004799#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00004800 /* Additional IPV6 socket options, defined in RFC 3493 */
4801#ifdef IPV6_V6ONLY
4802 PyModule_AddIntConstant(m, "IPV6_V6ONLY", IPV6_V6ONLY);
4803#endif
4804 /* Advanced IPV6 socket options, from RFC 3542 */
4805#ifdef IPV6_CHECKSUM
4806 PyModule_AddIntConstant(m, "IPV6_CHECKSUM", IPV6_CHECKSUM);
4807#endif
4808#ifdef IPV6_DONTFRAG
4809 PyModule_AddIntConstant(m, "IPV6_DONTFRAG", IPV6_DONTFRAG);
4810#endif
4811#ifdef IPV6_DSTOPTS
4812 PyModule_AddIntConstant(m, "IPV6_DSTOPTS", IPV6_DSTOPTS);
4813#endif
4814#ifdef IPV6_HOPLIMIT
4815 PyModule_AddIntConstant(m, "IPV6_HOPLIMIT", IPV6_HOPLIMIT);
4816#endif
4817#ifdef IPV6_HOPOPTS
4818 PyModule_AddIntConstant(m, "IPV6_HOPOPTS", IPV6_HOPOPTS);
4819#endif
4820#ifdef IPV6_NEXTHOP
4821 PyModule_AddIntConstant(m, "IPV6_NEXTHOP", IPV6_NEXTHOP);
4822#endif
4823#ifdef IPV6_PATHMTU
4824 PyModule_AddIntConstant(m, "IPV6_PATHMTU", IPV6_PATHMTU);
4825#endif
4826#ifdef IPV6_PKTINFO
4827 PyModule_AddIntConstant(m, "IPV6_PKTINFO", IPV6_PKTINFO);
4828#endif
4829#ifdef IPV6_RECVDSTOPTS
4830 PyModule_AddIntConstant(m, "IPV6_RECVDSTOPTS", IPV6_RECVDSTOPTS);
4831#endif
4832#ifdef IPV6_RECVHOPLIMIT
4833 PyModule_AddIntConstant(m, "IPV6_RECVHOPLIMIT", IPV6_RECVHOPLIMIT);
4834#endif
4835#ifdef IPV6_RECVHOPOPTS
4836 PyModule_AddIntConstant(m, "IPV6_RECVHOPOPTS", IPV6_RECVHOPOPTS);
4837#endif
4838#ifdef IPV6_RECVPKTINFO
4839 PyModule_AddIntConstant(m, "IPV6_RECVPKTINFO", IPV6_RECVPKTINFO);
4840#endif
4841#ifdef IPV6_RECVRTHDR
4842 PyModule_AddIntConstant(m, "IPV6_RECVRTHDR", IPV6_RECVRTHDR);
4843#endif
4844#ifdef IPV6_RECVTCLASS
4845 PyModule_AddIntConstant(m, "IPV6_RECVTCLASS", IPV6_RECVTCLASS);
4846#endif
4847#ifdef IPV6_RTHDR
4848 PyModule_AddIntConstant(m, "IPV6_RTHDR", IPV6_RTHDR);
4849#endif
4850#ifdef IPV6_RTHDRDSTOPTS
4851 PyModule_AddIntConstant(m, "IPV6_RTHDRDSTOPTS", IPV6_RTHDRDSTOPTS);
4852#endif
4853#ifdef IPV6_RTHDR_TYPE_0
4854 PyModule_AddIntConstant(m, "IPV6_RTHDR_TYPE_0", IPV6_RTHDR_TYPE_0);
4855#endif
4856#ifdef IPV6_RECVPATHMTU
4857 PyModule_AddIntConstant(m, "IPV6_RECVPATHMTU", IPV6_RECVPATHMTU);
4858#endif
4859#ifdef IPV6_TCLASS
4860 PyModule_AddIntConstant(m, "IPV6_TCLASS", IPV6_TCLASS);
4861#endif
4862#ifdef IPV6_USE_MIN_MTU
4863 PyModule_AddIntConstant(m, "IPV6_USE_MIN_MTU", IPV6_USE_MIN_MTU);
4864#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004865
Guido van Rossum09be4091999-08-09 14:40:40 +00004866 /* TCP options */
4867#ifdef TCP_NODELAY
Fred Drake4baedc12002-04-01 14:53:37 +00004868 PyModule_AddIntConstant(m, "TCP_NODELAY", TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00004869#endif
4870#ifdef TCP_MAXSEG
Fred Drake4baedc12002-04-01 14:53:37 +00004871 PyModule_AddIntConstant(m, "TCP_MAXSEG", TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00004872#endif
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004873#ifdef TCP_CORK
Fred Drake4baedc12002-04-01 14:53:37 +00004874 PyModule_AddIntConstant(m, "TCP_CORK", TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004875#endif
4876#ifdef TCP_KEEPIDLE
Fred Drake4baedc12002-04-01 14:53:37 +00004877 PyModule_AddIntConstant(m, "TCP_KEEPIDLE", TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004878#endif
4879#ifdef TCP_KEEPINTVL
Fred Drake4baedc12002-04-01 14:53:37 +00004880 PyModule_AddIntConstant(m, "TCP_KEEPINTVL", TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004881#endif
4882#ifdef TCP_KEEPCNT
Fred Drake4baedc12002-04-01 14:53:37 +00004883 PyModule_AddIntConstant(m, "TCP_KEEPCNT", TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004884#endif
4885#ifdef TCP_SYNCNT
Fred Drake4baedc12002-04-01 14:53:37 +00004886 PyModule_AddIntConstant(m, "TCP_SYNCNT", TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004887#endif
4888#ifdef TCP_LINGER2
Fred Drake4baedc12002-04-01 14:53:37 +00004889 PyModule_AddIntConstant(m, "TCP_LINGER2", TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004890#endif
4891#ifdef TCP_DEFER_ACCEPT
Fred Drake4baedc12002-04-01 14:53:37 +00004892 PyModule_AddIntConstant(m, "TCP_DEFER_ACCEPT", TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004893#endif
4894#ifdef TCP_WINDOW_CLAMP
Fred Drake4baedc12002-04-01 14:53:37 +00004895 PyModule_AddIntConstant(m, "TCP_WINDOW_CLAMP", TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004896#endif
4897#ifdef TCP_INFO
Fred Drake4baedc12002-04-01 14:53:37 +00004898 PyModule_AddIntConstant(m, "TCP_INFO", TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004899#endif
4900#ifdef TCP_QUICKACK
Fred Drake4baedc12002-04-01 14:53:37 +00004901 PyModule_AddIntConstant(m, "TCP_QUICKACK", TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004902#endif
4903
Guido van Rossum09be4091999-08-09 14:40:40 +00004904
4905 /* IPX options */
4906#ifdef IPX_TYPE
Fred Drake4baedc12002-04-01 14:53:37 +00004907 PyModule_AddIntConstant(m, "IPX_TYPE", IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00004908#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004909
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004910 /* get{addr,name}info parameters */
4911#ifdef EAI_ADDRFAMILY
Fred Drake4baedc12002-04-01 14:53:37 +00004912 PyModule_AddIntConstant(m, "EAI_ADDRFAMILY", EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004913#endif
4914#ifdef EAI_AGAIN
Fred Drake4baedc12002-04-01 14:53:37 +00004915 PyModule_AddIntConstant(m, "EAI_AGAIN", EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004916#endif
4917#ifdef EAI_BADFLAGS
Fred Drake4baedc12002-04-01 14:53:37 +00004918 PyModule_AddIntConstant(m, "EAI_BADFLAGS", EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004919#endif
4920#ifdef EAI_FAIL
Fred Drake4baedc12002-04-01 14:53:37 +00004921 PyModule_AddIntConstant(m, "EAI_FAIL", EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004922#endif
4923#ifdef EAI_FAMILY
Fred Drake4baedc12002-04-01 14:53:37 +00004924 PyModule_AddIntConstant(m, "EAI_FAMILY", EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004925#endif
4926#ifdef EAI_MEMORY
Fred Drake4baedc12002-04-01 14:53:37 +00004927 PyModule_AddIntConstant(m, "EAI_MEMORY", EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004928#endif
4929#ifdef EAI_NODATA
Fred Drake4baedc12002-04-01 14:53:37 +00004930 PyModule_AddIntConstant(m, "EAI_NODATA", EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004931#endif
4932#ifdef EAI_NONAME
Fred Drake4baedc12002-04-01 14:53:37 +00004933 PyModule_AddIntConstant(m, "EAI_NONAME", EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004934#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00004935#ifdef EAI_OVERFLOW
4936 PyModule_AddIntConstant(m, "EAI_OVERFLOW", EAI_OVERFLOW);
4937#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004938#ifdef EAI_SERVICE
Fred Drake4baedc12002-04-01 14:53:37 +00004939 PyModule_AddIntConstant(m, "EAI_SERVICE", EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004940#endif
4941#ifdef EAI_SOCKTYPE
Fred Drake4baedc12002-04-01 14:53:37 +00004942 PyModule_AddIntConstant(m, "EAI_SOCKTYPE", EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004943#endif
4944#ifdef EAI_SYSTEM
Fred Drake4baedc12002-04-01 14:53:37 +00004945 PyModule_AddIntConstant(m, "EAI_SYSTEM", EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004946#endif
4947#ifdef EAI_BADHINTS
Fred Drake4baedc12002-04-01 14:53:37 +00004948 PyModule_AddIntConstant(m, "EAI_BADHINTS", EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004949#endif
4950#ifdef EAI_PROTOCOL
Fred Drake4baedc12002-04-01 14:53:37 +00004951 PyModule_AddIntConstant(m, "EAI_PROTOCOL", EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004952#endif
4953#ifdef EAI_MAX
Fred Drake4baedc12002-04-01 14:53:37 +00004954 PyModule_AddIntConstant(m, "EAI_MAX", EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004955#endif
4956#ifdef AI_PASSIVE
Fred Drake4baedc12002-04-01 14:53:37 +00004957 PyModule_AddIntConstant(m, "AI_PASSIVE", AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004958#endif
4959#ifdef AI_CANONNAME
Fred Drake4baedc12002-04-01 14:53:37 +00004960 PyModule_AddIntConstant(m, "AI_CANONNAME", AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004961#endif
4962#ifdef AI_NUMERICHOST
Fred Drake4baedc12002-04-01 14:53:37 +00004963 PyModule_AddIntConstant(m, "AI_NUMERICHOST", AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004964#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00004965#ifdef AI_NUMERICSERV
4966 PyModule_AddIntConstant(m, "AI_NUMERICSERV", AI_NUMERICSERV);
4967#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004968#ifdef AI_MASK
Fred Drake4baedc12002-04-01 14:53:37 +00004969 PyModule_AddIntConstant(m, "AI_MASK", AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004970#endif
4971#ifdef AI_ALL
Fred Drake4baedc12002-04-01 14:53:37 +00004972 PyModule_AddIntConstant(m, "AI_ALL", AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004973#endif
4974#ifdef AI_V4MAPPED_CFG
Fred Drake4baedc12002-04-01 14:53:37 +00004975 PyModule_AddIntConstant(m, "AI_V4MAPPED_CFG", AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004976#endif
4977#ifdef AI_ADDRCONFIG
Fred Drake4baedc12002-04-01 14:53:37 +00004978 PyModule_AddIntConstant(m, "AI_ADDRCONFIG", AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004979#endif
4980#ifdef AI_V4MAPPED
Fred Drake4baedc12002-04-01 14:53:37 +00004981 PyModule_AddIntConstant(m, "AI_V4MAPPED", AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004982#endif
4983#ifdef AI_DEFAULT
Fred Drake4baedc12002-04-01 14:53:37 +00004984 PyModule_AddIntConstant(m, "AI_DEFAULT", AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004985#endif
4986#ifdef NI_MAXHOST
Fred Drake4baedc12002-04-01 14:53:37 +00004987 PyModule_AddIntConstant(m, "NI_MAXHOST", NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004988#endif
4989#ifdef NI_MAXSERV
Fred Drake4baedc12002-04-01 14:53:37 +00004990 PyModule_AddIntConstant(m, "NI_MAXSERV", NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004991#endif
4992#ifdef NI_NOFQDN
Fred Drake4baedc12002-04-01 14:53:37 +00004993 PyModule_AddIntConstant(m, "NI_NOFQDN", NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004994#endif
4995#ifdef NI_NUMERICHOST
Fred Drake4baedc12002-04-01 14:53:37 +00004996 PyModule_AddIntConstant(m, "NI_NUMERICHOST", NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004997#endif
4998#ifdef NI_NAMEREQD
Fred Drake4baedc12002-04-01 14:53:37 +00004999 PyModule_AddIntConstant(m, "NI_NAMEREQD", NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005000#endif
5001#ifdef NI_NUMERICSERV
Fred Drake4baedc12002-04-01 14:53:37 +00005002 PyModule_AddIntConstant(m, "NI_NUMERICSERV", NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005003#endif
5004#ifdef NI_DGRAM
Fred Drake4baedc12002-04-01 14:53:37 +00005005 PyModule_AddIntConstant(m, "NI_DGRAM", NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005006#endif
5007
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005008 /* shutdown() parameters */
5009#ifdef SHUT_RD
5010 PyModule_AddIntConstant(m, "SHUT_RD", SHUT_RD);
5011#elif defined(SD_RECEIVE)
5012 PyModule_AddIntConstant(m, "SHUT_RD", SD_RECEIVE);
5013#else
5014 PyModule_AddIntConstant(m, "SHUT_RD", 0);
5015#endif
5016#ifdef SHUT_WR
5017 PyModule_AddIntConstant(m, "SHUT_WR", SHUT_WR);
5018#elif defined(SD_SEND)
5019 PyModule_AddIntConstant(m, "SHUT_WR", SD_SEND);
5020#else
5021 PyModule_AddIntConstant(m, "SHUT_WR", 1);
5022#endif
5023#ifdef SHUT_RDWR
5024 PyModule_AddIntConstant(m, "SHUT_RDWR", SHUT_RDWR);
5025#elif defined(SD_BOTH)
5026 PyModule_AddIntConstant(m, "SHUT_RDWR", SD_BOTH);
5027#else
5028 PyModule_AddIntConstant(m, "SHUT_RDWR", 2);
5029#endif
5030
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005031 /* Initialize gethostbyname lock */
Just van Rossum1040d2c2003-05-09 07:53:18 +00005032#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
5033 netdb_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005034#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005035}
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005036
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005037
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005038#ifndef HAVE_INET_PTON
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005039
5040/* Simplistic emulation code for inet_pton that only works for IPv4 */
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005041/* These are not exposed because they do not set errno properly */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005042
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005043int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005044inet_pton(int af, const char *src, void *dst)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005045{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005046 if (af == AF_INET) {
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005047 long packed_addr;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005048 packed_addr = inet_addr(src);
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005049 if (packed_addr == INADDR_NONE)
5050 return 0;
5051 memcpy(dst, &packed_addr, 4);
5052 return 1;
5053 }
5054 /* Should set errno to EAFNOSUPPORT */
5055 return -1;
5056}
5057
Martin v. Löwisc925b1532001-07-21 09:42:15 +00005058const char *
5059inet_ntop(int af, const void *src, char *dst, socklen_t size)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005060{
5061 if (af == AF_INET) {
5062 struct in_addr packed_addr;
5063 if (size < 16)
5064 /* Should set errno to ENOSPC. */
5065 return NULL;
5066 memcpy(&packed_addr, src, sizeof(packed_addr));
5067 return strncpy(dst, inet_ntoa(packed_addr), size);
5068 }
5069 /* Should set errno to EAFNOSUPPORT */
5070 return NULL;
5071}
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005072
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005073#endif