blob: 3c17e9ce48b38694e4c21177babf90c91925f7b6 [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
Jeremy Hylton22308652001-02-02 03:23:09 +000010 portable manner, though AF_PACKET is supported under Linux.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000011- No read/write operations (use sendall/recv or makefile instead).
12- Additional restrictions apply on some non-Unix platforms (compensated
13 for by socket.py).
Guido van Rossum6574b3e1991-06-25 21:36:08 +000014
Guido van Rossum27e177d1995-03-16 15:43:47 +000015Module interface:
Guido van Rossum6574b3e1991-06-25 21:36:08 +000016
Guido van Rossum27e177d1995-03-16 15:43:47 +000017- socket.error: exception raised for socket specific errors
Martin v. Löwis2d8d4272001-07-21 18:05:31 +000018- socket.gaierror: exception raised for getaddrinfo/getnameinfo errors,
19 a subclass of socket.error
20- socket.herror: exception raised for gethostby* errors,
21 a subclass of socket.error
Guido van Rossum83a072d2002-09-03 19:10:18 +000022- socket.fromfd(fd, family, type[, proto]) --> new socket object (created
23 from an existing file descriptor)
Guido van Rossum30a685f1991-06-27 15:51:29 +000024- socket.gethostbyname(hostname) --> host IP address (string: 'dd.dd.dd.dd')
Guido van Rossum3bbc62e1995-01-02 19:30:30 +000025- socket.gethostbyaddr(IP address) --> (hostname, [alias, ...], [IP addr, ...])
Guido van Rossum27e177d1995-03-16 15:43:47 +000026- socket.gethostname() --> host name (string: 'spam' or 'spam.domain.com')
Guido van Rossum25405c71996-12-19 16:42:52 +000027- socket.getprotobyname(protocolname) --> protocol number
Barry Warsaw11b91a02004-06-28 00:50:43 +000028- socket.getservbyname(servicename[, protocolname]) --> port number
29- socket.getservbyport(portnumber[, protocolname]) --> service name
Guido van Rossum83a072d2002-09-03 19:10:18 +000030- socket.socket([family[, type [, proto]]]) --> new socket object
Dave Cole331708b2004-08-09 04:51:41 +000031- socket.socketpair([family[, type [, proto]]]) --> (socket, socket)
Guido van Rossum006bf911996-06-12 04:04:55 +000032- socket.ntohs(16 bit value) --> new int object
33- socket.ntohl(32 bit value) --> new int object
34- socket.htons(16 bit value) --> new int object
35- socket.htonl(32 bit value) --> new int object
Martin v. Löwis2d8d4272001-07-21 18:05:31 +000036- socket.getaddrinfo(host, port [, family, socktype, proto, flags])
37 --> List of (family, socktype, proto, canonname, sockaddr)
38- socket.getnameinfo(sockaddr, flags) --> (host, port)
Guido van Rossum27e177d1995-03-16 15:43:47 +000039- socket.AF_INET, socket.SOCK_STREAM, etc.: constants from <socket.h>
Guido van Rossum47dfa4a2003-04-25 05:48:32 +000040- socket.has_ipv6: boolean value indicating if IPv6 is supported
Guido van Rossum5c9eb211999-08-20 18:21:51 +000041- socket.inet_aton(IP address) -> 32-bit packed IP representation
42- socket.inet_ntoa(packed IP) -> IP address string
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +000043- socket.getdefaulttimeout() -> None | float
44- socket.setdefaulttimeout(None | float)
Guido van Rossum6574b3e1991-06-25 21:36:08 +000045- an Internet socket address is a pair (hostname, port)
46 where hostname can be anything recognized by gethostbyname()
47 (including the dd.dd.dd.dd notation) and port is in host byte order
48- where a hostname is returned, the dd.dd.dd.dd notation is used
Guido van Rossum27e177d1995-03-16 15:43:47 +000049- a UNIX domain socket address is a string specifying the pathname
Jeremy Hylton22308652001-02-02 03:23:09 +000050- an AF_PACKET socket address is a tuple containing a string
51 specifying the ethernet interface and an integer specifying
52 the Ethernet protocol number to be received. For example:
Jeremy Hyltondbfb6622001-02-02 19:55:17 +000053 ("eth0",0x1234). Optional 3rd,4th,5th elements in the tuple
Andrew M. Kuchlingb8e17172004-07-10 23:39:35 +000054 specify packet-type and ha-type/addr.
Guido van Rossum6574b3e1991-06-25 21:36:08 +000055
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000056Local naming conventions:
Guido van Rossum6574b3e1991-06-25 21:36:08 +000057
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000058- names starting with sock_ are socket object methods
59- names starting with socket_ are module-level functions
60- names starting with PySocket are exported through socketmodule.h
Guido van Rossum30a685f1991-06-27 15:51:29 +000061
Guido van Rossum6574b3e1991-06-25 21:36:08 +000062*/
63
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000064#include "Python.h"
65
Guido van Rossum47dfa4a2003-04-25 05:48:32 +000066#undef MAX
67#define MAX(x, y) ((x) < (y) ? (y) : (x))
68
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000069/* Socket object documentation */
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000070PyDoc_STRVAR(sock_doc,
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000071"socket([family[, type[, proto]]]) -> socket object\n\
72\n\
73Open a socket of the given type. The family argument specifies the\n\
74address family; it defaults to AF_INET. The type argument specifies\n\
75whether this is a stream (SOCK_STREAM, this is the default)\n\
76or datagram (SOCK_DGRAM) socket. The protocol argument defaults to 0,\n\
77specifying the default protocol. Keyword arguments are accepted.\n\
78\n\
79A socket object represents one endpoint of a network connection.\n\
80\n\
81Methods of socket objects (keyword arguments not allowed):\n\
82\n\
83accept() -- accept a connection, returning new socket and client address\n\
84bind(addr) -- bind the socket to a local address\n\
85close() -- close the socket\n\
86connect(addr) -- connect the socket to a remote address\n\
87connect_ex(addr) -- connect, return an error code instead of an exception\n\
88dup() -- return a new socket object identical to the current one [*]\n\
89fileno() -- return underlying file descriptor\n\
90getpeername() -- return remote address [*]\n\
91getsockname() -- return local address\n\
92getsockopt(level, optname[, buflen]) -- get socket options\n\
93gettimeout() -- return timeout or None\n\
94listen(n) -- start listening for incoming connections\n\
95makefile([mode, [bufsize]]) -- return a file object for the socket [*]\n\
96recv(buflen[, flags]) -- receive data\n\
97recvfrom(buflen[, flags]) -- receive data and sender's address\n\
98sendall(data[, flags]) -- send all data\n\
99send(data[, flags]) -- send data, may not send all of it\n\
100sendto(data[, flags], addr) -- send data to a given address\n\
101setblocking(0 | 1) -- set or clear the blocking I/O flag\n\
102setsockopt(level, optname, value) -- set socket options\n\
103settimeout(None | float) -- set or clear the timeout\n\
104shutdown(how) -- shut down traffic in one or both directions\n\
105\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000106 [*] not available on all platforms!");
Guido van Rossum3baaa131999-03-22 21:44:51 +0000107
Walter Dörwaldf0dfc7a2003-10-20 14:01:56 +0000108/* XXX This is a terrible mess of platform-dependent preprocessor hacks.
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000109 I hope some day someone can clean this up please... */
110
Guido van Rossum9376b741999-09-15 22:01:40 +0000111/* Hacks for gethostbyname_r(). On some non-Linux platforms, the configure
112 script doesn't get this right, so we hardcode some platform checks below.
113 On the other hand, not all Linux versions agree, so there the settings
114 computed by the configure script are needed! */
115
116#ifndef linux
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000117# undef HAVE_GETHOSTBYNAME_R_3_ARG
118# undef HAVE_GETHOSTBYNAME_R_5_ARG
119# undef HAVE_GETHOSTBYNAME_R_6_ARG
Guido van Rossum9376b741999-09-15 22:01:40 +0000120#endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000121
Guido van Rossum7a122991999-04-13 04:07:32 +0000122#ifndef WITH_THREAD
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000123# undef HAVE_GETHOSTBYNAME_R
Guido van Rossum7a122991999-04-13 04:07:32 +0000124#endif
125
Guido van Rossume7de2061999-03-24 17:24:33 +0000126#ifdef HAVE_GETHOSTBYNAME_R
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000127# if defined(_AIX) || defined(__osf__)
128# define HAVE_GETHOSTBYNAME_R_3_ARG
129# elif defined(__sun) || defined(__sgi)
130# define HAVE_GETHOSTBYNAME_R_5_ARG
131# elif defined(linux)
Guido van Rossum9376b741999-09-15 22:01:40 +0000132/* Rely on the configure script */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000133# else
134# undef HAVE_GETHOSTBYNAME_R
135# endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000136#endif
137
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000138#if !defined(HAVE_GETHOSTBYNAME_R) && defined(WITH_THREAD) && \
139 !defined(MS_WINDOWS)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000140# define USE_GETHOSTBYNAME_LOCK
Guido van Rossum3baaa131999-03-22 21:44:51 +0000141#endif
142
Just van Rossum1040d2c2003-05-09 07:53:18 +0000143/* On systems on which getaddrinfo() is believed to not be thread-safe,
Just van Rossum09aecd72003-05-09 08:03:44 +0000144 (this includes the getaddrinfo emulation) protect access with a lock. */
Just van Rossum16e426b2003-05-09 08:12:00 +0000145#if defined(WITH_THREAD) && (defined(__APPLE__) || defined(__FreeBSD__) || \
146 defined(__OpenBSD__) || defined(__NetBSD__) || !defined(HAVE_GETADDRINFO))
Just van Rossum1040d2c2003-05-09 07:53:18 +0000147#define USE_GETADDRINFO_LOCK
148#endif
149
150#ifdef USE_GETADDRINFO_LOCK
151#define ACQUIRE_GETADDRINFO_LOCK PyThread_acquire_lock(netdb_lock, 1);
152#define RELEASE_GETADDRINFO_LOCK PyThread_release_lock(netdb_lock);
153#else
154#define ACQUIRE_GETADDRINFO_LOCK
155#define RELEASE_GETADDRINFO_LOCK
156#endif
157
158#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000159# include "pythread.h"
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000160#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000161
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000162#if defined(PYCC_VACPP)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000163# include <types.h>
164# include <io.h>
165# include <sys/ioctl.h>
166# include <utils.h>
167# include <ctype.h>
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000168#endif
169
Martin v. Löwis9e437302002-12-06 12:57:26 +0000170#if defined(__VMS)
171#if ! defined(_SOCKADDR_LEN)
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000172# ifdef getaddrinfo
173# undef getaddrinfo
174# endif
175# include "TCPIP_IOCTL_ROUTINE"
176#else
177# include <ioctl.h>
178#endif
Martin v. Löwis9e437302002-12-06 12:57:26 +0000179#endif
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000180
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000181#if defined(PYOS_OS2)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000182# define INCL_DOS
183# define INCL_DOSERRORS
184# define INCL_NOPMAPI
185# include <os2.h>
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000186#endif
187
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000188#if defined(__sgi) && _COMPILER_VERSION>700 && !_SGIAPI
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000189/* make sure that the reentrant (gethostbyaddr_r etc)
190 functions are declared correctly if compiling with
191 MIPSPro 7.x in ANSI C mode (default) */
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000192
193/* XXX Using _SGIAPI is the wrong thing,
194 but I don't know what the right thing is. */
Trent Mick8ea5bdf2004-09-13 17:48:41 +0000195#undef _SGIAPI /* to avoid warning */
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000196#define _SGIAPI 1
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000197
Trent Mick8ea5bdf2004-09-13 17:48:41 +0000198#undef _XOPEN_SOURCE
199#include <sys/socket.h>
200#include <sys/types.h>
201#include <netinet/in.h>
202#ifdef _SS_ALIGNSIZE
203#define HAVE_GETADDRINFO 1
204#define HAVE_GETNAMEINFO 1
205#endif
206
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000207#define HAVE_INET_PTON
208#include <netdb.h>
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000209#endif
210
Anthony Baxterbab23cf2003-10-04 08:00:49 +0000211/* Irix 6.5 fails to define this variable at all. This is needed
212 for both GCC and SGI's compiler. I'd say that the SGI headers
213 are just busted. */
214#if defined(__sgi) && !defined(INET_ADDRSTRLEN)
215#define INET_ADDRSTRLEN 16
216#endif
217
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000218/* Generic includes */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000219#include <sys/types.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000220
Marc-André Lemburg976ade62002-02-16 18:47:07 +0000221/* Generic socket object definitions and includes */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000222#define PySocket_BUILDING_SOCKET
Marc-André Lemburgbb8b78b2002-02-16 18:44:52 +0000223#include "socketmodule.h"
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000224
225/* Addressing includes */
226
Guido van Rossum6f489d91996-06-28 20:15:15 +0000227#ifndef MS_WINDOWS
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000228
229/* Non-MS WINDOWS includes */
230# include <netdb.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000231
Guido van Rossum9376b741999-09-15 22:01:40 +0000232/* Headers needed for inet_ntoa() and inet_addr() */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000233# ifdef __BEOS__
234# include <net/netdb.h>
235# elif defined(PYOS_OS2) && defined(PYCC_VACPP)
236# include <netdb.h>
Tim Peters603c6832001-11-05 02:45:59 +0000237typedef size_t socklen_t;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000238# else
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000239# include <arpa/inet.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000240# endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000241
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000242# ifndef RISCOS
243# include <fcntl.h>
244# else
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000245# include <sys/ioctl.h>
246# include <socklib.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000247# define NO_DUP
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000248int h_errno; /* not used */
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000249# define INET_ADDRSTRLEN 16
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000250# endif
251
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000252#else
Guido van Rossum48a680c2001-03-02 06:34:14 +0000253
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000254/* MS_WINDOWS includes */
255# include <fcntl.h>
Guido van Rossum48a680c2001-03-02 06:34:14 +0000256
Jeremy Hylton22308652001-02-02 03:23:09 +0000257#endif
258
Skip Montanaro7befb992004-02-10 16:50:21 +0000259#include <stddef.h>
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000260
261#ifndef offsetof
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000262# define offsetof(type, member) ((size_t)(&((type *)0)->member))
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000263#endif
264
Neal Norwitz39d22e52002-11-02 19:55:21 +0000265#ifndef O_NONBLOCK
266# define O_NONBLOCK O_NDELAY
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000267#endif
268
Trent Micka708d6e2004-09-07 17:48:26 +0000269/* include Python's addrinfo.h unless it causes trouble */
270#if defined(__sgi) && _COMPILER_VERSION>700 && defined(_SS_ALIGNSIZE)
271 /* Do not include addinfo.h on some newer IRIX versions.
272 * _SS_ALIGNSIZE is defined in sys/socket.h by 6.5.21,
273 * for example, but not by 6.5.10.
274 */
275#elif defined(_MSC_VER) && _MSC_VER>1200
276 /* Do not include addrinfo.h for MSVC7 or greater. 'addrinfo' and
277 * EAI_* constants are defined in (the already included) ws2tcpip.h.
278 */
279#else
280# include "addrinfo.h"
281#endif
Jason Tishlerc246cb72004-08-09 13:25:59 +0000282
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000283#ifndef HAVE_INET_PTON
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000284int inet_pton(int af, const char *src, void *dst);
Martin v. Löwisc925b1532001-07-21 09:42:15 +0000285const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000286#endif
287
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000288#ifdef __APPLE__
289/* On OS X, getaddrinfo returns no error indication of lookup
290 failure, so we must use the emulation instead of the libinfo
291 implementation. Unfortunately, performing an autoconf test
292 for this bug would require DNS access for the machine performing
293 the configuration, which is not acceptable. Therefore, we
294 determine the bug just by checking for __APPLE__. If this bug
295 gets ever fixed, perhaps checking for sys/version.h would be
296 appropriate, which is 10/0 on the system with the bug. */
Jack Jansen84262fb2002-07-02 14:40:42 +0000297#ifndef HAVE_GETNAMEINFO
298/* This bug seems to be fixed in Jaguar. Ths easiest way I could
299 Find to check for Jaguar is that it has getnameinfo(), which
300 older releases don't have */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000301#undef HAVE_GETADDRINFO
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000302#endif
Jack Jansen84262fb2002-07-02 14:40:42 +0000303#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000304
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000305/* I know this is a bad practice, but it is the easiest... */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000306#if !defined(HAVE_GETADDRINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000307/* avoid clashes with the C library definition of the symbol. */
308#define getaddrinfo fake_getaddrinfo
309#define gai_strerror fake_gai_strerror
310#define freeaddrinfo fake_freeaddrinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000311#include "getaddrinfo.c"
312#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000313#if !defined(HAVE_GETNAMEINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000314#define getnameinfo fake_getnameinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000315#include "getnameinfo.c"
316#endif
317
Guido van Rossumbcc20741998-08-04 22:53:56 +0000318#if defined(MS_WINDOWS) || defined(__BEOS__)
319/* BeOS suffers from the same socket dichotomy as Win32... - [cjh] */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000320/* seem to be a few differences in the API */
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000321#define SOCKETCLOSE closesocket
Guido van Rossumbe32c891996-06-20 16:25:29 +0000322#define NO_DUP /* Actually it exists on NT 3.5, but what the heck... */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000323#endif
324
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000325#ifdef MS_WIN32
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000326#define EAFNOSUPPORT WSAEAFNOSUPPORT
327#define snprintf _snprintf
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000328#endif
Fred Drakea04eaad2000-06-30 02:46:07 +0000329
Andrew MacIntyreba43e872002-03-03 03:03:52 +0000330#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000331#define SOCKETCLOSE soclose
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000332#define NO_DUP /* Sockets are Not Actual File Handles under OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000333#endif
334
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000335#ifndef SOCKETCLOSE
336#define SOCKETCLOSE close
337#endif
338
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000339#ifdef __VMS
340/* TCP/IP Services for VMS uses a maximum send/revc buffer length of 65535 */
341#define SEGMENT_SIZE 65535
342#endif
343
Hye-Shik Chang81268602004-02-02 06:05:24 +0000344#if defined(HAVE_BLUETOOTH_H) || defined(HAVE_BLUETOOTH_BLUETOOTH_H)
345#define USE_BLUETOOTH 1
346#if defined(__FreeBSD__)
347#define BTPROTO_L2CAP BLUETOOTH_PROTO_L2CAP
348#define BTPROTO_RFCOMM BLUETOOTH_PROTO_RFCOMM
349#define sockaddr_l2 sockaddr_l2cap
350#define sockaddr_rc sockaddr_rfcomm
351#define _BT_SOCKADDR_MEMB(s, proto) &((s)->sock_addr)
352#define _BT_L2_MEMB(sa, memb) ((sa)->l2cap_##memb)
353#define _BT_RC_MEMB(sa, memb) ((sa)->rfcomm_##memb)
354#else
Anthony Baxter5d7c0672004-02-16 05:35:28 +0000355#define _BT_SOCKADDR_MEMB(s, proto) (&((s)->sock_addr).bt_##proto)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000356#define _BT_L2_MEMB(sa, memb) ((sa)->l2_##memb)
357#define _BT_RC_MEMB(sa, memb) ((sa)->rc_##memb)
358#define _BT_SCO_MEMB(sa, memb) ((sa)->sco_##memb)
359#endif
360#endif
361
Martin v. Löwise9416172003-05-03 10:12:45 +0000362/*
363 * Constants for getnameinfo()
364 */
365#if !defined(NI_MAXHOST)
366#define NI_MAXHOST 1025
367#endif
368#if !defined(NI_MAXSERV)
369#define NI_MAXSERV 32
370#endif
371
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000372/* XXX There's a problem here: *static* functions are not supposed to have
373 a Py prefix (or use CapitalizedWords). Later... */
374
Guido van Rossum30a685f1991-06-27 15:51:29 +0000375/* Global variable holding the exception type for errors detected
376 by this module (but not argument type or memory errors, etc.). */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000377static PyObject *socket_error;
378static PyObject *socket_herror;
379static PyObject *socket_gaierror;
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000380static PyObject *socket_timeout;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000381
Guido van Rossum48a680c2001-03-02 06:34:14 +0000382#ifdef RISCOS
383/* Global variable which is !=0 if Python is running in a RISC OS taskwindow */
384static int taskwindow;
385#endif
386
Tim Peters643a7fc2002-02-17 04:13:21 +0000387/* A forward reference to the socket type object.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000388 The sock_type variable contains pointers to various functions,
389 some of which call new_sockobject(), which uses sock_type, so
Tim Peters643a7fc2002-02-17 04:13:21 +0000390 there has to be a circular reference. */
Jeremy Hylton938ace62002-07-17 16:30:39 +0000391static PyTypeObject sock_type;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000392
Guido van Rossum30a685f1991-06-27 15:51:29 +0000393/* Convenience function to raise an error according to errno
394 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000395
Guido van Rossum73624e91994-10-10 17:59:00 +0000396static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000397set_error(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000398{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000399#ifdef MS_WINDOWS
Mark Hammond46a733d2000-07-24 01:45:11 +0000400 int err_no = WSAGetLastError();
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000401 static struct {
402 int no;
403 const char *msg;
404 } *msgp, msgs[] = {
405 {WSAEINTR, "Interrupted system call"},
406 {WSAEBADF, "Bad file descriptor"},
407 {WSAEACCES, "Permission denied"},
408 {WSAEFAULT, "Bad address"},
409 {WSAEINVAL, "Invalid argument"},
410 {WSAEMFILE, "Too many open files"},
411 {WSAEWOULDBLOCK,
412 "The socket operation could not complete "
413 "without blocking"},
414 {WSAEINPROGRESS, "Operation now in progress"},
415 {WSAEALREADY, "Operation already in progress"},
416 {WSAENOTSOCK, "Socket operation on non-socket"},
417 {WSAEDESTADDRREQ, "Destination address required"},
418 {WSAEMSGSIZE, "Message too long"},
419 {WSAEPROTOTYPE, "Protocol wrong type for socket"},
420 {WSAENOPROTOOPT, "Protocol not available"},
421 {WSAEPROTONOSUPPORT, "Protocol not supported"},
422 {WSAESOCKTNOSUPPORT, "Socket type not supported"},
423 {WSAEOPNOTSUPP, "Operation not supported"},
424 {WSAEPFNOSUPPORT, "Protocol family not supported"},
425 {WSAEAFNOSUPPORT, "Address family not supported"},
426 {WSAEADDRINUSE, "Address already in use"},
427 {WSAEADDRNOTAVAIL, "Can't assign requested address"},
428 {WSAENETDOWN, "Network is down"},
429 {WSAENETUNREACH, "Network is unreachable"},
430 {WSAENETRESET, "Network dropped connection on reset"},
431 {WSAECONNABORTED, "Software caused connection abort"},
432 {WSAECONNRESET, "Connection reset by peer"},
433 {WSAENOBUFS, "No buffer space available"},
434 {WSAEISCONN, "Socket is already connected"},
435 {WSAENOTCONN, "Socket is not connected"},
436 {WSAESHUTDOWN, "Can't send after socket shutdown"},
437 {WSAETOOMANYREFS, "Too many references: can't splice"},
438 {WSAETIMEDOUT, "Operation timed out"},
439 {WSAECONNREFUSED, "Connection refused"},
440 {WSAELOOP, "Too many levels of symbolic links"},
441 {WSAENAMETOOLONG, "File name too long"},
442 {WSAEHOSTDOWN, "Host is down"},
443 {WSAEHOSTUNREACH, "No route to host"},
444 {WSAENOTEMPTY, "Directory not empty"},
445 {WSAEPROCLIM, "Too many processes"},
446 {WSAEUSERS, "Too many users"},
447 {WSAEDQUOT, "Disc quota exceeded"},
448 {WSAESTALE, "Stale NFS file handle"},
449 {WSAEREMOTE, "Too many levels of remote in path"},
450 {WSASYSNOTREADY, "Network subsystem is unvailable"},
451 {WSAVERNOTSUPPORTED, "WinSock version is not supported"},
452 {WSANOTINITIALISED,
453 "Successful WSAStartup() not yet performed"},
454 {WSAEDISCON, "Graceful shutdown in progress"},
455 /* Resolver errors */
456 {WSAHOST_NOT_FOUND, "No such host is known"},
457 {WSATRY_AGAIN, "Host not found, or server failed"},
458 {WSANO_RECOVERY, "Unexpected server error encountered"},
459 {WSANO_DATA, "Valid name without requested data"},
460 {WSANO_ADDRESS, "No address, look for MX record"},
461 {0, NULL}
462 };
Mark Hammond46a733d2000-07-24 01:45:11 +0000463 if (err_no) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000464 PyObject *v;
Mark Hammond46a733d2000-07-24 01:45:11 +0000465 const char *msg = "winsock error";
Guido van Rossum48a680c2001-03-02 06:34:14 +0000466
Mark Hammond46a733d2000-07-24 01:45:11 +0000467 for (msgp = msgs; msgp->msg; msgp++) {
468 if (err_no == msgp->no) {
469 msg = msgp->msg;
470 break;
471 }
472 }
473
474 v = Py_BuildValue("(is)", err_no, msg);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000475 if (v != NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000476 PyErr_SetObject(socket_error, v);
Guido van Rossum73624e91994-10-10 17:59:00 +0000477 Py_DECREF(v);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000478 }
479 return NULL;
480 }
481 else
482#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000483
Andrew MacIntyreba43e872002-03-03 03:03:52 +0000484#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000485 if (sock_errno() != NO_ERROR) {
486 APIRET rc;
487 ULONG msglen;
488 char outbuf[100];
489 int myerrorcode = sock_errno();
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000490
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000491 /* Retrieve socket-related error message from MPTN.MSG file */
492 rc = DosGetMessage(NULL, 0, outbuf, sizeof(outbuf),
493 myerrorcode - SOCBASEERR + 26,
494 "mptn.msg",
495 &msglen);
496 if (rc == NO_ERROR) {
497 PyObject *v;
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000498
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000499 /* OS/2 doesn't guarantee a terminator */
500 outbuf[msglen] = '\0';
501 if (strlen(outbuf) > 0) {
502 /* If non-empty msg, trim CRLF */
503 char *lastc = &outbuf[ strlen(outbuf)-1 ];
504 while (lastc > outbuf && isspace(*lastc)) {
505 /* Trim trailing whitespace (CRLF) */
506 *lastc-- = '\0';
507 }
508 }
509 v = Py_BuildValue("(is)", myerrorcode, outbuf);
510 if (v != NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000511 PyErr_SetObject(socket_error, v);
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000512 Py_DECREF(v);
513 }
514 return NULL;
515 }
516 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000517#endif
518
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000519#if defined(RISCOS)
520 if (_inet_error.errnum != NULL) {
521 PyObject *v;
522 v = Py_BuildValue("(is)", errno, _inet_err());
523 if (v != NULL) {
524 PyErr_SetObject(socket_error, v);
525 Py_DECREF(v);
526 }
527 return NULL;
528 }
529#endif
530
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000531 return PyErr_SetFromErrno(socket_error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000532}
533
Guido van Rossum30a685f1991-06-27 15:51:29 +0000534
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000535static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000536set_herror(int h_error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000537{
538 PyObject *v;
539
540#ifdef HAVE_HSTRERROR
541 v = Py_BuildValue("(is)", h_error, (char *)hstrerror(h_error));
542#else
543 v = Py_BuildValue("(is)", h_error, "host not found");
544#endif
545 if (v != NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000546 PyErr_SetObject(socket_herror, v);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000547 Py_DECREF(v);
548 }
549
550 return NULL;
551}
552
553
554static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000555set_gaierror(int error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000556{
557 PyObject *v;
558
Martin v. Löwis272cb402002-03-01 08:31:07 +0000559#ifdef EAI_SYSTEM
560 /* EAI_SYSTEM is not available on Windows XP. */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000561 if (error == EAI_SYSTEM)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000562 return set_error();
Martin v. Löwis272cb402002-03-01 08:31:07 +0000563#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000564
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000565#ifdef HAVE_GAI_STRERROR
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000566 v = Py_BuildValue("(is)", error, gai_strerror(error));
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000567#else
568 v = Py_BuildValue("(is)", error, "getaddrinfo failed");
569#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000570 if (v != NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000571 PyErr_SetObject(socket_gaierror, v);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000572 Py_DECREF(v);
573 }
574
575 return NULL;
576}
577
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000578/* Function to perform the setting of socket blocking mode
579 internally. block = (1 | 0). */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000580static int
581internal_setblocking(PySocketSockObject *s, int block)
582{
583#ifndef RISCOS
584#ifndef MS_WINDOWS
585 int delay_flag;
586#endif
587#endif
588
589 Py_BEGIN_ALLOW_THREADS
590#ifdef __BEOS__
591 block = !block;
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000592 setsockopt(s->sock_fd, SOL_SOCKET, SO_NONBLOCK,
593 (void *)(&block), sizeof(int));
Guido van Rossum67f7a382002-06-06 21:08:16 +0000594#else
595#ifndef RISCOS
596#ifndef MS_WINDOWS
597#if defined(PYOS_OS2) && !defined(PYCC_GCC)
598 block = !block;
599 ioctl(s->sock_fd, FIONBIO, (caddr_t)&block, sizeof(block));
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000600#elif defined(__VMS)
601 block = !block;
602 ioctl(s->sock_fd, FIONBIO, (char *)&block);
603#else /* !PYOS_OS2 && !_VMS */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000604 delay_flag = fcntl(s->sock_fd, F_GETFL, 0);
605 if (block)
Neal Norwitz39d22e52002-11-02 19:55:21 +0000606 delay_flag &= (~O_NONBLOCK);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000607 else
Neal Norwitz39d22e52002-11-02 19:55:21 +0000608 delay_flag |= O_NONBLOCK;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000609 fcntl(s->sock_fd, F_SETFL, delay_flag);
610#endif /* !PYOS_OS2 */
611#else /* MS_WINDOWS */
612 block = !block;
613 ioctlsocket(s->sock_fd, FIONBIO, (u_long*)&block);
614#endif /* MS_WINDOWS */
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000615#else /* RISCOS */
616 block = !block;
617 socketioctl(s->sock_fd, FIONBIO, (u_long*)&block);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000618#endif /* RISCOS */
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000619#endif /* __BEOS__ */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000620 Py_END_ALLOW_THREADS
621
622 /* Since these don't return anything */
623 return 1;
624}
625
Guido van Rossum11ba0942002-06-13 15:07:44 +0000626/* Do a select() on the socket, if necessary (sock_timeout > 0).
627 The argument writing indicates the direction.
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000628 This does not raise an exception; we'll let our caller do that
629 after they've reacquired the interpreter lock.
630 Returns 1 on timeout, 0 otherwise. */
631static int
Guido van Rossumb9e916a2002-06-07 01:42:47 +0000632internal_select(PySocketSockObject *s, int writing)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000633{
634 fd_set fds;
635 struct timeval tv;
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000636 int n;
Guido van Rossum11ba0942002-06-13 15:07:44 +0000637
Guido van Rossumad654902002-07-19 12:44:59 +0000638 /* Nothing to do unless we're in timeout mode (not non-blocking) */
Guido van Rossum11ba0942002-06-13 15:07:44 +0000639 if (s->sock_timeout <= 0.0)
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000640 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000641
Guido van Rossumad654902002-07-19 12:44:59 +0000642 /* Guard against closed socket */
643 if (s->sock_fd < 0)
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000644 return 0;
Guido van Rossumad654902002-07-19 12:44:59 +0000645
Guido van Rossum67f7a382002-06-06 21:08:16 +0000646 /* Construct the arguments to select */
647 tv.tv_sec = (int)s->sock_timeout;
Guido van Rossumb9e916a2002-06-07 01:42:47 +0000648 tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000649 FD_ZERO(&fds);
650 FD_SET(s->sock_fd, &fds);
651
652 /* See if the socket is ready */
Guido van Rossumb9e916a2002-06-07 01:42:47 +0000653 if (writing)
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000654 n = select(s->sock_fd+1, NULL, &fds, NULL, &tv);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000655 else
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000656 n = select(s->sock_fd+1, &fds, NULL, NULL, &tv);
657 if (n == 0)
658 return 1;
659 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000660}
661
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000662/* Initialize a new socket object. */
663
Tim Petersa12b4cf2002-07-18 22:38:44 +0000664static double defaulttimeout = -1.0; /* Default timeout for new sockets */
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000665
Mark Hammond62b1ab12002-07-23 06:31:15 +0000666PyMODINIT_FUNC
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000667init_sockobject(PySocketSockObject *s,
668 SOCKET_T fd, int family, int type, int proto)
669{
670#ifdef RISCOS
671 int block = 1;
672#endif
673 s->sock_fd = fd;
674 s->sock_family = family;
675 s->sock_type = type;
676 s->sock_proto = proto;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000677 s->sock_timeout = defaulttimeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000678
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000679 s->errorhandler = &set_error;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000680
681 if (defaulttimeout >= 0.0)
682 internal_setblocking(s, 0);
683
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000684#ifdef RISCOS
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000685 if (taskwindow)
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000686 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000687#endif
688}
689
690
Guido van Rossum30a685f1991-06-27 15:51:29 +0000691/* Create a new socket object.
692 This just creates the object and initializes it.
693 If the creation fails, return NULL and set an exception (implicit
694 in NEWOBJ()). */
695
Guido van Rossum73624e91994-10-10 17:59:00 +0000696static PySocketSockObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000697new_sockobject(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000698{
Guido van Rossum73624e91994-10-10 17:59:00 +0000699 PySocketSockObject *s;
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000700 s = (PySocketSockObject *)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000701 PyType_GenericNew(&sock_type, NULL, NULL);
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000702 if (s != NULL)
703 init_sockobject(s, fd, family, type, proto);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000704 return s;
705}
706
Guido van Rossum30a685f1991-06-27 15:51:29 +0000707
Guido van Rossum48a680c2001-03-02 06:34:14 +0000708/* Lock to allow python interpreter to continue, but only allow one
Just van Rossum1040d2c2003-05-09 07:53:18 +0000709 thread to be in gethostbyname or getaddrinfo */
710#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
711PyThread_type_lock netdb_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000712#endif
713
714
Guido van Rossum30a685f1991-06-27 15:51:29 +0000715/* Convert a string specifying a host name or one of a few symbolic
716 names to a numeric IP address. This usually calls gethostbyname()
717 to do the work; the names "" and "<broadcast>" are special.
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000718 Return the length (IPv4 should be 4 bytes), or negative if
Guido van Rossum30a685f1991-06-27 15:51:29 +0000719 an error occurred; then an exception is raised. */
720
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000721static int
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000722setipaddr(char *name, struct sockaddr *addr_ret, size_t addr_ret_size, int af)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000723{
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000724 struct addrinfo hints, *res;
725 int error;
Anthony Baxter0e85f9d2003-05-02 15:40:46 +0000726 int d1, d2, d3, d4;
727 char ch;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000728
Guido van Rossuma376cc51996-12-05 23:43:35 +0000729 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
Guido van Rossum30a685f1991-06-27 15:51:29 +0000730 if (name[0] == '\0') {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000731 int siz;
732 memset(&hints, 0, sizeof(hints));
733 hints.ai_family = af;
734 hints.ai_socktype = SOCK_DGRAM; /*dummy*/
735 hints.ai_flags = AI_PASSIVE;
Just van Rossum1040d2c2003-05-09 07:53:18 +0000736 Py_BEGIN_ALLOW_THREADS
737 ACQUIRE_GETADDRINFO_LOCK
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000738 error = getaddrinfo(NULL, "0", &hints, &res);
Just van Rossum1040d2c2003-05-09 07:53:18 +0000739 Py_END_ALLOW_THREADS
740 /* We assume that those thread-unsafe getaddrinfo() versions
741 *are* safe regarding their return value, ie. that a
742 subsequent call to getaddrinfo() does not destroy the
743 outcome of the first call. */
744 RELEASE_GETADDRINFO_LOCK
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000745 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000746 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000747 return -1;
748 }
749 switch (res->ai_family) {
750 case AF_INET:
751 siz = 4;
752 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000753#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000754 case AF_INET6:
755 siz = 16;
756 break;
757#endif
758 default:
759 freeaddrinfo(res);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000760 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000761 "unsupported address family");
762 return -1;
763 }
764 if (res->ai_next) {
Martin v. Löwisf0b11d22001-11-07 08:31:03 +0000765 freeaddrinfo(res);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000766 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000767 "wildcard resolved to multiple address");
768 return -1;
769 }
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000770 if (res->ai_addrlen < addr_ret_size)
771 addr_ret_size = res->ai_addrlen;
772 memcpy(addr_ret, res->ai_addr, addr_ret_size);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000773 freeaddrinfo(res);
774 return siz;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000775 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000776 if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000777 struct sockaddr_in *sin;
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +0000778 if (af != AF_INET && af != AF_UNSPEC) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000779 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000780 "address family mismatched");
781 return -1;
782 }
783 sin = (struct sockaddr_in *)addr_ret;
784 memset((void *) sin, '\0', sizeof(*sin));
785 sin->sin_family = AF_INET;
786#ifdef HAVE_SOCKADDR_SA_LEN
787 sin->sin_len = sizeof(*sin);
788#endif
789 sin->sin_addr.s_addr = INADDR_BROADCAST;
790 return sizeof(sin->sin_addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000791 }
Anthony Baxter0e85f9d2003-05-02 15:40:46 +0000792 if (sscanf(name, "%d.%d.%d.%d%c", &d1, &d2, &d3, &d4, &ch) == 4 &&
793 0 <= d1 && d1 <= 255 && 0 <= d2 && d2 <= 255 &&
794 0 <= d3 && d3 <= 255 && 0 <= d4 && d4 <= 255) {
795 struct sockaddr_in *sin;
796 sin = (struct sockaddr_in *)addr_ret;
797 sin->sin_addr.s_addr = htonl(
798 ((long) d1 << 24) | ((long) d2 << 16) |
799 ((long) d3 << 8) | ((long) d4 << 0));
800 sin->sin_family = AF_INET;
801#ifdef HAVE_SOCKADDR_SA_LEN
802 sin->sin_len = sizeof(*sin);
803#endif
804 return 4;
805 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000806 memset(&hints, 0, sizeof(hints));
807 hints.ai_family = af;
Just van Rossum1040d2c2003-05-09 07:53:18 +0000808 Py_BEGIN_ALLOW_THREADS
809 ACQUIRE_GETADDRINFO_LOCK
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000810 error = getaddrinfo(name, NULL, &hints, &res);
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000811#if defined(__digital__) && defined(__unix__)
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000812 if (error == EAI_NONAME && af == AF_UNSPEC) {
813 /* On Tru64 V5.1, numeric-to-addr conversion fails
814 if no address family is given. Assume IPv4 for now.*/
815 hints.ai_family = AF_INET;
816 error = getaddrinfo(name, NULL, &hints, &res);
817 }
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000818#endif
Just van Rossum1040d2c2003-05-09 07:53:18 +0000819 Py_END_ALLOW_THREADS
820 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000821 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000822 set_gaierror(error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000823 return -1;
824 }
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000825 if (res->ai_addrlen < addr_ret_size)
826 addr_ret_size = res->ai_addrlen;
827 memcpy((char *) addr_ret, res->ai_addr, addr_ret_size);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000828 freeaddrinfo(res);
829 switch (addr_ret->sa_family) {
830 case AF_INET:
831 return 4;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000832#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000833 case AF_INET6:
834 return 16;
Guido van Rossum955becc1999-03-22 20:14:53 +0000835#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000836 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000837 PyErr_SetString(socket_error, "unknown address family");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000838 return -1;
839 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000840}
841
Guido van Rossum30a685f1991-06-27 15:51:29 +0000842
Guido van Rossum30a685f1991-06-27 15:51:29 +0000843/* Create a string object representing an IP address.
844 This is always a string of the form 'dd.dd.dd.dd' (with variable
845 size numbers). */
846
Guido van Rossum73624e91994-10-10 17:59:00 +0000847static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000848makeipaddr(struct sockaddr *addr, int addrlen)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000849{
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000850 char buf[NI_MAXHOST];
851 int error;
852
853 error = getnameinfo(addr, addrlen, buf, sizeof(buf), NULL, 0,
854 NI_NUMERICHOST);
855 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000856 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000857 return NULL;
858 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000859 return PyString_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000860}
861
862
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000863#ifdef USE_BLUETOOTH
864/* Convert a string representation of a Bluetooth address into a numeric
865 address. Returns the length (6), or raises an exception and returns -1 if
866 an error occurred. */
867
868static int
869setbdaddr(char *name, bdaddr_t *bdaddr)
870{
871 unsigned int b0, b1, b2, b3, b4, b5;
872 char ch;
873 int n;
874
875 n = sscanf(name, "%X:%X:%X:%X:%X:%X%c",
876 &b5, &b4, &b3, &b2, &b1, &b0, &ch);
877 if (n == 6 && (b0 | b1 | b2 | b3 | b4 | b5) < 256) {
878 bdaddr->b[0] = b0;
879 bdaddr->b[1] = b1;
880 bdaddr->b[2] = b2;
881 bdaddr->b[3] = b3;
882 bdaddr->b[4] = b4;
883 bdaddr->b[5] = b5;
884 return 6;
885 } else {
886 PyErr_SetString(socket_error, "bad bluetooth address");
887 return -1;
888 }
889}
890
891/* Create a string representation of the Bluetooth address. This is always a
892 string of the form 'XX:XX:XX:XX:XX:XX' where XX is a two digit hexadecimal
893 value (zero padded if necessary). */
894
895static PyObject *
896makebdaddr(bdaddr_t *bdaddr)
897{
898 char buf[(6 * 2) + 5 + 1];
899
900 sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X",
901 bdaddr->b[5], bdaddr->b[4], bdaddr->b[3],
902 bdaddr->b[2], bdaddr->b[1], bdaddr->b[0]);
903 return PyString_FromString(buf);
904}
905#endif
906
907
Guido van Rossum30a685f1991-06-27 15:51:29 +0000908/* Create an object representing the given socket address,
909 suitable for passing it back to bind(), connect() etc.
910 The family field of the sockaddr structure is inspected
911 to determine what kind of address it really is. */
912
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000913/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000914static PyObject *
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000915makesockaddr(int sockfd, struct sockaddr *addr, int addrlen, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000916{
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000917 if (addrlen == 0) {
918 /* No address -- may be recvfrom() from known socket */
Guido van Rossum73624e91994-10-10 17:59:00 +0000919 Py_INCREF(Py_None);
920 return Py_None;
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000921 }
922
Guido van Rossumbcc20741998-08-04 22:53:56 +0000923#ifdef __BEOS__
Guido van Rossum2c8bcb82000-04-25 21:34:53 +0000924 /* XXX: BeOS version of accept() doesn't set family correctly */
Guido van Rossumbcc20741998-08-04 22:53:56 +0000925 addr->sa_family = AF_INET;
926#endif
927
Guido van Rossum30a685f1991-06-27 15:51:29 +0000928 switch (addr->sa_family) {
929
930 case AF_INET:
931 {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000932 struct sockaddr_in *a;
933 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
Barry Warsaw752300b1997-01-03 17:18:10 +0000934 PyObject *ret = NULL;
935 if (addrobj) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000936 a = (struct sockaddr_in *)addr;
Barry Warsaw752300b1997-01-03 17:18:10 +0000937 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
938 Py_DECREF(addrobj);
939 }
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000940 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000941 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000942
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +0000943#if defined(AF_UNIX)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000944 case AF_UNIX:
945 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000946 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000947 return PyString_FromString(a->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000948 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000949#endif /* AF_UNIX */
950
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000951#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000952 case AF_INET6:
953 {
954 struct sockaddr_in6 *a;
955 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
956 PyObject *ret = NULL;
957 if (addrobj) {
958 a = (struct sockaddr_in6 *)addr;
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000959 ret = Py_BuildValue("Oiii",
960 addrobj,
961 ntohs(a->sin6_port),
962 a->sin6_flowinfo,
963 a->sin6_scope_id);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000964 Py_DECREF(addrobj);
965 }
966 return ret;
967 }
Jeremy Hylton22308652001-02-02 03:23:09 +0000968#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +0000969
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000970#ifdef USE_BLUETOOTH
971 case AF_BLUETOOTH:
972 switch (proto) {
973
974 case BTPROTO_L2CAP:
975 {
976 struct sockaddr_l2 *a = (struct sockaddr_l2 *) addr;
977 PyObject *addrobj = makebdaddr(&_BT_L2_MEMB(a, bdaddr));
978 PyObject *ret = NULL;
979 if (addrobj) {
980 ret = Py_BuildValue("Oi",
981 addrobj,
982 _BT_L2_MEMB(a, psm));
983 Py_DECREF(addrobj);
984 }
985 return ret;
986 }
987
988 case BTPROTO_RFCOMM:
989 {
990 struct sockaddr_rc *a = (struct sockaddr_rc *) addr;
991 PyObject *addrobj = makebdaddr(&_BT_RC_MEMB(a, bdaddr));
992 PyObject *ret = NULL;
993 if (addrobj) {
994 ret = Py_BuildValue("Oi",
995 addrobj,
996 _BT_RC_MEMB(a, channel));
997 Py_DECREF(addrobj);
998 }
999 return ret;
1000 }
1001
1002#if !defined(__FreeBSD__)
1003 case BTPROTO_SCO:
1004 {
1005 struct sockaddr_sco *a = (struct sockaddr_sco *) addr;
1006 return makebdaddr(&_BT_SCO_MEMB(a, bdaddr));
1007 }
1008#endif
1009
1010 }
1011#endif
1012
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00001013#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +00001014 case AF_PACKET:
1015 {
1016 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
1017 char *ifname = "";
1018 struct ifreq ifr;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001019 /* need to look up interface name give index */
1020 if (a->sll_ifindex) {
Jeremy Hylton22308652001-02-02 03:23:09 +00001021 ifr.ifr_ifindex = a->sll_ifindex;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001022 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
Jeremy Hylton22308652001-02-02 03:23:09 +00001023 ifname = ifr.ifr_name;
Jeremy Hylton22308652001-02-02 03:23:09 +00001024 }
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001025 return Py_BuildValue("shbhs#",
1026 ifname,
1027 ntohs(a->sll_protocol),
1028 a->sll_pkttype,
1029 a->sll_hatype,
1030 a->sll_addr,
1031 a->sll_halen);
Jeremy Hylton22308652001-02-02 03:23:09 +00001032 }
1033#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001034
Guido van Rossum30a685f1991-06-27 15:51:29 +00001035 /* More cases here... */
1036
1037 default:
Guido van Rossumaa948df1997-05-07 17:41:48 +00001038 /* If we don't know the address family, don't raise an
1039 exception -- return it as a tuple. */
1040 return Py_BuildValue("is#",
1041 addr->sa_family,
1042 addr->sa_data,
1043 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001044
Guido van Rossum30a685f1991-06-27 15:51:29 +00001045 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001046}
1047
Guido van Rossum30a685f1991-06-27 15:51:29 +00001048
1049/* Parse a socket address argument according to the socket object's
1050 address family. Return 1 if the address was in the proper format,
1051 0 of not. The address is returned through addr_ret, its length
1052 through len_ret. */
1053
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001054static int
Guido van Rossum48a680c2001-03-02 06:34:14 +00001055getsockaddrarg(PySocketSockObject *s, PyObject *args,
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001056 struct sockaddr **addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001057{
Guido van Rossum30a685f1991-06-27 15:51:29 +00001058 switch (s->sock_family) {
1059
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001060#if defined(AF_UNIX)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001061 case AF_UNIX:
1062 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001063 struct sockaddr_un* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001064 char *path;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001065 int len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001066 addr = (struct sockaddr_un*)&(s->sock_addr).un;
Guido van Rossum7e488981998-10-08 02:25:24 +00001067 if (!PyArg_Parse(args, "t#", &path, &len))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001068 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001069 if (len > sizeof addr->sun_path) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001070 PyErr_SetString(socket_error,
Barry Warsaw752300b1997-01-03 17:18:10 +00001071 "AF_UNIX path too long");
Guido van Rossum30a685f1991-06-27 15:51:29 +00001072 return 0;
1073 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001074 addr->sun_family = s->sock_family;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001075 memcpy(addr->sun_path, path, len);
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001076 addr->sun_path[len] = 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001077 *addr_ret = (struct sockaddr *) addr;
Andrew MacIntyredaedf212004-04-11 12:03:57 +00001078#if defined(PYOS_OS2)
1079 *len_ret = sizeof(*addr);
1080#else
Guido van Rossum65af28a1996-06-11 18:36:33 +00001081 *len_ret = len + sizeof(*addr) - sizeof(addr->sun_path);
Andrew MacIntyredaedf212004-04-11 12:03:57 +00001082#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001083 return 1;
1084 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001085#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001086
Guido van Rossum30a685f1991-06-27 15:51:29 +00001087 case AF_INET:
1088 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001089 struct sockaddr_in* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001090 char *host;
Martin v. Löwis5db099a2003-08-07 11:55:15 +00001091 int port, result;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001092 addr=(struct sockaddr_in*)&(s->sock_addr).in;
Guido van Rossume4dad902000-12-01 13:13:11 +00001093 if (!PyTuple_Check(args)) {
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001094 PyErr_Format(
1095 PyExc_TypeError,
1096 "getsockaddrarg: "
1097 "AF_INET address must be tuple, not %.500s",
1098 args->ob_type->tp_name);
Guido van Rossume4dad902000-12-01 13:13:11 +00001099 return 0;
1100 }
Martin v. Löwis2548c732003-04-18 10:39:54 +00001101 if (!PyArg_ParseTuple(args, "eti:getsockaddrarg",
1102 "idna", &host, &port))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001103 return 0;
Martin v. Löwis5db099a2003-08-07 11:55:15 +00001104 result = setipaddr(host, (struct sockaddr *)addr,
1105 sizeof(*addr), AF_INET);
1106 PyMem_Free(host);
1107 if (result < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001108 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001109 addr->sin_family = AF_INET;
Guido van Rossum644a12b1997-04-09 19:24:53 +00001110 addr->sin_port = htons((short)port);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001111 *addr_ret = (struct sockaddr *) addr;
1112 *len_ret = sizeof *addr;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001113 return 1;
1114 }
1115
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001116#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001117 case AF_INET6:
1118 {
1119 struct sockaddr_in6* addr;
1120 char *host;
Martin v. Löwis5db099a2003-08-07 11:55:15 +00001121 int port, flowinfo, scope_id, result;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001122 addr = (struct sockaddr_in6*)&(s->sock_addr).in6;
1123 flowinfo = scope_id = 0;
Martin v. Löwis2548c732003-04-18 10:39:54 +00001124 if (!PyArg_ParseTuple(args, "eti|ii",
1125 "idna", &host, &port, &flowinfo,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001126 &scope_id)) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001127 return 0;
1128 }
Martin v. Löwis5db099a2003-08-07 11:55:15 +00001129 result = setipaddr(host, (struct sockaddr *)addr,
1130 sizeof(*addr), AF_INET6);
1131 PyMem_Free(host);
1132 if (result < 0)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001133 return 0;
1134 addr->sin6_family = s->sock_family;
1135 addr->sin6_port = htons((short)port);
1136 addr->sin6_flowinfo = flowinfo;
1137 addr->sin6_scope_id = scope_id;
1138 *addr_ret = (struct sockaddr *) addr;
1139 *len_ret = sizeof *addr;
1140 return 1;
1141 }
1142#endif
1143
Hye-Shik Chang81268602004-02-02 06:05:24 +00001144#ifdef USE_BLUETOOTH
Martin v. Löwis12af0482004-01-31 12:34:17 +00001145 case AF_BLUETOOTH:
1146 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001147 switch (s->sock_proto) {
1148 case BTPROTO_L2CAP:
Martin v. Löwis12af0482004-01-31 12:34:17 +00001149 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001150 struct sockaddr_l2 *addr = (struct sockaddr_l2 *) _BT_SOCKADDR_MEMB(s, l2);
1151 char *straddr;
Martin v. Löwis12af0482004-01-31 12:34:17 +00001152
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001153 _BT_L2_MEMB(addr, family) = AF_BLUETOOTH;
1154 if (!PyArg_ParseTuple(args, "si", &straddr,
1155 &_BT_L2_MEMB(addr, psm))) {
1156 PyErr_SetString(socket_error, "getsockaddrarg: "
1157 "wrong format");
Martin v. Löwis12af0482004-01-31 12:34:17 +00001158 return 0;
1159 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001160 if (setbdaddr(straddr, &_BT_L2_MEMB(addr, bdaddr)) < 0)
1161 return 0;
1162
1163 *addr_ret = (struct sockaddr *) addr;
1164 *len_ret = sizeof *addr;
1165 return 1;
1166 }
1167 case BTPROTO_RFCOMM:
1168 {
1169 struct sockaddr_rc *addr = (struct sockaddr_rc *) _BT_SOCKADDR_MEMB(s, rc);
1170 char *straddr;
1171
1172 _BT_RC_MEMB(addr, family) = AF_BLUETOOTH;
1173 if (!PyArg_ParseTuple(args, "si", &straddr,
1174 &_BT_RC_MEMB(addr, channel))) {
1175 PyErr_SetString(socket_error, "getsockaddrarg: "
1176 "wrong format");
1177 return 0;
1178 }
1179 if (setbdaddr(straddr, &_BT_RC_MEMB(addr, bdaddr)) < 0)
1180 return 0;
1181
1182 *addr_ret = (struct sockaddr *) addr;
1183 *len_ret = sizeof *addr;
1184 return 1;
1185 }
1186#if !defined(__FreeBSD__)
1187 case BTPROTO_SCO:
1188 {
1189 struct sockaddr_sco *addr = (struct sockaddr_sco *) _BT_SOCKADDR_MEMB(s, sco);
1190 char *straddr;
1191
1192 _BT_SCO_MEMB(addr, family) = AF_BLUETOOTH;
1193 straddr = PyString_AsString(args);
1194 if (straddr == NULL) {
1195 PyErr_SetString(socket_error, "getsockaddrarg: "
1196 "wrong format");
1197 return 0;
1198 }
1199 if (setbdaddr(straddr, &_BT_SCO_MEMB(addr, bdaddr)) < 0)
1200 return 0;
1201
1202 *addr_ret = (struct sockaddr *) addr;
1203 *len_ret = sizeof *addr;
1204 return 1;
1205 }
1206#endif
1207 default:
1208 PyErr_SetString(socket_error, "getsockaddrarg: unknown Bluetooth protocol");
1209 return 0;
Martin v. Löwis12af0482004-01-31 12:34:17 +00001210 }
1211 }
1212#endif
1213
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00001214#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +00001215 case AF_PACKET:
1216 {
1217 struct sockaddr_ll* addr;
1218 struct ifreq ifr;
1219 char *interfaceName;
1220 int protoNumber;
1221 int hatype = 0;
1222 int pkttype = 0;
Andrew M. Kuchlingb8e17172004-07-10 23:39:35 +00001223 char *haddr = NULL;
1224 unsigned int halen = 0;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001225
Andrew M. Kuchlingb8e17172004-07-10 23:39:35 +00001226 if (!PyArg_ParseTuple(args, "si|iis#", &interfaceName,
1227 &protoNumber, &pkttype, &hatype,
1228 &haddr, &halen))
Jeremy Hylton22308652001-02-02 03:23:09 +00001229 return 0;
1230 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
1231 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001232 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001233 s->errorhandler();
Jeremy Hylton22308652001-02-02 03:23:09 +00001234 return 0;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001235 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001236 addr = &(s->sock_addr.ll);
1237 addr->sll_family = AF_PACKET;
1238 addr->sll_protocol = htons((short)protoNumber);
1239 addr->sll_ifindex = ifr.ifr_ifindex;
1240 addr->sll_pkttype = pkttype;
1241 addr->sll_hatype = hatype;
Andrew M. Kuchlingb8e17172004-07-10 23:39:35 +00001242 if (halen > 8) {
1243 PyErr_SetString(PyExc_ValueError,
1244 "Hardware address must be 8 bytes or less");
1245 return 0;
1246 }
1247 if (halen != 0) {
1248 memcpy(&addr->sll_addr, haddr, halen);
1249 }
1250 addr->sll_halen = halen;
Jeremy Hylton22308652001-02-02 03:23:09 +00001251 *addr_ret = (struct sockaddr *) addr;
1252 *len_ret = sizeof *addr;
1253 return 1;
1254 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00001255#endif
1256
Guido van Rossum30a685f1991-06-27 15:51:29 +00001257 /* More cases here... */
1258
1259 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001260 PyErr_SetString(socket_error, "getsockaddrarg: bad family");
Guido van Rossum30a685f1991-06-27 15:51:29 +00001261 return 0;
1262
1263 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001264}
1265
Guido van Rossum30a685f1991-06-27 15:51:29 +00001266
Guido van Rossum48a680c2001-03-02 06:34:14 +00001267/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +00001268 Return 1 if the family is known, 0 otherwise. The length is returned
1269 through len_ret. */
1270
1271static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +00001272getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +00001273{
1274 switch (s->sock_family) {
1275
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001276#if defined(AF_UNIX)
Guido van Rossum710e1df1992-06-12 10:39:36 +00001277 case AF_UNIX:
1278 {
1279 *len_ret = sizeof (struct sockaddr_un);
1280 return 1;
1281 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001282#endif /* AF_UNIX */
Guido van Rossum710e1df1992-06-12 10:39:36 +00001283
1284 case AF_INET:
1285 {
1286 *len_ret = sizeof (struct sockaddr_in);
1287 return 1;
1288 }
1289
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001290#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001291 case AF_INET6:
1292 {
1293 *len_ret = sizeof (struct sockaddr_in6);
1294 return 1;
1295 }
1296#endif
1297
Hye-Shik Chang81268602004-02-02 06:05:24 +00001298#ifdef USE_BLUETOOTH
Martin v. Löwis12af0482004-01-31 12:34:17 +00001299 case AF_BLUETOOTH:
1300 {
1301 switch(s->sock_proto)
1302 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001303
1304 case BTPROTO_L2CAP:
1305 *len_ret = sizeof (struct sockaddr_l2);
1306 return 1;
1307 case BTPROTO_RFCOMM:
1308 *len_ret = sizeof (struct sockaddr_rc);
1309 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00001310#if !defined(__FreeBSD__)
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001311 case BTPROTO_SCO:
1312 *len_ret = sizeof (struct sockaddr_sco);
1313 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00001314#endif
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001315 default:
1316 PyErr_SetString(socket_error, "getsockaddrlen: "
1317 "unknown BT protocol");
1318 return 0;
1319
Martin v. Löwis12af0482004-01-31 12:34:17 +00001320 }
1321 }
1322#endif
1323
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00001324#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +00001325 case AF_PACKET:
1326 {
1327 *len_ret = sizeof (struct sockaddr_ll);
1328 return 1;
1329 }
1330#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001331
Guido van Rossum710e1df1992-06-12 10:39:36 +00001332 /* More cases here... */
1333
1334 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001335 PyErr_SetString(socket_error, "getsockaddrlen: bad family");
Guido van Rossum710e1df1992-06-12 10:39:36 +00001336 return 0;
1337
1338 }
1339}
1340
1341
Guido van Rossum30a685f1991-06-27 15:51:29 +00001342/* s.accept() method */
1343
Guido van Rossum73624e91994-10-10 17:59:00 +00001344static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001345sock_accept(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001346{
1347 char addrbuf[256];
Fred Drakea04eaad2000-06-30 02:46:07 +00001348 SOCKET_T newfd;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001349 socklen_t addrlen;
Barry Warsaw752300b1997-01-03 17:18:10 +00001350 PyObject *sock = NULL;
1351 PyObject *addr = NULL;
1352 PyObject *res = NULL;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001353 int timeout;
Barry Warsaw752300b1997-01-03 17:18:10 +00001354
Guido van Rossum710e1df1992-06-12 10:39:36 +00001355 if (!getsockaddrlen(s, &addrlen))
1356 return NULL;
Fred Drakefd168342001-05-09 19:11:33 +00001357 memset(addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001358
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001359#ifdef MS_WINDOWS
1360 newfd = INVALID_SOCKET;
1361#else
1362 newfd = -1;
1363#endif
1364
Guido van Rossum73624e91994-10-10 17:59:00 +00001365 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001366 timeout = internal_select(s, 0);
1367 if (!timeout)
1368 newfd = accept(s->sock_fd, (struct sockaddr *) addrbuf,
1369 &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001370 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001371
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001372 if (timeout) {
1373 PyErr_SetString(socket_timeout, "timed out");
1374 return NULL;
1375 }
1376
Fred Drakea04eaad2000-06-30 02:46:07 +00001377#ifdef MS_WINDOWS
1378 if (newfd == INVALID_SOCKET)
1379#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001380 if (newfd < 0)
Fred Drakea04eaad2000-06-30 02:46:07 +00001381#endif
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001382 return s->errorhandler();
Barry Warsaw752300b1997-01-03 17:18:10 +00001383
Guido van Rossum30a685f1991-06-27 15:51:29 +00001384 /* Create the new object with unspecified family,
1385 to avoid calls to bind() etc. on it. */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001386 sock = (PyObject *) new_sockobject(newfd,
1387 s->sock_family,
1388 s->sock_type,
1389 s->sock_proto);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001390
Barry Warsaw752300b1997-01-03 17:18:10 +00001391 if (sock == NULL) {
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001392 SOCKETCLOSE(newfd);
Barry Warsaw752300b1997-01-03 17:18:10 +00001393 goto finally;
1394 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00001395 addr = makesockaddr(s->sock_fd, (struct sockaddr *)addrbuf,
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001396 addrlen, s->sock_proto);
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001397 if (addr == NULL)
Barry Warsaw752300b1997-01-03 17:18:10 +00001398 goto finally;
1399
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001400 res = PyTuple_Pack(2, sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00001401
Guido van Rossum67f7a382002-06-06 21:08:16 +00001402finally:
Guido van Rossum73624e91994-10-10 17:59:00 +00001403 Py_XDECREF(sock);
1404 Py_XDECREF(addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001405 return res;
1406}
1407
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001408PyDoc_STRVAR(accept_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001409"accept() -> (socket object, address info)\n\
1410\n\
1411Wait for an incoming connection. Return a new socket representing the\n\
1412connection, and the address of the client. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001413info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001414
Guido van Rossum11ba0942002-06-13 15:07:44 +00001415/* s.setblocking(flag) method. Argument:
1416 False -- non-blocking mode; same as settimeout(0)
1417 True -- blocking mode; same as settimeout(None)
1418*/
Guido van Rossume4485b01994-09-07 14:32:49 +00001419
Guido van Rossum73624e91994-10-10 17:59:00 +00001420static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001421sock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00001422{
1423 int block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001424
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001425 block = PyInt_AsLong(arg);
1426 if (block == -1 && PyErr_Occurred())
Guido van Rossume4485b01994-09-07 14:32:49 +00001427 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001428
Guido van Rossum11ba0942002-06-13 15:07:44 +00001429 s->sock_timeout = block ? -1.0 : 0.0;
Guido van Rossume8008f02002-06-07 03:36:20 +00001430 internal_setblocking(s, block);
Guido van Rossume4485b01994-09-07 14:32:49 +00001431
Guido van Rossum73624e91994-10-10 17:59:00 +00001432 Py_INCREF(Py_None);
1433 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +00001434}
Guido van Rossume4485b01994-09-07 14:32:49 +00001435
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001436PyDoc_STRVAR(setblocking_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001437"setblocking(flag)\n\
1438\n\
1439Set the socket to blocking (flag is true) or non-blocking (false).\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00001440setblocking(True) is equivalent to settimeout(None);\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001441setblocking(False) is equivalent to settimeout(0.0).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001442
Guido van Rossum11ba0942002-06-13 15:07:44 +00001443/* s.settimeout(timeout) method. Argument:
1444 None -- no timeout, blocking mode; same as setblocking(True)
1445 0.0 -- non-blocking mode; same as setblocking(False)
1446 > 0 -- timeout mode; operations time out after timeout seconds
1447 < 0 -- illegal; raises an exception
1448*/
Guido van Rossum67f7a382002-06-06 21:08:16 +00001449static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001450sock_settimeout(PySocketSockObject *s, PyObject *arg)
Guido van Rossum67f7a382002-06-06 21:08:16 +00001451{
Guido van Rossum11ba0942002-06-13 15:07:44 +00001452 double timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001453
1454 if (arg == Py_None)
Guido van Rossum11ba0942002-06-13 15:07:44 +00001455 timeout = -1.0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001456 else {
Guido van Rossum11ba0942002-06-13 15:07:44 +00001457 timeout = PyFloat_AsDouble(arg);
1458 if (timeout < 0.0) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00001459 if (!PyErr_Occurred())
1460 PyErr_SetString(PyExc_ValueError,
Guido van Rossum11ba0942002-06-13 15:07:44 +00001461 "Timeout value out of range");
Guido van Rossum67f7a382002-06-06 21:08:16 +00001462 return NULL;
1463 }
1464 }
1465
Guido van Rossum11ba0942002-06-13 15:07:44 +00001466 s->sock_timeout = timeout;
1467 internal_setblocking(s, timeout < 0.0);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001468
1469 Py_INCREF(Py_None);
1470 return Py_None;
1471}
1472
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001473PyDoc_STRVAR(settimeout_doc,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001474"settimeout(timeout)\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00001475\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00001476Set a timeout on socket operations. 'timeout' can be a float,\n\
1477giving in seconds, or None. Setting a timeout of None disables\n\
1478the timeout feature and is equivalent to setblocking(1).\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001479Setting a timeout of zero is the same as setblocking(0).");
Guido van Rossum67f7a382002-06-06 21:08:16 +00001480
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001481/* s.gettimeout() method.
1482 Returns the timeout associated with a socket. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00001483static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001484sock_gettimeout(PySocketSockObject *s)
Guido van Rossum67f7a382002-06-06 21:08:16 +00001485{
1486 if (s->sock_timeout < 0.0) {
1487 Py_INCREF(Py_None);
1488 return Py_None;
1489 }
1490 else
1491 return PyFloat_FromDouble(s->sock_timeout);
1492}
1493
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001494PyDoc_STRVAR(gettimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00001495"gettimeout() -> timeout\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00001496\n\
1497Returns the timeout in floating seconds associated with socket \n\
1498operations. A timeout of None indicates that timeouts on socket \n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001499operations are disabled.");
Guido van Rossume4485b01994-09-07 14:32:49 +00001500
Guido van Rossum48a680c2001-03-02 06:34:14 +00001501#ifdef RISCOS
1502/* s.sleeptaskw(1 | 0) method */
1503
1504static PyObject *
Martin v. Löwisa94568a2003-05-10 07:36:56 +00001505sock_sleeptaskw(PySocketSockObject *s,PyObject *arg)
Guido van Rossum48a680c2001-03-02 06:34:14 +00001506{
Guido van Rossum67f7a382002-06-06 21:08:16 +00001507 int block;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00001508 block = PyInt_AsLong(arg);
1509 if (block == -1 && PyErr_Occurred())
Guido van Rossum67f7a382002-06-06 21:08:16 +00001510 return NULL;
1511 Py_BEGIN_ALLOW_THREADS
1512 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
1513 Py_END_ALLOW_THREADS
Guido van Rossum48a680c2001-03-02 06:34:14 +00001514
Guido van Rossum67f7a382002-06-06 21:08:16 +00001515 Py_INCREF(Py_None);
1516 return Py_None;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001517}
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001518PyDoc_STRVAR(sleeptaskw_doc,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001519"sleeptaskw(flag)\n\
1520\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001521Allow sleeps in taskwindows.");
Guido van Rossum48a680c2001-03-02 06:34:14 +00001522#endif
1523
1524
Guido van Rossumaee08791992-09-08 09:05:33 +00001525/* s.setsockopt() method.
1526 With an integer third argument, sets an integer option.
1527 With a string third argument, sets an option from a buffer;
1528 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001529
Guido van Rossum73624e91994-10-10 17:59:00 +00001530static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001531sock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001532{
1533 int level;
1534 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001535 int res;
Guido van Rossumaee08791992-09-08 09:05:33 +00001536 char *buf;
1537 int buflen;
1538 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001539
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001540 if (PyArg_ParseTuple(args, "iii:setsockopt",
1541 &level, &optname, &flag)) {
Guido van Rossumaee08791992-09-08 09:05:33 +00001542 buf = (char *) &flag;
1543 buflen = sizeof flag;
1544 }
1545 else {
Guido van Rossum73624e91994-10-10 17:59:00 +00001546 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001547 if (!PyArg_ParseTuple(args, "iis#:setsockopt",
1548 &level, &optname, &buf, &buflen))
Guido van Rossumaee08791992-09-08 09:05:33 +00001549 return NULL;
1550 }
Thomas Wouters334fb892000-07-25 12:56:38 +00001551 res = setsockopt(s->sock_fd, level, optname, (void *)buf, buflen);
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001552 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001553 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001554 Py_INCREF(Py_None);
1555 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001556}
1557
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001558PyDoc_STRVAR(setsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001559"setsockopt(level, option, value)\n\
1560\n\
1561Set a socket option. See the Unix manual for level and option.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001562The value argument can either be an integer or a string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001563
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001564
Guido van Rossumaee08791992-09-08 09:05:33 +00001565/* s.getsockopt() method.
1566 With two arguments, retrieves an integer option.
1567 With a third integer argument, retrieves a string buffer of that size;
1568 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001569
Guido van Rossum73624e91994-10-10 17:59:00 +00001570static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001571sock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001572{
1573 int level;
1574 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001575 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +00001576 PyObject *buf;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001577 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001578
Guido van Rossumbcc20741998-08-04 22:53:56 +00001579#ifdef __BEOS__
Fred Drake564a6cc2001-05-11 20:12:26 +00001580 /* We have incomplete socket support. */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001581 PyErr_SetString(socket_error, "getsockopt not supported");
Guido van Rossumbcc20741998-08-04 22:53:56 +00001582 return NULL;
1583#else
1584
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001585 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
1586 &level, &optname, &buflen))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001587 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001588
Guido van Rossumbe32c891996-06-20 16:25:29 +00001589 if (buflen == 0) {
Guido van Rossumaee08791992-09-08 09:05:33 +00001590 int flag = 0;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001591 socklen_t flagsize = sizeof flag;
Guido van Rossumb376a4a1993-11-23 17:53:17 +00001592 res = getsockopt(s->sock_fd, level, optname,
Thomas Wouters334fb892000-07-25 12:56:38 +00001593 (void *)&flag, &flagsize);
Guido van Rossumaee08791992-09-08 09:05:33 +00001594 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001595 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001596 return PyInt_FromLong(flag);
Guido van Rossumaee08791992-09-08 09:05:33 +00001597 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001598#ifdef __VMS
1599 if (buflen > 1024) {
1600#else
Guido van Rossumaee08791992-09-08 09:05:33 +00001601 if (buflen <= 0 || buflen > 1024) {
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001602#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001603 PyErr_SetString(socket_error,
Barry Warsaw752300b1997-01-03 17:18:10 +00001604 "getsockopt buflen out of range");
Guido van Rossumaee08791992-09-08 09:05:33 +00001605 return NULL;
1606 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001607 buf = PyString_FromStringAndSize((char *)NULL, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001608 if (buf == NULL)
1609 return NULL;
Guido van Rossumb376a4a1993-11-23 17:53:17 +00001610 res = getsockopt(s->sock_fd, level, optname,
Fred Drake564a6cc2001-05-11 20:12:26 +00001611 (void *)PyString_AS_STRING(buf), &buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001612 if (res < 0) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001613 Py_DECREF(buf);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001614 return s->errorhandler();
Guido van Rossumaee08791992-09-08 09:05:33 +00001615 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001616 _PyString_Resize(&buf, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001617 return buf;
Guido van Rossumbcc20741998-08-04 22:53:56 +00001618#endif /* __BEOS__ */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001619}
1620
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001621PyDoc_STRVAR(getsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001622"getsockopt(level, option[, buffersize]) -> value\n\
1623\n\
1624Get a socket option. See the Unix manual for level and option.\n\
1625If a nonzero buffersize argument is given, the return value is a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001626string of that length; otherwise it is an integer.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001627
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001628
Fred Drake728819a2000-07-01 03:40:12 +00001629/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001630
Guido van Rossum73624e91994-10-10 17:59:00 +00001631static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001632sock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001633{
1634 struct sockaddr *addr;
1635 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001636 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001637
Fred Drake728819a2000-07-01 03:40:12 +00001638 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001639 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001640 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001641 res = bind(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001642 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001643 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001644 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001645 Py_INCREF(Py_None);
1646 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001647}
1648
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001649PyDoc_STRVAR(bind_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001650"bind(address)\n\
1651\n\
1652Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00001653pair (host, port); the host must refer to the local host. For raw packet\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001654sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001655
Guido van Rossum30a685f1991-06-27 15:51:29 +00001656
1657/* s.close() method.
1658 Set the file descriptor to -1 so operations tried subsequently
1659 will surely fail. */
1660
Guido van Rossum73624e91994-10-10 17:59:00 +00001661static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001662sock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001663{
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001664 SOCKET_T fd;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001665
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001666 if ((fd = s->sock_fd) != -1) {
1667 s->sock_fd = -1;
Guido van Rossum08481461996-10-12 14:07:22 +00001668 Py_BEGIN_ALLOW_THREADS
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001669 (void) SOCKETCLOSE(fd);
Guido van Rossum08481461996-10-12 14:07:22 +00001670 Py_END_ALLOW_THREADS
1671 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001672 Py_INCREF(Py_None);
1673 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001674}
1675
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001676PyDoc_STRVAR(close_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001677"close()\n\
1678\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001679Close the socket. It cannot be used after this call.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001680
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001681static int
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001682internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen,
1683 int *timeoutp)
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001684{
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001685 int res, timeout;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001686
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001687 timeout = 0;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001688 res = connect(s->sock_fd, addr, addrlen);
1689
1690#ifdef MS_WINDOWS
1691
1692 if (s->sock_timeout > 0.0) {
1693 if (res < 0 && WSAGetLastError() == WSAEWOULDBLOCK) {
Guido van Rossumb76bdf82003-02-19 17:50:16 +00001694 /* This is a mess. Best solution: trust select */
1695 fd_set fds;
Mark Hammonda57ec932004-08-03 05:06:26 +00001696 fd_set fds_exc;
Guido van Rossumb76bdf82003-02-19 17:50:16 +00001697 struct timeval tv;
1698 tv.tv_sec = (int)s->sock_timeout;
1699 tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6);
1700 FD_ZERO(&fds);
1701 FD_SET(s->sock_fd, &fds);
Mark Hammonda57ec932004-08-03 05:06:26 +00001702 FD_ZERO(&fds_exc);
1703 FD_SET(s->sock_fd, &fds_exc);
1704 res = select(s->sock_fd+1, NULL, &fds, &fds_exc, &tv);
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001705 if (res == 0) {
Guido van Rossumb76bdf82003-02-19 17:50:16 +00001706 res = WSAEWOULDBLOCK;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001707 timeout = 1;
Mark Hammonda57ec932004-08-03 05:06:26 +00001708 } else if (res > 0) {
1709 if (FD_ISSET(s->sock_fd, &fds))
1710 /* The socket is in the writeable set - this
1711 means connected */
1712 res = 0;
1713 else {
1714 /* As per MS docs, we need to call getsockopt()
1715 to get the underlying error */
1716 int res_size = sizeof res;
1717 /* It must be in the exception set */
1718 assert(FD_ISSET(s->sock_fd, &fds_exc));
1719 if (0 == getsockopt(s->sock_fd, SOL_SOCKET, SO_ERROR,
1720 (char *)&res, &res_size))
1721 /* getsockopt also clears WSAGetLastError,
1722 so reset it back. */
1723 WSASetLastError(res);
1724 else
1725 res = WSAGetLastError();
1726 }
1727 }
Guido van Rossumb76bdf82003-02-19 17:50:16 +00001728 /* else if (res < 0) an error occurred */
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001729 }
1730 }
1731
1732 if (res < 0)
1733 res = WSAGetLastError();
1734
1735#else
1736
1737 if (s->sock_timeout > 0.0) {
1738 if (res < 0 && errno == EINPROGRESS) {
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001739 timeout = internal_select(s, 1);
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001740 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum12e3c712002-08-08 20:39:30 +00001741 if (res < 0 && errno == EISCONN)
1742 res = 0;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001743 }
1744 }
1745
1746 if (res < 0)
1747 res = errno;
1748
1749#endif
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001750 *timeoutp = timeout;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001751
1752 return res;
1753}
Guido van Rossum30a685f1991-06-27 15:51:29 +00001754
Fred Drake728819a2000-07-01 03:40:12 +00001755/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001756
Guido van Rossum73624e91994-10-10 17:59:00 +00001757static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001758sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001759{
1760 struct sockaddr *addr;
1761 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001762 int res;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001763 int timeout;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001764
Fred Drake728819a2000-07-01 03:40:12 +00001765 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001766 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001767
Guido van Rossum73624e91994-10-10 17:59:00 +00001768 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001769 res = internal_connect(s, addr, addrlen, &timeout);
Guido van Rossum11ba0942002-06-13 15:07:44 +00001770 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001771
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001772 if (timeout) {
1773 PyErr_SetString(socket_timeout, "timed out");
1774 return NULL;
1775 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001776 if (res != 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001777 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001778 Py_INCREF(Py_None);
1779 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001780}
1781
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001782PyDoc_STRVAR(connect_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001783"connect(address)\n\
1784\n\
1785Connect the socket to a remote address. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001786is a pair (host, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001787
Guido van Rossum30a685f1991-06-27 15:51:29 +00001788
Fred Drake728819a2000-07-01 03:40:12 +00001789/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001790
1791static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001792sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001793{
1794 struct sockaddr *addr;
1795 int addrlen;
1796 int res;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001797 int timeout;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001798
Fred Drake728819a2000-07-01 03:40:12 +00001799 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001800 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001801
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001802 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001803 res = internal_connect(s, addr, addrlen, &timeout);
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001804 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001805
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001806 return PyInt_FromLong((long) res);
1807}
1808
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001809PyDoc_STRVAR(connect_ex_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00001810"connect_ex(address) -> errno\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00001811\n\
1812This is like connect(address), but returns an error code (the errno value)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001813instead of raising an exception when an error occurs.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001814
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001815
Guido van Rossumed233a51992-06-23 09:07:03 +00001816/* s.fileno() method */
1817
Guido van Rossum73624e91994-10-10 17:59:00 +00001818static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001819sock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00001820{
Fred Drakea04eaad2000-06-30 02:46:07 +00001821#if SIZEOF_SOCKET_T <= SIZEOF_LONG
Guido van Rossum73624e91994-10-10 17:59:00 +00001822 return PyInt_FromLong((long) s->sock_fd);
Fred Drakea04eaad2000-06-30 02:46:07 +00001823#else
Martin v. Löwisb9a0f912003-03-29 10:06:18 +00001824 return PyLong_FromLongLong((PY_LONG_LONG)s->sock_fd);
Fred Drakea04eaad2000-06-30 02:46:07 +00001825#endif
Guido van Rossumed233a51992-06-23 09:07:03 +00001826}
1827
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001828PyDoc_STRVAR(fileno_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001829"fileno() -> integer\n\
1830\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001831Return the integer file descriptor of the socket.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001832
Guido van Rossumed233a51992-06-23 09:07:03 +00001833
Guido van Rossumbe32c891996-06-20 16:25:29 +00001834#ifndef NO_DUP
1835/* s.dup() method */
1836
1837static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001838sock_dup(PySocketSockObject *s)
Guido van Rossumbe32c891996-06-20 16:25:29 +00001839{
Fred Drakea04eaad2000-06-30 02:46:07 +00001840 SOCKET_T newfd;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001841 PyObject *sock;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001842
Guido van Rossumbe32c891996-06-20 16:25:29 +00001843 newfd = dup(s->sock_fd);
1844 if (newfd < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001845 return s->errorhandler();
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001846 sock = (PyObject *) new_sockobject(newfd,
1847 s->sock_family,
1848 s->sock_type,
1849 s->sock_proto);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001850 if (sock == NULL)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001851 SOCKETCLOSE(newfd);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001852 return sock;
1853}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001854
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001855PyDoc_STRVAR(dup_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001856"dup() -> socket object\n\
1857\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001858Return a new socket object connected to the same system resource.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001859
Guido van Rossumbe32c891996-06-20 16:25:29 +00001860#endif
1861
1862
Guido van Rossumc89705d1992-11-26 08:54:07 +00001863/* s.getsockname() method */
1864
Guido van Rossum73624e91994-10-10 17:59:00 +00001865static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001866sock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001867{
1868 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001869 int res;
1870 socklen_t addrlen;
1871
Guido van Rossumc89705d1992-11-26 08:54:07 +00001872 if (!getsockaddrlen(s, &addrlen))
1873 return NULL;
Guido van Rossumca42b161996-01-12 01:36:05 +00001874 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001875 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001876 res = getsockname(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001877 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001878 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001879 return s->errorhandler();
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001880 return makesockaddr(s->sock_fd, (struct sockaddr *) addrbuf, addrlen,
1881 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001882}
1883
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001884PyDoc_STRVAR(getsockname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001885"getsockname() -> address info\n\
1886\n\
1887Return the address of the local endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001888info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001889
Guido van Rossumc89705d1992-11-26 08:54:07 +00001890
Guido van Rossumb6775db1994-08-01 11:34:53 +00001891#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001892/* s.getpeername() method */
1893
Guido van Rossum73624e91994-10-10 17:59:00 +00001894static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001895sock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001896{
1897 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001898 int res;
1899 socklen_t addrlen;
1900
Guido van Rossumc89705d1992-11-26 08:54:07 +00001901 if (!getsockaddrlen(s, &addrlen))
1902 return NULL;
Fred Drakefd168342001-05-09 19:11:33 +00001903 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001904 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001905 res = getpeername(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001906 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001907 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001908 return s->errorhandler();
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001909 return makesockaddr(s->sock_fd, (struct sockaddr *) addrbuf, addrlen,
1910 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001911}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001912
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001913PyDoc_STRVAR(getpeername_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001914"getpeername() -> address info\n\
1915\n\
1916Return the address of the remote endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001917info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001918
Guido van Rossumb6775db1994-08-01 11:34:53 +00001919#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001920
1921
Guido van Rossum30a685f1991-06-27 15:51:29 +00001922/* s.listen(n) method */
1923
Guido van Rossum73624e91994-10-10 17:59:00 +00001924static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001925sock_listen(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001926{
1927 int backlog;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001928 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001929
1930 backlog = PyInt_AsLong(arg);
1931 if (backlog == -1 && PyErr_Occurred())
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001932 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001933 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +00001934 if (backlog < 1)
1935 backlog = 1;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001936 res = listen(s->sock_fd, backlog);
Guido van Rossum73624e91994-10-10 17:59:00 +00001937 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001938 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001939 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001940 Py_INCREF(Py_None);
1941 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001942}
1943
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001944PyDoc_STRVAR(listen_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001945"listen(backlog)\n\
1946\n\
1947Enable a server to accept connections. The backlog argument must be at\n\
1948least 1; it specifies the number of unaccepted connection that the system\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001949will allow before refusing new connections.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001950
1951
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001952#ifndef NO_DUP
Guido van Rossum30a685f1991-06-27 15:51:29 +00001953/* s.makefile(mode) method.
1954 Create a new open file object referring to a dupped version of
1955 the socket's file descriptor. (The dup() call is necessary so
1956 that the open file and socket objects may be closed independent
1957 of each other.)
1958 The mode argument specifies 'r' or 'w' passed to fdopen(). */
1959
Guido van Rossum73624e91994-10-10 17:59:00 +00001960static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001961sock_makefile(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001962{
Tim Petersdbd9ba62000-07-09 03:09:57 +00001963 extern int fclose(FILE *);
Guido van Rossum6b144911995-03-14 15:05:13 +00001964 char *mode = "r";
1965 int bufsize = -1;
Fred Drakea04eaad2000-06-30 02:46:07 +00001966#ifdef MS_WIN32
Tim Peters79248aa2001-08-29 21:37:10 +00001967 Py_intptr_t fd;
Fred Drakea04eaad2000-06-30 02:46:07 +00001968#else
Guido van Rossum30a685f1991-06-27 15:51:29 +00001969 int fd;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001970#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001971 FILE *fp;
Guido van Rossum6b144911995-03-14 15:05:13 +00001972 PyObject *f;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001973#ifdef __VMS
1974 char *mode_r = "r";
1975 char *mode_w = "w";
1976#endif
Guido van Rossum6b144911995-03-14 15:05:13 +00001977
Guido van Rossum43713e52000-02-29 13:59:29 +00001978 if (!PyArg_ParseTuple(args, "|si:makefile", &mode, &bufsize))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001979 return NULL;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001980#ifdef __VMS
1981 if (strcmp(mode,"rb") == 0) {
1982 mode = mode_r;
1983 }
1984 else {
1985 if (strcmp(mode,"wb") == 0) {
1986 mode = mode_w;
1987 }
1988 }
1989#endif
Guido van Rossum8d665e61996-06-26 18:22:49 +00001990#ifdef MS_WIN32
Guido van Rossum82a5c661998-07-07 20:45:43 +00001991 if (((fd = _open_osfhandle(s->sock_fd, _O_BINARY)) < 0) ||
1992 ((fd = dup(fd)) < 0) || ((fp = fdopen(fd, mode)) == NULL))
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001993#else
Guido van Rossum82a5c661998-07-07 20:45:43 +00001994 if ((fd = dup(s->sock_fd)) < 0 || (fp = fdopen(fd, mode)) == NULL)
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001995#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001996 {
Guido van Rossum6b144911995-03-14 15:05:13 +00001997 if (fd >= 0)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001998 SOCKETCLOSE(fd);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001999 return s->errorhandler();
Guido van Rossum6b144911995-03-14 15:05:13 +00002000 }
2001 f = PyFile_FromFile(fp, "<socket>", mode, fclose);
2002 if (f != NULL)
2003 PyFile_SetBufSize(f, bufsize);
2004 return f;
Guido van Rossum30a685f1991-06-27 15:51:29 +00002005}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002006
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002007PyDoc_STRVAR(makefile_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002008"makefile([mode[, buffersize]]) -> file object\n\
2009\n\
2010Return a regular file object corresponding to the socket.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002011The mode and buffersize arguments are as for the built-in open() function.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002012
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002013#endif /* NO_DUP */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002014
Guido van Rossum48a680c2001-03-02 06:34:14 +00002015
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002016/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002017
Guido van Rossum73624e91994-10-10 17:59:00 +00002018static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002019sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002020{
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002021 int len, n = 0, flags = 0, timeout;
Guido van Rossum73624e91994-10-10 17:59:00 +00002022 PyObject *buf;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002023#ifdef __VMS
2024 int read_length;
2025 char *read_buf;
2026#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00002027
Guido van Rossum43713e52000-02-29 13:59:29 +00002028 if (!PyArg_ParseTuple(args, "i|i:recv", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00002029 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002030
2031 if (len < 0) {
Martin v. Löwisfba64e12001-11-19 10:41:26 +00002032 PyErr_SetString(PyExc_ValueError,
Guido van Rossum11ba0942002-06-13 15:07:44 +00002033 "negative buffersize in recv");
Martin v. Löwisfba64e12001-11-19 10:41:26 +00002034 return NULL;
2035 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002036
Guido van Rossum73624e91994-10-10 17:59:00 +00002037 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002038 if (buf == NULL)
2039 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002040
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002041#ifndef __VMS
Guido van Rossum73624e91994-10-10 17:59:00 +00002042 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002043 timeout = internal_select(s, 0);
2044 if (!timeout)
2045 n = recv(s->sock_fd, PyString_AS_STRING(buf), len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00002046 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002047
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002048 if (timeout) {
2049 Py_DECREF(buf);
2050 PyErr_SetString(socket_timeout, "timed out");
2051 return NULL;
2052 }
Guido van Rossum7c53b771995-09-13 18:39:47 +00002053 if (n < 0) {
2054 Py_DECREF(buf);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002055 return s->errorhandler();
Guido van Rossum7c53b771995-09-13 18:39:47 +00002056 }
Tim Peters5de98422002-04-27 18:44:32 +00002057 if (n != len)
2058 _PyString_Resize(&buf, n);
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002059#else
2060 read_buf = PyString_AsString(buf);
2061 read_length = len;
2062 while (read_length != 0) {
2063 unsigned int segment;
2064
2065 segment = read_length /SEGMENT_SIZE;
2066 if (segment != 0) {
2067 segment = SEGMENT_SIZE;
2068 }
2069 else {
2070 segment = read_length;
2071 }
2072
2073 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002074 timeout = internal_select(s, 0);
2075 if (!timeout)
2076 n = recv(s->sock_fd, read_buf, segment, flags);
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002077 Py_END_ALLOW_THREADS
2078
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002079 if (timeout) {
2080 Py_DECREF(buf);
2081 PyErr_SetString(socket_timeout, "timed out");
2082 return NULL;
2083 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002084 if (n < 0) {
2085 Py_DECREF(buf);
2086 return s->errorhandler();
2087 }
2088 if (n != read_length) {
2089 read_buf += n;
2090 break;
2091 }
2092
2093 read_length -= segment;
2094 read_buf += segment;
2095 }
2096 if (_PyString_Resize(&buf, (read_buf - PyString_AsString(buf))) < 0)
2097 {
2098 return NULL;
2099 }
2100#endif /* !__VMS */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002101 return buf;
2102}
2103
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002104PyDoc_STRVAR(recv_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002105"recv(buffersize[, flags]) -> data\n\
2106\n\
2107Receive up to buffersize bytes from the socket. For the optional flags\n\
2108argument, see the Unix manual. When no data is available, block until\n\
2109at least one byte is available or until the remote end is closed. When\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002110the remote end is closed and all data is read, return the empty string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002111
Guido van Rossum30a685f1991-06-27 15:51:29 +00002112
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002113/* s.recvfrom(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002114
Guido van Rossum73624e91994-10-10 17:59:00 +00002115static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002116sock_recvfrom(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002117{
2118 char addrbuf[256];
Barry Warsaw752300b1997-01-03 17:18:10 +00002119 PyObject *buf = NULL;
2120 PyObject *addr = NULL;
2121 PyObject *ret = NULL;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002122 int len, n = 0, flags = 0, timeout;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002123 socklen_t addrlen;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002124
Guido van Rossum43713e52000-02-29 13:59:29 +00002125 if (!PyArg_ParseTuple(args, "i|i:recvfrom", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00002126 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002127
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00002128 if (!getsockaddrlen(s, &addrlen))
2129 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00002130 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00002131 if (buf == NULL)
2132 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002133
Guido van Rossum73624e91994-10-10 17:59:00 +00002134 Py_BEGIN_ALLOW_THREADS
Fred Drakefd168342001-05-09 19:11:33 +00002135 memset(addrbuf, 0, addrlen);
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002136 timeout = internal_select(s, 0);
2137 if (!timeout)
2138 n = recvfrom(s->sock_fd, PyString_AS_STRING(buf), len, flags,
Guido van Rossum8d665e61996-06-26 18:22:49 +00002139#ifndef MS_WINDOWS
Andrew MacIntyreba43e872002-03-03 03:03:52 +00002140#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002141 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00002142#else
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002143 (void *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00002144#endif
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002145#else
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002146 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002147#endif
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002148 );
Guido van Rossum73624e91994-10-10 17:59:00 +00002149 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002150
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002151 if (timeout) {
2152 Py_DECREF(buf);
2153 PyErr_SetString(socket_timeout, "timed out");
2154 return NULL;
2155 }
Guido van Rossum7c53b771995-09-13 18:39:47 +00002156 if (n < 0) {
2157 Py_DECREF(buf);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002158 return s->errorhandler();
Guido van Rossum7c53b771995-09-13 18:39:47 +00002159 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002160
Guido van Rossum53a9bf81996-06-11 18:35:24 +00002161 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002162 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002163
Guido van Rossum67f7a382002-06-06 21:08:16 +00002164 if (!(addr = makesockaddr(s->sock_fd, (struct sockaddr *)addrbuf,
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00002165 addrlen, s->sock_proto)))
Barry Warsaw752300b1997-01-03 17:18:10 +00002166 goto finally;
2167
Raymond Hettinger8ae46892003-10-12 19:09:37 +00002168 ret = PyTuple_Pack(2, buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002169
2170finally:
Guido van Rossum73624e91994-10-10 17:59:00 +00002171 Py_XDECREF(addr);
2172 Py_XDECREF(buf);
Guido van Rossum6f5afc91993-02-05 09:46:15 +00002173 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002174}
2175
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002176PyDoc_STRVAR(recvfrom_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002177"recvfrom(buffersize[, flags]) -> (data, address info)\n\
2178\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002179Like recv(buffersize, flags) but also return the sender's address info.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002180
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002181/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002182
Guido van Rossum73624e91994-10-10 17:59:00 +00002183static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002184sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002185{
Guido van Rossumff4949e1992-08-05 19:58:53 +00002186 char *buf;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002187 int len, n = 0, flags = 0, timeout;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002188#ifdef __VMS
2189 int send_length;
2190#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00002191
Guido van Rossum43713e52000-02-29 13:59:29 +00002192 if (!PyArg_ParseTuple(args, "s#|i:send", &buf, &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00002193 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002194
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002195#ifndef __VMS
Guido van Rossum73624e91994-10-10 17:59:00 +00002196 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002197 timeout = internal_select(s, 1);
2198 if (!timeout)
2199 n = send(s->sock_fd, buf, len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00002200 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002201
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002202 if (timeout) {
2203 PyErr_SetString(socket_timeout, "timed out");
2204 return NULL;
2205 }
Guido van Rossum30a685f1991-06-27 15:51:29 +00002206 if (n < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002207 return s->errorhandler();
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002208#else
2209 /* Divide packet into smaller segments for */
2210 /* TCP/IP Services for OpenVMS */
2211 send_length = len;
2212 while (send_length != 0) {
2213 unsigned int segment;
2214
2215 segment = send_length / SEGMENT_SIZE;
2216 if (segment != 0) {
2217 segment = SEGMENT_SIZE;
2218 }
2219 else {
2220 segment = send_length;
2221 }
2222 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002223 timeout = internal_select(s, 1);
2224 if (!timeout)
2225 n = send(s->sock_fd, buf, segment, flags);
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002226 Py_END_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002227 if (timeout) {
2228 PyErr_SetString(socket_timeout, "timed out");
2229 return NULL;
2230 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002231 if (n < 0) {
2232 return s->errorhandler();
2233 }
2234 send_length -= segment;
2235 buf += segment;
2236 } /* end while */
2237#endif /* !__VMS */
Guido van Rossum73624e91994-10-10 17:59:00 +00002238 return PyInt_FromLong((long)n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00002239}
2240
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002241PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002242"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002243\n\
2244Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002245argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002246sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002247
2248
2249/* s.sendall(data [,flags]) method */
2250
2251static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002252sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002253{
2254 char *buf;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002255 int len, n = 0, flags = 0, timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002256
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002257 if (!PyArg_ParseTuple(args, "s#|i:sendall", &buf, &len, &flags))
2258 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002259
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002260 Py_BEGIN_ALLOW_THREADS
2261 do {
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002262 timeout = internal_select(s, 1);
2263 if (timeout)
2264 break;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002265 n = send(s->sock_fd, buf, len, flags);
2266 if (n < 0)
2267 break;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002268 buf += n;
2269 len -= n;
2270 } while (len > 0);
2271 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002272
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002273 if (timeout) {
2274 PyErr_SetString(socket_timeout, "timed out");
2275 return NULL;
2276 }
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002277 if (n < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002278 return s->errorhandler();
Guido van Rossum67f7a382002-06-06 21:08:16 +00002279
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002280 Py_INCREF(Py_None);
2281 return Py_None;
2282}
2283
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002284PyDoc_STRVAR(sendall_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002285"sendall(data[, flags])\n\
2286\n\
2287Send a data string to the socket. For the optional flags\n\
2288argument, see the Unix manual. This calls send() repeatedly\n\
2289until all data is sent. If an error occurs, it's impossible\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002290to tell how much data has been sent.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002291
Guido van Rossum30a685f1991-06-27 15:51:29 +00002292
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002293/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002294
Guido van Rossum73624e91994-10-10 17:59:00 +00002295static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002296sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002297{
Guido van Rossum73624e91994-10-10 17:59:00 +00002298 PyObject *addro;
Guido van Rossumff4949e1992-08-05 19:58:53 +00002299 char *buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002300 struct sockaddr *addr;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002301 int addrlen, len, n = 0, flags, timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002302
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002303 flags = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002304 if (!PyArg_ParseTuple(args, "s#O:sendto", &buf, &len, &addro)) {
Guido van Rossum73624e91994-10-10 17:59:00 +00002305 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002306 if (!PyArg_ParseTuple(args, "s#iO:sendto",
2307 &buf, &len, &flags, &addro))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002308 return NULL;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002309 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002310
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002311 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002312 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002313
Guido van Rossum73624e91994-10-10 17:59:00 +00002314 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002315 timeout = internal_select(s, 1);
2316 if (!timeout)
2317 n = sendto(s->sock_fd, buf, len, flags, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00002318 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002319
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002320 if (timeout) {
2321 PyErr_SetString(socket_timeout, "timed out");
2322 return NULL;
2323 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002324 if (n < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002325 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00002326 return PyInt_FromLong((long)n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002327}
2328
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002329PyDoc_STRVAR(sendto_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002330"sendto(data[, flags], address) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002331\n\
2332Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002333For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002334
Guido van Rossum30a685f1991-06-27 15:51:29 +00002335
2336/* s.shutdown(how) method */
2337
Guido van Rossum73624e91994-10-10 17:59:00 +00002338static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002339sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002340{
2341 int how;
Guido van Rossumff4949e1992-08-05 19:58:53 +00002342 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002343
2344 how = PyInt_AsLong(arg);
2345 if (how == -1 && PyErr_Occurred())
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002346 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00002347 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002348 res = shutdown(s->sock_fd, how);
Guido van Rossum73624e91994-10-10 17:59:00 +00002349 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002350 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002351 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00002352 Py_INCREF(Py_None);
2353 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002354}
2355
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002356PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002357"shutdown(flag)\n\
2358\n\
Martin v. Löwis94681fc2003-11-27 19:40:22 +00002359Shut down the reading side of the socket (flag == SHUT_RD), the writing side\n\
2360of the socket (flag == SHUT_WR), or both ends (flag == SHUT_RDWR).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002361
Guido van Rossum30a685f1991-06-27 15:51:29 +00002362
2363/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002364
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002365static PyMethodDef sock_methods[] = {
2366 {"accept", (PyCFunction)sock_accept, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002367 accept_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002368 {"bind", (PyCFunction)sock_bind, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002369 bind_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002370 {"close", (PyCFunction)sock_close, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002371 close_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002372 {"connect", (PyCFunction)sock_connect, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002373 connect_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002374 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002375 connect_ex_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00002376#ifndef NO_DUP
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002377 {"dup", (PyCFunction)sock_dup, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002378 dup_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00002379#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002380 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002381 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00002382#ifdef HAVE_GETPEERNAME
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002383 {"getpeername", (PyCFunction)sock_getpeername,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002384 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00002385#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002386 {"getsockname", (PyCFunction)sock_getsockname,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002387 METH_NOARGS, getsockname_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002388 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002389 getsockopt_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002390 {"listen", (PyCFunction)sock_listen, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002391 listen_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002392#ifndef NO_DUP
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002393 {"makefile", (PyCFunction)sock_makefile, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002394 makefile_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002395#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002396 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002397 recv_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002398 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002399 recvfrom_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002400 {"send", (PyCFunction)sock_send, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002401 send_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002402 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002403 sendall_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002404 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002405 sendto_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002406 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002407 setblocking_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002408 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
Guido van Rossum67f7a382002-06-06 21:08:16 +00002409 settimeout_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002410 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
Guido van Rossum67f7a382002-06-06 21:08:16 +00002411 gettimeout_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002412 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002413 setsockopt_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002414 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002415 shutdown_doc},
2416#ifdef RISCOS
Martin v. Löwisa94568a2003-05-10 07:36:56 +00002417 {"sleeptaskw", (PyCFunction)sock_sleeptaskw, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002418 sleeptaskw_doc},
2419#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +00002420 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002421};
2422
Guido van Rossum30a685f1991-06-27 15:51:29 +00002423
Guido van Rossum73624e91994-10-10 17:59:00 +00002424/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00002425 First close the file description. */
2426
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002427static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002428sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002429{
Guido van Rossumfa972c92000-04-10 12:45:45 +00002430 if (s->sock_fd != -1)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00002431 (void) SOCKETCLOSE(s->sock_fd);
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002432 s->ob_type->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002433}
2434
Guido van Rossum30a685f1991-06-27 15:51:29 +00002435
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002436static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002437sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002438{
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002439 char buf[512];
Fred Drakea04eaad2000-06-30 02:46:07 +00002440#if SIZEOF_SOCKET_T > SIZEOF_LONG
2441 if (s->sock_fd > LONG_MAX) {
2442 /* this can occur on Win64, and actually there is a special
2443 ugly printf formatter for decimal pointer length integer
2444 printing, only bother if necessary*/
2445 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002446 "no printf formatter to display "
2447 "the socket descriptor in decimal");
Fred Drakea04eaad2000-06-30 02:46:07 +00002448 return NULL;
2449 }
2450#endif
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002451 PyOS_snprintf(
2452 buf, sizeof(buf),
2453 "<socket object, fd=%ld, family=%d, type=%d, protocol=%d>",
2454 (long)s->sock_fd, s->sock_family,
2455 s->sock_type,
2456 s->sock_proto);
Guido van Rossumdc1c64a1996-02-27 15:21:19 +00002457 return PyString_FromString(buf);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002458}
2459
2460
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002461/* Create a new, uninitialized socket object. */
2462
2463static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002464sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002465{
2466 PyObject *new;
2467
2468 new = type->tp_alloc(type, 0);
Guido van Rossume1c478f2002-06-06 20:08:25 +00002469 if (new != NULL) {
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002470 ((PySocketSockObject *)new)->sock_fd = -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002471 ((PySocketSockObject *)new)->sock_timeout = -1.0;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002472 ((PySocketSockObject *)new)->errorhandler = &set_error;
Guido van Rossume1c478f2002-06-06 20:08:25 +00002473 }
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002474 return new;
2475}
2476
2477
2478/* Initialize a new socket object. */
2479
2480/*ARGSUSED*/
2481static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00002482sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002483{
2484 PySocketSockObject *s = (PySocketSockObject *)self;
2485 SOCKET_T fd;
2486 int family = AF_INET, type = SOCK_STREAM, proto = 0;
2487 static char *keywords[] = {"family", "type", "proto", 0};
2488
2489 if (!PyArg_ParseTupleAndKeywords(args, kwds,
2490 "|iii:socket", keywords,
2491 &family, &type, &proto))
2492 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002493
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002494 Py_BEGIN_ALLOW_THREADS
2495 fd = socket(family, type, proto);
2496 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002497
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002498#ifdef MS_WINDOWS
2499 if (fd == INVALID_SOCKET)
2500#else
2501 if (fd < 0)
2502#endif
2503 {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002504 set_error();
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002505 return -1;
2506 }
2507 init_sockobject(s, fd, family, type, proto);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002508
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002509 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002510
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002511}
2512
2513
Guido van Rossumb6775db1994-08-01 11:34:53 +00002514/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002515
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002516static PyTypeObject sock_type = {
Guido van Rossum55558541996-05-23 22:54:50 +00002517 PyObject_HEAD_INIT(0) /* Must fill in type value later */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002518 0, /* ob_size */
Guido van Rossumca6dfa52001-10-28 12:31:33 +00002519 "_socket.socket", /* tp_name */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002520 sizeof(PySocketSockObject), /* tp_basicsize */
2521 0, /* tp_itemsize */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002522 (destructor)sock_dealloc, /* tp_dealloc */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002523 0, /* tp_print */
2524 0, /* tp_getattr */
2525 0, /* tp_setattr */
2526 0, /* tp_compare */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002527 (reprfunc)sock_repr, /* tp_repr */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002528 0, /* tp_as_number */
2529 0, /* tp_as_sequence */
2530 0, /* tp_as_mapping */
2531 0, /* tp_hash */
2532 0, /* tp_call */
2533 0, /* tp_str */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002534 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002535 0, /* tp_setattro */
2536 0, /* tp_as_buffer */
2537 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002538 sock_doc, /* tp_doc */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002539 0, /* tp_traverse */
2540 0, /* tp_clear */
2541 0, /* tp_richcompare */
2542 0, /* tp_weaklistoffset */
2543 0, /* tp_iter */
2544 0, /* tp_iternext */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002545 sock_methods, /* tp_methods */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002546 0, /* tp_members */
2547 0, /* tp_getset */
2548 0, /* tp_base */
2549 0, /* tp_dict */
2550 0, /* tp_descr_get */
2551 0, /* tp_descr_set */
2552 0, /* tp_dictoffset */
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00002553 sock_initobj, /* tp_init */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002554 PyType_GenericAlloc, /* tp_alloc */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002555 sock_new, /* tp_new */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002556 PyObject_Del, /* tp_free */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002557};
2558
Guido van Rossum30a685f1991-06-27 15:51:29 +00002559
Guido van Rossum81194471991-07-27 21:42:02 +00002560/* Python interface to gethostname(). */
2561
2562/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002563static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002564socket_gethostname(PyObject *self, PyObject *args)
Guido van Rossum81194471991-07-27 21:42:02 +00002565{
2566 char buf[1024];
Guido van Rossumff4949e1992-08-05 19:58:53 +00002567 int res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002568 if (!PyArg_ParseTuple(args, ":gethostname"))
Guido van Rossum81194471991-07-27 21:42:02 +00002569 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00002570 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002571 res = gethostname(buf, (int) sizeof buf - 1);
Guido van Rossum73624e91994-10-10 17:59:00 +00002572 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002573 if (res < 0)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002574 return set_error();
Guido van Rossum81194471991-07-27 21:42:02 +00002575 buf[sizeof buf - 1] = '\0';
Guido van Rossum73624e91994-10-10 17:59:00 +00002576 return PyString_FromString(buf);
Guido van Rossum81194471991-07-27 21:42:02 +00002577}
Guido van Rossumff4949e1992-08-05 19:58:53 +00002578
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002579PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002580"gethostname() -> string\n\
2581\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002582Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002583
Guido van Rossumff4949e1992-08-05 19:58:53 +00002584
Guido van Rossum30a685f1991-06-27 15:51:29 +00002585/* Python interface to gethostbyname(name). */
2586
2587/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002588static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002589socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002590{
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002591 char *name;
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00002592#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002593 struct sockaddr_storage addrbuf;
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00002594#else
2595 struct sockaddr_in addrbuf;
2596#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002597
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002598 if (!PyArg_ParseTuple(args, "s:gethostbyname", &name))
Guido van Rossum30a685f1991-06-27 15:51:29 +00002599 return NULL;
Martin v. Löwisddc6f472002-07-28 16:10:31 +00002600 if (setipaddr(name, (struct sockaddr *)&addrbuf, sizeof(addrbuf), AF_INET) < 0)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002601 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002602 return makeipaddr((struct sockaddr *)&addrbuf,
2603 sizeof(struct sockaddr_in));
Guido van Rossum30a685f1991-06-27 15:51:29 +00002604}
2605
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002606PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002607"gethostbyname(host) -> address\n\
2608\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002609Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002610
2611
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002612/* Convenience function common to gethostbyname_ex and gethostbyaddr */
2613
2614static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002615gethost_common(struct hostent *h, struct sockaddr *addr, int alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002616{
2617 char **pch;
2618 PyObject *rtn_tuple = (PyObject *)NULL;
2619 PyObject *name_list = (PyObject *)NULL;
2620 PyObject *addr_list = (PyObject *)NULL;
2621 PyObject *tmp;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002622
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002623 if (h == NULL) {
Guido van Rossum48a680c2001-03-02 06:34:14 +00002624 /* Let's get real error message to return */
Guido van Rossume2ae77b2001-10-24 20:42:55 +00002625#ifndef RISCOS
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002626 set_herror(h_errno);
Guido van Rossume2ae77b2001-10-24 20:42:55 +00002627#else
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002628 PyErr_SetString(socket_error, "host not found");
Guido van Rossume2ae77b2001-10-24 20:42:55 +00002629#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002630 return NULL;
2631 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002632
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002633 if (h->h_addrtype != af) {
2634#ifdef HAVE_STRERROR
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002635 /* Let's get real error message to return */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002636 PyErr_SetString(socket_error,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002637 (char *)strerror(EAFNOSUPPORT));
2638#else
2639 PyErr_SetString(
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002640 socket_error,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002641 "Address family not supported by protocol family");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002642#endif
2643 return NULL;
2644 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002645
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002646 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00002647
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002648 case AF_INET:
2649 if (alen < sizeof(struct sockaddr_in))
2650 return NULL;
2651 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002652
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002653#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002654 case AF_INET6:
2655 if (alen < sizeof(struct sockaddr_in6))
2656 return NULL;
2657 break;
2658#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00002659
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002660 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002661
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002662 if ((name_list = PyList_New(0)) == NULL)
2663 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002664
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002665 if ((addr_list = PyList_New(0)) == NULL)
2666 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002667
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002668 for (pch = h->h_aliases; *pch != NULL; pch++) {
2669 int status;
2670 tmp = PyString_FromString(*pch);
2671 if (tmp == NULL)
2672 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002673
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002674 status = PyList_Append(name_list, tmp);
2675 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002676
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002677 if (status)
2678 goto err;
2679 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002680
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002681 for (pch = h->h_addr_list; *pch != NULL; pch++) {
2682 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002683
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002684 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00002685
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002686 case AF_INET:
2687 {
2688 struct sockaddr_in sin;
2689 memset(&sin, 0, sizeof(sin));
2690 sin.sin_family = af;
2691#ifdef HAVE_SOCKADDR_SA_LEN
2692 sin.sin_len = sizeof(sin);
2693#endif
2694 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
2695 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
Guido van Rossum67f7a382002-06-06 21:08:16 +00002696
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002697 if (pch == h->h_addr_list && alen >= sizeof(sin))
2698 memcpy((char *) addr, &sin, sizeof(sin));
2699 break;
2700 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002701
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002702#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002703 case AF_INET6:
2704 {
2705 struct sockaddr_in6 sin6;
2706 memset(&sin6, 0, sizeof(sin6));
2707 sin6.sin6_family = af;
2708#ifdef HAVE_SOCKADDR_SA_LEN
2709 sin6.sin6_len = sizeof(sin6);
2710#endif
2711 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
2712 tmp = makeipaddr((struct sockaddr *)&sin6,
2713 sizeof(sin6));
Guido van Rossum67f7a382002-06-06 21:08:16 +00002714
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002715 if (pch == h->h_addr_list && alen >= sizeof(sin6))
2716 memcpy((char *) addr, &sin6, sizeof(sin6));
2717 break;
2718 }
2719#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00002720
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002721 default: /* can't happen */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002722 PyErr_SetString(socket_error,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002723 "unsupported address family");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002724 return NULL;
2725 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002726
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002727 if (tmp == NULL)
2728 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002729
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002730 status = PyList_Append(addr_list, tmp);
2731 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002732
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002733 if (status)
2734 goto err;
2735 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002736
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002737 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002738
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002739 err:
2740 Py_XDECREF(name_list);
2741 Py_XDECREF(addr_list);
2742 return rtn_tuple;
2743}
2744
2745
2746/* Python interface to gethostbyname_ex(name). */
2747
2748/*ARGSUSED*/
2749static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002750socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002751{
2752 char *name;
2753 struct hostent *h;
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00002754#ifdef ENABLE_IPV6
2755 struct sockaddr_storage addr;
2756#else
2757 struct sockaddr_in addr;
2758#endif
Martin v. Löwis9db2f572001-07-23 01:30:10 +00002759 struct sockaddr *sa;
Guido van Rossum955becc1999-03-22 20:14:53 +00002760 PyObject *ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002761#ifdef HAVE_GETHOSTBYNAME_R
2762 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002763#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
2764 struct hostent_data data;
2765#else
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002766 char buf[16384];
2767 int buf_len = (sizeof buf) - 1;
2768 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002769#endif
2770#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002771 int result;
2772#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002773#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002774
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002775 if (!PyArg_ParseTuple(args, "s:gethostbyname_ex", &name))
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002776 return NULL;
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00002777 if (setipaddr(name, (struct sockaddr *)&addr, sizeof(addr), AF_INET) < 0)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002778 return NULL;
2779 Py_BEGIN_ALLOW_THREADS
2780#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002781#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002782 result = gethostbyname_r(name, &hp_allocated, buf, buf_len,
2783 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002784#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002785 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002786#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00002787 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002788 result = gethostbyname_r(name, &hp_allocated, &data);
2789 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002790#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002791#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00002792#ifdef USE_GETHOSTBYNAME_LOCK
Just van Rossum1040d2c2003-05-09 07:53:18 +00002793 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002794#endif
2795 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002796#endif /* HAVE_GETHOSTBYNAME_R */
2797 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002798 /* Some C libraries would require addr.__ss_family instead of
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002799 addr.ss_family.
2800 Therefore, we cast the sockaddr_storage into sockaddr to
2801 access sa_family. */
Martin v. Löwis9db2f572001-07-23 01:30:10 +00002802 sa = (struct sockaddr*)&addr;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002803 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr),
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002804 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00002805#ifdef USE_GETHOSTBYNAME_LOCK
Just van Rossum1040d2c2003-05-09 07:53:18 +00002806 PyThread_release_lock(netdb_lock);
Guido van Rossum955becc1999-03-22 20:14:53 +00002807#endif
2808 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002809}
2810
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002811PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002812"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
2813\n\
2814Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002815for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002816
2817
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002818/* Python interface to gethostbyaddr(IP). */
2819
2820/*ARGSUSED*/
2821static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002822socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002823{
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002824#ifdef ENABLE_IPV6
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002825 struct sockaddr_storage addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002826#else
Guido van Rossum48a680c2001-03-02 06:34:14 +00002827 struct sockaddr_in addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002828#endif
2829 struct sockaddr *sa = (struct sockaddr *)&addr;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002830 char *ip_num;
2831 struct hostent *h;
Guido van Rossum3baaa131999-03-22 21:44:51 +00002832 PyObject *ret;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002833#ifdef HAVE_GETHOSTBYNAME_R
2834 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002835#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
2836 struct hostent_data data;
2837#else
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002838 char buf[16384];
2839 int buf_len = (sizeof buf) - 1;
2840 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002841#endif
2842#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002843 int result;
2844#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002845#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002846 char *ap;
2847 int al;
2848 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002849
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002850 if (!PyArg_ParseTuple(args, "s:gethostbyaddr", &ip_num))
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002851 return NULL;
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00002852 af = AF_UNSPEC;
Martin v. Löwisddc6f472002-07-28 16:10:31 +00002853 if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002854 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002855 af = sa->sa_family;
2856 ap = NULL;
2857 al = 0;
2858 switch (af) {
2859 case AF_INET:
2860 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
2861 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
2862 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002863#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002864 case AF_INET6:
2865 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
2866 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
2867 break;
2868#endif
2869 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002870 PyErr_SetString(socket_error, "unsupported address family");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002871 return NULL;
2872 }
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002873 Py_BEGIN_ALLOW_THREADS
2874#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002875#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002876 result = gethostbyaddr_r(ap, al, af,
2877 &hp_allocated, buf, buf_len,
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002878 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002879#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002880 h = gethostbyaddr_r(ap, al, af,
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002881 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002882#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00002883 memset((void *) &data, '\0', sizeof(data));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002884 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002885 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002886#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002887#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00002888#ifdef USE_GETHOSTBYNAME_LOCK
Just van Rossum1040d2c2003-05-09 07:53:18 +00002889 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002890#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002891 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002892#endif /* HAVE_GETHOSTBYNAME_R */
2893 Py_END_ALLOW_THREADS
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002894 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00002895#ifdef USE_GETHOSTBYNAME_LOCK
Just van Rossum1040d2c2003-05-09 07:53:18 +00002896 PyThread_release_lock(netdb_lock);
Guido van Rossum3baaa131999-03-22 21:44:51 +00002897#endif
2898 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002899}
2900
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002901PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002902"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
2903\n\
2904Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002905for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002906
Guido van Rossum30a685f1991-06-27 15:51:29 +00002907
2908/* Python interface to getservbyname(name).
2909 This only returns the port number, since the other info is already
2910 known or not useful (like the list of aliases). */
2911
2912/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002913static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002914socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002915{
Barry Warsaw11b91a02004-06-28 00:50:43 +00002916 char *name, *proto=NULL;
Guido van Rossum30a685f1991-06-27 15:51:29 +00002917 struct servent *sp;
Barry Warsaw11b91a02004-06-28 00:50:43 +00002918 if (!PyArg_ParseTuple(args, "s|s:getservbyname", &name, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +00002919 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00002920 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002921 sp = getservbyname(name, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00002922 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00002923 if (sp == NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002924 PyErr_SetString(socket_error, "service/proto not found");
Guido van Rossum30a685f1991-06-27 15:51:29 +00002925 return NULL;
2926 }
Guido van Rossum73624e91994-10-10 17:59:00 +00002927 return PyInt_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00002928}
2929
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002930PyDoc_STRVAR(getservbyname_doc,
Barry Warsaw11b91a02004-06-28 00:50:43 +00002931"getservbyname(servicename[, protocolname]) -> integer\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002932\n\
2933Return a port number from a service name and protocol name.\n\
Barry Warsaw11b91a02004-06-28 00:50:43 +00002934The optional protocol name, if given, should be 'tcp' or 'udp',\n\
2935otherwise any protocol will match.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002936
Guido van Rossum30a685f1991-06-27 15:51:29 +00002937
Barry Warsaw11b91a02004-06-28 00:50:43 +00002938/* Python interface to getservbyport(port).
2939 This only returns the service name, since the other info is already
2940 known or not useful (like the list of aliases). */
2941
2942/*ARGSUSED*/
2943static PyObject *
2944socket_getservbyport(PyObject *self, PyObject *args)
2945{
Raymond Hettinger87de0ca2004-09-28 02:19:40 +00002946 unsigned short port;
Barry Warsaw11b91a02004-06-28 00:50:43 +00002947 char *proto=NULL;
2948 struct servent *sp;
Raymond Hettinger87de0ca2004-09-28 02:19:40 +00002949 if (!PyArg_ParseTuple(args, "H|s:getservbyport", &port, &proto))
Barry Warsaw11b91a02004-06-28 00:50:43 +00002950 return NULL;
2951 Py_BEGIN_ALLOW_THREADS
2952 sp = getservbyport(htons(port), proto);
2953 Py_END_ALLOW_THREADS
2954 if (sp == NULL) {
2955 PyErr_SetString(socket_error, "port/proto not found");
2956 return NULL;
2957 }
2958 return PyString_FromString(sp->s_name);
2959}
2960
2961PyDoc_STRVAR(getservbyport_doc,
2962"getservbyport(port[, protocolname]) -> string\n\
2963\n\
2964Return the service name from a port number and protocol name.\n\
2965The optional protocol name, if given, should be 'tcp' or 'udp',\n\
2966otherwise any protocol will match.");
2967
Guido van Rossum3901d851996-12-19 16:35:04 +00002968/* Python interface to getprotobyname(name).
2969 This only returns the protocol number, since the other info is
2970 already known or not useful (like the list of aliases). */
2971
2972/*ARGSUSED*/
2973static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002974socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00002975{
2976 char *name;
2977 struct protoent *sp;
Guido van Rossumbcc20741998-08-04 22:53:56 +00002978#ifdef __BEOS__
2979/* Not available in BeOS yet. - [cjh] */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002980 PyErr_SetString(socket_error, "getprotobyname not supported");
Guido van Rossumbcc20741998-08-04 22:53:56 +00002981 return NULL;
2982#else
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002983 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
Guido van Rossum3901d851996-12-19 16:35:04 +00002984 return NULL;
2985 Py_BEGIN_ALLOW_THREADS
2986 sp = getprotobyname(name);
2987 Py_END_ALLOW_THREADS
2988 if (sp == NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002989 PyErr_SetString(socket_error, "protocol not found");
Guido van Rossum3901d851996-12-19 16:35:04 +00002990 return NULL;
2991 }
2992 return PyInt_FromLong((long) sp->p_proto);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002993#endif
Guido van Rossum3901d851996-12-19 16:35:04 +00002994}
2995
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002996PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002997"getprotobyname(name) -> integer\n\
2998\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002999Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003000
Guido van Rossum3901d851996-12-19 16:35:04 +00003001
Dave Cole331708b2004-08-09 04:51:41 +00003002#ifdef HAVE_SOCKETPAIR
3003/* Create a pair of sockets using the socketpair() function.
Dave Cole07fda7e2004-08-23 05:16:23 +00003004 Arguments as for socket() except the default family is AF_UNIX if
Dave Colee8bbfe42004-08-26 00:51:16 +00003005 defined on the platform; otherwise, the default is AF_INET. */
Dave Cole331708b2004-08-09 04:51:41 +00003006
3007/*ARGSUSED*/
3008static PyObject *
3009socket_socketpair(PyObject *self, PyObject *args)
3010{
3011 PySocketSockObject *s0 = NULL, *s1 = NULL;
3012 SOCKET_T sv[2];
3013 int family, type = SOCK_STREAM, proto = 0;
3014 PyObject *res = NULL;
3015
3016#if defined(AF_UNIX)
3017 family = AF_UNIX;
3018#else
3019 family = AF_INET;
3020#endif
3021 if (!PyArg_ParseTuple(args, "|iii:socketpair",
3022 &family, &type, &proto))
3023 return NULL;
3024 /* Create a pair of socket fds */
3025 if (socketpair(family, type, proto, sv) < 0)
3026 return set_error();
Dave Cole331708b2004-08-09 04:51:41 +00003027 s0 = new_sockobject(sv[0], family, type, proto);
3028 if (s0 == NULL)
3029 goto finally;
3030 s1 = new_sockobject(sv[1], family, type, proto);
3031 if (s1 == NULL)
3032 goto finally;
3033 res = PyTuple_Pack(2, s0, s1);
3034
3035finally:
3036 if (res == NULL) {
3037 if (s0 == NULL)
3038 SOCKETCLOSE(sv[0]);
3039 if (s1 == NULL)
3040 SOCKETCLOSE(sv[1]);
3041 }
3042 Py_XDECREF(s0);
3043 Py_XDECREF(s1);
3044 return res;
3045}
3046
3047PyDoc_STRVAR(socketpair_doc,
3048"socketpair([family[, type[, proto]]]) -> (socket object, socket object)\n\
3049\n\
3050Create a pair of socket objects from the sockets returned by the platform\n\
3051socketpair() function.\n\
Dave Cole07fda7e2004-08-23 05:16:23 +00003052The arguments are the same as for socket() except the default family is\n\
Dave Colee8bbfe42004-08-26 00:51:16 +00003053AF_UNIX if defined on the platform; otherwise, the default is AF_INET.");
Dave Cole331708b2004-08-09 04:51:41 +00003054
3055#endif /* HAVE_SOCKETPAIR */
3056
3057
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00003058#ifndef NO_DUP
Guido van Rossum2a7178e1992-12-08 13:38:24 +00003059/* Create a socket object from a numeric file description.
3060 Useful e.g. if stdin is a socket.
3061 Additional arguments as for socket(). */
3062
3063/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00003064static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003065socket_fromfd(PyObject *self, PyObject *args)
Guido van Rossum2a7178e1992-12-08 13:38:24 +00003066{
Guido van Rossum73624e91994-10-10 17:59:00 +00003067 PySocketSockObject *s;
Fred Drakea04eaad2000-06-30 02:46:07 +00003068 SOCKET_T fd;
3069 int family, type, proto = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00003070 if (!PyArg_ParseTuple(args, "iii|i:fromfd",
3071 &fd, &family, &type, &proto))
Guido van Rossumbe32c891996-06-20 16:25:29 +00003072 return NULL;
Guido van Rossum5f59d601992-12-14 16:59:51 +00003073 /* Dup the fd so it and the socket can be closed independently */
3074 fd = dup(fd);
3075 if (fd < 0)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003076 return set_error();
3077 s = new_sockobject(fd, family, type, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00003078 return (PyObject *) s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00003079}
Guido van Rossum82a5c661998-07-07 20:45:43 +00003080
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003081PyDoc_STRVAR(fromfd_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003082"fromfd(fd, family, type[, proto]) -> socket object\n\
3083\n\
3084Create a socket object from the given file descriptor.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003085The remaining arguments are the same as for socket().");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003086
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00003087#endif /* NO_DUP */
Guido van Rossum2a7178e1992-12-08 13:38:24 +00003088
Guido van Rossum82a5c661998-07-07 20:45:43 +00003089
Guido van Rossum006bf911996-06-12 04:04:55 +00003090static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003091socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00003092{
3093 int x1, x2;
3094
Guido van Rossum27fc3c02000-03-24 20:56:56 +00003095 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00003096 return NULL;
3097 }
3098 x2 = (int)ntohs((short)x1);
3099 return PyInt_FromLong(x2);
3100}
3101
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003102PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003103"ntohs(integer) -> integer\n\
3104\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003105Convert a 16-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003106
3107
Guido van Rossum006bf911996-06-12 04:04:55 +00003108static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003109socket_ntohl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00003110{
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003111 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00003112
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003113 if (PyInt_Check(arg)) {
3114 x = PyInt_AS_LONG(arg);
Jeremy Hylton825e47b2002-07-25 16:37:51 +00003115 if (x == (unsigned long) -1 && PyErr_Occurred())
3116 return NULL;
Guido van Rossum006bf911996-06-12 04:04:55 +00003117 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003118 else if (PyLong_Check(arg)) {
3119 x = PyLong_AsUnsignedLong(arg);
Jeremy Hylton825e47b2002-07-25 16:37:51 +00003120 if (x == (unsigned long) -1 && PyErr_Occurred())
3121 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003122#if SIZEOF_LONG > 4
3123 {
3124 unsigned long y;
3125 /* only want the trailing 32 bits */
3126 y = x & 0xFFFFFFFFUL;
3127 if (y ^ x)
3128 return PyErr_Format(PyExc_OverflowError,
3129 "long int larger than 32 bits");
3130 x = y;
Tim Peters58141872002-08-06 22:25:02 +00003131 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003132#endif
3133 }
3134 else
Tim Peters58141872002-08-06 22:25:02 +00003135 return PyErr_Format(PyExc_TypeError,
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003136 "expected int/long, %s found",
3137 arg->ob_type->tp_name);
3138 if (x == (unsigned long) -1 && PyErr_Occurred())
3139 return NULL;
3140 return PyInt_FromLong(ntohl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00003141}
3142
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003143PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003144"ntohl(integer) -> integer\n\
3145\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003146Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003147
3148
Guido van Rossum006bf911996-06-12 04:04:55 +00003149static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003150socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00003151{
Hye-Shik Changa7b673f2003-12-17 09:40:23 +00003152 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00003153
Guido van Rossum27fc3c02000-03-24 20:56:56 +00003154 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00003155 return NULL;
3156 }
3157 x2 = (int)htons((short)x1);
3158 return PyInt_FromLong(x2);
3159}
3160
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003161PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003162"htons(integer) -> integer\n\
3163\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003164Convert a 16-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003165
3166
Guido van Rossum006bf911996-06-12 04:04:55 +00003167static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003168socket_htonl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00003169{
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003170 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00003171
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003172 if (PyInt_Check(arg)) {
3173 x = PyInt_AS_LONG(arg);
Jeremy Hylton825e47b2002-07-25 16:37:51 +00003174 if (x == (unsigned long) -1 && PyErr_Occurred())
3175 return NULL;
Guido van Rossum006bf911996-06-12 04:04:55 +00003176 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003177 else if (PyLong_Check(arg)) {
3178 x = PyLong_AsUnsignedLong(arg);
Jeremy Hylton825e47b2002-07-25 16:37:51 +00003179 if (x == (unsigned long) -1 && PyErr_Occurred())
3180 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003181#if SIZEOF_LONG > 4
3182 {
3183 unsigned long y;
3184 /* only want the trailing 32 bits */
3185 y = x & 0xFFFFFFFFUL;
3186 if (y ^ x)
3187 return PyErr_Format(PyExc_OverflowError,
3188 "long int larger than 32 bits");
3189 x = y;
Tim Peters58141872002-08-06 22:25:02 +00003190 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003191#endif
3192 }
3193 else
Tim Peters58141872002-08-06 22:25:02 +00003194 return PyErr_Format(PyExc_TypeError,
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003195 "expected int/long, %s found",
3196 arg->ob_type->tp_name);
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003197 return PyInt_FromLong(htonl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00003198}
3199
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003200PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003201"htonl(integer) -> integer\n\
3202\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003203Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003204
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003205/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003206
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003207PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003208"inet_aton(string) -> packed 32-bit IP representation\n\
3209\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003210Convert 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 +00003211binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003212
3213static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003214socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003215{
Guido van Rossuma2e48551999-09-09 15:42:59 +00003216#ifndef INADDR_NONE
3217#define INADDR_NONE (-1)
3218#endif
Neal Norwitz88f115b2003-02-13 02:15:42 +00003219#ifdef HAVE_INET_ATON
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003220 struct in_addr buf;
Tim Peters1df9fdd2003-02-13 03:13:40 +00003221#else
3222 /* Have to use inet_addr() instead */
3223 unsigned long packed_addr;
3224#endif
3225 char *ip_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003226
Tim Peters1df9fdd2003-02-13 03:13:40 +00003227 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003228 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003229
Tim Peters1df9fdd2003-02-13 03:13:40 +00003230
3231#ifdef HAVE_INET_ATON
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003232 if (inet_aton(ip_addr, &buf))
3233 return PyString_FromStringAndSize((char *)(&buf),
3234 sizeof(buf));
3235
3236 PyErr_SetString(socket_error,
3237 "illegal IP address string passed to inet_aton");
3238 return NULL;
3239
Tim Peters1df9fdd2003-02-13 03:13:40 +00003240#else /* ! HAVE_INET_ATON */
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003241 /* XXX Problem here: inet_aton('255.255.255.255') raises
3242 an exception while it should be a valid address. */
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003243 packed_addr = inet_addr(ip_addr);
3244
3245 if (packed_addr == INADDR_NONE) { /* invalid address */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003246 PyErr_SetString(socket_error,
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003247 "illegal IP address string passed to inet_aton");
3248 return NULL;
3249 }
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003250 return PyString_FromStringAndSize((char *) &packed_addr,
3251 sizeof(packed_addr));
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003252#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003253}
3254
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003255PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00003256"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003257\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003258Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003259
3260static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003261socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003262{
3263 char *packed_str;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003264 int addr_len;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003265 struct in_addr packed_addr;
3266
Guido van Rossum27fc3c02000-03-24 20:56:56 +00003267 if (!PyArg_ParseTuple(args, "s#:inet_ntoa", &packed_str, &addr_len)) {
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003268 return NULL;
3269 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00003270
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003271 if (addr_len != sizeof(packed_addr)) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003272 PyErr_SetString(socket_error,
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003273 "packed IP wrong length for inet_ntoa");
3274 return NULL;
3275 }
3276
3277 memcpy(&packed_addr, packed_str, addr_len);
3278
3279 return PyString_FromString(inet_ntoa(packed_addr));
3280}
Guido van Rossum82a5c661998-07-07 20:45:43 +00003281
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003282#ifdef HAVE_INET_PTON
3283
3284PyDoc_STRVAR(inet_pton_doc,
3285"inet_pton(af, ip) -> packed IP address string\n\
3286\n\
3287Convert an IP address from string format to a packed string suitable\n\
3288for use with low-level network functions.");
3289
3290static PyObject *
3291socket_inet_pton(PyObject *self, PyObject *args)
3292{
3293 int af;
3294 char* ip;
3295 int retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003296#ifdef ENABLE_IPV6
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003297 char packed[MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003298#else
3299 char packed[sizeof(struct in_addr)];
3300#endif
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003301 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
3302 return NULL;
3303 }
3304
Martin v. Löwis04697e82004-06-02 12:35:29 +00003305#if !defined(ENABLE_IPV6) && defined(AF_INET6)
Martin v. Löwis10649092003-08-05 06:25:06 +00003306 if(af == AF_INET6) {
3307 PyErr_SetString(socket_error,
3308 "can't use AF_INET6, IPv6 is disabled");
3309 return NULL;
3310 }
3311#endif
3312
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003313 retval = inet_pton(af, ip, packed);
3314 if (retval < 0) {
3315 PyErr_SetFromErrno(socket_error);
3316 return NULL;
3317 } else if (retval == 0) {
3318 PyErr_SetString(socket_error,
3319 "illegal IP address string passed to inet_pton");
3320 return NULL;
3321 } else if (af == AF_INET) {
3322 return PyString_FromStringAndSize(packed,
3323 sizeof(struct in_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003324#ifdef ENABLE_IPV6
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003325 } else if (af == AF_INET6) {
3326 return PyString_FromStringAndSize(packed,
3327 sizeof(struct in6_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003328#endif
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003329 } else {
3330 PyErr_SetString(socket_error, "unknown address family");
3331 return NULL;
3332 }
3333}
3334
3335PyDoc_STRVAR(inet_ntop_doc,
3336"inet_ntop(af, packed_ip) -> string formatted IP address\n\
3337\n\
3338Convert a packed IP address of the given family to string format.");
3339
3340static PyObject *
3341socket_inet_ntop(PyObject *self, PyObject *args)
3342{
3343 int af;
3344 char* packed;
3345 int len;
3346 const char* retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003347#ifdef ENABLE_IPV6
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003348 char ip[MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003349#else
3350 char ip[INET_ADDRSTRLEN + 1];
3351#endif
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003352
3353 /* Guarantee NUL-termination for PyString_FromString() below */
Jeremy Hylton80961f32004-11-07 14:24:25 +00003354 memset((void *) &ip[0], '\0', sizeof(ip));
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003355
3356 if (!PyArg_ParseTuple(args, "is#:inet_ntop", &af, &packed, &len)) {
3357 return NULL;
3358 }
3359
3360 if (af == AF_INET) {
3361 if (len != sizeof(struct in_addr)) {
3362 PyErr_SetString(PyExc_ValueError,
3363 "invalid length of packed IP address string");
3364 return NULL;
3365 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003366#ifdef ENABLE_IPV6
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003367 } else if (af == AF_INET6) {
3368 if (len != sizeof(struct in6_addr)) {
3369 PyErr_SetString(PyExc_ValueError,
3370 "invalid length of packed IP address string");
3371 return NULL;
3372 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003373#endif
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003374 } else {
3375 PyErr_Format(PyExc_ValueError,
3376 "unknown address family %d", af);
3377 return NULL;
3378 }
3379
3380 retval = inet_ntop(af, packed, ip, sizeof(ip));
3381 if (!retval) {
3382 PyErr_SetFromErrno(socket_error);
3383 return NULL;
3384 } else {
3385 return PyString_FromString(retval);
3386 }
3387
3388 /* NOTREACHED */
3389 PyErr_SetString(PyExc_RuntimeError, "invalid handling of inet_ntop");
3390 return NULL;
3391}
3392
3393#endif /* HAVE_INET_PTON */
3394
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003395/* Python interface to getaddrinfo(host, port). */
3396
3397/*ARGSUSED*/
3398static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003399socket_getaddrinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003400{
Martin v. Löwisf0b11d22001-11-07 08:31:03 +00003401 struct addrinfo hints, *res;
3402 struct addrinfo *res0 = NULL;
Martin v. Löwis2548c732003-04-18 10:39:54 +00003403 PyObject *hobj = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003404 PyObject *pobj = (PyObject *)NULL;
Martin v. Löwisf65b1a12001-08-12 09:28:40 +00003405 char pbuf[30];
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003406 char *hptr, *pptr;
3407 int family, socktype, protocol, flags;
3408 int error;
3409 PyObject *all = (PyObject *)NULL;
3410 PyObject *single = (PyObject *)NULL;
Martin v. Löwis2548c732003-04-18 10:39:54 +00003411 PyObject *idna = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003412
3413 family = socktype = protocol = flags = 0;
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00003414 family = AF_UNSPEC;
Martin v. Löwis2548c732003-04-18 10:39:54 +00003415 if (!PyArg_ParseTuple(args, "OO|iiii:getaddrinfo",
3416 &hobj, &pobj, &family, &socktype,
3417 &protocol, &flags)) {
3418 return NULL;
3419 }
3420 if (hobj == Py_None) {
3421 hptr = NULL;
3422 } else if (PyUnicode_Check(hobj)) {
3423 idna = PyObject_CallMethod(hobj, "encode", "s", "idna");
3424 if (!idna)
3425 return NULL;
3426 hptr = PyString_AsString(idna);
3427 } else if (PyString_Check(hobj)) {
3428 hptr = PyString_AsString(hobj);
3429 } else {
3430 PyErr_SetString(PyExc_TypeError,
3431 "getaddrinfo() argument 1 must be string or None");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003432 return NULL;
3433 }
3434 if (PyInt_Check(pobj)) {
Marc-André Lemburg03d1b182001-07-31 18:05:33 +00003435 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", PyInt_AsLong(pobj));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003436 pptr = pbuf;
3437 } else if (PyString_Check(pobj)) {
3438 pptr = PyString_AsString(pobj);
3439 } else if (pobj == Py_None) {
3440 pptr = (char *)NULL;
3441 } else {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003442 PyErr_SetString(socket_error, "Int or String expected");
Martin v. Löwis5db099a2003-08-07 11:55:15 +00003443 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003444 }
3445 memset(&hints, 0, sizeof(hints));
3446 hints.ai_family = family;
3447 hints.ai_socktype = socktype;
3448 hints.ai_protocol = protocol;
3449 hints.ai_flags = flags;
Just van Rossum1040d2c2003-05-09 07:53:18 +00003450 Py_BEGIN_ALLOW_THREADS
3451 ACQUIRE_GETADDRINFO_LOCK
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003452 error = getaddrinfo(hptr, pptr, &hints, &res0);
Just van Rossum1040d2c2003-05-09 07:53:18 +00003453 Py_END_ALLOW_THREADS
3454 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003455 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003456 set_gaierror(error);
Martin v. Löwis5db099a2003-08-07 11:55:15 +00003457 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003458 }
3459
3460 if ((all = PyList_New(0)) == NULL)
3461 goto err;
3462 for (res = res0; res; res = res->ai_next) {
Guido van Rossum716aac02001-10-12 18:59:27 +00003463 PyObject *addr =
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00003464 makesockaddr(-1, res->ai_addr, res->ai_addrlen, protocol);
Guido van Rossum716aac02001-10-12 18:59:27 +00003465 if (addr == NULL)
3466 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003467 single = Py_BuildValue("iiisO", res->ai_family,
3468 res->ai_socktype, res->ai_protocol,
3469 res->ai_canonname ? res->ai_canonname : "",
Guido van Rossum716aac02001-10-12 18:59:27 +00003470 addr);
3471 Py_DECREF(addr);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003472 if (single == NULL)
3473 goto err;
3474
3475 if (PyList_Append(all, single))
3476 goto err;
3477 Py_XDECREF(single);
3478 }
Martin v. Löwis2548c732003-04-18 10:39:54 +00003479 Py_XDECREF(idna);
Neal Norwitz90128ba2002-08-09 03:37:42 +00003480 if (res0)
3481 freeaddrinfo(res0);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003482 return all;
3483 err:
3484 Py_XDECREF(single);
3485 Py_XDECREF(all);
Martin v. Löwis2548c732003-04-18 10:39:54 +00003486 Py_XDECREF(idna);
Martin v. Löwisf0b11d22001-11-07 08:31:03 +00003487 if (res0)
3488 freeaddrinfo(res0);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003489 return (PyObject *)NULL;
3490}
3491
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003492PyDoc_STRVAR(getaddrinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003493"getaddrinfo(host, port [, family, socktype, proto, flags])\n\
3494 -> list of (family, socktype, proto, canonname, sockaddr)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003495\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003496Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003497
3498/* Python interface to getnameinfo(sa, flags). */
3499
3500/*ARGSUSED*/
3501static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003502socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003503{
3504 PyObject *sa = (PyObject *)NULL;
3505 int flags;
3506 char *hostp;
Martin v. Löwis06b1d212001-11-02 23:34:52 +00003507 int port, flowinfo, scope_id;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003508 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
3509 struct addrinfo hints, *res = NULL;
3510 int error;
3511 PyObject *ret = (PyObject *)NULL;
3512
3513 flags = flowinfo = scope_id = 0;
Martin v. Löwis06b1d212001-11-02 23:34:52 +00003514 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003515 return NULL;
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003516 if (!PyArg_ParseTuple(sa, "si|ii",
3517 &hostp, &port, &flowinfo, &scope_id))
Martin v. Löwis06b1d212001-11-02 23:34:52 +00003518 return NULL;
Marc-André Lemburg03d1b182001-07-31 18:05:33 +00003519 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003520 memset(&hints, 0, sizeof(hints));
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00003521 hints.ai_family = AF_UNSPEC;
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003522 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Just van Rossum1040d2c2003-05-09 07:53:18 +00003523 Py_BEGIN_ALLOW_THREADS
3524 ACQUIRE_GETADDRINFO_LOCK
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003525 error = getaddrinfo(hostp, pbuf, &hints, &res);
Just van Rossum1040d2c2003-05-09 07:53:18 +00003526 Py_END_ALLOW_THREADS
3527 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003528 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003529 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003530 goto fail;
3531 }
3532 if (res->ai_next) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003533 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003534 "sockaddr resolved to multiple addresses");
3535 goto fail;
3536 }
3537 switch (res->ai_family) {
3538 case AF_INET:
3539 {
3540 char *t1;
3541 int t2;
3542 if (PyArg_ParseTuple(sa, "si", &t1, &t2) == 0) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003543 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003544 "IPv4 sockaddr must be 2 tuple");
3545 goto fail;
3546 }
3547 break;
3548 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00003549#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003550 case AF_INET6:
3551 {
3552 struct sockaddr_in6 *sin6;
3553 sin6 = (struct sockaddr_in6 *)res->ai_addr;
3554 sin6->sin6_flowinfo = flowinfo;
3555 sin6->sin6_scope_id = scope_id;
3556 break;
3557 }
3558#endif
3559 }
3560 error = getnameinfo(res->ai_addr, res->ai_addrlen,
3561 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
3562 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003563 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003564 goto fail;
3565 }
3566 ret = Py_BuildValue("ss", hbuf, pbuf);
3567
3568fail:
3569 if (res)
3570 freeaddrinfo(res);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003571 return ret;
3572}
3573
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003574PyDoc_STRVAR(getnameinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003575"getnameinfo(sockaddr, flags) --> (host, port)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003576\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003577Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003578
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00003579
3580/* Python API to getting and setting the default timeout value. */
3581
3582static PyObject *
3583socket_getdefaulttimeout(PyObject *self)
3584{
3585 if (defaulttimeout < 0.0) {
3586 Py_INCREF(Py_None);
3587 return Py_None;
3588 }
3589 else
3590 return PyFloat_FromDouble(defaulttimeout);
3591}
3592
3593PyDoc_STRVAR(getdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003594"getdefaulttimeout() -> timeout\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00003595\n\
3596Returns the default timeout in floating seconds for new socket objects.\n\
3597A value of None indicates that new socket objects have no timeout.\n\
3598When the socket module is first imported, the default is None.");
3599
3600static PyObject *
3601socket_setdefaulttimeout(PyObject *self, PyObject *arg)
3602{
3603 double timeout;
3604
3605 if (arg == Py_None)
3606 timeout = -1.0;
3607 else {
3608 timeout = PyFloat_AsDouble(arg);
3609 if (timeout < 0.0) {
3610 if (!PyErr_Occurred())
3611 PyErr_SetString(PyExc_ValueError,
3612 "Timeout value out of range");
3613 return NULL;
3614 }
3615 }
3616
3617 defaulttimeout = timeout;
3618
3619 Py_INCREF(Py_None);
3620 return Py_None;
3621}
3622
3623PyDoc_STRVAR(setdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003624"setdefaulttimeout(timeout)\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00003625\n\
3626Set the default timeout in floating seconds for new socket objects.\n\
3627A value of None indicates that new socket objects have no timeout.\n\
3628When the socket module is first imported, the default is None.");
3629
3630
Guido van Rossum30a685f1991-06-27 15:51:29 +00003631/* List of functions exported by this module. */
3632
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003633static PyMethodDef socket_methods[] = {
3634 {"gethostbyname", socket_gethostbyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003635 METH_VARARGS, gethostbyname_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003636 {"gethostbyname_ex", socket_gethostbyname_ex,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003637 METH_VARARGS, ghbn_ex_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003638 {"gethostbyaddr", socket_gethostbyaddr,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003639 METH_VARARGS, gethostbyaddr_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003640 {"gethostname", socket_gethostname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003641 METH_VARARGS, gethostname_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003642 {"getservbyname", socket_getservbyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003643 METH_VARARGS, getservbyname_doc},
Barry Warsaw11b91a02004-06-28 00:50:43 +00003644 {"getservbyport", socket_getservbyport,
3645 METH_VARARGS, getservbyport_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003646 {"getprotobyname", socket_getprotobyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003647 METH_VARARGS,getprotobyname_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00003648#ifndef NO_DUP
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003649 {"fromfd", socket_fromfd,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003650 METH_VARARGS, fromfd_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00003651#endif
Dave Cole331708b2004-08-09 04:51:41 +00003652#ifdef HAVE_SOCKETPAIR
3653 {"socketpair", socket_socketpair,
3654 METH_VARARGS, socketpair_doc},
3655#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003656 {"ntohs", socket_ntohs,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003657 METH_VARARGS, ntohs_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003658 {"ntohl", socket_ntohl,
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003659 METH_O, ntohl_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003660 {"htons", socket_htons,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003661 METH_VARARGS, htons_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003662 {"htonl", socket_htonl,
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003663 METH_O, htonl_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003664 {"inet_aton", socket_inet_aton,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003665 METH_VARARGS, inet_aton_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003666 {"inet_ntoa", socket_inet_ntoa,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003667 METH_VARARGS, inet_ntoa_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003668#ifdef HAVE_INET_PTON
3669 {"inet_pton", socket_inet_pton,
3670 METH_VARARGS, inet_pton_doc},
3671 {"inet_ntop", socket_inet_ntop,
3672 METH_VARARGS, inet_ntop_doc},
3673#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003674 {"getaddrinfo", socket_getaddrinfo,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003675 METH_VARARGS, getaddrinfo_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003676 {"getnameinfo", socket_getnameinfo,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003677 METH_VARARGS, getnameinfo_doc},
Guido van Rossum1693ba82002-07-18 21:11:26 +00003678 {"getdefaulttimeout", (PyCFunction)socket_getdefaulttimeout,
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00003679 METH_NOARGS, getdefaulttimeout_doc},
3680 {"setdefaulttimeout", socket_setdefaulttimeout,
3681 METH_O, setdefaulttimeout_doc},
Guido van Rossum30a685f1991-06-27 15:51:29 +00003682 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003683};
3684
Guido van Rossum30a685f1991-06-27 15:51:29 +00003685
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003686#ifdef RISCOS
3687#define OS_INIT_DEFINED
Guido van Rossumbe32c891996-06-20 16:25:29 +00003688
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003689static int
3690os_init(void)
3691{
3692 _kernel_swi_regs r;
3693
3694 r.r[0] = 0;
3695 _kernel_swi(0x43380, &r, &r);
3696 taskwindow = r.r[0];
3697
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003698 return 1;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003699}
3700
3701#endif /* RISCOS */
3702
3703
3704#ifdef MS_WINDOWS
3705#define OS_INIT_DEFINED
3706
3707/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00003708
3709static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003710os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00003711{
3712 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00003713}
3714
3715static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003716os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00003717{
3718 WSADATA WSAData;
3719 int ret;
3720 char buf[100];
3721 ret = WSAStartup(0x0101, &WSAData);
3722 switch (ret) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003723 case 0: /* No error */
Mark Hammond14350ab2003-07-09 04:57:46 +00003724 Py_AtExit(os_cleanup);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003725 return 1; /* Success */
Guido van Rossumbe32c891996-06-20 16:25:29 +00003726 case WSASYSNOTREADY:
3727 PyErr_SetString(PyExc_ImportError,
3728 "WSAStartup failed: network not ready");
3729 break;
3730 case WSAVERNOTSUPPORTED:
3731 case WSAEINVAL:
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003732 PyErr_SetString(
3733 PyExc_ImportError,
3734 "WSAStartup failed: requested version not supported");
Guido van Rossumbe32c891996-06-20 16:25:29 +00003735 break;
3736 default:
Tim Peters885d4572001-11-28 20:27:42 +00003737 PyOS_snprintf(buf, sizeof(buf),
3738 "WSAStartup failed: error code %d", ret);
Guido van Rossumbe32c891996-06-20 16:25:29 +00003739 PyErr_SetString(PyExc_ImportError, buf);
3740 break;
3741 }
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003742 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00003743}
3744
Guido van Rossum8d665e61996-06-26 18:22:49 +00003745#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00003746
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003747
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003748#ifdef PYOS_OS2
3749#define OS_INIT_DEFINED
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003750
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003751/* Additional initialization for OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003752
3753static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003754os_init(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003755{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003756#ifndef PYCC_GCC
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003757 char reason[64];
3758 int rc = sock_init();
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003759
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003760 if (rc == 0) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003761 return 1; /* Success */
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003762 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003763
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003764 PyOS_snprintf(reason, sizeof(reason),
3765 "OS/2 TCP/IP Error# %d", sock_errno());
3766 PyErr_SetString(PyExc_ImportError, reason);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003767
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003768 return 0; /* Failure */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00003769#else
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003770 /* No need to initialise sockets with GCC/EMX */
3771 return 1; /* Success */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00003772#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003773}
3774
3775#endif /* PYOS_OS2 */
3776
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003777
3778#ifndef OS_INIT_DEFINED
3779static int
3780os_init(void)
3781{
3782 return 1; /* Success */
3783}
3784#endif
3785
3786
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00003787/* C API table - always add new things to the end for binary
3788 compatibility. */
3789static
3790PySocketModule_APIObject PySocketModuleAPI =
3791{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003792 &sock_type,
Brett Cannon06c34792004-03-23 23:16:54 +00003793 NULL
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00003794};
3795
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003796
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003797/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003798
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003799 This module is actually called "_socket", and there's a wrapper
3800 "socket.py" which implements some additional functionality. On some
3801 platforms (e.g. Windows and OS/2), socket.py also implements a
3802 wrapper for the socket type that provides missing functionality such
3803 as makefile(), dup() and fromfd(). The import of "_socket" may fail
3804 with an ImportError exception if os-specific initialization fails.
3805 On Windows, this does WINSOCK initialization. When WINSOCK is
3806 initialized succesfully, a call to WSACleanup() is scheduled to be
3807 made at exit time.
3808*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003809
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003810PyDoc_STRVAR(socket_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003811"Implementation module for socket operations.\n\
3812\n\
3813See the socket module for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003814
Mark Hammondfe51c6d2002-08-02 02:27:13 +00003815PyMODINIT_FUNC
Thomas Wouters1e0c2f42000-07-24 16:06:23 +00003816init_socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003817{
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003818 PyObject *m, *has_ipv6;
Fred Drake4baedc12002-04-01 14:53:37 +00003819
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003820 if (!os_init())
Guido van Rossum0cb96de1997-10-01 04:29:29 +00003821 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003822
3823 sock_type.ob_type = &PyType_Type;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003824 m = Py_InitModule3(PySocket_MODULE_NAME,
3825 socket_methods,
3826 socket_doc);
3827
3828 socket_error = PyErr_NewException("socket.error", NULL, NULL);
3829 if (socket_error == NULL)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003830 return;
Brett Cannon06c34792004-03-23 23:16:54 +00003831 PySocketModuleAPI.error = socket_error;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003832 Py_INCREF(socket_error);
3833 PyModule_AddObject(m, "error", socket_error);
3834 socket_herror = PyErr_NewException("socket.herror",
3835 socket_error, NULL);
3836 if (socket_herror == NULL)
3837 return;
3838 Py_INCREF(socket_herror);
3839 PyModule_AddObject(m, "herror", socket_herror);
3840 socket_gaierror = PyErr_NewException("socket.gaierror", socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003841 NULL);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003842 if (socket_gaierror == NULL)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003843 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003844 Py_INCREF(socket_gaierror);
3845 PyModule_AddObject(m, "gaierror", socket_gaierror);
Raymond Hettingeref7343c2003-06-29 03:08:05 +00003846 socket_timeout = PyErr_NewException("socket.timeout",
3847 socket_error, NULL);
3848 if (socket_timeout == NULL)
3849 return;
3850 Py_INCREF(socket_timeout);
3851 PyModule_AddObject(m, "timeout", socket_timeout);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003852 Py_INCREF((PyObject *)&sock_type);
Fred Drake4baedc12002-04-01 14:53:37 +00003853 if (PyModule_AddObject(m, "SocketType",
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003854 (PyObject *)&sock_type) != 0)
Guido van Rossum0cb96de1997-10-01 04:29:29 +00003855 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003856 Py_INCREF((PyObject *)&sock_type);
Fred Drake4baedc12002-04-01 14:53:37 +00003857 if (PyModule_AddObject(m, "socket",
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003858 (PyObject *)&sock_type) != 0)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003859 return;
Guido van Rossum09be4091999-08-09 14:40:40 +00003860
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003861#ifdef ENABLE_IPV6
3862 has_ipv6 = Py_True;
3863#else
3864 has_ipv6 = Py_False;
3865#endif
3866 Py_INCREF(has_ipv6);
3867 PyModule_AddObject(m, "has_ipv6", has_ipv6);
3868
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00003869 /* Export C API */
Fred Drake4baedc12002-04-01 14:53:37 +00003870 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00003871 PyCObject_FromVoidPtr((void *)&PySocketModuleAPI, NULL)
3872 ) != 0)
3873 return;
3874
Guido van Rossum09be4091999-08-09 14:40:40 +00003875 /* Address families (we only support AF_INET and AF_UNIX) */
3876#ifdef AF_UNSPEC
Fred Drake4baedc12002-04-01 14:53:37 +00003877 PyModule_AddIntConstant(m, "AF_UNSPEC", AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00003878#endif
Fred Drake4baedc12002-04-01 14:53:37 +00003879 PyModule_AddIntConstant(m, "AF_INET", AF_INET);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003880#ifdef AF_INET6
Fred Drake4baedc12002-04-01 14:53:37 +00003881 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003882#endif /* AF_INET6 */
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00003883#if defined(AF_UNIX)
Fred Drake4baedc12002-04-01 14:53:37 +00003884 PyModule_AddIntConstant(m, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00003885#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00003886#ifdef AF_AX25
Fred Drake4baedc12002-04-01 14:53:37 +00003887 /* Amateur Radio AX.25 */
3888 PyModule_AddIntConstant(m, "AF_AX25", AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00003889#endif
3890#ifdef AF_IPX
Fred Drake4baedc12002-04-01 14:53:37 +00003891 PyModule_AddIntConstant(m, "AF_IPX", AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00003892#endif
3893#ifdef AF_APPLETALK
Fred Drake4baedc12002-04-01 14:53:37 +00003894 /* Appletalk DDP */
3895 PyModule_AddIntConstant(m, "AF_APPLETALK", AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00003896#endif
3897#ifdef AF_NETROM
Fred Drake4baedc12002-04-01 14:53:37 +00003898 /* Amateur radio NetROM */
3899 PyModule_AddIntConstant(m, "AF_NETROM", AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00003900#endif
3901#ifdef AF_BRIDGE
Fred Drake4baedc12002-04-01 14:53:37 +00003902 /* Multiprotocol bridge */
3903 PyModule_AddIntConstant(m, "AF_BRIDGE", AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00003904#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00003905#ifdef AF_ATMPVC
3906 /* ATM PVCs */
3907 PyModule_AddIntConstant(m, "AF_ATMPVC", AF_ATMPVC);
3908#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00003909#ifdef AF_AAL5
Fred Drake4baedc12002-04-01 14:53:37 +00003910 /* Reserved for Werner's ATM */
3911 PyModule_AddIntConstant(m, "AF_AAL5", AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00003912#endif
3913#ifdef AF_X25
Fred Drake4baedc12002-04-01 14:53:37 +00003914 /* Reserved for X.25 project */
3915 PyModule_AddIntConstant(m, "AF_X25", AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00003916#endif
3917#ifdef AF_INET6
Fred Drake4baedc12002-04-01 14:53:37 +00003918 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00003919#endif
3920#ifdef AF_ROSE
Fred Drake4baedc12002-04-01 14:53:37 +00003921 /* Amateur Radio X.25 PLP */
3922 PyModule_AddIntConstant(m, "AF_ROSE", AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00003923#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00003924#ifdef AF_DECnet
3925 /* Reserved for DECnet project */
3926 PyModule_AddIntConstant(m, "AF_DECnet", AF_DECnet);
3927#endif
3928#ifdef AF_NETBEUI
3929 /* Reserved for 802.2LLC project */
3930 PyModule_AddIntConstant(m, "AF_NETBEUI", AF_NETBEUI);
3931#endif
3932#ifdef AF_SECURITY
3933 /* Security callback pseudo AF */
3934 PyModule_AddIntConstant(m, "AF_SECURITY", AF_SECURITY);
3935#endif
3936#ifdef AF_KEY
3937 /* PF_KEY key management API */
3938 PyModule_AddIntConstant(m, "AF_KEY", AF_KEY);
3939#endif
3940#ifdef AF_NETLINK
3941 /* */
3942 PyModule_AddIntConstant(m, "AF_NETLINK", AF_NETLINK);
3943#endif
3944#ifdef AF_ROUTE
3945 /* Alias to emulate 4.4BSD */
3946 PyModule_AddIntConstant(m, "AF_ROUTE", AF_ROUTE);
3947#endif
3948#ifdef AF_ASH
3949 /* Ash */
3950 PyModule_AddIntConstant(m, "AF_ASH", AF_ASH);
3951#endif
3952#ifdef AF_ECONET
3953 /* Acorn Econet */
3954 PyModule_AddIntConstant(m, "AF_ECONET", AF_ECONET);
3955#endif
3956#ifdef AF_ATMSVC
3957 /* ATM SVCs */
3958 PyModule_AddIntConstant(m, "AF_ATMSVC", AF_ATMSVC);
3959#endif
3960#ifdef AF_SNA
3961 /* Linux SNA Project (nutters!) */
3962 PyModule_AddIntConstant(m, "AF_SNA", AF_SNA);
3963#endif
3964#ifdef AF_IRDA
3965 /* IRDA sockets */
3966 PyModule_AddIntConstant(m, "AF_IRDA", AF_IRDA);
3967#endif
3968#ifdef AF_PPPOX
3969 /* PPPoX sockets */
3970 PyModule_AddIntConstant(m, "AF_PPPOX", AF_PPPOX);
3971#endif
3972#ifdef AF_WANPIPE
3973 /* Wanpipe API Sockets */
3974 PyModule_AddIntConstant(m, "AF_WANPIPE", AF_WANPIPE);
3975#endif
3976#ifdef AF_LLC
3977 /* Linux LLC */
3978 PyModule_AddIntConstant(m, "AF_LLC", AF_LLC);
3979#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00003980
Hye-Shik Chang81268602004-02-02 06:05:24 +00003981#ifdef USE_BLUETOOTH
Martin v. Löwis12af0482004-01-31 12:34:17 +00003982 PyModule_AddIntConstant(m, "AF_BLUETOOTH", AF_BLUETOOTH);
3983 PyModule_AddIntConstant(m, "BTPROTO_L2CAP", BTPROTO_L2CAP);
Hye-Shik Chang81268602004-02-02 06:05:24 +00003984#if !defined(__FreeBSD__)
Martin v. Löwis12af0482004-01-31 12:34:17 +00003985 PyModule_AddIntConstant(m, "BTPROTO_SCO", BTPROTO_SCO);
Hye-Shik Chang81268602004-02-02 06:05:24 +00003986#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00003987 PyModule_AddIntConstant(m, "BTPROTO_RFCOMM", BTPROTO_RFCOMM);
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00003988 PyModule_AddObject(m, "BDADDR_ANY", Py_BuildValue("s", "00:00:00:00:00:00"));
3989 PyModule_AddObject(m, "BDADDR_LOCAL", Py_BuildValue("s", "00:00:00:FF:FF:FF"));
Martin v. Löwis12af0482004-01-31 12:34:17 +00003990#endif
3991
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00003992#ifdef HAVE_NETPACKET_PACKET_H
Fred Drake4baedc12002-04-01 14:53:37 +00003993 PyModule_AddIntConstant(m, "AF_PACKET", AF_PACKET);
3994 PyModule_AddIntConstant(m, "PF_PACKET", PF_PACKET);
3995 PyModule_AddIntConstant(m, "PACKET_HOST", PACKET_HOST);
3996 PyModule_AddIntConstant(m, "PACKET_BROADCAST", PACKET_BROADCAST);
3997 PyModule_AddIntConstant(m, "PACKET_MULTICAST", PACKET_MULTICAST);
3998 PyModule_AddIntConstant(m, "PACKET_OTHERHOST", PACKET_OTHERHOST);
3999 PyModule_AddIntConstant(m, "PACKET_OUTGOING", PACKET_OUTGOING);
4000 PyModule_AddIntConstant(m, "PACKET_LOOPBACK", PACKET_LOOPBACK);
4001 PyModule_AddIntConstant(m, "PACKET_FASTROUTE", PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00004002#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00004003
4004 /* Socket types */
Fred Drake4baedc12002-04-01 14:53:37 +00004005 PyModule_AddIntConstant(m, "SOCK_STREAM", SOCK_STREAM);
4006 PyModule_AddIntConstant(m, "SOCK_DGRAM", SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00004007#ifndef __BEOS__
4008/* We have incomplete socket support. */
Fred Drake4baedc12002-04-01 14:53:37 +00004009 PyModule_AddIntConstant(m, "SOCK_RAW", SOCK_RAW);
4010 PyModule_AddIntConstant(m, "SOCK_SEQPACKET", SOCK_SEQPACKET);
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00004011#if defined(SOCK_RDM)
Fred Drake4baedc12002-04-01 14:53:37 +00004012 PyModule_AddIntConstant(m, "SOCK_RDM", SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00004013#endif
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00004014#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004015
4016#ifdef SO_DEBUG
Fred Drake4baedc12002-04-01 14:53:37 +00004017 PyModule_AddIntConstant(m, "SO_DEBUG", SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004018#endif
4019#ifdef SO_ACCEPTCONN
Fred Drake4baedc12002-04-01 14:53:37 +00004020 PyModule_AddIntConstant(m, "SO_ACCEPTCONN", SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004021#endif
4022#ifdef SO_REUSEADDR
Fred Drake4baedc12002-04-01 14:53:37 +00004023 PyModule_AddIntConstant(m, "SO_REUSEADDR", SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004024#endif
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00004025#ifdef SO_EXCLUSIVEADDRUSE
4026 PyModule_AddIntConstant(m, "SO_EXCLUSIVEADDRUSE", SO_EXCLUSIVEADDRUSE);
4027#endif
4028
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004029#ifdef SO_KEEPALIVE
Fred Drake4baedc12002-04-01 14:53:37 +00004030 PyModule_AddIntConstant(m, "SO_KEEPALIVE", SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004031#endif
4032#ifdef SO_DONTROUTE
Fred Drake4baedc12002-04-01 14:53:37 +00004033 PyModule_AddIntConstant(m, "SO_DONTROUTE", SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004034#endif
4035#ifdef SO_BROADCAST
Fred Drake4baedc12002-04-01 14:53:37 +00004036 PyModule_AddIntConstant(m, "SO_BROADCAST", SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004037#endif
4038#ifdef SO_USELOOPBACK
Fred Drake4baedc12002-04-01 14:53:37 +00004039 PyModule_AddIntConstant(m, "SO_USELOOPBACK", SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004040#endif
4041#ifdef SO_LINGER
Fred Drake4baedc12002-04-01 14:53:37 +00004042 PyModule_AddIntConstant(m, "SO_LINGER", SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004043#endif
4044#ifdef SO_OOBINLINE
Fred Drake4baedc12002-04-01 14:53:37 +00004045 PyModule_AddIntConstant(m, "SO_OOBINLINE", SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004046#endif
4047#ifdef SO_REUSEPORT
Fred Drake4baedc12002-04-01 14:53:37 +00004048 PyModule_AddIntConstant(m, "SO_REUSEPORT", SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004049#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004050#ifdef SO_SNDBUF
Fred Drake4baedc12002-04-01 14:53:37 +00004051 PyModule_AddIntConstant(m, "SO_SNDBUF", SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004052#endif
4053#ifdef SO_RCVBUF
Fred Drake4baedc12002-04-01 14:53:37 +00004054 PyModule_AddIntConstant(m, "SO_RCVBUF", SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004055#endif
4056#ifdef SO_SNDLOWAT
Fred Drake4baedc12002-04-01 14:53:37 +00004057 PyModule_AddIntConstant(m, "SO_SNDLOWAT", SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004058#endif
4059#ifdef SO_RCVLOWAT
Fred Drake4baedc12002-04-01 14:53:37 +00004060 PyModule_AddIntConstant(m, "SO_RCVLOWAT", SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004061#endif
4062#ifdef SO_SNDTIMEO
Fred Drake4baedc12002-04-01 14:53:37 +00004063 PyModule_AddIntConstant(m, "SO_SNDTIMEO", SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004064#endif
4065#ifdef SO_RCVTIMEO
Fred Drake4baedc12002-04-01 14:53:37 +00004066 PyModule_AddIntConstant(m, "SO_RCVTIMEO", SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004067#endif
4068#ifdef SO_ERROR
Fred Drake4baedc12002-04-01 14:53:37 +00004069 PyModule_AddIntConstant(m, "SO_ERROR", SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004070#endif
4071#ifdef SO_TYPE
Fred Drake4baedc12002-04-01 14:53:37 +00004072 PyModule_AddIntConstant(m, "SO_TYPE", SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004073#endif
4074
4075 /* Maximum number of connections for "listen" */
4076#ifdef SOMAXCONN
Fred Drake4baedc12002-04-01 14:53:37 +00004077 PyModule_AddIntConstant(m, "SOMAXCONN", SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004078#else
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004079 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004080#endif
4081
4082 /* Flags for send, recv */
4083#ifdef MSG_OOB
Fred Drake4baedc12002-04-01 14:53:37 +00004084 PyModule_AddIntConstant(m, "MSG_OOB", MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004085#endif
4086#ifdef MSG_PEEK
Fred Drake4baedc12002-04-01 14:53:37 +00004087 PyModule_AddIntConstant(m, "MSG_PEEK", MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004088#endif
4089#ifdef MSG_DONTROUTE
Fred Drake4baedc12002-04-01 14:53:37 +00004090 PyModule_AddIntConstant(m, "MSG_DONTROUTE", MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004091#endif
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00004092#ifdef MSG_DONTWAIT
Fred Drake4baedc12002-04-01 14:53:37 +00004093 PyModule_AddIntConstant(m, "MSG_DONTWAIT", MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00004094#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004095#ifdef MSG_EOR
Fred Drake4baedc12002-04-01 14:53:37 +00004096 PyModule_AddIntConstant(m, "MSG_EOR", MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004097#endif
4098#ifdef MSG_TRUNC
Fred Drake4baedc12002-04-01 14:53:37 +00004099 PyModule_AddIntConstant(m, "MSG_TRUNC", MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004100#endif
4101#ifdef MSG_CTRUNC
Fred Drake4baedc12002-04-01 14:53:37 +00004102 PyModule_AddIntConstant(m, "MSG_CTRUNC", MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004103#endif
4104#ifdef MSG_WAITALL
Fred Drake4baedc12002-04-01 14:53:37 +00004105 PyModule_AddIntConstant(m, "MSG_WAITALL", MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004106#endif
4107#ifdef MSG_BTAG
Fred Drake4baedc12002-04-01 14:53:37 +00004108 PyModule_AddIntConstant(m, "MSG_BTAG", MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004109#endif
4110#ifdef MSG_ETAG
Fred Drake4baedc12002-04-01 14:53:37 +00004111 PyModule_AddIntConstant(m, "MSG_ETAG", MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004112#endif
4113
4114 /* Protocol level and numbers, usable for [gs]etsockopt */
4115#ifdef SOL_SOCKET
Fred Drake4baedc12002-04-01 14:53:37 +00004116 PyModule_AddIntConstant(m, "SOL_SOCKET", SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004117#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00004118#ifdef SOL_IP
Fred Drake4baedc12002-04-01 14:53:37 +00004119 PyModule_AddIntConstant(m, "SOL_IP", SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00004120#else
Fred Drake4baedc12002-04-01 14:53:37 +00004121 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00004122#endif
4123#ifdef SOL_IPX
Fred Drake4baedc12002-04-01 14:53:37 +00004124 PyModule_AddIntConstant(m, "SOL_IPX", SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00004125#endif
4126#ifdef SOL_AX25
Fred Drake4baedc12002-04-01 14:53:37 +00004127 PyModule_AddIntConstant(m, "SOL_AX25", SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00004128#endif
4129#ifdef SOL_ATALK
Fred Drake4baedc12002-04-01 14:53:37 +00004130 PyModule_AddIntConstant(m, "SOL_ATALK", SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00004131#endif
4132#ifdef SOL_NETROM
Fred Drake4baedc12002-04-01 14:53:37 +00004133 PyModule_AddIntConstant(m, "SOL_NETROM", SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00004134#endif
4135#ifdef SOL_ROSE
Fred Drake4baedc12002-04-01 14:53:37 +00004136 PyModule_AddIntConstant(m, "SOL_ROSE", SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00004137#endif
4138#ifdef SOL_TCP
Fred Drake4baedc12002-04-01 14:53:37 +00004139 PyModule_AddIntConstant(m, "SOL_TCP", SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00004140#else
Fred Drake4baedc12002-04-01 14:53:37 +00004141 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00004142#endif
4143#ifdef SOL_UDP
Fred Drake4baedc12002-04-01 14:53:37 +00004144 PyModule_AddIntConstant(m, "SOL_UDP", SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00004145#else
Fred Drake4baedc12002-04-01 14:53:37 +00004146 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00004147#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004148#ifdef IPPROTO_IP
Fred Drake4baedc12002-04-01 14:53:37 +00004149 PyModule_AddIntConstant(m, "IPPROTO_IP", IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00004150#else
Fred Drake4baedc12002-04-01 14:53:37 +00004151 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004152#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004153#ifdef IPPROTO_HOPOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00004154 PyModule_AddIntConstant(m, "IPPROTO_HOPOPTS", IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004155#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004156#ifdef IPPROTO_ICMP
Fred Drake4baedc12002-04-01 14:53:37 +00004157 PyModule_AddIntConstant(m, "IPPROTO_ICMP", IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00004158#else
Fred Drake4baedc12002-04-01 14:53:37 +00004159 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004160#endif
4161#ifdef IPPROTO_IGMP
Fred Drake4baedc12002-04-01 14:53:37 +00004162 PyModule_AddIntConstant(m, "IPPROTO_IGMP", IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004163#endif
4164#ifdef IPPROTO_GGP
Fred Drake4baedc12002-04-01 14:53:37 +00004165 PyModule_AddIntConstant(m, "IPPROTO_GGP", IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004166#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004167#ifdef IPPROTO_IPV4
Fred Drake4baedc12002-04-01 14:53:37 +00004168 PyModule_AddIntConstant(m, "IPPROTO_IPV4", IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004169#endif
Martin v. Löwisa0f17342003-10-03 13:56:20 +00004170#ifdef IPPROTO_IPV6
4171 PyModule_AddIntConstant(m, "IPPROTO_IPV6", IPPROTO_IPV6);
4172#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004173#ifdef IPPROTO_IPIP
Fred Drake4baedc12002-04-01 14:53:37 +00004174 PyModule_AddIntConstant(m, "IPPROTO_IPIP", IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004175#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004176#ifdef IPPROTO_TCP
Fred Drake4baedc12002-04-01 14:53:37 +00004177 PyModule_AddIntConstant(m, "IPPROTO_TCP", IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00004178#else
Fred Drake4baedc12002-04-01 14:53:37 +00004179 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004180#endif
4181#ifdef IPPROTO_EGP
Fred Drake4baedc12002-04-01 14:53:37 +00004182 PyModule_AddIntConstant(m, "IPPROTO_EGP", IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004183#endif
4184#ifdef IPPROTO_PUP
Fred Drake4baedc12002-04-01 14:53:37 +00004185 PyModule_AddIntConstant(m, "IPPROTO_PUP", IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004186#endif
4187#ifdef IPPROTO_UDP
Fred Drake4baedc12002-04-01 14:53:37 +00004188 PyModule_AddIntConstant(m, "IPPROTO_UDP", IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00004189#else
Fred Drake4baedc12002-04-01 14:53:37 +00004190 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004191#endif
4192#ifdef IPPROTO_IDP
Fred Drake4baedc12002-04-01 14:53:37 +00004193 PyModule_AddIntConstant(m, "IPPROTO_IDP", IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004194#endif
4195#ifdef IPPROTO_HELLO
Fred Drake4baedc12002-04-01 14:53:37 +00004196 PyModule_AddIntConstant(m, "IPPROTO_HELLO", IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004197#endif
4198#ifdef IPPROTO_ND
Fred Drake4baedc12002-04-01 14:53:37 +00004199 PyModule_AddIntConstant(m, "IPPROTO_ND", IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004200#endif
4201#ifdef IPPROTO_TP
Fred Drake4baedc12002-04-01 14:53:37 +00004202 PyModule_AddIntConstant(m, "IPPROTO_TP", IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004203#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004204#ifdef IPPROTO_IPV6
Fred Drake4baedc12002-04-01 14:53:37 +00004205 PyModule_AddIntConstant(m, "IPPROTO_IPV6", IPPROTO_IPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004206#endif
4207#ifdef IPPROTO_ROUTING
Fred Drake4baedc12002-04-01 14:53:37 +00004208 PyModule_AddIntConstant(m, "IPPROTO_ROUTING", IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004209#endif
4210#ifdef IPPROTO_FRAGMENT
Fred Drake4baedc12002-04-01 14:53:37 +00004211 PyModule_AddIntConstant(m, "IPPROTO_FRAGMENT", IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004212#endif
4213#ifdef IPPROTO_RSVP
Fred Drake4baedc12002-04-01 14:53:37 +00004214 PyModule_AddIntConstant(m, "IPPROTO_RSVP", IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004215#endif
4216#ifdef IPPROTO_GRE
Fred Drake4baedc12002-04-01 14:53:37 +00004217 PyModule_AddIntConstant(m, "IPPROTO_GRE", IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004218#endif
4219#ifdef IPPROTO_ESP
Fred Drake4baedc12002-04-01 14:53:37 +00004220 PyModule_AddIntConstant(m, "IPPROTO_ESP", IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004221#endif
4222#ifdef IPPROTO_AH
Fred Drake4baedc12002-04-01 14:53:37 +00004223 PyModule_AddIntConstant(m, "IPPROTO_AH", IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004224#endif
4225#ifdef IPPROTO_MOBILE
Fred Drake4baedc12002-04-01 14:53:37 +00004226 PyModule_AddIntConstant(m, "IPPROTO_MOBILE", IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004227#endif
4228#ifdef IPPROTO_ICMPV6
Fred Drake4baedc12002-04-01 14:53:37 +00004229 PyModule_AddIntConstant(m, "IPPROTO_ICMPV6", IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004230#endif
4231#ifdef IPPROTO_NONE
Fred Drake4baedc12002-04-01 14:53:37 +00004232 PyModule_AddIntConstant(m, "IPPROTO_NONE", IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004233#endif
4234#ifdef IPPROTO_DSTOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00004235 PyModule_AddIntConstant(m, "IPPROTO_DSTOPTS", IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004236#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004237#ifdef IPPROTO_XTP
Fred Drake4baedc12002-04-01 14:53:37 +00004238 PyModule_AddIntConstant(m, "IPPROTO_XTP", IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004239#endif
4240#ifdef IPPROTO_EON
Fred Drake4baedc12002-04-01 14:53:37 +00004241 PyModule_AddIntConstant(m, "IPPROTO_EON", IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004242#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004243#ifdef IPPROTO_PIM
Fred Drake4baedc12002-04-01 14:53:37 +00004244 PyModule_AddIntConstant(m, "IPPROTO_PIM", IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004245#endif
4246#ifdef IPPROTO_IPCOMP
Fred Drake4baedc12002-04-01 14:53:37 +00004247 PyModule_AddIntConstant(m, "IPPROTO_IPCOMP", IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004248#endif
4249#ifdef IPPROTO_VRRP
Fred Drake4baedc12002-04-01 14:53:37 +00004250 PyModule_AddIntConstant(m, "IPPROTO_VRRP", IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004251#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004252#ifdef IPPROTO_BIP
Fred Drake4baedc12002-04-01 14:53:37 +00004253 PyModule_AddIntConstant(m, "IPPROTO_BIP", IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004254#endif
4255/**/
4256#ifdef IPPROTO_RAW
Fred Drake4baedc12002-04-01 14:53:37 +00004257 PyModule_AddIntConstant(m, "IPPROTO_RAW", IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00004258#else
Fred Drake4baedc12002-04-01 14:53:37 +00004259 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004260#endif
4261#ifdef IPPROTO_MAX
Fred Drake4baedc12002-04-01 14:53:37 +00004262 PyModule_AddIntConstant(m, "IPPROTO_MAX", IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004263#endif
4264
4265 /* Some port configuration */
4266#ifdef IPPORT_RESERVED
Fred Drake4baedc12002-04-01 14:53:37 +00004267 PyModule_AddIntConstant(m, "IPPORT_RESERVED", IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004268#else
Fred Drake4baedc12002-04-01 14:53:37 +00004269 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004270#endif
4271#ifdef IPPORT_USERRESERVED
Fred Drake4baedc12002-04-01 14:53:37 +00004272 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004273#else
Fred Drake4baedc12002-04-01 14:53:37 +00004274 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004275#endif
4276
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004277 /* Some reserved IP v.4 addresses */
4278#ifdef INADDR_ANY
Fred Drake4baedc12002-04-01 14:53:37 +00004279 PyModule_AddIntConstant(m, "INADDR_ANY", INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004280#else
Fred Drake4baedc12002-04-01 14:53:37 +00004281 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004282#endif
4283#ifdef INADDR_BROADCAST
Fred Drake4baedc12002-04-01 14:53:37 +00004284 PyModule_AddIntConstant(m, "INADDR_BROADCAST", INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004285#else
Fred Drake4baedc12002-04-01 14:53:37 +00004286 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004287#endif
4288#ifdef INADDR_LOOPBACK
Fred Drake4baedc12002-04-01 14:53:37 +00004289 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004290#else
Fred Drake4baedc12002-04-01 14:53:37 +00004291 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004292#endif
4293#ifdef INADDR_UNSPEC_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00004294 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004295#else
Fred Drake4baedc12002-04-01 14:53:37 +00004296 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004297#endif
4298#ifdef INADDR_ALLHOSTS_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00004299 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
4300 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004301#else
Fred Drake4baedc12002-04-01 14:53:37 +00004302 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004303#endif
4304#ifdef INADDR_MAX_LOCAL_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00004305 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP",
4306 INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004307#else
Fred Drake4baedc12002-04-01 14:53:37 +00004308 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004309#endif
4310#ifdef INADDR_NONE
Fred Drake4baedc12002-04-01 14:53:37 +00004311 PyModule_AddIntConstant(m, "INADDR_NONE", INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004312#else
Fred Drake4baedc12002-04-01 14:53:37 +00004313 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004314#endif
4315
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004316 /* IPv4 [gs]etsockopt options */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004317#ifdef IP_OPTIONS
Fred Drake4baedc12002-04-01 14:53:37 +00004318 PyModule_AddIntConstant(m, "IP_OPTIONS", IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004319#endif
4320#ifdef IP_HDRINCL
Fred Drake4baedc12002-04-01 14:53:37 +00004321 PyModule_AddIntConstant(m, "IP_HDRINCL", IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004322#endif
4323#ifdef IP_TOS
Fred Drake4baedc12002-04-01 14:53:37 +00004324 PyModule_AddIntConstant(m, "IP_TOS", IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004325#endif
4326#ifdef IP_TTL
Fred Drake4baedc12002-04-01 14:53:37 +00004327 PyModule_AddIntConstant(m, "IP_TTL", IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004328#endif
4329#ifdef IP_RECVOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00004330 PyModule_AddIntConstant(m, "IP_RECVOPTS", IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004331#endif
4332#ifdef IP_RECVRETOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00004333 PyModule_AddIntConstant(m, "IP_RECVRETOPTS", IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004334#endif
4335#ifdef IP_RECVDSTADDR
Fred Drake4baedc12002-04-01 14:53:37 +00004336 PyModule_AddIntConstant(m, "IP_RECVDSTADDR", IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004337#endif
4338#ifdef IP_RETOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00004339 PyModule_AddIntConstant(m, "IP_RETOPTS", IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004340#endif
4341#ifdef IP_MULTICAST_IF
Fred Drake4baedc12002-04-01 14:53:37 +00004342 PyModule_AddIntConstant(m, "IP_MULTICAST_IF", IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004343#endif
4344#ifdef IP_MULTICAST_TTL
Fred Drake4baedc12002-04-01 14:53:37 +00004345 PyModule_AddIntConstant(m, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004346#endif
4347#ifdef IP_MULTICAST_LOOP
Fred Drake4baedc12002-04-01 14:53:37 +00004348 PyModule_AddIntConstant(m, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004349#endif
4350#ifdef IP_ADD_MEMBERSHIP
Fred Drake4baedc12002-04-01 14:53:37 +00004351 PyModule_AddIntConstant(m, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004352#endif
4353#ifdef IP_DROP_MEMBERSHIP
Fred Drake4baedc12002-04-01 14:53:37 +00004354 PyModule_AddIntConstant(m, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004355#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00004356#ifdef IP_DEFAULT_MULTICAST_TTL
Fred Drake4baedc12002-04-01 14:53:37 +00004357 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_TTL",
4358 IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00004359#endif
4360#ifdef IP_DEFAULT_MULTICAST_LOOP
Fred Drake4baedc12002-04-01 14:53:37 +00004361 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_LOOP",
4362 IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00004363#endif
4364#ifdef IP_MAX_MEMBERSHIPS
Fred Drake4baedc12002-04-01 14:53:37 +00004365 PyModule_AddIntConstant(m, "IP_MAX_MEMBERSHIPS", IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00004366#endif
4367
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004368 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
4369#ifdef IPV6_JOIN_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00004370 PyModule_AddIntConstant(m, "IPV6_JOIN_GROUP", IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004371#endif
4372#ifdef IPV6_LEAVE_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00004373 PyModule_AddIntConstant(m, "IPV6_LEAVE_GROUP", IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004374#endif
4375#ifdef IPV6_MULTICAST_HOPS
Fred Drake4baedc12002-04-01 14:53:37 +00004376 PyModule_AddIntConstant(m, "IPV6_MULTICAST_HOPS", IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004377#endif
4378#ifdef IPV6_MULTICAST_IF
Fred Drake4baedc12002-04-01 14:53:37 +00004379 PyModule_AddIntConstant(m, "IPV6_MULTICAST_IF", IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004380#endif
4381#ifdef IPV6_MULTICAST_LOOP
Fred Drake4baedc12002-04-01 14:53:37 +00004382 PyModule_AddIntConstant(m, "IPV6_MULTICAST_LOOP", IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004383#endif
4384#ifdef IPV6_UNICAST_HOPS
Fred Drake4baedc12002-04-01 14:53:37 +00004385 PyModule_AddIntConstant(m, "IPV6_UNICAST_HOPS", IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004386#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00004387 /* Additional IPV6 socket options, defined in RFC 3493 */
4388#ifdef IPV6_V6ONLY
4389 PyModule_AddIntConstant(m, "IPV6_V6ONLY", IPV6_V6ONLY);
4390#endif
4391 /* Advanced IPV6 socket options, from RFC 3542 */
4392#ifdef IPV6_CHECKSUM
4393 PyModule_AddIntConstant(m, "IPV6_CHECKSUM", IPV6_CHECKSUM);
4394#endif
4395#ifdef IPV6_DONTFRAG
4396 PyModule_AddIntConstant(m, "IPV6_DONTFRAG", IPV6_DONTFRAG);
4397#endif
4398#ifdef IPV6_DSTOPTS
4399 PyModule_AddIntConstant(m, "IPV6_DSTOPTS", IPV6_DSTOPTS);
4400#endif
4401#ifdef IPV6_HOPLIMIT
4402 PyModule_AddIntConstant(m, "IPV6_HOPLIMIT", IPV6_HOPLIMIT);
4403#endif
4404#ifdef IPV6_HOPOPTS
4405 PyModule_AddIntConstant(m, "IPV6_HOPOPTS", IPV6_HOPOPTS);
4406#endif
4407#ifdef IPV6_NEXTHOP
4408 PyModule_AddIntConstant(m, "IPV6_NEXTHOP", IPV6_NEXTHOP);
4409#endif
4410#ifdef IPV6_PATHMTU
4411 PyModule_AddIntConstant(m, "IPV6_PATHMTU", IPV6_PATHMTU);
4412#endif
4413#ifdef IPV6_PKTINFO
4414 PyModule_AddIntConstant(m, "IPV6_PKTINFO", IPV6_PKTINFO);
4415#endif
4416#ifdef IPV6_RECVDSTOPTS
4417 PyModule_AddIntConstant(m, "IPV6_RECVDSTOPTS", IPV6_RECVDSTOPTS);
4418#endif
4419#ifdef IPV6_RECVHOPLIMIT
4420 PyModule_AddIntConstant(m, "IPV6_RECVHOPLIMIT", IPV6_RECVHOPLIMIT);
4421#endif
4422#ifdef IPV6_RECVHOPOPTS
4423 PyModule_AddIntConstant(m, "IPV6_RECVHOPOPTS", IPV6_RECVHOPOPTS);
4424#endif
4425#ifdef IPV6_RECVPKTINFO
4426 PyModule_AddIntConstant(m, "IPV6_RECVPKTINFO", IPV6_RECVPKTINFO);
4427#endif
4428#ifdef IPV6_RECVRTHDR
4429 PyModule_AddIntConstant(m, "IPV6_RECVRTHDR", IPV6_RECVRTHDR);
4430#endif
4431#ifdef IPV6_RECVTCLASS
4432 PyModule_AddIntConstant(m, "IPV6_RECVTCLASS", IPV6_RECVTCLASS);
4433#endif
4434#ifdef IPV6_RTHDR
4435 PyModule_AddIntConstant(m, "IPV6_RTHDR", IPV6_RTHDR);
4436#endif
4437#ifdef IPV6_RTHDRDSTOPTS
4438 PyModule_AddIntConstant(m, "IPV6_RTHDRDSTOPTS", IPV6_RTHDRDSTOPTS);
4439#endif
4440#ifdef IPV6_RTHDR_TYPE_0
4441 PyModule_AddIntConstant(m, "IPV6_RTHDR_TYPE_0", IPV6_RTHDR_TYPE_0);
4442#endif
4443#ifdef IPV6_RECVPATHMTU
4444 PyModule_AddIntConstant(m, "IPV6_RECVPATHMTU", IPV6_RECVPATHMTU);
4445#endif
4446#ifdef IPV6_TCLASS
4447 PyModule_AddIntConstant(m, "IPV6_TCLASS", IPV6_TCLASS);
4448#endif
4449#ifdef IPV6_USE_MIN_MTU
4450 PyModule_AddIntConstant(m, "IPV6_USE_MIN_MTU", IPV6_USE_MIN_MTU);
4451#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004452
Guido van Rossum09be4091999-08-09 14:40:40 +00004453 /* TCP options */
4454#ifdef TCP_NODELAY
Fred Drake4baedc12002-04-01 14:53:37 +00004455 PyModule_AddIntConstant(m, "TCP_NODELAY", TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00004456#endif
4457#ifdef TCP_MAXSEG
Fred Drake4baedc12002-04-01 14:53:37 +00004458 PyModule_AddIntConstant(m, "TCP_MAXSEG", TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00004459#endif
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004460#ifdef TCP_CORK
Fred Drake4baedc12002-04-01 14:53:37 +00004461 PyModule_AddIntConstant(m, "TCP_CORK", TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004462#endif
4463#ifdef TCP_KEEPIDLE
Fred Drake4baedc12002-04-01 14:53:37 +00004464 PyModule_AddIntConstant(m, "TCP_KEEPIDLE", TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004465#endif
4466#ifdef TCP_KEEPINTVL
Fred Drake4baedc12002-04-01 14:53:37 +00004467 PyModule_AddIntConstant(m, "TCP_KEEPINTVL", TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004468#endif
4469#ifdef TCP_KEEPCNT
Fred Drake4baedc12002-04-01 14:53:37 +00004470 PyModule_AddIntConstant(m, "TCP_KEEPCNT", TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004471#endif
4472#ifdef TCP_SYNCNT
Fred Drake4baedc12002-04-01 14:53:37 +00004473 PyModule_AddIntConstant(m, "TCP_SYNCNT", TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004474#endif
4475#ifdef TCP_LINGER2
Fred Drake4baedc12002-04-01 14:53:37 +00004476 PyModule_AddIntConstant(m, "TCP_LINGER2", TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004477#endif
4478#ifdef TCP_DEFER_ACCEPT
Fred Drake4baedc12002-04-01 14:53:37 +00004479 PyModule_AddIntConstant(m, "TCP_DEFER_ACCEPT", TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004480#endif
4481#ifdef TCP_WINDOW_CLAMP
Fred Drake4baedc12002-04-01 14:53:37 +00004482 PyModule_AddIntConstant(m, "TCP_WINDOW_CLAMP", TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004483#endif
4484#ifdef TCP_INFO
Fred Drake4baedc12002-04-01 14:53:37 +00004485 PyModule_AddIntConstant(m, "TCP_INFO", TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004486#endif
4487#ifdef TCP_QUICKACK
Fred Drake4baedc12002-04-01 14:53:37 +00004488 PyModule_AddIntConstant(m, "TCP_QUICKACK", TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004489#endif
4490
Guido van Rossum09be4091999-08-09 14:40:40 +00004491
4492 /* IPX options */
4493#ifdef IPX_TYPE
Fred Drake4baedc12002-04-01 14:53:37 +00004494 PyModule_AddIntConstant(m, "IPX_TYPE", IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00004495#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004496
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004497 /* get{addr,name}info parameters */
4498#ifdef EAI_ADDRFAMILY
Fred Drake4baedc12002-04-01 14:53:37 +00004499 PyModule_AddIntConstant(m, "EAI_ADDRFAMILY", EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004500#endif
4501#ifdef EAI_AGAIN
Fred Drake4baedc12002-04-01 14:53:37 +00004502 PyModule_AddIntConstant(m, "EAI_AGAIN", EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004503#endif
4504#ifdef EAI_BADFLAGS
Fred Drake4baedc12002-04-01 14:53:37 +00004505 PyModule_AddIntConstant(m, "EAI_BADFLAGS", EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004506#endif
4507#ifdef EAI_FAIL
Fred Drake4baedc12002-04-01 14:53:37 +00004508 PyModule_AddIntConstant(m, "EAI_FAIL", EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004509#endif
4510#ifdef EAI_FAMILY
Fred Drake4baedc12002-04-01 14:53:37 +00004511 PyModule_AddIntConstant(m, "EAI_FAMILY", EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004512#endif
4513#ifdef EAI_MEMORY
Fred Drake4baedc12002-04-01 14:53:37 +00004514 PyModule_AddIntConstant(m, "EAI_MEMORY", EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004515#endif
4516#ifdef EAI_NODATA
Fred Drake4baedc12002-04-01 14:53:37 +00004517 PyModule_AddIntConstant(m, "EAI_NODATA", EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004518#endif
4519#ifdef EAI_NONAME
Fred Drake4baedc12002-04-01 14:53:37 +00004520 PyModule_AddIntConstant(m, "EAI_NONAME", EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004521#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00004522#ifdef EAI_OVERFLOW
4523 PyModule_AddIntConstant(m, "EAI_OVERFLOW", EAI_OVERFLOW);
4524#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004525#ifdef EAI_SERVICE
Fred Drake4baedc12002-04-01 14:53:37 +00004526 PyModule_AddIntConstant(m, "EAI_SERVICE", EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004527#endif
4528#ifdef EAI_SOCKTYPE
Fred Drake4baedc12002-04-01 14:53:37 +00004529 PyModule_AddIntConstant(m, "EAI_SOCKTYPE", EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004530#endif
4531#ifdef EAI_SYSTEM
Fred Drake4baedc12002-04-01 14:53:37 +00004532 PyModule_AddIntConstant(m, "EAI_SYSTEM", EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004533#endif
4534#ifdef EAI_BADHINTS
Fred Drake4baedc12002-04-01 14:53:37 +00004535 PyModule_AddIntConstant(m, "EAI_BADHINTS", EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004536#endif
4537#ifdef EAI_PROTOCOL
Fred Drake4baedc12002-04-01 14:53:37 +00004538 PyModule_AddIntConstant(m, "EAI_PROTOCOL", EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004539#endif
4540#ifdef EAI_MAX
Fred Drake4baedc12002-04-01 14:53:37 +00004541 PyModule_AddIntConstant(m, "EAI_MAX", EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004542#endif
4543#ifdef AI_PASSIVE
Fred Drake4baedc12002-04-01 14:53:37 +00004544 PyModule_AddIntConstant(m, "AI_PASSIVE", AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004545#endif
4546#ifdef AI_CANONNAME
Fred Drake4baedc12002-04-01 14:53:37 +00004547 PyModule_AddIntConstant(m, "AI_CANONNAME", AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004548#endif
4549#ifdef AI_NUMERICHOST
Fred Drake4baedc12002-04-01 14:53:37 +00004550 PyModule_AddIntConstant(m, "AI_NUMERICHOST", AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004551#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00004552#ifdef AI_NUMERICSERV
4553 PyModule_AddIntConstant(m, "AI_NUMERICSERV", AI_NUMERICSERV);
4554#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004555#ifdef AI_MASK
Fred Drake4baedc12002-04-01 14:53:37 +00004556 PyModule_AddIntConstant(m, "AI_MASK", AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004557#endif
4558#ifdef AI_ALL
Fred Drake4baedc12002-04-01 14:53:37 +00004559 PyModule_AddIntConstant(m, "AI_ALL", AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004560#endif
4561#ifdef AI_V4MAPPED_CFG
Fred Drake4baedc12002-04-01 14:53:37 +00004562 PyModule_AddIntConstant(m, "AI_V4MAPPED_CFG", AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004563#endif
4564#ifdef AI_ADDRCONFIG
Fred Drake4baedc12002-04-01 14:53:37 +00004565 PyModule_AddIntConstant(m, "AI_ADDRCONFIG", AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004566#endif
4567#ifdef AI_V4MAPPED
Fred Drake4baedc12002-04-01 14:53:37 +00004568 PyModule_AddIntConstant(m, "AI_V4MAPPED", AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004569#endif
4570#ifdef AI_DEFAULT
Fred Drake4baedc12002-04-01 14:53:37 +00004571 PyModule_AddIntConstant(m, "AI_DEFAULT", AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004572#endif
4573#ifdef NI_MAXHOST
Fred Drake4baedc12002-04-01 14:53:37 +00004574 PyModule_AddIntConstant(m, "NI_MAXHOST", NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004575#endif
4576#ifdef NI_MAXSERV
Fred Drake4baedc12002-04-01 14:53:37 +00004577 PyModule_AddIntConstant(m, "NI_MAXSERV", NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004578#endif
4579#ifdef NI_NOFQDN
Fred Drake4baedc12002-04-01 14:53:37 +00004580 PyModule_AddIntConstant(m, "NI_NOFQDN", NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004581#endif
4582#ifdef NI_NUMERICHOST
Fred Drake4baedc12002-04-01 14:53:37 +00004583 PyModule_AddIntConstant(m, "NI_NUMERICHOST", NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004584#endif
4585#ifdef NI_NAMEREQD
Fred Drake4baedc12002-04-01 14:53:37 +00004586 PyModule_AddIntConstant(m, "NI_NAMEREQD", NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004587#endif
4588#ifdef NI_NUMERICSERV
Fred Drake4baedc12002-04-01 14:53:37 +00004589 PyModule_AddIntConstant(m, "NI_NUMERICSERV", NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004590#endif
4591#ifdef NI_DGRAM
Fred Drake4baedc12002-04-01 14:53:37 +00004592 PyModule_AddIntConstant(m, "NI_DGRAM", NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004593#endif
4594
Martin v. Löwis94681fc2003-11-27 19:40:22 +00004595 /* shutdown() parameters */
4596#ifdef SHUT_RD
4597 PyModule_AddIntConstant(m, "SHUT_RD", SHUT_RD);
4598#elif defined(SD_RECEIVE)
4599 PyModule_AddIntConstant(m, "SHUT_RD", SD_RECEIVE);
4600#else
4601 PyModule_AddIntConstant(m, "SHUT_RD", 0);
4602#endif
4603#ifdef SHUT_WR
4604 PyModule_AddIntConstant(m, "SHUT_WR", SHUT_WR);
4605#elif defined(SD_SEND)
4606 PyModule_AddIntConstant(m, "SHUT_WR", SD_SEND);
4607#else
4608 PyModule_AddIntConstant(m, "SHUT_WR", 1);
4609#endif
4610#ifdef SHUT_RDWR
4611 PyModule_AddIntConstant(m, "SHUT_RDWR", SHUT_RDWR);
4612#elif defined(SD_BOTH)
4613 PyModule_AddIntConstant(m, "SHUT_RDWR", SD_BOTH);
4614#else
4615 PyModule_AddIntConstant(m, "SHUT_RDWR", 2);
4616#endif
4617
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004618 /* Initialize gethostbyname lock */
Just van Rossum1040d2c2003-05-09 07:53:18 +00004619#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
4620 netdb_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004621#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004622}
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004623
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004624
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004625#ifndef HAVE_INET_PTON
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004626
4627/* Simplistic emulation code for inet_pton that only works for IPv4 */
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004628/* These are not exposed because they do not set errno properly */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004629
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004630int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004631inet_pton(int af, const char *src, void *dst)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004632{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004633 if (af == AF_INET) {
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004634 long packed_addr;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004635 packed_addr = inet_addr(src);
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004636 if (packed_addr == INADDR_NONE)
4637 return 0;
4638 memcpy(dst, &packed_addr, 4);
4639 return 1;
4640 }
4641 /* Should set errno to EAFNOSUPPORT */
4642 return -1;
4643}
4644
Martin v. Löwisc925b1532001-07-21 09:42:15 +00004645const char *
4646inet_ntop(int af, const void *src, char *dst, socklen_t size)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004647{
4648 if (af == AF_INET) {
4649 struct in_addr packed_addr;
4650 if (size < 16)
4651 /* Should set errno to ENOSPC. */
4652 return NULL;
4653 memcpy(&packed_addr, src, sizeof(packed_addr));
4654 return strncpy(dst, inet_ntoa(packed_addr), size);
4655 }
4656 /* Should set errno to EAFNOSUPPORT */
4657 return NULL;
4658}
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004659
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004660#endif