blob: 6054c1855f77eb4fd6ba324f066fccd73485b899 [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>
Guido van Rossum81194471991-07-27 21:42:02 +0000220#include <signal.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000221
Marc-André Lemburg976ade62002-02-16 18:47:07 +0000222/* Generic socket object definitions and includes */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000223#define PySocket_BUILDING_SOCKET
Marc-André Lemburgbb8b78b2002-02-16 18:44:52 +0000224#include "socketmodule.h"
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000225
226/* Addressing includes */
227
Guido van Rossum6f489d91996-06-28 20:15:15 +0000228#ifndef MS_WINDOWS
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000229
230/* Non-MS WINDOWS includes */
231# include <netdb.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000232
Guido van Rossum9376b741999-09-15 22:01:40 +0000233/* Headers needed for inet_ntoa() and inet_addr() */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000234# ifdef __BEOS__
235# include <net/netdb.h>
236# elif defined(PYOS_OS2) && defined(PYCC_VACPP)
237# include <netdb.h>
Tim Peters603c6832001-11-05 02:45:59 +0000238typedef size_t socklen_t;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000239# else
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000240# include <arpa/inet.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000241# endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000242
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000243# ifndef RISCOS
244# include <fcntl.h>
245# else
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000246# include <sys/ioctl.h>
247# include <socklib.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000248# define NO_DUP
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000249int h_errno; /* not used */
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000250# define INET_ADDRSTRLEN 16
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000251# endif
252
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000253#else
Guido van Rossum48a680c2001-03-02 06:34:14 +0000254
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000255/* MS_WINDOWS includes */
256# include <fcntl.h>
Guido van Rossum48a680c2001-03-02 06:34:14 +0000257
Jeremy Hylton22308652001-02-02 03:23:09 +0000258#endif
259
Skip Montanaro7befb992004-02-10 16:50:21 +0000260#include <stddef.h>
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000261
262#ifndef offsetof
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000263# define offsetof(type, member) ((size_t)(&((type *)0)->member))
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000264#endif
265
Neal Norwitz39d22e52002-11-02 19:55:21 +0000266#ifndef O_NONBLOCK
267# define O_NONBLOCK O_NDELAY
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000268#endif
269
Trent Micka708d6e2004-09-07 17:48:26 +0000270/* include Python's addrinfo.h unless it causes trouble */
271#if defined(__sgi) && _COMPILER_VERSION>700 && defined(_SS_ALIGNSIZE)
272 /* Do not include addinfo.h on some newer IRIX versions.
273 * _SS_ALIGNSIZE is defined in sys/socket.h by 6.5.21,
274 * for example, but not by 6.5.10.
275 */
276#elif defined(_MSC_VER) && _MSC_VER>1200
277 /* Do not include addrinfo.h for MSVC7 or greater. 'addrinfo' and
278 * EAI_* constants are defined in (the already included) ws2tcpip.h.
279 */
280#else
281# include "addrinfo.h"
282#endif
Jason Tishlerc246cb72004-08-09 13:25:59 +0000283
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000284#ifndef HAVE_INET_PTON
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000285int inet_pton(int af, const char *src, void *dst);
Martin v. Löwisc925b1532001-07-21 09:42:15 +0000286const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000287#endif
288
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000289#ifdef __APPLE__
290/* On OS X, getaddrinfo returns no error indication of lookup
291 failure, so we must use the emulation instead of the libinfo
292 implementation. Unfortunately, performing an autoconf test
293 for this bug would require DNS access for the machine performing
294 the configuration, which is not acceptable. Therefore, we
295 determine the bug just by checking for __APPLE__. If this bug
296 gets ever fixed, perhaps checking for sys/version.h would be
297 appropriate, which is 10/0 on the system with the bug. */
Jack Jansen84262fb2002-07-02 14:40:42 +0000298#ifndef HAVE_GETNAMEINFO
299/* This bug seems to be fixed in Jaguar. Ths easiest way I could
300 Find to check for Jaguar is that it has getnameinfo(), which
301 older releases don't have */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000302#undef HAVE_GETADDRINFO
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000303#endif
Jack Jansen84262fb2002-07-02 14:40:42 +0000304#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000305
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000306/* I know this is a bad practice, but it is the easiest... */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000307#if !defined(HAVE_GETADDRINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000308/* avoid clashes with the C library definition of the symbol. */
309#define getaddrinfo fake_getaddrinfo
310#define gai_strerror fake_gai_strerror
311#define freeaddrinfo fake_freeaddrinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000312#include "getaddrinfo.c"
313#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000314#if !defined(HAVE_GETNAMEINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000315#define getnameinfo fake_getnameinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000316#include "getnameinfo.c"
317#endif
318
Guido van Rossumbcc20741998-08-04 22:53:56 +0000319#if defined(MS_WINDOWS) || defined(__BEOS__)
320/* BeOS suffers from the same socket dichotomy as Win32... - [cjh] */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000321/* seem to be a few differences in the API */
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000322#define SOCKETCLOSE closesocket
Guido van Rossumbe32c891996-06-20 16:25:29 +0000323#define NO_DUP /* Actually it exists on NT 3.5, but what the heck... */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000324#endif
325
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000326#ifdef MS_WIN32
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000327#define EAFNOSUPPORT WSAEAFNOSUPPORT
328#define snprintf _snprintf
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000329#endif
Fred Drakea04eaad2000-06-30 02:46:07 +0000330
Andrew MacIntyreba43e872002-03-03 03:03:52 +0000331#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000332#define SOCKETCLOSE soclose
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000333#define NO_DUP /* Sockets are Not Actual File Handles under OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000334#endif
335
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000336#ifndef SOCKETCLOSE
337#define SOCKETCLOSE close
338#endif
339
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000340#ifdef __VMS
341/* TCP/IP Services for VMS uses a maximum send/revc buffer length of 65535 */
342#define SEGMENT_SIZE 65535
343#endif
344
Hye-Shik Chang81268602004-02-02 06:05:24 +0000345#if defined(HAVE_BLUETOOTH_H) || defined(HAVE_BLUETOOTH_BLUETOOTH_H)
346#define USE_BLUETOOTH 1
347#if defined(__FreeBSD__)
348#define BTPROTO_L2CAP BLUETOOTH_PROTO_L2CAP
349#define BTPROTO_RFCOMM BLUETOOTH_PROTO_RFCOMM
350#define sockaddr_l2 sockaddr_l2cap
351#define sockaddr_rc sockaddr_rfcomm
352#define _BT_SOCKADDR_MEMB(s, proto) &((s)->sock_addr)
353#define _BT_L2_MEMB(sa, memb) ((sa)->l2cap_##memb)
354#define _BT_RC_MEMB(sa, memb) ((sa)->rfcomm_##memb)
355#else
Anthony Baxter5d7c0672004-02-16 05:35:28 +0000356#define _BT_SOCKADDR_MEMB(s, proto) (&((s)->sock_addr).bt_##proto)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000357#define _BT_L2_MEMB(sa, memb) ((sa)->l2_##memb)
358#define _BT_RC_MEMB(sa, memb) ((sa)->rc_##memb)
359#define _BT_SCO_MEMB(sa, memb) ((sa)->sco_##memb)
360#endif
361#endif
362
Martin v. Löwise9416172003-05-03 10:12:45 +0000363/*
364 * Constants for getnameinfo()
365 */
366#if !defined(NI_MAXHOST)
367#define NI_MAXHOST 1025
368#endif
369#if !defined(NI_MAXSERV)
370#define NI_MAXSERV 32
371#endif
372
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000373/* XXX There's a problem here: *static* functions are not supposed to have
374 a Py prefix (or use CapitalizedWords). Later... */
375
Guido van Rossum30a685f1991-06-27 15:51:29 +0000376/* Global variable holding the exception type for errors detected
377 by this module (but not argument type or memory errors, etc.). */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000378static PyObject *socket_error;
379static PyObject *socket_herror;
380static PyObject *socket_gaierror;
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000381static PyObject *socket_timeout;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000382
Guido van Rossum48a680c2001-03-02 06:34:14 +0000383#ifdef RISCOS
384/* Global variable which is !=0 if Python is running in a RISC OS taskwindow */
385static int taskwindow;
386#endif
387
Tim Peters643a7fc2002-02-17 04:13:21 +0000388/* A forward reference to the socket type object.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000389 The sock_type variable contains pointers to various functions,
390 some of which call new_sockobject(), which uses sock_type, so
Tim Peters643a7fc2002-02-17 04:13:21 +0000391 there has to be a circular reference. */
Jeremy Hylton938ace62002-07-17 16:30:39 +0000392static PyTypeObject sock_type;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000393
Guido van Rossum30a685f1991-06-27 15:51:29 +0000394/* Convenience function to raise an error according to errno
395 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000396
Guido van Rossum73624e91994-10-10 17:59:00 +0000397static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000398set_error(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000399{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000400#ifdef MS_WINDOWS
Mark Hammond46a733d2000-07-24 01:45:11 +0000401 int err_no = WSAGetLastError();
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000402 static struct {
403 int no;
404 const char *msg;
405 } *msgp, msgs[] = {
406 {WSAEINTR, "Interrupted system call"},
407 {WSAEBADF, "Bad file descriptor"},
408 {WSAEACCES, "Permission denied"},
409 {WSAEFAULT, "Bad address"},
410 {WSAEINVAL, "Invalid argument"},
411 {WSAEMFILE, "Too many open files"},
412 {WSAEWOULDBLOCK,
413 "The socket operation could not complete "
414 "without blocking"},
415 {WSAEINPROGRESS, "Operation now in progress"},
416 {WSAEALREADY, "Operation already in progress"},
417 {WSAENOTSOCK, "Socket operation on non-socket"},
418 {WSAEDESTADDRREQ, "Destination address required"},
419 {WSAEMSGSIZE, "Message too long"},
420 {WSAEPROTOTYPE, "Protocol wrong type for socket"},
421 {WSAENOPROTOOPT, "Protocol not available"},
422 {WSAEPROTONOSUPPORT, "Protocol not supported"},
423 {WSAESOCKTNOSUPPORT, "Socket type not supported"},
424 {WSAEOPNOTSUPP, "Operation not supported"},
425 {WSAEPFNOSUPPORT, "Protocol family not supported"},
426 {WSAEAFNOSUPPORT, "Address family not supported"},
427 {WSAEADDRINUSE, "Address already in use"},
428 {WSAEADDRNOTAVAIL, "Can't assign requested address"},
429 {WSAENETDOWN, "Network is down"},
430 {WSAENETUNREACH, "Network is unreachable"},
431 {WSAENETRESET, "Network dropped connection on reset"},
432 {WSAECONNABORTED, "Software caused connection abort"},
433 {WSAECONNRESET, "Connection reset by peer"},
434 {WSAENOBUFS, "No buffer space available"},
435 {WSAEISCONN, "Socket is already connected"},
436 {WSAENOTCONN, "Socket is not connected"},
437 {WSAESHUTDOWN, "Can't send after socket shutdown"},
438 {WSAETOOMANYREFS, "Too many references: can't splice"},
439 {WSAETIMEDOUT, "Operation timed out"},
440 {WSAECONNREFUSED, "Connection refused"},
441 {WSAELOOP, "Too many levels of symbolic links"},
442 {WSAENAMETOOLONG, "File name too long"},
443 {WSAEHOSTDOWN, "Host is down"},
444 {WSAEHOSTUNREACH, "No route to host"},
445 {WSAENOTEMPTY, "Directory not empty"},
446 {WSAEPROCLIM, "Too many processes"},
447 {WSAEUSERS, "Too many users"},
448 {WSAEDQUOT, "Disc quota exceeded"},
449 {WSAESTALE, "Stale NFS file handle"},
450 {WSAEREMOTE, "Too many levels of remote in path"},
451 {WSASYSNOTREADY, "Network subsystem is unvailable"},
452 {WSAVERNOTSUPPORTED, "WinSock version is not supported"},
453 {WSANOTINITIALISED,
454 "Successful WSAStartup() not yet performed"},
455 {WSAEDISCON, "Graceful shutdown in progress"},
456 /* Resolver errors */
457 {WSAHOST_NOT_FOUND, "No such host is known"},
458 {WSATRY_AGAIN, "Host not found, or server failed"},
459 {WSANO_RECOVERY, "Unexpected server error encountered"},
460 {WSANO_DATA, "Valid name without requested data"},
461 {WSANO_ADDRESS, "No address, look for MX record"},
462 {0, NULL}
463 };
Mark Hammond46a733d2000-07-24 01:45:11 +0000464 if (err_no) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000465 PyObject *v;
Mark Hammond46a733d2000-07-24 01:45:11 +0000466 const char *msg = "winsock error";
Guido van Rossum48a680c2001-03-02 06:34:14 +0000467
Mark Hammond46a733d2000-07-24 01:45:11 +0000468 for (msgp = msgs; msgp->msg; msgp++) {
469 if (err_no == msgp->no) {
470 msg = msgp->msg;
471 break;
472 }
473 }
474
475 v = Py_BuildValue("(is)", err_no, msg);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000476 if (v != NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000477 PyErr_SetObject(socket_error, v);
Guido van Rossum73624e91994-10-10 17:59:00 +0000478 Py_DECREF(v);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000479 }
480 return NULL;
481 }
482 else
483#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000484
Andrew MacIntyreba43e872002-03-03 03:03:52 +0000485#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000486 if (sock_errno() != NO_ERROR) {
487 APIRET rc;
488 ULONG msglen;
489 char outbuf[100];
490 int myerrorcode = sock_errno();
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000491
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000492 /* Retrieve socket-related error message from MPTN.MSG file */
493 rc = DosGetMessage(NULL, 0, outbuf, sizeof(outbuf),
494 myerrorcode - SOCBASEERR + 26,
495 "mptn.msg",
496 &msglen);
497 if (rc == NO_ERROR) {
498 PyObject *v;
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000499
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000500 /* OS/2 doesn't guarantee a terminator */
501 outbuf[msglen] = '\0';
502 if (strlen(outbuf) > 0) {
503 /* If non-empty msg, trim CRLF */
504 char *lastc = &outbuf[ strlen(outbuf)-1 ];
505 while (lastc > outbuf && isspace(*lastc)) {
506 /* Trim trailing whitespace (CRLF) */
507 *lastc-- = '\0';
508 }
509 }
510 v = Py_BuildValue("(is)", myerrorcode, outbuf);
511 if (v != NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000512 PyErr_SetObject(socket_error, v);
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000513 Py_DECREF(v);
514 }
515 return NULL;
516 }
517 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000518#endif
519
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000520#if defined(RISCOS)
521 if (_inet_error.errnum != NULL) {
522 PyObject *v;
523 v = Py_BuildValue("(is)", errno, _inet_err());
524 if (v != NULL) {
525 PyErr_SetObject(socket_error, v);
526 Py_DECREF(v);
527 }
528 return NULL;
529 }
530#endif
531
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000532 return PyErr_SetFromErrno(socket_error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000533}
534
Guido van Rossum30a685f1991-06-27 15:51:29 +0000535
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000536static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000537set_herror(int h_error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000538{
539 PyObject *v;
540
541#ifdef HAVE_HSTRERROR
542 v = Py_BuildValue("(is)", h_error, (char *)hstrerror(h_error));
543#else
544 v = Py_BuildValue("(is)", h_error, "host not found");
545#endif
546 if (v != NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000547 PyErr_SetObject(socket_herror, v);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000548 Py_DECREF(v);
549 }
550
551 return NULL;
552}
553
554
555static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000556set_gaierror(int error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000557{
558 PyObject *v;
559
Martin v. Löwis272cb402002-03-01 08:31:07 +0000560#ifdef EAI_SYSTEM
561 /* EAI_SYSTEM is not available on Windows XP. */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000562 if (error == EAI_SYSTEM)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000563 return set_error();
Martin v. Löwis272cb402002-03-01 08:31:07 +0000564#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000565
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000566#ifdef HAVE_GAI_STRERROR
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000567 v = Py_BuildValue("(is)", error, gai_strerror(error));
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000568#else
569 v = Py_BuildValue("(is)", error, "getaddrinfo failed");
570#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000571 if (v != NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000572 PyErr_SetObject(socket_gaierror, v);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000573 Py_DECREF(v);
574 }
575
576 return NULL;
577}
578
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000579/* Function to perform the setting of socket blocking mode
580 internally. block = (1 | 0). */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000581static int
582internal_setblocking(PySocketSockObject *s, int block)
583{
584#ifndef RISCOS
585#ifndef MS_WINDOWS
586 int delay_flag;
587#endif
588#endif
589
590 Py_BEGIN_ALLOW_THREADS
591#ifdef __BEOS__
592 block = !block;
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000593 setsockopt(s->sock_fd, SOL_SOCKET, SO_NONBLOCK,
594 (void *)(&block), sizeof(int));
Guido van Rossum67f7a382002-06-06 21:08:16 +0000595#else
596#ifndef RISCOS
597#ifndef MS_WINDOWS
598#if defined(PYOS_OS2) && !defined(PYCC_GCC)
599 block = !block;
600 ioctl(s->sock_fd, FIONBIO, (caddr_t)&block, sizeof(block));
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000601#elif defined(__VMS)
602 block = !block;
603 ioctl(s->sock_fd, FIONBIO, (char *)&block);
604#else /* !PYOS_OS2 && !_VMS */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000605 delay_flag = fcntl(s->sock_fd, F_GETFL, 0);
606 if (block)
Neal Norwitz39d22e52002-11-02 19:55:21 +0000607 delay_flag &= (~O_NONBLOCK);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000608 else
Neal Norwitz39d22e52002-11-02 19:55:21 +0000609 delay_flag |= O_NONBLOCK;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000610 fcntl(s->sock_fd, F_SETFL, delay_flag);
611#endif /* !PYOS_OS2 */
612#else /* MS_WINDOWS */
613 block = !block;
614 ioctlsocket(s->sock_fd, FIONBIO, (u_long*)&block);
615#endif /* MS_WINDOWS */
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000616#else /* RISCOS */
617 block = !block;
618 socketioctl(s->sock_fd, FIONBIO, (u_long*)&block);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000619#endif /* RISCOS */
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000620#endif /* __BEOS__ */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000621 Py_END_ALLOW_THREADS
622
623 /* Since these don't return anything */
624 return 1;
625}
626
Guido van Rossum11ba0942002-06-13 15:07:44 +0000627/* Do a select() on the socket, if necessary (sock_timeout > 0).
628 The argument writing indicates the direction.
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000629 This does not raise an exception; we'll let our caller do that
630 after they've reacquired the interpreter lock.
631 Returns 1 on timeout, 0 otherwise. */
632static int
Guido van Rossumb9e916a2002-06-07 01:42:47 +0000633internal_select(PySocketSockObject *s, int writing)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000634{
635 fd_set fds;
636 struct timeval tv;
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000637 int n;
Guido van Rossum11ba0942002-06-13 15:07:44 +0000638
Guido van Rossumad654902002-07-19 12:44:59 +0000639 /* Nothing to do unless we're in timeout mode (not non-blocking) */
Guido van Rossum11ba0942002-06-13 15:07:44 +0000640 if (s->sock_timeout <= 0.0)
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000641 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000642
Guido van Rossumad654902002-07-19 12:44:59 +0000643 /* Guard against closed socket */
644 if (s->sock_fd < 0)
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000645 return 0;
Guido van Rossumad654902002-07-19 12:44:59 +0000646
Guido van Rossum67f7a382002-06-06 21:08:16 +0000647 /* Construct the arguments to select */
648 tv.tv_sec = (int)s->sock_timeout;
Guido van Rossumb9e916a2002-06-07 01:42:47 +0000649 tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000650 FD_ZERO(&fds);
651 FD_SET(s->sock_fd, &fds);
652
653 /* See if the socket is ready */
Guido van Rossumb9e916a2002-06-07 01:42:47 +0000654 if (writing)
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000655 n = select(s->sock_fd+1, NULL, &fds, NULL, &tv);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000656 else
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000657 n = select(s->sock_fd+1, &fds, NULL, NULL, &tv);
658 if (n == 0)
659 return 1;
660 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000661}
662
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000663/* Initialize a new socket object. */
664
Tim Petersa12b4cf2002-07-18 22:38:44 +0000665static double defaulttimeout = -1.0; /* Default timeout for new sockets */
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000666
Mark Hammond62b1ab12002-07-23 06:31:15 +0000667PyMODINIT_FUNC
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000668init_sockobject(PySocketSockObject *s,
669 SOCKET_T fd, int family, int type, int proto)
670{
671#ifdef RISCOS
672 int block = 1;
673#endif
674 s->sock_fd = fd;
675 s->sock_family = family;
676 s->sock_type = type;
677 s->sock_proto = proto;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000678 s->sock_timeout = defaulttimeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000679
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000680 s->errorhandler = &set_error;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000681
682 if (defaulttimeout >= 0.0)
683 internal_setblocking(s, 0);
684
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000685#ifdef RISCOS
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000686 if (taskwindow)
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000687 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000688#endif
689}
690
691
Guido van Rossum30a685f1991-06-27 15:51:29 +0000692/* Create a new socket object.
693 This just creates the object and initializes it.
694 If the creation fails, return NULL and set an exception (implicit
695 in NEWOBJ()). */
696
Guido van Rossum73624e91994-10-10 17:59:00 +0000697static PySocketSockObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000698new_sockobject(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000699{
Guido van Rossum73624e91994-10-10 17:59:00 +0000700 PySocketSockObject *s;
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000701 s = (PySocketSockObject *)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000702 PyType_GenericNew(&sock_type, NULL, NULL);
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000703 if (s != NULL)
704 init_sockobject(s, fd, family, type, proto);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000705 return s;
706}
707
Guido van Rossum30a685f1991-06-27 15:51:29 +0000708
Guido van Rossum48a680c2001-03-02 06:34:14 +0000709/* Lock to allow python interpreter to continue, but only allow one
Just van Rossum1040d2c2003-05-09 07:53:18 +0000710 thread to be in gethostbyname or getaddrinfo */
711#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
712PyThread_type_lock netdb_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000713#endif
714
715
Guido van Rossum30a685f1991-06-27 15:51:29 +0000716/* Convert a string specifying a host name or one of a few symbolic
717 names to a numeric IP address. This usually calls gethostbyname()
718 to do the work; the names "" and "<broadcast>" are special.
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000719 Return the length (IPv4 should be 4 bytes), or negative if
Guido van Rossum30a685f1991-06-27 15:51:29 +0000720 an error occurred; then an exception is raised. */
721
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000722static int
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000723setipaddr(char *name, struct sockaddr *addr_ret, size_t addr_ret_size, int af)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000724{
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000725 struct addrinfo hints, *res;
726 int error;
Anthony Baxter0e85f9d2003-05-02 15:40:46 +0000727 int d1, d2, d3, d4;
728 char ch;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000729
Guido van Rossuma376cc51996-12-05 23:43:35 +0000730 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
Guido van Rossum30a685f1991-06-27 15:51:29 +0000731 if (name[0] == '\0') {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000732 int siz;
733 memset(&hints, 0, sizeof(hints));
734 hints.ai_family = af;
735 hints.ai_socktype = SOCK_DGRAM; /*dummy*/
736 hints.ai_flags = AI_PASSIVE;
Just van Rossum1040d2c2003-05-09 07:53:18 +0000737 Py_BEGIN_ALLOW_THREADS
738 ACQUIRE_GETADDRINFO_LOCK
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000739 error = getaddrinfo(NULL, "0", &hints, &res);
Just van Rossum1040d2c2003-05-09 07:53:18 +0000740 Py_END_ALLOW_THREADS
741 /* We assume that those thread-unsafe getaddrinfo() versions
742 *are* safe regarding their return value, ie. that a
743 subsequent call to getaddrinfo() does not destroy the
744 outcome of the first call. */
745 RELEASE_GETADDRINFO_LOCK
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000746 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000747 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000748 return -1;
749 }
750 switch (res->ai_family) {
751 case AF_INET:
752 siz = 4;
753 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000754#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000755 case AF_INET6:
756 siz = 16;
757 break;
758#endif
759 default:
760 freeaddrinfo(res);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000761 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000762 "unsupported address family");
763 return -1;
764 }
765 if (res->ai_next) {
Martin v. Löwisf0b11d22001-11-07 08:31:03 +0000766 freeaddrinfo(res);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000767 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000768 "wildcard resolved to multiple address");
769 return -1;
770 }
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000771 if (res->ai_addrlen < addr_ret_size)
772 addr_ret_size = res->ai_addrlen;
773 memcpy(addr_ret, res->ai_addr, addr_ret_size);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000774 freeaddrinfo(res);
775 return siz;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000776 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000777 if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000778 struct sockaddr_in *sin;
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +0000779 if (af != AF_INET && af != AF_UNSPEC) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000780 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000781 "address family mismatched");
782 return -1;
783 }
784 sin = (struct sockaddr_in *)addr_ret;
785 memset((void *) sin, '\0', sizeof(*sin));
786 sin->sin_family = AF_INET;
787#ifdef HAVE_SOCKADDR_SA_LEN
788 sin->sin_len = sizeof(*sin);
789#endif
790 sin->sin_addr.s_addr = INADDR_BROADCAST;
791 return sizeof(sin->sin_addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000792 }
Anthony Baxter0e85f9d2003-05-02 15:40:46 +0000793 if (sscanf(name, "%d.%d.%d.%d%c", &d1, &d2, &d3, &d4, &ch) == 4 &&
794 0 <= d1 && d1 <= 255 && 0 <= d2 && d2 <= 255 &&
795 0 <= d3 && d3 <= 255 && 0 <= d4 && d4 <= 255) {
796 struct sockaddr_in *sin;
797 sin = (struct sockaddr_in *)addr_ret;
798 sin->sin_addr.s_addr = htonl(
799 ((long) d1 << 24) | ((long) d2 << 16) |
800 ((long) d3 << 8) | ((long) d4 << 0));
801 sin->sin_family = AF_INET;
802#ifdef HAVE_SOCKADDR_SA_LEN
803 sin->sin_len = sizeof(*sin);
804#endif
805 return 4;
806 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000807 memset(&hints, 0, sizeof(hints));
808 hints.ai_family = af;
Just van Rossum1040d2c2003-05-09 07:53:18 +0000809 Py_BEGIN_ALLOW_THREADS
810 ACQUIRE_GETADDRINFO_LOCK
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000811 error = getaddrinfo(name, NULL, &hints, &res);
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000812#if defined(__digital__) && defined(__unix__)
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000813 if (error == EAI_NONAME && af == AF_UNSPEC) {
814 /* On Tru64 V5.1, numeric-to-addr conversion fails
815 if no address family is given. Assume IPv4 for now.*/
816 hints.ai_family = AF_INET;
817 error = getaddrinfo(name, NULL, &hints, &res);
818 }
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000819#endif
Just van Rossum1040d2c2003-05-09 07:53:18 +0000820 Py_END_ALLOW_THREADS
821 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000822 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000823 set_gaierror(error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000824 return -1;
825 }
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000826 if (res->ai_addrlen < addr_ret_size)
827 addr_ret_size = res->ai_addrlen;
828 memcpy((char *) addr_ret, res->ai_addr, addr_ret_size);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000829 freeaddrinfo(res);
830 switch (addr_ret->sa_family) {
831 case AF_INET:
832 return 4;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000833#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000834 case AF_INET6:
835 return 16;
Guido van Rossum955becc1999-03-22 20:14:53 +0000836#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000837 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000838 PyErr_SetString(socket_error, "unknown address family");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000839 return -1;
840 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000841}
842
Guido van Rossum30a685f1991-06-27 15:51:29 +0000843
Guido van Rossum30a685f1991-06-27 15:51:29 +0000844/* Create a string object representing an IP address.
845 This is always a string of the form 'dd.dd.dd.dd' (with variable
846 size numbers). */
847
Guido van Rossum73624e91994-10-10 17:59:00 +0000848static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000849makeipaddr(struct sockaddr *addr, int addrlen)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000850{
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000851 char buf[NI_MAXHOST];
852 int error;
853
854 error = getnameinfo(addr, addrlen, buf, sizeof(buf), NULL, 0,
855 NI_NUMERICHOST);
856 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000857 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000858 return NULL;
859 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000860 return PyString_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000861}
862
863
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000864#ifdef USE_BLUETOOTH
865/* Convert a string representation of a Bluetooth address into a numeric
866 address. Returns the length (6), or raises an exception and returns -1 if
867 an error occurred. */
868
869static int
870setbdaddr(char *name, bdaddr_t *bdaddr)
871{
872 unsigned int b0, b1, b2, b3, b4, b5;
873 char ch;
874 int n;
875
876 n = sscanf(name, "%X:%X:%X:%X:%X:%X%c",
877 &b5, &b4, &b3, &b2, &b1, &b0, &ch);
878 if (n == 6 && (b0 | b1 | b2 | b3 | b4 | b5) < 256) {
879 bdaddr->b[0] = b0;
880 bdaddr->b[1] = b1;
881 bdaddr->b[2] = b2;
882 bdaddr->b[3] = b3;
883 bdaddr->b[4] = b4;
884 bdaddr->b[5] = b5;
885 return 6;
886 } else {
887 PyErr_SetString(socket_error, "bad bluetooth address");
888 return -1;
889 }
890}
891
892/* Create a string representation of the Bluetooth address. This is always a
893 string of the form 'XX:XX:XX:XX:XX:XX' where XX is a two digit hexadecimal
894 value (zero padded if necessary). */
895
896static PyObject *
897makebdaddr(bdaddr_t *bdaddr)
898{
899 char buf[(6 * 2) + 5 + 1];
900
901 sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X",
902 bdaddr->b[5], bdaddr->b[4], bdaddr->b[3],
903 bdaddr->b[2], bdaddr->b[1], bdaddr->b[0]);
904 return PyString_FromString(buf);
905}
906#endif
907
908
Guido van Rossum30a685f1991-06-27 15:51:29 +0000909/* Create an object representing the given socket address,
910 suitable for passing it back to bind(), connect() etc.
911 The family field of the sockaddr structure is inspected
912 to determine what kind of address it really is. */
913
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000914/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000915static PyObject *
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000916makesockaddr(int sockfd, struct sockaddr *addr, int addrlen, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000917{
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000918 if (addrlen == 0) {
919 /* No address -- may be recvfrom() from known socket */
Guido van Rossum73624e91994-10-10 17:59:00 +0000920 Py_INCREF(Py_None);
921 return Py_None;
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000922 }
923
Guido van Rossumbcc20741998-08-04 22:53:56 +0000924#ifdef __BEOS__
Guido van Rossum2c8bcb82000-04-25 21:34:53 +0000925 /* XXX: BeOS version of accept() doesn't set family correctly */
Guido van Rossumbcc20741998-08-04 22:53:56 +0000926 addr->sa_family = AF_INET;
927#endif
928
Guido van Rossum30a685f1991-06-27 15:51:29 +0000929 switch (addr->sa_family) {
930
931 case AF_INET:
932 {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000933 struct sockaddr_in *a;
934 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
Barry Warsaw752300b1997-01-03 17:18:10 +0000935 PyObject *ret = NULL;
936 if (addrobj) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000937 a = (struct sockaddr_in *)addr;
Barry Warsaw752300b1997-01-03 17:18:10 +0000938 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
939 Py_DECREF(addrobj);
940 }
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000941 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000942 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000943
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +0000944#if defined(AF_UNIX)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000945 case AF_UNIX:
946 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000947 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000948 return PyString_FromString(a->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000949 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000950#endif /* AF_UNIX */
951
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000952#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000953 case AF_INET6:
954 {
955 struct sockaddr_in6 *a;
956 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
957 PyObject *ret = NULL;
958 if (addrobj) {
959 a = (struct sockaddr_in6 *)addr;
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000960 ret = Py_BuildValue("Oiii",
961 addrobj,
962 ntohs(a->sin6_port),
963 a->sin6_flowinfo,
964 a->sin6_scope_id);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000965 Py_DECREF(addrobj);
966 }
967 return ret;
968 }
Jeremy Hylton22308652001-02-02 03:23:09 +0000969#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +0000970
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000971#ifdef USE_BLUETOOTH
972 case AF_BLUETOOTH:
973 switch (proto) {
974
975 case BTPROTO_L2CAP:
976 {
977 struct sockaddr_l2 *a = (struct sockaddr_l2 *) addr;
978 PyObject *addrobj = makebdaddr(&_BT_L2_MEMB(a, bdaddr));
979 PyObject *ret = NULL;
980 if (addrobj) {
981 ret = Py_BuildValue("Oi",
982 addrobj,
983 _BT_L2_MEMB(a, psm));
984 Py_DECREF(addrobj);
985 }
986 return ret;
987 }
988
989 case BTPROTO_RFCOMM:
990 {
991 struct sockaddr_rc *a = (struct sockaddr_rc *) addr;
992 PyObject *addrobj = makebdaddr(&_BT_RC_MEMB(a, bdaddr));
993 PyObject *ret = NULL;
994 if (addrobj) {
995 ret = Py_BuildValue("Oi",
996 addrobj,
997 _BT_RC_MEMB(a, channel));
998 Py_DECREF(addrobj);
999 }
1000 return ret;
1001 }
1002
1003#if !defined(__FreeBSD__)
1004 case BTPROTO_SCO:
1005 {
1006 struct sockaddr_sco *a = (struct sockaddr_sco *) addr;
1007 return makebdaddr(&_BT_SCO_MEMB(a, bdaddr));
1008 }
1009#endif
1010
1011 }
1012#endif
1013
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00001014#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +00001015 case AF_PACKET:
1016 {
1017 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
1018 char *ifname = "";
1019 struct ifreq ifr;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001020 /* need to look up interface name give index */
1021 if (a->sll_ifindex) {
Jeremy Hylton22308652001-02-02 03:23:09 +00001022 ifr.ifr_ifindex = a->sll_ifindex;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001023 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
Jeremy Hylton22308652001-02-02 03:23:09 +00001024 ifname = ifr.ifr_name;
Jeremy Hylton22308652001-02-02 03:23:09 +00001025 }
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001026 return Py_BuildValue("shbhs#",
1027 ifname,
1028 ntohs(a->sll_protocol),
1029 a->sll_pkttype,
1030 a->sll_hatype,
1031 a->sll_addr,
1032 a->sll_halen);
Jeremy Hylton22308652001-02-02 03:23:09 +00001033 }
1034#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001035
Guido van Rossum30a685f1991-06-27 15:51:29 +00001036 /* More cases here... */
1037
1038 default:
Guido van Rossumaa948df1997-05-07 17:41:48 +00001039 /* If we don't know the address family, don't raise an
1040 exception -- return it as a tuple. */
1041 return Py_BuildValue("is#",
1042 addr->sa_family,
1043 addr->sa_data,
1044 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001045
Guido van Rossum30a685f1991-06-27 15:51:29 +00001046 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001047}
1048
Guido van Rossum30a685f1991-06-27 15:51:29 +00001049
1050/* Parse a socket address argument according to the socket object's
1051 address family. Return 1 if the address was in the proper format,
1052 0 of not. The address is returned through addr_ret, its length
1053 through len_ret. */
1054
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001055static int
Guido van Rossum48a680c2001-03-02 06:34:14 +00001056getsockaddrarg(PySocketSockObject *s, PyObject *args,
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001057 struct sockaddr **addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001058{
Guido van Rossum30a685f1991-06-27 15:51:29 +00001059 switch (s->sock_family) {
1060
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001061#if defined(AF_UNIX)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001062 case AF_UNIX:
1063 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001064 struct sockaddr_un* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001065 char *path;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001066 int len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001067 addr = (struct sockaddr_un*)&(s->sock_addr).un;
Guido van Rossum7e488981998-10-08 02:25:24 +00001068 if (!PyArg_Parse(args, "t#", &path, &len))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001069 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001070 if (len > sizeof addr->sun_path) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001071 PyErr_SetString(socket_error,
Barry Warsaw752300b1997-01-03 17:18:10 +00001072 "AF_UNIX path too long");
Guido van Rossum30a685f1991-06-27 15:51:29 +00001073 return 0;
1074 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001075 addr->sun_family = s->sock_family;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001076 memcpy(addr->sun_path, path, len);
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001077 addr->sun_path[len] = 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001078 *addr_ret = (struct sockaddr *) addr;
Andrew MacIntyredaedf212004-04-11 12:03:57 +00001079#if defined(PYOS_OS2)
1080 *len_ret = sizeof(*addr);
1081#else
Guido van Rossum65af28a1996-06-11 18:36:33 +00001082 *len_ret = len + sizeof(*addr) - sizeof(addr->sun_path);
Andrew MacIntyredaedf212004-04-11 12:03:57 +00001083#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001084 return 1;
1085 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001086#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001087
Guido van Rossum30a685f1991-06-27 15:51:29 +00001088 case AF_INET:
1089 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001090 struct sockaddr_in* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001091 char *host;
Martin v. Löwis5db099a2003-08-07 11:55:15 +00001092 int port, result;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001093 addr=(struct sockaddr_in*)&(s->sock_addr).in;
Guido van Rossume4dad902000-12-01 13:13:11 +00001094 if (!PyTuple_Check(args)) {
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001095 PyErr_Format(
1096 PyExc_TypeError,
1097 "getsockaddrarg: "
1098 "AF_INET address must be tuple, not %.500s",
1099 args->ob_type->tp_name);
Guido van Rossume4dad902000-12-01 13:13:11 +00001100 return 0;
1101 }
Martin v. Löwis2548c732003-04-18 10:39:54 +00001102 if (!PyArg_ParseTuple(args, "eti:getsockaddrarg",
1103 "idna", &host, &port))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001104 return 0;
Martin v. Löwis5db099a2003-08-07 11:55:15 +00001105 result = setipaddr(host, (struct sockaddr *)addr,
1106 sizeof(*addr), AF_INET);
1107 PyMem_Free(host);
1108 if (result < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001109 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001110 addr->sin_family = AF_INET;
Guido van Rossum644a12b1997-04-09 19:24:53 +00001111 addr->sin_port = htons((short)port);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001112 *addr_ret = (struct sockaddr *) addr;
1113 *len_ret = sizeof *addr;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001114 return 1;
1115 }
1116
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001117#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001118 case AF_INET6:
1119 {
1120 struct sockaddr_in6* addr;
1121 char *host;
Martin v. Löwis5db099a2003-08-07 11:55:15 +00001122 int port, flowinfo, scope_id, result;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001123 addr = (struct sockaddr_in6*)&(s->sock_addr).in6;
1124 flowinfo = scope_id = 0;
Martin v. Löwis2548c732003-04-18 10:39:54 +00001125 if (!PyArg_ParseTuple(args, "eti|ii",
1126 "idna", &host, &port, &flowinfo,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001127 &scope_id)) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001128 return 0;
1129 }
Martin v. Löwis5db099a2003-08-07 11:55:15 +00001130 result = setipaddr(host, (struct sockaddr *)addr,
1131 sizeof(*addr), AF_INET6);
1132 PyMem_Free(host);
1133 if (result < 0)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001134 return 0;
1135 addr->sin6_family = s->sock_family;
1136 addr->sin6_port = htons((short)port);
1137 addr->sin6_flowinfo = flowinfo;
1138 addr->sin6_scope_id = scope_id;
1139 *addr_ret = (struct sockaddr *) addr;
1140 *len_ret = sizeof *addr;
1141 return 1;
1142 }
1143#endif
1144
Hye-Shik Chang81268602004-02-02 06:05:24 +00001145#ifdef USE_BLUETOOTH
Martin v. Löwis12af0482004-01-31 12:34:17 +00001146 case AF_BLUETOOTH:
1147 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001148 switch (s->sock_proto) {
1149 case BTPROTO_L2CAP:
Martin v. Löwis12af0482004-01-31 12:34:17 +00001150 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001151 struct sockaddr_l2 *addr = (struct sockaddr_l2 *) _BT_SOCKADDR_MEMB(s, l2);
1152 char *straddr;
Martin v. Löwis12af0482004-01-31 12:34:17 +00001153
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001154 _BT_L2_MEMB(addr, family) = AF_BLUETOOTH;
1155 if (!PyArg_ParseTuple(args, "si", &straddr,
1156 &_BT_L2_MEMB(addr, psm))) {
1157 PyErr_SetString(socket_error, "getsockaddrarg: "
1158 "wrong format");
Martin v. Löwis12af0482004-01-31 12:34:17 +00001159 return 0;
1160 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001161 if (setbdaddr(straddr, &_BT_L2_MEMB(addr, bdaddr)) < 0)
1162 return 0;
1163
1164 *addr_ret = (struct sockaddr *) addr;
1165 *len_ret = sizeof *addr;
1166 return 1;
1167 }
1168 case BTPROTO_RFCOMM:
1169 {
1170 struct sockaddr_rc *addr = (struct sockaddr_rc *) _BT_SOCKADDR_MEMB(s, rc);
1171 char *straddr;
1172
1173 _BT_RC_MEMB(addr, family) = AF_BLUETOOTH;
1174 if (!PyArg_ParseTuple(args, "si", &straddr,
1175 &_BT_RC_MEMB(addr, channel))) {
1176 PyErr_SetString(socket_error, "getsockaddrarg: "
1177 "wrong format");
1178 return 0;
1179 }
1180 if (setbdaddr(straddr, &_BT_RC_MEMB(addr, bdaddr)) < 0)
1181 return 0;
1182
1183 *addr_ret = (struct sockaddr *) addr;
1184 *len_ret = sizeof *addr;
1185 return 1;
1186 }
1187#if !defined(__FreeBSD__)
1188 case BTPROTO_SCO:
1189 {
1190 struct sockaddr_sco *addr = (struct sockaddr_sco *) _BT_SOCKADDR_MEMB(s, sco);
1191 char *straddr;
1192
1193 _BT_SCO_MEMB(addr, family) = AF_BLUETOOTH;
1194 straddr = PyString_AsString(args);
1195 if (straddr == NULL) {
1196 PyErr_SetString(socket_error, "getsockaddrarg: "
1197 "wrong format");
1198 return 0;
1199 }
1200 if (setbdaddr(straddr, &_BT_SCO_MEMB(addr, bdaddr)) < 0)
1201 return 0;
1202
1203 *addr_ret = (struct sockaddr *) addr;
1204 *len_ret = sizeof *addr;
1205 return 1;
1206 }
1207#endif
1208 default:
1209 PyErr_SetString(socket_error, "getsockaddrarg: unknown Bluetooth protocol");
1210 return 0;
Martin v. Löwis12af0482004-01-31 12:34:17 +00001211 }
1212 }
1213#endif
1214
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00001215#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +00001216 case AF_PACKET:
1217 {
1218 struct sockaddr_ll* addr;
1219 struct ifreq ifr;
1220 char *interfaceName;
1221 int protoNumber;
1222 int hatype = 0;
1223 int pkttype = 0;
Andrew M. Kuchlingb8e17172004-07-10 23:39:35 +00001224 char *haddr = NULL;
1225 unsigned int halen = 0;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001226
Andrew M. Kuchlingb8e17172004-07-10 23:39:35 +00001227 if (!PyArg_ParseTuple(args, "si|iis#", &interfaceName,
1228 &protoNumber, &pkttype, &hatype,
1229 &haddr, &halen))
Jeremy Hylton22308652001-02-02 03:23:09 +00001230 return 0;
1231 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
1232 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001233 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001234 s->errorhandler();
Jeremy Hylton22308652001-02-02 03:23:09 +00001235 return 0;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001236 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001237 addr = &(s->sock_addr.ll);
1238 addr->sll_family = AF_PACKET;
1239 addr->sll_protocol = htons((short)protoNumber);
1240 addr->sll_ifindex = ifr.ifr_ifindex;
1241 addr->sll_pkttype = pkttype;
1242 addr->sll_hatype = hatype;
Andrew M. Kuchlingb8e17172004-07-10 23:39:35 +00001243 if (halen > 8) {
1244 PyErr_SetString(PyExc_ValueError,
1245 "Hardware address must be 8 bytes or less");
1246 return 0;
1247 }
1248 if (halen != 0) {
1249 memcpy(&addr->sll_addr, haddr, halen);
1250 }
1251 addr->sll_halen = halen;
Jeremy Hylton22308652001-02-02 03:23:09 +00001252 *addr_ret = (struct sockaddr *) addr;
1253 *len_ret = sizeof *addr;
1254 return 1;
1255 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00001256#endif
1257
Guido van Rossum30a685f1991-06-27 15:51:29 +00001258 /* More cases here... */
1259
1260 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001261 PyErr_SetString(socket_error, "getsockaddrarg: bad family");
Guido van Rossum30a685f1991-06-27 15:51:29 +00001262 return 0;
1263
1264 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001265}
1266
Guido van Rossum30a685f1991-06-27 15:51:29 +00001267
Guido van Rossum48a680c2001-03-02 06:34:14 +00001268/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +00001269 Return 1 if the family is known, 0 otherwise. The length is returned
1270 through len_ret. */
1271
1272static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +00001273getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +00001274{
1275 switch (s->sock_family) {
1276
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001277#if defined(AF_UNIX)
Guido van Rossum710e1df1992-06-12 10:39:36 +00001278 case AF_UNIX:
1279 {
1280 *len_ret = sizeof (struct sockaddr_un);
1281 return 1;
1282 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001283#endif /* AF_UNIX */
Guido van Rossum710e1df1992-06-12 10:39:36 +00001284
1285 case AF_INET:
1286 {
1287 *len_ret = sizeof (struct sockaddr_in);
1288 return 1;
1289 }
1290
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001291#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001292 case AF_INET6:
1293 {
1294 *len_ret = sizeof (struct sockaddr_in6);
1295 return 1;
1296 }
1297#endif
1298
Hye-Shik Chang81268602004-02-02 06:05:24 +00001299#ifdef USE_BLUETOOTH
Martin v. Löwis12af0482004-01-31 12:34:17 +00001300 case AF_BLUETOOTH:
1301 {
1302 switch(s->sock_proto)
1303 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001304
1305 case BTPROTO_L2CAP:
1306 *len_ret = sizeof (struct sockaddr_l2);
1307 return 1;
1308 case BTPROTO_RFCOMM:
1309 *len_ret = sizeof (struct sockaddr_rc);
1310 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00001311#if !defined(__FreeBSD__)
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001312 case BTPROTO_SCO:
1313 *len_ret = sizeof (struct sockaddr_sco);
1314 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00001315#endif
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001316 default:
1317 PyErr_SetString(socket_error, "getsockaddrlen: "
1318 "unknown BT protocol");
1319 return 0;
1320
Martin v. Löwis12af0482004-01-31 12:34:17 +00001321 }
1322 }
1323#endif
1324
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00001325#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +00001326 case AF_PACKET:
1327 {
1328 *len_ret = sizeof (struct sockaddr_ll);
1329 return 1;
1330 }
1331#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001332
Guido van Rossum710e1df1992-06-12 10:39:36 +00001333 /* More cases here... */
1334
1335 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001336 PyErr_SetString(socket_error, "getsockaddrlen: bad family");
Guido van Rossum710e1df1992-06-12 10:39:36 +00001337 return 0;
1338
1339 }
1340}
1341
1342
Guido van Rossum30a685f1991-06-27 15:51:29 +00001343/* s.accept() method */
1344
Guido van Rossum73624e91994-10-10 17:59:00 +00001345static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001346sock_accept(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001347{
1348 char addrbuf[256];
Fred Drakea04eaad2000-06-30 02:46:07 +00001349 SOCKET_T newfd;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001350 socklen_t addrlen;
Barry Warsaw752300b1997-01-03 17:18:10 +00001351 PyObject *sock = NULL;
1352 PyObject *addr = NULL;
1353 PyObject *res = NULL;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001354 int timeout;
Barry Warsaw752300b1997-01-03 17:18:10 +00001355
Guido van Rossum710e1df1992-06-12 10:39:36 +00001356 if (!getsockaddrlen(s, &addrlen))
1357 return NULL;
Fred Drakefd168342001-05-09 19:11:33 +00001358 memset(addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001359
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001360#ifdef MS_WINDOWS
1361 newfd = INVALID_SOCKET;
1362#else
1363 newfd = -1;
1364#endif
1365
Guido van Rossum73624e91994-10-10 17:59:00 +00001366 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001367 timeout = internal_select(s, 0);
1368 if (!timeout)
1369 newfd = accept(s->sock_fd, (struct sockaddr *) addrbuf,
1370 &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001371 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001372
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001373 if (timeout) {
1374 PyErr_SetString(socket_timeout, "timed out");
1375 return NULL;
1376 }
1377
Fred Drakea04eaad2000-06-30 02:46:07 +00001378#ifdef MS_WINDOWS
1379 if (newfd == INVALID_SOCKET)
1380#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001381 if (newfd < 0)
Fred Drakea04eaad2000-06-30 02:46:07 +00001382#endif
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001383 return s->errorhandler();
Barry Warsaw752300b1997-01-03 17:18:10 +00001384
Guido van Rossum30a685f1991-06-27 15:51:29 +00001385 /* Create the new object with unspecified family,
1386 to avoid calls to bind() etc. on it. */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001387 sock = (PyObject *) new_sockobject(newfd,
1388 s->sock_family,
1389 s->sock_type,
1390 s->sock_proto);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001391
Barry Warsaw752300b1997-01-03 17:18:10 +00001392 if (sock == NULL) {
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001393 SOCKETCLOSE(newfd);
Barry Warsaw752300b1997-01-03 17:18:10 +00001394 goto finally;
1395 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00001396 addr = makesockaddr(s->sock_fd, (struct sockaddr *)addrbuf,
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001397 addrlen, s->sock_proto);
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001398 if (addr == NULL)
Barry Warsaw752300b1997-01-03 17:18:10 +00001399 goto finally;
1400
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001401 res = PyTuple_Pack(2, sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00001402
Guido van Rossum67f7a382002-06-06 21:08:16 +00001403finally:
Guido van Rossum73624e91994-10-10 17:59:00 +00001404 Py_XDECREF(sock);
1405 Py_XDECREF(addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001406 return res;
1407}
1408
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001409PyDoc_STRVAR(accept_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001410"accept() -> (socket object, address info)\n\
1411\n\
1412Wait for an incoming connection. Return a new socket representing the\n\
1413connection, and the address of the client. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001414info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001415
Guido van Rossum11ba0942002-06-13 15:07:44 +00001416/* s.setblocking(flag) method. Argument:
1417 False -- non-blocking mode; same as settimeout(0)
1418 True -- blocking mode; same as settimeout(None)
1419*/
Guido van Rossume4485b01994-09-07 14:32:49 +00001420
Guido van Rossum73624e91994-10-10 17:59:00 +00001421static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001422sock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00001423{
1424 int block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001425
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001426 block = PyInt_AsLong(arg);
1427 if (block == -1 && PyErr_Occurred())
Guido van Rossume4485b01994-09-07 14:32:49 +00001428 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001429
Guido van Rossum11ba0942002-06-13 15:07:44 +00001430 s->sock_timeout = block ? -1.0 : 0.0;
Guido van Rossume8008f02002-06-07 03:36:20 +00001431 internal_setblocking(s, block);
Guido van Rossume4485b01994-09-07 14:32:49 +00001432
Guido van Rossum73624e91994-10-10 17:59:00 +00001433 Py_INCREF(Py_None);
1434 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +00001435}
Guido van Rossume4485b01994-09-07 14:32:49 +00001436
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001437PyDoc_STRVAR(setblocking_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001438"setblocking(flag)\n\
1439\n\
1440Set the socket to blocking (flag is true) or non-blocking (false).\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00001441setblocking(True) is equivalent to settimeout(None);\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001442setblocking(False) is equivalent to settimeout(0.0).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001443
Guido van Rossum11ba0942002-06-13 15:07:44 +00001444/* s.settimeout(timeout) method. Argument:
1445 None -- no timeout, blocking mode; same as setblocking(True)
1446 0.0 -- non-blocking mode; same as setblocking(False)
1447 > 0 -- timeout mode; operations time out after timeout seconds
1448 < 0 -- illegal; raises an exception
1449*/
Guido van Rossum67f7a382002-06-06 21:08:16 +00001450static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001451sock_settimeout(PySocketSockObject *s, PyObject *arg)
Guido van Rossum67f7a382002-06-06 21:08:16 +00001452{
Guido van Rossum11ba0942002-06-13 15:07:44 +00001453 double timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001454
1455 if (arg == Py_None)
Guido van Rossum11ba0942002-06-13 15:07:44 +00001456 timeout = -1.0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001457 else {
Guido van Rossum11ba0942002-06-13 15:07:44 +00001458 timeout = PyFloat_AsDouble(arg);
1459 if (timeout < 0.0) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00001460 if (!PyErr_Occurred())
1461 PyErr_SetString(PyExc_ValueError,
Guido van Rossum11ba0942002-06-13 15:07:44 +00001462 "Timeout value out of range");
Guido van Rossum67f7a382002-06-06 21:08:16 +00001463 return NULL;
1464 }
1465 }
1466
Guido van Rossum11ba0942002-06-13 15:07:44 +00001467 s->sock_timeout = timeout;
1468 internal_setblocking(s, timeout < 0.0);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001469
1470 Py_INCREF(Py_None);
1471 return Py_None;
1472}
1473
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001474PyDoc_STRVAR(settimeout_doc,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001475"settimeout(timeout)\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00001476\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00001477Set a timeout on socket operations. 'timeout' can be a float,\n\
1478giving in seconds, or None. Setting a timeout of None disables\n\
1479the timeout feature and is equivalent to setblocking(1).\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001480Setting a timeout of zero is the same as setblocking(0).");
Guido van Rossum67f7a382002-06-06 21:08:16 +00001481
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001482/* s.gettimeout() method.
1483 Returns the timeout associated with a socket. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00001484static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001485sock_gettimeout(PySocketSockObject *s)
Guido van Rossum67f7a382002-06-06 21:08:16 +00001486{
1487 if (s->sock_timeout < 0.0) {
1488 Py_INCREF(Py_None);
1489 return Py_None;
1490 }
1491 else
1492 return PyFloat_FromDouble(s->sock_timeout);
1493}
1494
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001495PyDoc_STRVAR(gettimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00001496"gettimeout() -> timeout\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00001497\n\
1498Returns the timeout in floating seconds associated with socket \n\
1499operations. A timeout of None indicates that timeouts on socket \n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001500operations are disabled.");
Guido van Rossume4485b01994-09-07 14:32:49 +00001501
Guido van Rossum48a680c2001-03-02 06:34:14 +00001502#ifdef RISCOS
1503/* s.sleeptaskw(1 | 0) method */
1504
1505static PyObject *
Martin v. Löwisa94568a2003-05-10 07:36:56 +00001506sock_sleeptaskw(PySocketSockObject *s,PyObject *arg)
Guido van Rossum48a680c2001-03-02 06:34:14 +00001507{
Guido van Rossum67f7a382002-06-06 21:08:16 +00001508 int block;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00001509 block = PyInt_AsLong(arg);
1510 if (block == -1 && PyErr_Occurred())
Guido van Rossum67f7a382002-06-06 21:08:16 +00001511 return NULL;
1512 Py_BEGIN_ALLOW_THREADS
1513 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
1514 Py_END_ALLOW_THREADS
Guido van Rossum48a680c2001-03-02 06:34:14 +00001515
Guido van Rossum67f7a382002-06-06 21:08:16 +00001516 Py_INCREF(Py_None);
1517 return Py_None;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001518}
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001519PyDoc_STRVAR(sleeptaskw_doc,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001520"sleeptaskw(flag)\n\
1521\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001522Allow sleeps in taskwindows.");
Guido van Rossum48a680c2001-03-02 06:34:14 +00001523#endif
1524
1525
Guido van Rossumaee08791992-09-08 09:05:33 +00001526/* s.setsockopt() method.
1527 With an integer third argument, sets an integer option.
1528 With a string third argument, sets an option from a buffer;
1529 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001530
Guido van Rossum73624e91994-10-10 17:59:00 +00001531static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001532sock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001533{
1534 int level;
1535 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001536 int res;
Guido van Rossumaee08791992-09-08 09:05:33 +00001537 char *buf;
1538 int buflen;
1539 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001540
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001541 if (PyArg_ParseTuple(args, "iii:setsockopt",
1542 &level, &optname, &flag)) {
Guido van Rossumaee08791992-09-08 09:05:33 +00001543 buf = (char *) &flag;
1544 buflen = sizeof flag;
1545 }
1546 else {
Guido van Rossum73624e91994-10-10 17:59:00 +00001547 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001548 if (!PyArg_ParseTuple(args, "iis#:setsockopt",
1549 &level, &optname, &buf, &buflen))
Guido van Rossumaee08791992-09-08 09:05:33 +00001550 return NULL;
1551 }
Thomas Wouters334fb892000-07-25 12:56:38 +00001552 res = setsockopt(s->sock_fd, level, optname, (void *)buf, buflen);
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001553 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001554 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001555 Py_INCREF(Py_None);
1556 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001557}
1558
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001559PyDoc_STRVAR(setsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001560"setsockopt(level, option, value)\n\
1561\n\
1562Set a socket option. See the Unix manual for level and option.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001563The value argument can either be an integer or a string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001564
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001565
Guido van Rossumaee08791992-09-08 09:05:33 +00001566/* s.getsockopt() method.
1567 With two arguments, retrieves an integer option.
1568 With a third integer argument, retrieves a string buffer of that size;
1569 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001570
Guido van Rossum73624e91994-10-10 17:59:00 +00001571static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001572sock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001573{
1574 int level;
1575 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001576 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +00001577 PyObject *buf;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001578 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001579
Guido van Rossumbcc20741998-08-04 22:53:56 +00001580#ifdef __BEOS__
Fred Drake564a6cc2001-05-11 20:12:26 +00001581 /* We have incomplete socket support. */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001582 PyErr_SetString(socket_error, "getsockopt not supported");
Guido van Rossumbcc20741998-08-04 22:53:56 +00001583 return NULL;
1584#else
1585
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001586 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
1587 &level, &optname, &buflen))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001588 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001589
Guido van Rossumbe32c891996-06-20 16:25:29 +00001590 if (buflen == 0) {
Guido van Rossumaee08791992-09-08 09:05:33 +00001591 int flag = 0;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001592 socklen_t flagsize = sizeof flag;
Guido van Rossumb376a4a1993-11-23 17:53:17 +00001593 res = getsockopt(s->sock_fd, level, optname,
Thomas Wouters334fb892000-07-25 12:56:38 +00001594 (void *)&flag, &flagsize);
Guido van Rossumaee08791992-09-08 09:05:33 +00001595 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001596 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001597 return PyInt_FromLong(flag);
Guido van Rossumaee08791992-09-08 09:05:33 +00001598 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001599#ifdef __VMS
1600 if (buflen > 1024) {
1601#else
Guido van Rossumaee08791992-09-08 09:05:33 +00001602 if (buflen <= 0 || buflen > 1024) {
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001603#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001604 PyErr_SetString(socket_error,
Barry Warsaw752300b1997-01-03 17:18:10 +00001605 "getsockopt buflen out of range");
Guido van Rossumaee08791992-09-08 09:05:33 +00001606 return NULL;
1607 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001608 buf = PyString_FromStringAndSize((char *)NULL, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001609 if (buf == NULL)
1610 return NULL;
Guido van Rossumb376a4a1993-11-23 17:53:17 +00001611 res = getsockopt(s->sock_fd, level, optname,
Fred Drake564a6cc2001-05-11 20:12:26 +00001612 (void *)PyString_AS_STRING(buf), &buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001613 if (res < 0) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001614 Py_DECREF(buf);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001615 return s->errorhandler();
Guido van Rossumaee08791992-09-08 09:05:33 +00001616 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001617 _PyString_Resize(&buf, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001618 return buf;
Guido van Rossumbcc20741998-08-04 22:53:56 +00001619#endif /* __BEOS__ */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001620}
1621
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001622PyDoc_STRVAR(getsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001623"getsockopt(level, option[, buffersize]) -> value\n\
1624\n\
1625Get a socket option. See the Unix manual for level and option.\n\
1626If a nonzero buffersize argument is given, the return value is a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001627string of that length; otherwise it is an integer.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001628
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001629
Fred Drake728819a2000-07-01 03:40:12 +00001630/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001631
Guido van Rossum73624e91994-10-10 17:59:00 +00001632static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001633sock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001634{
1635 struct sockaddr *addr;
1636 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001637 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001638
Fred Drake728819a2000-07-01 03:40:12 +00001639 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001640 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001641 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001642 res = bind(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001643 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001644 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001645 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001646 Py_INCREF(Py_None);
1647 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001648}
1649
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001650PyDoc_STRVAR(bind_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001651"bind(address)\n\
1652\n\
1653Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00001654pair (host, port); the host must refer to the local host. For raw packet\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001655sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001656
Guido van Rossum30a685f1991-06-27 15:51:29 +00001657
1658/* s.close() method.
1659 Set the file descriptor to -1 so operations tried subsequently
1660 will surely fail. */
1661
Guido van Rossum73624e91994-10-10 17:59:00 +00001662static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001663sock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001664{
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001665 SOCKET_T fd;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001666
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001667 if ((fd = s->sock_fd) != -1) {
1668 s->sock_fd = -1;
Guido van Rossum08481461996-10-12 14:07:22 +00001669 Py_BEGIN_ALLOW_THREADS
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001670 (void) SOCKETCLOSE(fd);
Guido van Rossum08481461996-10-12 14:07:22 +00001671 Py_END_ALLOW_THREADS
1672 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001673 Py_INCREF(Py_None);
1674 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001675}
1676
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001677PyDoc_STRVAR(close_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001678"close()\n\
1679\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001680Close the socket. It cannot be used after this call.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001681
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001682static int
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001683internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen,
1684 int *timeoutp)
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001685{
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001686 int res, timeout;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001687
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001688 timeout = 0;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001689 res = connect(s->sock_fd, addr, addrlen);
1690
1691#ifdef MS_WINDOWS
1692
1693 if (s->sock_timeout > 0.0) {
1694 if (res < 0 && WSAGetLastError() == WSAEWOULDBLOCK) {
Guido van Rossumb76bdf82003-02-19 17:50:16 +00001695 /* This is a mess. Best solution: trust select */
1696 fd_set fds;
Mark Hammonda57ec932004-08-03 05:06:26 +00001697 fd_set fds_exc;
Guido van Rossumb76bdf82003-02-19 17:50:16 +00001698 struct timeval tv;
1699 tv.tv_sec = (int)s->sock_timeout;
1700 tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6);
1701 FD_ZERO(&fds);
1702 FD_SET(s->sock_fd, &fds);
Mark Hammonda57ec932004-08-03 05:06:26 +00001703 FD_ZERO(&fds_exc);
1704 FD_SET(s->sock_fd, &fds_exc);
1705 res = select(s->sock_fd+1, NULL, &fds, &fds_exc, &tv);
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001706 if (res == 0) {
Guido van Rossumb76bdf82003-02-19 17:50:16 +00001707 res = WSAEWOULDBLOCK;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001708 timeout = 1;
Mark Hammonda57ec932004-08-03 05:06:26 +00001709 } else if (res > 0) {
1710 if (FD_ISSET(s->sock_fd, &fds))
1711 /* The socket is in the writeable set - this
1712 means connected */
1713 res = 0;
1714 else {
1715 /* As per MS docs, we need to call getsockopt()
1716 to get the underlying error */
1717 int res_size = sizeof res;
1718 /* It must be in the exception set */
1719 assert(FD_ISSET(s->sock_fd, &fds_exc));
1720 if (0 == getsockopt(s->sock_fd, SOL_SOCKET, SO_ERROR,
1721 (char *)&res, &res_size))
1722 /* getsockopt also clears WSAGetLastError,
1723 so reset it back. */
1724 WSASetLastError(res);
1725 else
1726 res = WSAGetLastError();
1727 }
1728 }
Guido van Rossumb76bdf82003-02-19 17:50:16 +00001729 /* else if (res < 0) an error occurred */
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001730 }
1731 }
1732
1733 if (res < 0)
1734 res = WSAGetLastError();
1735
1736#else
1737
1738 if (s->sock_timeout > 0.0) {
1739 if (res < 0 && errno == EINPROGRESS) {
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001740 timeout = internal_select(s, 1);
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001741 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum12e3c712002-08-08 20:39:30 +00001742 if (res < 0 && errno == EISCONN)
1743 res = 0;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001744 }
1745 }
1746
1747 if (res < 0)
1748 res = errno;
1749
1750#endif
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001751 *timeoutp = timeout;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001752
1753 return res;
1754}
Guido van Rossum30a685f1991-06-27 15:51:29 +00001755
Fred Drake728819a2000-07-01 03:40:12 +00001756/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001757
Guido van Rossum73624e91994-10-10 17:59:00 +00001758static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001759sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001760{
1761 struct sockaddr *addr;
1762 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001763 int res;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001764 int timeout;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001765
Fred Drake728819a2000-07-01 03:40:12 +00001766 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001767 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001768
Guido van Rossum73624e91994-10-10 17:59:00 +00001769 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001770 res = internal_connect(s, addr, addrlen, &timeout);
Guido van Rossum11ba0942002-06-13 15:07:44 +00001771 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001772
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001773 if (timeout) {
1774 PyErr_SetString(socket_timeout, "timed out");
1775 return NULL;
1776 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001777 if (res != 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001778 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001779 Py_INCREF(Py_None);
1780 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001781}
1782
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001783PyDoc_STRVAR(connect_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001784"connect(address)\n\
1785\n\
1786Connect the socket to a remote address. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001787is a pair (host, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001788
Guido van Rossum30a685f1991-06-27 15:51:29 +00001789
Fred Drake728819a2000-07-01 03:40:12 +00001790/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001791
1792static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001793sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001794{
1795 struct sockaddr *addr;
1796 int addrlen;
1797 int res;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001798 int timeout;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001799
Fred Drake728819a2000-07-01 03:40:12 +00001800 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001801 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001802
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001803 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001804 res = internal_connect(s, addr, addrlen, &timeout);
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001805 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001806
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001807 return PyInt_FromLong((long) res);
1808}
1809
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001810PyDoc_STRVAR(connect_ex_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00001811"connect_ex(address) -> errno\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00001812\n\
1813This is like connect(address), but returns an error code (the errno value)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001814instead of raising an exception when an error occurs.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001815
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001816
Guido van Rossumed233a51992-06-23 09:07:03 +00001817/* s.fileno() method */
1818
Guido van Rossum73624e91994-10-10 17:59:00 +00001819static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001820sock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00001821{
Fred Drakea04eaad2000-06-30 02:46:07 +00001822#if SIZEOF_SOCKET_T <= SIZEOF_LONG
Guido van Rossum73624e91994-10-10 17:59:00 +00001823 return PyInt_FromLong((long) s->sock_fd);
Fred Drakea04eaad2000-06-30 02:46:07 +00001824#else
Martin v. Löwisb9a0f912003-03-29 10:06:18 +00001825 return PyLong_FromLongLong((PY_LONG_LONG)s->sock_fd);
Fred Drakea04eaad2000-06-30 02:46:07 +00001826#endif
Guido van Rossumed233a51992-06-23 09:07:03 +00001827}
1828
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001829PyDoc_STRVAR(fileno_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001830"fileno() -> integer\n\
1831\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001832Return the integer file descriptor of the socket.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001833
Guido van Rossumed233a51992-06-23 09:07:03 +00001834
Guido van Rossumbe32c891996-06-20 16:25:29 +00001835#ifndef NO_DUP
1836/* s.dup() method */
1837
1838static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001839sock_dup(PySocketSockObject *s)
Guido van Rossumbe32c891996-06-20 16:25:29 +00001840{
Fred Drakea04eaad2000-06-30 02:46:07 +00001841 SOCKET_T newfd;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001842 PyObject *sock;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001843
Guido van Rossumbe32c891996-06-20 16:25:29 +00001844 newfd = dup(s->sock_fd);
1845 if (newfd < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001846 return s->errorhandler();
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001847 sock = (PyObject *) new_sockobject(newfd,
1848 s->sock_family,
1849 s->sock_type,
1850 s->sock_proto);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001851 if (sock == NULL)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001852 SOCKETCLOSE(newfd);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001853 return sock;
1854}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001855
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001856PyDoc_STRVAR(dup_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001857"dup() -> socket object\n\
1858\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001859Return a new socket object connected to the same system resource.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001860
Guido van Rossumbe32c891996-06-20 16:25:29 +00001861#endif
1862
1863
Guido van Rossumc89705d1992-11-26 08:54:07 +00001864/* s.getsockname() method */
1865
Guido van Rossum73624e91994-10-10 17:59:00 +00001866static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001867sock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001868{
1869 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001870 int res;
1871 socklen_t addrlen;
1872
Guido van Rossumc89705d1992-11-26 08:54:07 +00001873 if (!getsockaddrlen(s, &addrlen))
1874 return NULL;
Guido van Rossumca42b161996-01-12 01:36:05 +00001875 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001876 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001877 res = getsockname(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001878 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001879 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001880 return s->errorhandler();
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001881 return makesockaddr(s->sock_fd, (struct sockaddr *) addrbuf, addrlen,
1882 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001883}
1884
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001885PyDoc_STRVAR(getsockname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001886"getsockname() -> address info\n\
1887\n\
1888Return the address of the local endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001889info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001890
Guido van Rossumc89705d1992-11-26 08:54:07 +00001891
Guido van Rossumb6775db1994-08-01 11:34:53 +00001892#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001893/* s.getpeername() method */
1894
Guido van Rossum73624e91994-10-10 17:59:00 +00001895static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001896sock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001897{
1898 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001899 int res;
1900 socklen_t addrlen;
1901
Guido van Rossumc89705d1992-11-26 08:54:07 +00001902 if (!getsockaddrlen(s, &addrlen))
1903 return NULL;
Fred Drakefd168342001-05-09 19:11:33 +00001904 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001905 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001906 res = getpeername(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001907 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001908 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001909 return s->errorhandler();
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001910 return makesockaddr(s->sock_fd, (struct sockaddr *) addrbuf, addrlen,
1911 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001912}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001913
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001914PyDoc_STRVAR(getpeername_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001915"getpeername() -> address info\n\
1916\n\
1917Return the address of the remote endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001918info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001919
Guido van Rossumb6775db1994-08-01 11:34:53 +00001920#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001921
1922
Guido van Rossum30a685f1991-06-27 15:51:29 +00001923/* s.listen(n) method */
1924
Guido van Rossum73624e91994-10-10 17:59:00 +00001925static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001926sock_listen(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001927{
1928 int backlog;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001929 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001930
1931 backlog = PyInt_AsLong(arg);
1932 if (backlog == -1 && PyErr_Occurred())
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001933 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001934 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +00001935 if (backlog < 1)
1936 backlog = 1;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001937 res = listen(s->sock_fd, backlog);
Guido van Rossum73624e91994-10-10 17:59:00 +00001938 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001939 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001940 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001941 Py_INCREF(Py_None);
1942 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001943}
1944
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001945PyDoc_STRVAR(listen_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001946"listen(backlog)\n\
1947\n\
1948Enable a server to accept connections. The backlog argument must be at\n\
1949least 1; it specifies the number of unaccepted connection that the system\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001950will allow before refusing new connections.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001951
1952
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001953#ifndef NO_DUP
Guido van Rossum30a685f1991-06-27 15:51:29 +00001954/* s.makefile(mode) method.
1955 Create a new open file object referring to a dupped version of
1956 the socket's file descriptor. (The dup() call is necessary so
1957 that the open file and socket objects may be closed independent
1958 of each other.)
1959 The mode argument specifies 'r' or 'w' passed to fdopen(). */
1960
Guido van Rossum73624e91994-10-10 17:59:00 +00001961static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001962sock_makefile(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001963{
Tim Petersdbd9ba62000-07-09 03:09:57 +00001964 extern int fclose(FILE *);
Guido van Rossum6b144911995-03-14 15:05:13 +00001965 char *mode = "r";
1966 int bufsize = -1;
Fred Drakea04eaad2000-06-30 02:46:07 +00001967#ifdef MS_WIN32
Tim Peters79248aa2001-08-29 21:37:10 +00001968 Py_intptr_t fd;
Fred Drakea04eaad2000-06-30 02:46:07 +00001969#else
Guido van Rossum30a685f1991-06-27 15:51:29 +00001970 int fd;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001971#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001972 FILE *fp;
Guido van Rossum6b144911995-03-14 15:05:13 +00001973 PyObject *f;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001974#ifdef __VMS
1975 char *mode_r = "r";
1976 char *mode_w = "w";
1977#endif
Guido van Rossum6b144911995-03-14 15:05:13 +00001978
Guido van Rossum43713e52000-02-29 13:59:29 +00001979 if (!PyArg_ParseTuple(args, "|si:makefile", &mode, &bufsize))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001980 return NULL;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001981#ifdef __VMS
1982 if (strcmp(mode,"rb") == 0) {
1983 mode = mode_r;
1984 }
1985 else {
1986 if (strcmp(mode,"wb") == 0) {
1987 mode = mode_w;
1988 }
1989 }
1990#endif
Guido van Rossum8d665e61996-06-26 18:22:49 +00001991#ifdef MS_WIN32
Guido van Rossum82a5c661998-07-07 20:45:43 +00001992 if (((fd = _open_osfhandle(s->sock_fd, _O_BINARY)) < 0) ||
1993 ((fd = dup(fd)) < 0) || ((fp = fdopen(fd, mode)) == NULL))
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001994#else
Guido van Rossum82a5c661998-07-07 20:45:43 +00001995 if ((fd = dup(s->sock_fd)) < 0 || (fp = fdopen(fd, mode)) == NULL)
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001996#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001997 {
Guido van Rossum6b144911995-03-14 15:05:13 +00001998 if (fd >= 0)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001999 SOCKETCLOSE(fd);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002000 return s->errorhandler();
Guido van Rossum6b144911995-03-14 15:05:13 +00002001 }
2002 f = PyFile_FromFile(fp, "<socket>", mode, fclose);
2003 if (f != NULL)
2004 PyFile_SetBufSize(f, bufsize);
2005 return f;
Guido van Rossum30a685f1991-06-27 15:51:29 +00002006}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002007
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002008PyDoc_STRVAR(makefile_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002009"makefile([mode[, buffersize]]) -> file object\n\
2010\n\
2011Return a regular file object corresponding to the socket.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002012The mode and buffersize arguments are as for the built-in open() function.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002013
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002014#endif /* NO_DUP */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002015
Guido van Rossum48a680c2001-03-02 06:34:14 +00002016
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002017/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002018
Guido van Rossum73624e91994-10-10 17:59:00 +00002019static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002020sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002021{
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002022 int len, n = 0, flags = 0, timeout;
Guido van Rossum73624e91994-10-10 17:59:00 +00002023 PyObject *buf;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002024#ifdef __VMS
2025 int read_length;
2026 char *read_buf;
2027#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00002028
Guido van Rossum43713e52000-02-29 13:59:29 +00002029 if (!PyArg_ParseTuple(args, "i|i:recv", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00002030 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002031
2032 if (len < 0) {
Martin v. Löwisfba64e12001-11-19 10:41:26 +00002033 PyErr_SetString(PyExc_ValueError,
Guido van Rossum11ba0942002-06-13 15:07:44 +00002034 "negative buffersize in recv");
Martin v. Löwisfba64e12001-11-19 10:41:26 +00002035 return NULL;
2036 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002037
Guido van Rossum73624e91994-10-10 17:59:00 +00002038 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002039 if (buf == NULL)
2040 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002041
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002042#ifndef __VMS
Guido van Rossum73624e91994-10-10 17:59:00 +00002043 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002044 timeout = internal_select(s, 0);
2045 if (!timeout)
2046 n = recv(s->sock_fd, PyString_AS_STRING(buf), len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00002047 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002048
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002049 if (timeout) {
2050 Py_DECREF(buf);
2051 PyErr_SetString(socket_timeout, "timed out");
2052 return NULL;
2053 }
Guido van Rossum7c53b771995-09-13 18:39:47 +00002054 if (n < 0) {
2055 Py_DECREF(buf);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002056 return s->errorhandler();
Guido van Rossum7c53b771995-09-13 18:39:47 +00002057 }
Tim Peters5de98422002-04-27 18:44:32 +00002058 if (n != len)
2059 _PyString_Resize(&buf, n);
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002060#else
2061 read_buf = PyString_AsString(buf);
2062 read_length = len;
2063 while (read_length != 0) {
2064 unsigned int segment;
2065
2066 segment = read_length /SEGMENT_SIZE;
2067 if (segment != 0) {
2068 segment = SEGMENT_SIZE;
2069 }
2070 else {
2071 segment = read_length;
2072 }
2073
2074 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002075 timeout = internal_select(s, 0);
2076 if (!timeout)
2077 n = recv(s->sock_fd, read_buf, segment, flags);
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002078 Py_END_ALLOW_THREADS
2079
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002080 if (timeout) {
2081 Py_DECREF(buf);
2082 PyErr_SetString(socket_timeout, "timed out");
2083 return NULL;
2084 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002085 if (n < 0) {
2086 Py_DECREF(buf);
2087 return s->errorhandler();
2088 }
2089 if (n != read_length) {
2090 read_buf += n;
2091 break;
2092 }
2093
2094 read_length -= segment;
2095 read_buf += segment;
2096 }
2097 if (_PyString_Resize(&buf, (read_buf - PyString_AsString(buf))) < 0)
2098 {
2099 return NULL;
2100 }
2101#endif /* !__VMS */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002102 return buf;
2103}
2104
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002105PyDoc_STRVAR(recv_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002106"recv(buffersize[, flags]) -> data\n\
2107\n\
2108Receive up to buffersize bytes from the socket. For the optional flags\n\
2109argument, see the Unix manual. When no data is available, block until\n\
2110at least one byte is available or until the remote end is closed. When\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002111the remote end is closed and all data is read, return the empty string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002112
Guido van Rossum30a685f1991-06-27 15:51:29 +00002113
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002114/* s.recvfrom(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002115
Guido van Rossum73624e91994-10-10 17:59:00 +00002116static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002117sock_recvfrom(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002118{
2119 char addrbuf[256];
Barry Warsaw752300b1997-01-03 17:18:10 +00002120 PyObject *buf = NULL;
2121 PyObject *addr = NULL;
2122 PyObject *ret = NULL;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002123 int len, n = 0, flags = 0, timeout;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002124 socklen_t addrlen;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002125
Guido van Rossum43713e52000-02-29 13:59:29 +00002126 if (!PyArg_ParseTuple(args, "i|i:recvfrom", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00002127 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002128
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00002129 if (!getsockaddrlen(s, &addrlen))
2130 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00002131 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00002132 if (buf == NULL)
2133 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002134
Guido van Rossum73624e91994-10-10 17:59:00 +00002135 Py_BEGIN_ALLOW_THREADS
Fred Drakefd168342001-05-09 19:11:33 +00002136 memset(addrbuf, 0, addrlen);
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002137 timeout = internal_select(s, 0);
2138 if (!timeout)
2139 n = recvfrom(s->sock_fd, PyString_AS_STRING(buf), len, flags,
Guido van Rossum8d665e61996-06-26 18:22:49 +00002140#ifndef MS_WINDOWS
Andrew MacIntyreba43e872002-03-03 03:03:52 +00002141#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002142 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00002143#else
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002144 (void *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00002145#endif
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002146#else
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002147 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002148#endif
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002149 );
Guido van Rossum73624e91994-10-10 17:59:00 +00002150 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002151
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002152 if (timeout) {
2153 Py_DECREF(buf);
2154 PyErr_SetString(socket_timeout, "timed out");
2155 return NULL;
2156 }
Guido van Rossum7c53b771995-09-13 18:39:47 +00002157 if (n < 0) {
2158 Py_DECREF(buf);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002159 return s->errorhandler();
Guido van Rossum7c53b771995-09-13 18:39:47 +00002160 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002161
Guido van Rossum53a9bf81996-06-11 18:35:24 +00002162 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002163 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002164
Guido van Rossum67f7a382002-06-06 21:08:16 +00002165 if (!(addr = makesockaddr(s->sock_fd, (struct sockaddr *)addrbuf,
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00002166 addrlen, s->sock_proto)))
Barry Warsaw752300b1997-01-03 17:18:10 +00002167 goto finally;
2168
Raymond Hettinger8ae46892003-10-12 19:09:37 +00002169 ret = PyTuple_Pack(2, buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002170
2171finally:
Guido van Rossum73624e91994-10-10 17:59:00 +00002172 Py_XDECREF(addr);
2173 Py_XDECREF(buf);
Guido van Rossum6f5afc91993-02-05 09:46:15 +00002174 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002175}
2176
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002177PyDoc_STRVAR(recvfrom_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002178"recvfrom(buffersize[, flags]) -> (data, address info)\n\
2179\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002180Like recv(buffersize, flags) but also return the sender's address info.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002181
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002182/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002183
Guido van Rossum73624e91994-10-10 17:59:00 +00002184static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002185sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002186{
Guido van Rossumff4949e1992-08-05 19:58:53 +00002187 char *buf;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002188 int len, n = 0, flags = 0, timeout;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002189#ifdef __VMS
2190 int send_length;
2191#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00002192
Guido van Rossum43713e52000-02-29 13:59:29 +00002193 if (!PyArg_ParseTuple(args, "s#|i:send", &buf, &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00002194 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002195
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002196#ifndef __VMS
Guido van Rossum73624e91994-10-10 17:59:00 +00002197 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002198 timeout = internal_select(s, 1);
2199 if (!timeout)
2200 n = send(s->sock_fd, buf, len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00002201 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002202
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002203 if (timeout) {
2204 PyErr_SetString(socket_timeout, "timed out");
2205 return NULL;
2206 }
Guido van Rossum30a685f1991-06-27 15:51:29 +00002207 if (n < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002208 return s->errorhandler();
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002209#else
2210 /* Divide packet into smaller segments for */
2211 /* TCP/IP Services for OpenVMS */
2212 send_length = len;
2213 while (send_length != 0) {
2214 unsigned int segment;
2215
2216 segment = send_length / SEGMENT_SIZE;
2217 if (segment != 0) {
2218 segment = SEGMENT_SIZE;
2219 }
2220 else {
2221 segment = send_length;
2222 }
2223 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002224 timeout = internal_select(s, 1);
2225 if (!timeout)
2226 n = send(s->sock_fd, buf, segment, flags);
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002227 Py_END_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002228 if (timeout) {
2229 PyErr_SetString(socket_timeout, "timed out");
2230 return NULL;
2231 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002232 if (n < 0) {
2233 return s->errorhandler();
2234 }
2235 send_length -= segment;
2236 buf += segment;
2237 } /* end while */
2238#endif /* !__VMS */
Guido van Rossum73624e91994-10-10 17:59:00 +00002239 return PyInt_FromLong((long)n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00002240}
2241
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002242PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002243"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002244\n\
2245Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002246argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002247sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002248
2249
2250/* s.sendall(data [,flags]) method */
2251
2252static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002253sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002254{
2255 char *buf;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002256 int len, n = 0, flags = 0, timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002257
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002258 if (!PyArg_ParseTuple(args, "s#|i:sendall", &buf, &len, &flags))
2259 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002260
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002261 Py_BEGIN_ALLOW_THREADS
2262 do {
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002263 timeout = internal_select(s, 1);
2264 if (timeout)
2265 break;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002266 n = send(s->sock_fd, buf, len, flags);
2267 if (n < 0)
2268 break;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002269 buf += n;
2270 len -= n;
2271 } while (len > 0);
2272 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002273
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002274 if (timeout) {
2275 PyErr_SetString(socket_timeout, "timed out");
2276 return NULL;
2277 }
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002278 if (n < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002279 return s->errorhandler();
Guido van Rossum67f7a382002-06-06 21:08:16 +00002280
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002281 Py_INCREF(Py_None);
2282 return Py_None;
2283}
2284
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002285PyDoc_STRVAR(sendall_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002286"sendall(data[, flags])\n\
2287\n\
2288Send a data string to the socket. For the optional flags\n\
2289argument, see the Unix manual. This calls send() repeatedly\n\
2290until all data is sent. If an error occurs, it's impossible\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002291to tell how much data has been sent.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002292
Guido van Rossum30a685f1991-06-27 15:51:29 +00002293
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002294/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002295
Guido van Rossum73624e91994-10-10 17:59:00 +00002296static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002297sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002298{
Guido van Rossum73624e91994-10-10 17:59:00 +00002299 PyObject *addro;
Guido van Rossumff4949e1992-08-05 19:58:53 +00002300 char *buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002301 struct sockaddr *addr;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002302 int addrlen, len, n = 0, flags, timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002303
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002304 flags = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002305 if (!PyArg_ParseTuple(args, "s#O:sendto", &buf, &len, &addro)) {
Guido van Rossum73624e91994-10-10 17:59:00 +00002306 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002307 if (!PyArg_ParseTuple(args, "s#iO:sendto",
2308 &buf, &len, &flags, &addro))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002309 return NULL;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002310 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002311
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002312 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002313 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002314
Guido van Rossum73624e91994-10-10 17:59:00 +00002315 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002316 timeout = internal_select(s, 1);
2317 if (!timeout)
2318 n = sendto(s->sock_fd, buf, len, flags, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00002319 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002320
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002321 if (timeout) {
2322 PyErr_SetString(socket_timeout, "timed out");
2323 return NULL;
2324 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002325 if (n < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002326 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00002327 return PyInt_FromLong((long)n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002328}
2329
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002330PyDoc_STRVAR(sendto_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002331"sendto(data[, flags], address) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002332\n\
2333Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002334For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002335
Guido van Rossum30a685f1991-06-27 15:51:29 +00002336
2337/* s.shutdown(how) method */
2338
Guido van Rossum73624e91994-10-10 17:59:00 +00002339static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002340sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002341{
2342 int how;
Guido van Rossumff4949e1992-08-05 19:58:53 +00002343 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002344
2345 how = PyInt_AsLong(arg);
2346 if (how == -1 && PyErr_Occurred())
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002347 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00002348 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002349 res = shutdown(s->sock_fd, how);
Guido van Rossum73624e91994-10-10 17:59:00 +00002350 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002351 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002352 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00002353 Py_INCREF(Py_None);
2354 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002355}
2356
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002357PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002358"shutdown(flag)\n\
2359\n\
Martin v. Löwis94681fc2003-11-27 19:40:22 +00002360Shut down the reading side of the socket (flag == SHUT_RD), the writing side\n\
2361of the socket (flag == SHUT_WR), or both ends (flag == SHUT_RDWR).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002362
Guido van Rossum30a685f1991-06-27 15:51:29 +00002363
2364/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002365
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002366static PyMethodDef sock_methods[] = {
2367 {"accept", (PyCFunction)sock_accept, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002368 accept_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002369 {"bind", (PyCFunction)sock_bind, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002370 bind_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002371 {"close", (PyCFunction)sock_close, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002372 close_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002373 {"connect", (PyCFunction)sock_connect, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002374 connect_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002375 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002376 connect_ex_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00002377#ifndef NO_DUP
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002378 {"dup", (PyCFunction)sock_dup, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002379 dup_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00002380#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002381 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002382 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00002383#ifdef HAVE_GETPEERNAME
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002384 {"getpeername", (PyCFunction)sock_getpeername,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002385 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00002386#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002387 {"getsockname", (PyCFunction)sock_getsockname,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002388 METH_NOARGS, getsockname_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002389 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002390 getsockopt_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002391 {"listen", (PyCFunction)sock_listen, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002392 listen_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002393#ifndef NO_DUP
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002394 {"makefile", (PyCFunction)sock_makefile, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002395 makefile_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002396#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002397 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002398 recv_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002399 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002400 recvfrom_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002401 {"send", (PyCFunction)sock_send, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002402 send_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002403 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002404 sendall_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002405 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002406 sendto_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002407 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002408 setblocking_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002409 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
Guido van Rossum67f7a382002-06-06 21:08:16 +00002410 settimeout_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002411 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
Guido van Rossum67f7a382002-06-06 21:08:16 +00002412 gettimeout_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002413 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002414 setsockopt_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002415 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002416 shutdown_doc},
2417#ifdef RISCOS
Martin v. Löwisa94568a2003-05-10 07:36:56 +00002418 {"sleeptaskw", (PyCFunction)sock_sleeptaskw, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002419 sleeptaskw_doc},
2420#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +00002421 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002422};
2423
Guido van Rossum30a685f1991-06-27 15:51:29 +00002424
Guido van Rossum73624e91994-10-10 17:59:00 +00002425/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00002426 First close the file description. */
2427
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002428static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002429sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002430{
Guido van Rossumfa972c92000-04-10 12:45:45 +00002431 if (s->sock_fd != -1)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00002432 (void) SOCKETCLOSE(s->sock_fd);
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002433 s->ob_type->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002434}
2435
Guido van Rossum30a685f1991-06-27 15:51:29 +00002436
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002437static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002438sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002439{
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002440 char buf[512];
Fred Drakea04eaad2000-06-30 02:46:07 +00002441#if SIZEOF_SOCKET_T > SIZEOF_LONG
2442 if (s->sock_fd > LONG_MAX) {
2443 /* this can occur on Win64, and actually there is a special
2444 ugly printf formatter for decimal pointer length integer
2445 printing, only bother if necessary*/
2446 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002447 "no printf formatter to display "
2448 "the socket descriptor in decimal");
Fred Drakea04eaad2000-06-30 02:46:07 +00002449 return NULL;
2450 }
2451#endif
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002452 PyOS_snprintf(
2453 buf, sizeof(buf),
2454 "<socket object, fd=%ld, family=%d, type=%d, protocol=%d>",
2455 (long)s->sock_fd, s->sock_family,
2456 s->sock_type,
2457 s->sock_proto);
Guido van Rossumdc1c64a1996-02-27 15:21:19 +00002458 return PyString_FromString(buf);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002459}
2460
2461
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002462/* Create a new, uninitialized socket object. */
2463
2464static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002465sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002466{
2467 PyObject *new;
2468
2469 new = type->tp_alloc(type, 0);
Guido van Rossume1c478f2002-06-06 20:08:25 +00002470 if (new != NULL) {
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002471 ((PySocketSockObject *)new)->sock_fd = -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002472 ((PySocketSockObject *)new)->sock_timeout = -1.0;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002473 ((PySocketSockObject *)new)->errorhandler = &set_error;
Guido van Rossume1c478f2002-06-06 20:08:25 +00002474 }
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002475 return new;
2476}
2477
2478
2479/* Initialize a new socket object. */
2480
2481/*ARGSUSED*/
2482static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00002483sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002484{
2485 PySocketSockObject *s = (PySocketSockObject *)self;
2486 SOCKET_T fd;
2487 int family = AF_INET, type = SOCK_STREAM, proto = 0;
2488 static char *keywords[] = {"family", "type", "proto", 0};
2489
2490 if (!PyArg_ParseTupleAndKeywords(args, kwds,
2491 "|iii:socket", keywords,
2492 &family, &type, &proto))
2493 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002494
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002495 Py_BEGIN_ALLOW_THREADS
2496 fd = socket(family, type, proto);
2497 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002498
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002499#ifdef MS_WINDOWS
2500 if (fd == INVALID_SOCKET)
2501#else
2502 if (fd < 0)
2503#endif
2504 {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002505 set_error();
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002506 return -1;
2507 }
2508 init_sockobject(s, fd, family, type, proto);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002509
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002510 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002511
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002512}
2513
2514
Guido van Rossumb6775db1994-08-01 11:34:53 +00002515/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002516
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002517static PyTypeObject sock_type = {
Guido van Rossum55558541996-05-23 22:54:50 +00002518 PyObject_HEAD_INIT(0) /* Must fill in type value later */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002519 0, /* ob_size */
Guido van Rossumca6dfa52001-10-28 12:31:33 +00002520 "_socket.socket", /* tp_name */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002521 sizeof(PySocketSockObject), /* tp_basicsize */
2522 0, /* tp_itemsize */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002523 (destructor)sock_dealloc, /* tp_dealloc */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002524 0, /* tp_print */
2525 0, /* tp_getattr */
2526 0, /* tp_setattr */
2527 0, /* tp_compare */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002528 (reprfunc)sock_repr, /* tp_repr */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002529 0, /* tp_as_number */
2530 0, /* tp_as_sequence */
2531 0, /* tp_as_mapping */
2532 0, /* tp_hash */
2533 0, /* tp_call */
2534 0, /* tp_str */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002535 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002536 0, /* tp_setattro */
2537 0, /* tp_as_buffer */
2538 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002539 sock_doc, /* tp_doc */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002540 0, /* tp_traverse */
2541 0, /* tp_clear */
2542 0, /* tp_richcompare */
2543 0, /* tp_weaklistoffset */
2544 0, /* tp_iter */
2545 0, /* tp_iternext */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002546 sock_methods, /* tp_methods */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002547 0, /* tp_members */
2548 0, /* tp_getset */
2549 0, /* tp_base */
2550 0, /* tp_dict */
2551 0, /* tp_descr_get */
2552 0, /* tp_descr_set */
2553 0, /* tp_dictoffset */
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00002554 sock_initobj, /* tp_init */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002555 PyType_GenericAlloc, /* tp_alloc */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002556 sock_new, /* tp_new */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002557 PyObject_Del, /* tp_free */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002558};
2559
Guido van Rossum30a685f1991-06-27 15:51:29 +00002560
Guido van Rossum81194471991-07-27 21:42:02 +00002561/* Python interface to gethostname(). */
2562
2563/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002564static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002565socket_gethostname(PyObject *self, PyObject *args)
Guido van Rossum81194471991-07-27 21:42:02 +00002566{
2567 char buf[1024];
Guido van Rossumff4949e1992-08-05 19:58:53 +00002568 int res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002569 if (!PyArg_ParseTuple(args, ":gethostname"))
Guido van Rossum81194471991-07-27 21:42:02 +00002570 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00002571 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002572 res = gethostname(buf, (int) sizeof buf - 1);
Guido van Rossum73624e91994-10-10 17:59:00 +00002573 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002574 if (res < 0)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002575 return set_error();
Guido van Rossum81194471991-07-27 21:42:02 +00002576 buf[sizeof buf - 1] = '\0';
Guido van Rossum73624e91994-10-10 17:59:00 +00002577 return PyString_FromString(buf);
Guido van Rossum81194471991-07-27 21:42:02 +00002578}
Guido van Rossumff4949e1992-08-05 19:58:53 +00002579
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002580PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002581"gethostname() -> string\n\
2582\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002583Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002584
Guido van Rossumff4949e1992-08-05 19:58:53 +00002585
Guido van Rossum30a685f1991-06-27 15:51:29 +00002586/* Python interface to gethostbyname(name). */
2587
2588/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002589static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002590socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002591{
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002592 char *name;
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00002593#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002594 struct sockaddr_storage addrbuf;
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00002595#else
2596 struct sockaddr_in addrbuf;
2597#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002598
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002599 if (!PyArg_ParseTuple(args, "s:gethostbyname", &name))
Guido van Rossum30a685f1991-06-27 15:51:29 +00002600 return NULL;
Martin v. Löwisddc6f472002-07-28 16:10:31 +00002601 if (setipaddr(name, (struct sockaddr *)&addrbuf, sizeof(addrbuf), AF_INET) < 0)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002602 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002603 return makeipaddr((struct sockaddr *)&addrbuf,
2604 sizeof(struct sockaddr_in));
Guido van Rossum30a685f1991-06-27 15:51:29 +00002605}
2606
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002607PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002608"gethostbyname(host) -> address\n\
2609\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002610Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002611
2612
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002613/* Convenience function common to gethostbyname_ex and gethostbyaddr */
2614
2615static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002616gethost_common(struct hostent *h, struct sockaddr *addr, int alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002617{
2618 char **pch;
2619 PyObject *rtn_tuple = (PyObject *)NULL;
2620 PyObject *name_list = (PyObject *)NULL;
2621 PyObject *addr_list = (PyObject *)NULL;
2622 PyObject *tmp;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002623
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002624 if (h == NULL) {
Guido van Rossum48a680c2001-03-02 06:34:14 +00002625 /* Let's get real error message to return */
Guido van Rossume2ae77b2001-10-24 20:42:55 +00002626#ifndef RISCOS
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002627 set_herror(h_errno);
Guido van Rossume2ae77b2001-10-24 20:42:55 +00002628#else
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002629 PyErr_SetString(socket_error, "host not found");
Guido van Rossume2ae77b2001-10-24 20:42:55 +00002630#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002631 return NULL;
2632 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002633
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002634 if (h->h_addrtype != af) {
2635#ifdef HAVE_STRERROR
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002636 /* Let's get real error message to return */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002637 PyErr_SetString(socket_error,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002638 (char *)strerror(EAFNOSUPPORT));
2639#else
2640 PyErr_SetString(
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002641 socket_error,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002642 "Address family not supported by protocol family");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002643#endif
2644 return NULL;
2645 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002646
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002647 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00002648
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002649 case AF_INET:
2650 if (alen < sizeof(struct sockaddr_in))
2651 return NULL;
2652 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002653
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002654#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002655 case AF_INET6:
2656 if (alen < sizeof(struct sockaddr_in6))
2657 return NULL;
2658 break;
2659#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00002660
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002661 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002662
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002663 if ((name_list = PyList_New(0)) == NULL)
2664 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002665
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002666 if ((addr_list = PyList_New(0)) == NULL)
2667 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002668
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002669 for (pch = h->h_aliases; *pch != NULL; pch++) {
2670 int status;
2671 tmp = PyString_FromString(*pch);
2672 if (tmp == NULL)
2673 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002674
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002675 status = PyList_Append(name_list, tmp);
2676 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002677
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002678 if (status)
2679 goto err;
2680 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002681
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002682 for (pch = h->h_addr_list; *pch != NULL; pch++) {
2683 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002684
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002685 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00002686
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002687 case AF_INET:
2688 {
2689 struct sockaddr_in sin;
2690 memset(&sin, 0, sizeof(sin));
2691 sin.sin_family = af;
2692#ifdef HAVE_SOCKADDR_SA_LEN
2693 sin.sin_len = sizeof(sin);
2694#endif
2695 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
2696 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
Guido van Rossum67f7a382002-06-06 21:08:16 +00002697
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002698 if (pch == h->h_addr_list && alen >= sizeof(sin))
2699 memcpy((char *) addr, &sin, sizeof(sin));
2700 break;
2701 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002702
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002703#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002704 case AF_INET6:
2705 {
2706 struct sockaddr_in6 sin6;
2707 memset(&sin6, 0, sizeof(sin6));
2708 sin6.sin6_family = af;
2709#ifdef HAVE_SOCKADDR_SA_LEN
2710 sin6.sin6_len = sizeof(sin6);
2711#endif
2712 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
2713 tmp = makeipaddr((struct sockaddr *)&sin6,
2714 sizeof(sin6));
Guido van Rossum67f7a382002-06-06 21:08:16 +00002715
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002716 if (pch == h->h_addr_list && alen >= sizeof(sin6))
2717 memcpy((char *) addr, &sin6, sizeof(sin6));
2718 break;
2719 }
2720#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00002721
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002722 default: /* can't happen */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002723 PyErr_SetString(socket_error,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002724 "unsupported address family");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002725 return NULL;
2726 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002727
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002728 if (tmp == NULL)
2729 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002730
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002731 status = PyList_Append(addr_list, tmp);
2732 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002733
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002734 if (status)
2735 goto err;
2736 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002737
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002738 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002739
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002740 err:
2741 Py_XDECREF(name_list);
2742 Py_XDECREF(addr_list);
2743 return rtn_tuple;
2744}
2745
2746
2747/* Python interface to gethostbyname_ex(name). */
2748
2749/*ARGSUSED*/
2750static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002751socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002752{
2753 char *name;
2754 struct hostent *h;
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00002755#ifdef ENABLE_IPV6
2756 struct sockaddr_storage addr;
2757#else
2758 struct sockaddr_in addr;
2759#endif
Martin v. Löwis9db2f572001-07-23 01:30:10 +00002760 struct sockaddr *sa;
Guido van Rossum955becc1999-03-22 20:14:53 +00002761 PyObject *ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002762#ifdef HAVE_GETHOSTBYNAME_R
2763 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002764#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
2765 struct hostent_data data;
2766#else
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002767 char buf[16384];
2768 int buf_len = (sizeof buf) - 1;
2769 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002770#endif
2771#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002772 int result;
2773#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002774#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002775
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002776 if (!PyArg_ParseTuple(args, "s:gethostbyname_ex", &name))
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002777 return NULL;
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00002778 if (setipaddr(name, (struct sockaddr *)&addr, sizeof(addr), AF_INET) < 0)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002779 return NULL;
2780 Py_BEGIN_ALLOW_THREADS
2781#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002782#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002783 result = gethostbyname_r(name, &hp_allocated, buf, buf_len,
2784 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002785#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002786 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002787#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00002788 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002789 result = gethostbyname_r(name, &hp_allocated, &data);
2790 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002791#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002792#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00002793#ifdef USE_GETHOSTBYNAME_LOCK
Just van Rossum1040d2c2003-05-09 07:53:18 +00002794 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002795#endif
2796 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002797#endif /* HAVE_GETHOSTBYNAME_R */
2798 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002799 /* Some C libraries would require addr.__ss_family instead of
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002800 addr.ss_family.
2801 Therefore, we cast the sockaddr_storage into sockaddr to
2802 access sa_family. */
Martin v. Löwis9db2f572001-07-23 01:30:10 +00002803 sa = (struct sockaddr*)&addr;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002804 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr),
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002805 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00002806#ifdef USE_GETHOSTBYNAME_LOCK
Just van Rossum1040d2c2003-05-09 07:53:18 +00002807 PyThread_release_lock(netdb_lock);
Guido van Rossum955becc1999-03-22 20:14:53 +00002808#endif
2809 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002810}
2811
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002812PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002813"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
2814\n\
2815Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002816for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002817
2818
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002819/* Python interface to gethostbyaddr(IP). */
2820
2821/*ARGSUSED*/
2822static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002823socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002824{
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002825#ifdef ENABLE_IPV6
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002826 struct sockaddr_storage addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002827#else
Guido van Rossum48a680c2001-03-02 06:34:14 +00002828 struct sockaddr_in addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002829#endif
2830 struct sockaddr *sa = (struct sockaddr *)&addr;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002831 char *ip_num;
2832 struct hostent *h;
Guido van Rossum3baaa131999-03-22 21:44:51 +00002833 PyObject *ret;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002834#ifdef HAVE_GETHOSTBYNAME_R
2835 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002836#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
2837 struct hostent_data data;
2838#else
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002839 char buf[16384];
2840 int buf_len = (sizeof buf) - 1;
2841 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002842#endif
2843#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002844 int result;
2845#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002846#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002847 char *ap;
2848 int al;
2849 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002850
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002851 if (!PyArg_ParseTuple(args, "s:gethostbyaddr", &ip_num))
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002852 return NULL;
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00002853 af = AF_UNSPEC;
Martin v. Löwisddc6f472002-07-28 16:10:31 +00002854 if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002855 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002856 af = sa->sa_family;
2857 ap = NULL;
2858 al = 0;
2859 switch (af) {
2860 case AF_INET:
2861 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
2862 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
2863 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002864#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002865 case AF_INET6:
2866 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
2867 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
2868 break;
2869#endif
2870 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002871 PyErr_SetString(socket_error, "unsupported address family");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002872 return NULL;
2873 }
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002874 Py_BEGIN_ALLOW_THREADS
2875#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002876#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002877 result = gethostbyaddr_r(ap, al, af,
2878 &hp_allocated, buf, buf_len,
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002879 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002880#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002881 h = gethostbyaddr_r(ap, al, af,
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002882 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002883#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00002884 memset((void *) &data, '\0', sizeof(data));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002885 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002886 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002887#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002888#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00002889#ifdef USE_GETHOSTBYNAME_LOCK
Just van Rossum1040d2c2003-05-09 07:53:18 +00002890 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002891#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002892 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002893#endif /* HAVE_GETHOSTBYNAME_R */
2894 Py_END_ALLOW_THREADS
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002895 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00002896#ifdef USE_GETHOSTBYNAME_LOCK
Just van Rossum1040d2c2003-05-09 07:53:18 +00002897 PyThread_release_lock(netdb_lock);
Guido van Rossum3baaa131999-03-22 21:44:51 +00002898#endif
2899 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002900}
2901
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002902PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002903"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
2904\n\
2905Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002906for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002907
Guido van Rossum30a685f1991-06-27 15:51:29 +00002908
2909/* Python interface to getservbyname(name).
2910 This only returns the port number, since the other info is already
2911 known or not useful (like the list of aliases). */
2912
2913/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002914static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002915socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002916{
Barry Warsaw11b91a02004-06-28 00:50:43 +00002917 char *name, *proto=NULL;
Guido van Rossum30a685f1991-06-27 15:51:29 +00002918 struct servent *sp;
Barry Warsaw11b91a02004-06-28 00:50:43 +00002919 if (!PyArg_ParseTuple(args, "s|s:getservbyname", &name, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +00002920 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00002921 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002922 sp = getservbyname(name, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00002923 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00002924 if (sp == NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002925 PyErr_SetString(socket_error, "service/proto not found");
Guido van Rossum30a685f1991-06-27 15:51:29 +00002926 return NULL;
2927 }
Guido van Rossum73624e91994-10-10 17:59:00 +00002928 return PyInt_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00002929}
2930
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002931PyDoc_STRVAR(getservbyname_doc,
Barry Warsaw11b91a02004-06-28 00:50:43 +00002932"getservbyname(servicename[, protocolname]) -> integer\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002933\n\
2934Return a port number from a service name and protocol name.\n\
Barry Warsaw11b91a02004-06-28 00:50:43 +00002935The optional protocol name, if given, should be 'tcp' or 'udp',\n\
2936otherwise any protocol will match.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002937
Guido van Rossum30a685f1991-06-27 15:51:29 +00002938
Barry Warsaw11b91a02004-06-28 00:50:43 +00002939/* Python interface to getservbyport(port).
2940 This only returns the service name, since the other info is already
2941 known or not useful (like the list of aliases). */
2942
2943/*ARGSUSED*/
2944static PyObject *
2945socket_getservbyport(PyObject *self, PyObject *args)
2946{
2947 int port;
2948 char *proto=NULL;
2949 struct servent *sp;
2950 if (!PyArg_ParseTuple(args, "i|s:getservbyport", &port, &proto))
2951 return NULL;
2952 Py_BEGIN_ALLOW_THREADS
2953 sp = getservbyport(htons(port), proto);
2954 Py_END_ALLOW_THREADS
2955 if (sp == NULL) {
2956 PyErr_SetString(socket_error, "port/proto not found");
2957 return NULL;
2958 }
2959 return PyString_FromString(sp->s_name);
2960}
2961
2962PyDoc_STRVAR(getservbyport_doc,
2963"getservbyport(port[, protocolname]) -> string\n\
2964\n\
2965Return the service name from a port number and protocol name.\n\
2966The optional protocol name, if given, should be 'tcp' or 'udp',\n\
2967otherwise any protocol will match.");
2968
Guido van Rossum3901d851996-12-19 16:35:04 +00002969/* Python interface to getprotobyname(name).
2970 This only returns the protocol number, since the other info is
2971 already known or not useful (like the list of aliases). */
2972
2973/*ARGSUSED*/
2974static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002975socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00002976{
2977 char *name;
2978 struct protoent *sp;
Guido van Rossumbcc20741998-08-04 22:53:56 +00002979#ifdef __BEOS__
2980/* Not available in BeOS yet. - [cjh] */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002981 PyErr_SetString(socket_error, "getprotobyname not supported");
Guido van Rossumbcc20741998-08-04 22:53:56 +00002982 return NULL;
2983#else
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002984 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
Guido van Rossum3901d851996-12-19 16:35:04 +00002985 return NULL;
2986 Py_BEGIN_ALLOW_THREADS
2987 sp = getprotobyname(name);
2988 Py_END_ALLOW_THREADS
2989 if (sp == NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002990 PyErr_SetString(socket_error, "protocol not found");
Guido van Rossum3901d851996-12-19 16:35:04 +00002991 return NULL;
2992 }
2993 return PyInt_FromLong((long) sp->p_proto);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002994#endif
Guido van Rossum3901d851996-12-19 16:35:04 +00002995}
2996
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002997PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002998"getprotobyname(name) -> integer\n\
2999\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003000Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003001
Guido van Rossum3901d851996-12-19 16:35:04 +00003002
Dave Cole331708b2004-08-09 04:51:41 +00003003#ifdef HAVE_SOCKETPAIR
3004/* Create a pair of sockets using the socketpair() function.
Dave Cole07fda7e2004-08-23 05:16:23 +00003005 Arguments as for socket() except the default family is AF_UNIX if
Dave Colee8bbfe42004-08-26 00:51:16 +00003006 defined on the platform; otherwise, the default is AF_INET. */
Dave Cole331708b2004-08-09 04:51:41 +00003007
3008/*ARGSUSED*/
3009static PyObject *
3010socket_socketpair(PyObject *self, PyObject *args)
3011{
3012 PySocketSockObject *s0 = NULL, *s1 = NULL;
3013 SOCKET_T sv[2];
3014 int family, type = SOCK_STREAM, proto = 0;
3015 PyObject *res = NULL;
3016
3017#if defined(AF_UNIX)
3018 family = AF_UNIX;
3019#else
3020 family = AF_INET;
3021#endif
3022 if (!PyArg_ParseTuple(args, "|iii:socketpair",
3023 &family, &type, &proto))
3024 return NULL;
3025 /* Create a pair of socket fds */
3026 if (socketpair(family, type, proto, sv) < 0)
3027 return set_error();
Dave Cole331708b2004-08-09 04:51:41 +00003028 s0 = new_sockobject(sv[0], family, type, proto);
3029 if (s0 == NULL)
3030 goto finally;
3031 s1 = new_sockobject(sv[1], family, type, proto);
3032 if (s1 == NULL)
3033 goto finally;
3034 res = PyTuple_Pack(2, s0, s1);
3035
3036finally:
3037 if (res == NULL) {
3038 if (s0 == NULL)
3039 SOCKETCLOSE(sv[0]);
3040 if (s1 == NULL)
3041 SOCKETCLOSE(sv[1]);
3042 }
3043 Py_XDECREF(s0);
3044 Py_XDECREF(s1);
3045 return res;
3046}
3047
3048PyDoc_STRVAR(socketpair_doc,
3049"socketpair([family[, type[, proto]]]) -> (socket object, socket object)\n\
3050\n\
3051Create a pair of socket objects from the sockets returned by the platform\n\
3052socketpair() function.\n\
Dave Cole07fda7e2004-08-23 05:16:23 +00003053The arguments are the same as for socket() except the default family is\n\
Dave Colee8bbfe42004-08-26 00:51:16 +00003054AF_UNIX if defined on the platform; otherwise, the default is AF_INET.");
Dave Cole331708b2004-08-09 04:51:41 +00003055
3056#endif /* HAVE_SOCKETPAIR */
3057
3058
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00003059#ifndef NO_DUP
Guido van Rossum2a7178e1992-12-08 13:38:24 +00003060/* Create a socket object from a numeric file description.
3061 Useful e.g. if stdin is a socket.
3062 Additional arguments as for socket(). */
3063
3064/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00003065static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003066socket_fromfd(PyObject *self, PyObject *args)
Guido van Rossum2a7178e1992-12-08 13:38:24 +00003067{
Guido van Rossum73624e91994-10-10 17:59:00 +00003068 PySocketSockObject *s;
Fred Drakea04eaad2000-06-30 02:46:07 +00003069 SOCKET_T fd;
3070 int family, type, proto = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00003071 if (!PyArg_ParseTuple(args, "iii|i:fromfd",
3072 &fd, &family, &type, &proto))
Guido van Rossumbe32c891996-06-20 16:25:29 +00003073 return NULL;
Guido van Rossum5f59d601992-12-14 16:59:51 +00003074 /* Dup the fd so it and the socket can be closed independently */
3075 fd = dup(fd);
3076 if (fd < 0)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003077 return set_error();
3078 s = new_sockobject(fd, family, type, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00003079 return (PyObject *) s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00003080}
Guido van Rossum82a5c661998-07-07 20:45:43 +00003081
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003082PyDoc_STRVAR(fromfd_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003083"fromfd(fd, family, type[, proto]) -> socket object\n\
3084\n\
3085Create a socket object from the given file descriptor.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003086The remaining arguments are the same as for socket().");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003087
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00003088#endif /* NO_DUP */
Guido van Rossum2a7178e1992-12-08 13:38:24 +00003089
Guido van Rossum82a5c661998-07-07 20:45:43 +00003090
Guido van Rossum006bf911996-06-12 04:04:55 +00003091static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003092socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00003093{
3094 int x1, x2;
3095
Guido van Rossum27fc3c02000-03-24 20:56:56 +00003096 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00003097 return NULL;
3098 }
3099 x2 = (int)ntohs((short)x1);
3100 return PyInt_FromLong(x2);
3101}
3102
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003103PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003104"ntohs(integer) -> integer\n\
3105\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003106Convert a 16-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003107
3108
Guido van Rossum006bf911996-06-12 04:04:55 +00003109static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003110socket_ntohl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00003111{
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003112 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00003113
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003114 if (PyInt_Check(arg)) {
3115 x = PyInt_AS_LONG(arg);
Jeremy Hylton825e47b2002-07-25 16:37:51 +00003116 if (x == (unsigned long) -1 && PyErr_Occurred())
3117 return NULL;
Guido van Rossum006bf911996-06-12 04:04:55 +00003118 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003119 else if (PyLong_Check(arg)) {
3120 x = PyLong_AsUnsignedLong(arg);
Jeremy Hylton825e47b2002-07-25 16:37:51 +00003121 if (x == (unsigned long) -1 && PyErr_Occurred())
3122 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003123#if SIZEOF_LONG > 4
3124 {
3125 unsigned long y;
3126 /* only want the trailing 32 bits */
3127 y = x & 0xFFFFFFFFUL;
3128 if (y ^ x)
3129 return PyErr_Format(PyExc_OverflowError,
3130 "long int larger than 32 bits");
3131 x = y;
Tim Peters58141872002-08-06 22:25:02 +00003132 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003133#endif
3134 }
3135 else
Tim Peters58141872002-08-06 22:25:02 +00003136 return PyErr_Format(PyExc_TypeError,
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003137 "expected int/long, %s found",
3138 arg->ob_type->tp_name);
3139 if (x == (unsigned long) -1 && PyErr_Occurred())
3140 return NULL;
3141 return PyInt_FromLong(ntohl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00003142}
3143
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003144PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003145"ntohl(integer) -> integer\n\
3146\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003147Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003148
3149
Guido van Rossum006bf911996-06-12 04:04:55 +00003150static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003151socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00003152{
Hye-Shik Changa7b673f2003-12-17 09:40:23 +00003153 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00003154
Guido van Rossum27fc3c02000-03-24 20:56:56 +00003155 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00003156 return NULL;
3157 }
3158 x2 = (int)htons((short)x1);
3159 return PyInt_FromLong(x2);
3160}
3161
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003162PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003163"htons(integer) -> integer\n\
3164\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003165Convert a 16-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003166
3167
Guido van Rossum006bf911996-06-12 04:04:55 +00003168static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003169socket_htonl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00003170{
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003171 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00003172
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003173 if (PyInt_Check(arg)) {
3174 x = PyInt_AS_LONG(arg);
Jeremy Hylton825e47b2002-07-25 16:37:51 +00003175 if (x == (unsigned long) -1 && PyErr_Occurred())
3176 return NULL;
Guido van Rossum006bf911996-06-12 04:04:55 +00003177 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003178 else if (PyLong_Check(arg)) {
3179 x = PyLong_AsUnsignedLong(arg);
Jeremy Hylton825e47b2002-07-25 16:37:51 +00003180 if (x == (unsigned long) -1 && PyErr_Occurred())
3181 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003182#if SIZEOF_LONG > 4
3183 {
3184 unsigned long y;
3185 /* only want the trailing 32 bits */
3186 y = x & 0xFFFFFFFFUL;
3187 if (y ^ x)
3188 return PyErr_Format(PyExc_OverflowError,
3189 "long int larger than 32 bits");
3190 x = y;
Tim Peters58141872002-08-06 22:25:02 +00003191 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003192#endif
3193 }
3194 else
Tim Peters58141872002-08-06 22:25:02 +00003195 return PyErr_Format(PyExc_TypeError,
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003196 "expected int/long, %s found",
3197 arg->ob_type->tp_name);
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003198 return PyInt_FromLong(htonl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00003199}
3200
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003201PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003202"htonl(integer) -> integer\n\
3203\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003204Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003205
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003206/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003207
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003208PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003209"inet_aton(string) -> packed 32-bit IP representation\n\
3210\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003211Convert 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 +00003212binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003213
3214static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003215socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003216{
Guido van Rossuma2e48551999-09-09 15:42:59 +00003217#ifndef INADDR_NONE
3218#define INADDR_NONE (-1)
3219#endif
Neal Norwitz88f115b2003-02-13 02:15:42 +00003220#ifdef HAVE_INET_ATON
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003221 struct in_addr buf;
Tim Peters1df9fdd2003-02-13 03:13:40 +00003222#else
3223 /* Have to use inet_addr() instead */
3224 unsigned long packed_addr;
3225#endif
3226 char *ip_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003227
Tim Peters1df9fdd2003-02-13 03:13:40 +00003228 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003229 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003230
Tim Peters1df9fdd2003-02-13 03:13:40 +00003231
3232#ifdef HAVE_INET_ATON
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003233 if (inet_aton(ip_addr, &buf))
3234 return PyString_FromStringAndSize((char *)(&buf),
3235 sizeof(buf));
3236
3237 PyErr_SetString(socket_error,
3238 "illegal IP address string passed to inet_aton");
3239 return NULL;
3240
Tim Peters1df9fdd2003-02-13 03:13:40 +00003241#else /* ! HAVE_INET_ATON */
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003242 /* XXX Problem here: inet_aton('255.255.255.255') raises
3243 an exception while it should be a valid address. */
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003244 packed_addr = inet_addr(ip_addr);
3245
3246 if (packed_addr == INADDR_NONE) { /* invalid address */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003247 PyErr_SetString(socket_error,
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003248 "illegal IP address string passed to inet_aton");
3249 return NULL;
3250 }
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003251 return PyString_FromStringAndSize((char *) &packed_addr,
3252 sizeof(packed_addr));
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003253#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003254}
3255
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003256PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00003257"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003258\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003259Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003260
3261static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003262socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003263{
3264 char *packed_str;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003265 int addr_len;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003266 struct in_addr packed_addr;
3267
Guido van Rossum27fc3c02000-03-24 20:56:56 +00003268 if (!PyArg_ParseTuple(args, "s#:inet_ntoa", &packed_str, &addr_len)) {
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003269 return NULL;
3270 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00003271
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003272 if (addr_len != sizeof(packed_addr)) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003273 PyErr_SetString(socket_error,
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003274 "packed IP wrong length for inet_ntoa");
3275 return NULL;
3276 }
3277
3278 memcpy(&packed_addr, packed_str, addr_len);
3279
3280 return PyString_FromString(inet_ntoa(packed_addr));
3281}
Guido van Rossum82a5c661998-07-07 20:45:43 +00003282
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003283#ifdef HAVE_INET_PTON
3284
3285PyDoc_STRVAR(inet_pton_doc,
3286"inet_pton(af, ip) -> packed IP address string\n\
3287\n\
3288Convert an IP address from string format to a packed string suitable\n\
3289for use with low-level network functions.");
3290
3291static PyObject *
3292socket_inet_pton(PyObject *self, PyObject *args)
3293{
3294 int af;
3295 char* ip;
3296 int retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003297#ifdef ENABLE_IPV6
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003298 char packed[MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003299#else
3300 char packed[sizeof(struct in_addr)];
3301#endif
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003302 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
3303 return NULL;
3304 }
3305
Martin v. Löwis04697e82004-06-02 12:35:29 +00003306#if !defined(ENABLE_IPV6) && defined(AF_INET6)
Martin v. Löwis10649092003-08-05 06:25:06 +00003307 if(af == AF_INET6) {
3308 PyErr_SetString(socket_error,
3309 "can't use AF_INET6, IPv6 is disabled");
3310 return NULL;
3311 }
3312#endif
3313
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003314 retval = inet_pton(af, ip, packed);
3315 if (retval < 0) {
3316 PyErr_SetFromErrno(socket_error);
3317 return NULL;
3318 } else if (retval == 0) {
3319 PyErr_SetString(socket_error,
3320 "illegal IP address string passed to inet_pton");
3321 return NULL;
3322 } else if (af == AF_INET) {
3323 return PyString_FromStringAndSize(packed,
3324 sizeof(struct in_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003325#ifdef ENABLE_IPV6
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003326 } else if (af == AF_INET6) {
3327 return PyString_FromStringAndSize(packed,
3328 sizeof(struct in6_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003329#endif
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003330 } else {
3331 PyErr_SetString(socket_error, "unknown address family");
3332 return NULL;
3333 }
3334}
3335
3336PyDoc_STRVAR(inet_ntop_doc,
3337"inet_ntop(af, packed_ip) -> string formatted IP address\n\
3338\n\
3339Convert a packed IP address of the given family to string format.");
3340
3341static PyObject *
3342socket_inet_ntop(PyObject *self, PyObject *args)
3343{
3344 int af;
3345 char* packed;
3346 int len;
3347 const char* retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003348#ifdef ENABLE_IPV6
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003349 char ip[MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003350#else
3351 char ip[INET_ADDRSTRLEN + 1];
3352#endif
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003353
3354 /* Guarantee NUL-termination for PyString_FromString() below */
3355 memset((void *) &ip[0], '\0', sizeof(ip) + 1);
3356
3357 if (!PyArg_ParseTuple(args, "is#:inet_ntop", &af, &packed, &len)) {
3358 return NULL;
3359 }
3360
3361 if (af == AF_INET) {
3362 if (len != sizeof(struct in_addr)) {
3363 PyErr_SetString(PyExc_ValueError,
3364 "invalid length of packed IP address string");
3365 return NULL;
3366 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003367#ifdef ENABLE_IPV6
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003368 } else if (af == AF_INET6) {
3369 if (len != sizeof(struct in6_addr)) {
3370 PyErr_SetString(PyExc_ValueError,
3371 "invalid length of packed IP address string");
3372 return NULL;
3373 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003374#endif
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003375 } else {
3376 PyErr_Format(PyExc_ValueError,
3377 "unknown address family %d", af);
3378 return NULL;
3379 }
3380
3381 retval = inet_ntop(af, packed, ip, sizeof(ip));
3382 if (!retval) {
3383 PyErr_SetFromErrno(socket_error);
3384 return NULL;
3385 } else {
3386 return PyString_FromString(retval);
3387 }
3388
3389 /* NOTREACHED */
3390 PyErr_SetString(PyExc_RuntimeError, "invalid handling of inet_ntop");
3391 return NULL;
3392}
3393
3394#endif /* HAVE_INET_PTON */
3395
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003396/* Python interface to getaddrinfo(host, port). */
3397
3398/*ARGSUSED*/
3399static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003400socket_getaddrinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003401{
Martin v. Löwisf0b11d22001-11-07 08:31:03 +00003402 struct addrinfo hints, *res;
3403 struct addrinfo *res0 = NULL;
Martin v. Löwis2548c732003-04-18 10:39:54 +00003404 PyObject *hobj = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003405 PyObject *pobj = (PyObject *)NULL;
Martin v. Löwisf65b1a12001-08-12 09:28:40 +00003406 char pbuf[30];
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003407 char *hptr, *pptr;
3408 int family, socktype, protocol, flags;
3409 int error;
3410 PyObject *all = (PyObject *)NULL;
3411 PyObject *single = (PyObject *)NULL;
Martin v. Löwis2548c732003-04-18 10:39:54 +00003412 PyObject *idna = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003413
3414 family = socktype = protocol = flags = 0;
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00003415 family = AF_UNSPEC;
Martin v. Löwis2548c732003-04-18 10:39:54 +00003416 if (!PyArg_ParseTuple(args, "OO|iiii:getaddrinfo",
3417 &hobj, &pobj, &family, &socktype,
3418 &protocol, &flags)) {
3419 return NULL;
3420 }
3421 if (hobj == Py_None) {
3422 hptr = NULL;
3423 } else if (PyUnicode_Check(hobj)) {
3424 idna = PyObject_CallMethod(hobj, "encode", "s", "idna");
3425 if (!idna)
3426 return NULL;
3427 hptr = PyString_AsString(idna);
3428 } else if (PyString_Check(hobj)) {
3429 hptr = PyString_AsString(hobj);
3430 } else {
3431 PyErr_SetString(PyExc_TypeError,
3432 "getaddrinfo() argument 1 must be string or None");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003433 return NULL;
3434 }
3435 if (PyInt_Check(pobj)) {
Marc-André Lemburg03d1b182001-07-31 18:05:33 +00003436 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", PyInt_AsLong(pobj));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003437 pptr = pbuf;
3438 } else if (PyString_Check(pobj)) {
3439 pptr = PyString_AsString(pobj);
3440 } else if (pobj == Py_None) {
3441 pptr = (char *)NULL;
3442 } else {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003443 PyErr_SetString(socket_error, "Int or String expected");
Martin v. Löwis5db099a2003-08-07 11:55:15 +00003444 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003445 }
3446 memset(&hints, 0, sizeof(hints));
3447 hints.ai_family = family;
3448 hints.ai_socktype = socktype;
3449 hints.ai_protocol = protocol;
3450 hints.ai_flags = flags;
Just van Rossum1040d2c2003-05-09 07:53:18 +00003451 Py_BEGIN_ALLOW_THREADS
3452 ACQUIRE_GETADDRINFO_LOCK
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003453 error = getaddrinfo(hptr, pptr, &hints, &res0);
Just van Rossum1040d2c2003-05-09 07:53:18 +00003454 Py_END_ALLOW_THREADS
3455 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003456 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003457 set_gaierror(error);
Martin v. Löwis5db099a2003-08-07 11:55:15 +00003458 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003459 }
3460
3461 if ((all = PyList_New(0)) == NULL)
3462 goto err;
3463 for (res = res0; res; res = res->ai_next) {
Guido van Rossum716aac02001-10-12 18:59:27 +00003464 PyObject *addr =
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00003465 makesockaddr(-1, res->ai_addr, res->ai_addrlen, protocol);
Guido van Rossum716aac02001-10-12 18:59:27 +00003466 if (addr == NULL)
3467 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003468 single = Py_BuildValue("iiisO", res->ai_family,
3469 res->ai_socktype, res->ai_protocol,
3470 res->ai_canonname ? res->ai_canonname : "",
Guido van Rossum716aac02001-10-12 18:59:27 +00003471 addr);
3472 Py_DECREF(addr);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003473 if (single == NULL)
3474 goto err;
3475
3476 if (PyList_Append(all, single))
3477 goto err;
3478 Py_XDECREF(single);
3479 }
Martin v. Löwis2548c732003-04-18 10:39:54 +00003480 Py_XDECREF(idna);
Neal Norwitz90128ba2002-08-09 03:37:42 +00003481 if (res0)
3482 freeaddrinfo(res0);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003483 return all;
3484 err:
3485 Py_XDECREF(single);
3486 Py_XDECREF(all);
Martin v. Löwis2548c732003-04-18 10:39:54 +00003487 Py_XDECREF(idna);
Martin v. Löwisf0b11d22001-11-07 08:31:03 +00003488 if (res0)
3489 freeaddrinfo(res0);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003490 return (PyObject *)NULL;
3491}
3492
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003493PyDoc_STRVAR(getaddrinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003494"getaddrinfo(host, port [, family, socktype, proto, flags])\n\
3495 -> list of (family, socktype, proto, canonname, sockaddr)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003496\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003497Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003498
3499/* Python interface to getnameinfo(sa, flags). */
3500
3501/*ARGSUSED*/
3502static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003503socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003504{
3505 PyObject *sa = (PyObject *)NULL;
3506 int flags;
3507 char *hostp;
Martin v. Löwis06b1d212001-11-02 23:34:52 +00003508 int port, flowinfo, scope_id;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003509 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
3510 struct addrinfo hints, *res = NULL;
3511 int error;
3512 PyObject *ret = (PyObject *)NULL;
3513
3514 flags = flowinfo = scope_id = 0;
Martin v. Löwis06b1d212001-11-02 23:34:52 +00003515 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003516 return NULL;
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003517 if (!PyArg_ParseTuple(sa, "si|ii",
3518 &hostp, &port, &flowinfo, &scope_id))
Martin v. Löwis06b1d212001-11-02 23:34:52 +00003519 return NULL;
Marc-André Lemburg03d1b182001-07-31 18:05:33 +00003520 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003521 memset(&hints, 0, sizeof(hints));
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00003522 hints.ai_family = AF_UNSPEC;
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003523 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Just van Rossum1040d2c2003-05-09 07:53:18 +00003524 Py_BEGIN_ALLOW_THREADS
3525 ACQUIRE_GETADDRINFO_LOCK
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003526 error = getaddrinfo(hostp, pbuf, &hints, &res);
Just van Rossum1040d2c2003-05-09 07:53:18 +00003527 Py_END_ALLOW_THREADS
3528 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003529 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003530 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003531 goto fail;
3532 }
3533 if (res->ai_next) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003534 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003535 "sockaddr resolved to multiple addresses");
3536 goto fail;
3537 }
3538 switch (res->ai_family) {
3539 case AF_INET:
3540 {
3541 char *t1;
3542 int t2;
3543 if (PyArg_ParseTuple(sa, "si", &t1, &t2) == 0) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003544 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003545 "IPv4 sockaddr must be 2 tuple");
3546 goto fail;
3547 }
3548 break;
3549 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00003550#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003551 case AF_INET6:
3552 {
3553 struct sockaddr_in6 *sin6;
3554 sin6 = (struct sockaddr_in6 *)res->ai_addr;
3555 sin6->sin6_flowinfo = flowinfo;
3556 sin6->sin6_scope_id = scope_id;
3557 break;
3558 }
3559#endif
3560 }
3561 error = getnameinfo(res->ai_addr, res->ai_addrlen,
3562 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
3563 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003564 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003565 goto fail;
3566 }
3567 ret = Py_BuildValue("ss", hbuf, pbuf);
3568
3569fail:
3570 if (res)
3571 freeaddrinfo(res);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003572 return ret;
3573}
3574
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003575PyDoc_STRVAR(getnameinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003576"getnameinfo(sockaddr, flags) --> (host, port)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003577\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003578Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003579
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00003580
3581/* Python API to getting and setting the default timeout value. */
3582
3583static PyObject *
3584socket_getdefaulttimeout(PyObject *self)
3585{
3586 if (defaulttimeout < 0.0) {
3587 Py_INCREF(Py_None);
3588 return Py_None;
3589 }
3590 else
3591 return PyFloat_FromDouble(defaulttimeout);
3592}
3593
3594PyDoc_STRVAR(getdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003595"getdefaulttimeout() -> timeout\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00003596\n\
3597Returns the default timeout in floating seconds for new socket objects.\n\
3598A value of None indicates that new socket objects have no timeout.\n\
3599When the socket module is first imported, the default is None.");
3600
3601static PyObject *
3602socket_setdefaulttimeout(PyObject *self, PyObject *arg)
3603{
3604 double timeout;
3605
3606 if (arg == Py_None)
3607 timeout = -1.0;
3608 else {
3609 timeout = PyFloat_AsDouble(arg);
3610 if (timeout < 0.0) {
3611 if (!PyErr_Occurred())
3612 PyErr_SetString(PyExc_ValueError,
3613 "Timeout value out of range");
3614 return NULL;
3615 }
3616 }
3617
3618 defaulttimeout = timeout;
3619
3620 Py_INCREF(Py_None);
3621 return Py_None;
3622}
3623
3624PyDoc_STRVAR(setdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003625"setdefaulttimeout(timeout)\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00003626\n\
3627Set the default timeout in floating seconds for new socket objects.\n\
3628A value of None indicates that new socket objects have no timeout.\n\
3629When the socket module is first imported, the default is None.");
3630
3631
Guido van Rossum30a685f1991-06-27 15:51:29 +00003632/* List of functions exported by this module. */
3633
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003634static PyMethodDef socket_methods[] = {
3635 {"gethostbyname", socket_gethostbyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003636 METH_VARARGS, gethostbyname_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003637 {"gethostbyname_ex", socket_gethostbyname_ex,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003638 METH_VARARGS, ghbn_ex_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003639 {"gethostbyaddr", socket_gethostbyaddr,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003640 METH_VARARGS, gethostbyaddr_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003641 {"gethostname", socket_gethostname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003642 METH_VARARGS, gethostname_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003643 {"getservbyname", socket_getservbyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003644 METH_VARARGS, getservbyname_doc},
Barry Warsaw11b91a02004-06-28 00:50:43 +00003645 {"getservbyport", socket_getservbyport,
3646 METH_VARARGS, getservbyport_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003647 {"getprotobyname", socket_getprotobyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003648 METH_VARARGS,getprotobyname_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00003649#ifndef NO_DUP
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003650 {"fromfd", socket_fromfd,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003651 METH_VARARGS, fromfd_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00003652#endif
Dave Cole331708b2004-08-09 04:51:41 +00003653#ifdef HAVE_SOCKETPAIR
3654 {"socketpair", socket_socketpair,
3655 METH_VARARGS, socketpair_doc},
3656#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003657 {"ntohs", socket_ntohs,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003658 METH_VARARGS, ntohs_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003659 {"ntohl", socket_ntohl,
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003660 METH_O, ntohl_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003661 {"htons", socket_htons,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003662 METH_VARARGS, htons_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003663 {"htonl", socket_htonl,
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003664 METH_O, htonl_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003665 {"inet_aton", socket_inet_aton,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003666 METH_VARARGS, inet_aton_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003667 {"inet_ntoa", socket_inet_ntoa,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003668 METH_VARARGS, inet_ntoa_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003669#ifdef HAVE_INET_PTON
3670 {"inet_pton", socket_inet_pton,
3671 METH_VARARGS, inet_pton_doc},
3672 {"inet_ntop", socket_inet_ntop,
3673 METH_VARARGS, inet_ntop_doc},
3674#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003675 {"getaddrinfo", socket_getaddrinfo,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003676 METH_VARARGS, getaddrinfo_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003677 {"getnameinfo", socket_getnameinfo,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003678 METH_VARARGS, getnameinfo_doc},
Guido van Rossum1693ba82002-07-18 21:11:26 +00003679 {"getdefaulttimeout", (PyCFunction)socket_getdefaulttimeout,
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00003680 METH_NOARGS, getdefaulttimeout_doc},
3681 {"setdefaulttimeout", socket_setdefaulttimeout,
3682 METH_O, setdefaulttimeout_doc},
Guido van Rossum30a685f1991-06-27 15:51:29 +00003683 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003684};
3685
Guido van Rossum30a685f1991-06-27 15:51:29 +00003686
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003687#ifdef RISCOS
3688#define OS_INIT_DEFINED
Guido van Rossumbe32c891996-06-20 16:25:29 +00003689
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003690static int
3691os_init(void)
3692{
3693 _kernel_swi_regs r;
3694
3695 r.r[0] = 0;
3696 _kernel_swi(0x43380, &r, &r);
3697 taskwindow = r.r[0];
3698
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003699 return 1;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003700}
3701
3702#endif /* RISCOS */
3703
3704
3705#ifdef MS_WINDOWS
3706#define OS_INIT_DEFINED
3707
3708/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00003709
3710static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003711os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00003712{
3713 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00003714}
3715
3716static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003717os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00003718{
3719 WSADATA WSAData;
3720 int ret;
3721 char buf[100];
3722 ret = WSAStartup(0x0101, &WSAData);
3723 switch (ret) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003724 case 0: /* No error */
Mark Hammond14350ab2003-07-09 04:57:46 +00003725 Py_AtExit(os_cleanup);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003726 return 1; /* Success */
Guido van Rossumbe32c891996-06-20 16:25:29 +00003727 case WSASYSNOTREADY:
3728 PyErr_SetString(PyExc_ImportError,
3729 "WSAStartup failed: network not ready");
3730 break;
3731 case WSAVERNOTSUPPORTED:
3732 case WSAEINVAL:
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003733 PyErr_SetString(
3734 PyExc_ImportError,
3735 "WSAStartup failed: requested version not supported");
Guido van Rossumbe32c891996-06-20 16:25:29 +00003736 break;
3737 default:
Tim Peters885d4572001-11-28 20:27:42 +00003738 PyOS_snprintf(buf, sizeof(buf),
3739 "WSAStartup failed: error code %d", ret);
Guido van Rossumbe32c891996-06-20 16:25:29 +00003740 PyErr_SetString(PyExc_ImportError, buf);
3741 break;
3742 }
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003743 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00003744}
3745
Guido van Rossum8d665e61996-06-26 18:22:49 +00003746#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00003747
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003748
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003749#ifdef PYOS_OS2
3750#define OS_INIT_DEFINED
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003751
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003752/* Additional initialization for OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003753
3754static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003755os_init(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003756{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003757#ifndef PYCC_GCC
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003758 char reason[64];
3759 int rc = sock_init();
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003760
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003761 if (rc == 0) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003762 return 1; /* Success */
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003763 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003764
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003765 PyOS_snprintf(reason, sizeof(reason),
3766 "OS/2 TCP/IP Error# %d", sock_errno());
3767 PyErr_SetString(PyExc_ImportError, reason);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003768
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003769 return 0; /* Failure */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00003770#else
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003771 /* No need to initialise sockets with GCC/EMX */
3772 return 1; /* Success */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00003773#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003774}
3775
3776#endif /* PYOS_OS2 */
3777
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003778
3779#ifndef OS_INIT_DEFINED
3780static int
3781os_init(void)
3782{
3783 return 1; /* Success */
3784}
3785#endif
3786
3787
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00003788/* C API table - always add new things to the end for binary
3789 compatibility. */
3790static
3791PySocketModule_APIObject PySocketModuleAPI =
3792{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003793 &sock_type,
Brett Cannon06c34792004-03-23 23:16:54 +00003794 NULL
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00003795};
3796
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003797
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003798/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003799
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003800 This module is actually called "_socket", and there's a wrapper
3801 "socket.py" which implements some additional functionality. On some
3802 platforms (e.g. Windows and OS/2), socket.py also implements a
3803 wrapper for the socket type that provides missing functionality such
3804 as makefile(), dup() and fromfd(). The import of "_socket" may fail
3805 with an ImportError exception if os-specific initialization fails.
3806 On Windows, this does WINSOCK initialization. When WINSOCK is
3807 initialized succesfully, a call to WSACleanup() is scheduled to be
3808 made at exit time.
3809*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003810
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003811PyDoc_STRVAR(socket_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003812"Implementation module for socket operations.\n\
3813\n\
3814See the socket module for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003815
Mark Hammondfe51c6d2002-08-02 02:27:13 +00003816PyMODINIT_FUNC
Thomas Wouters1e0c2f42000-07-24 16:06:23 +00003817init_socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003818{
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003819 PyObject *m, *has_ipv6;
Fred Drake4baedc12002-04-01 14:53:37 +00003820
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003821 if (!os_init())
Guido van Rossum0cb96de1997-10-01 04:29:29 +00003822 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003823
3824 sock_type.ob_type = &PyType_Type;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003825 m = Py_InitModule3(PySocket_MODULE_NAME,
3826 socket_methods,
3827 socket_doc);
3828
3829 socket_error = PyErr_NewException("socket.error", NULL, NULL);
3830 if (socket_error == NULL)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003831 return;
Brett Cannon06c34792004-03-23 23:16:54 +00003832 PySocketModuleAPI.error = socket_error;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003833 Py_INCREF(socket_error);
3834 PyModule_AddObject(m, "error", socket_error);
3835 socket_herror = PyErr_NewException("socket.herror",
3836 socket_error, NULL);
3837 if (socket_herror == NULL)
3838 return;
3839 Py_INCREF(socket_herror);
3840 PyModule_AddObject(m, "herror", socket_herror);
3841 socket_gaierror = PyErr_NewException("socket.gaierror", socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003842 NULL);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003843 if (socket_gaierror == NULL)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003844 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003845 Py_INCREF(socket_gaierror);
3846 PyModule_AddObject(m, "gaierror", socket_gaierror);
Raymond Hettingeref7343c2003-06-29 03:08:05 +00003847 socket_timeout = PyErr_NewException("socket.timeout",
3848 socket_error, NULL);
3849 if (socket_timeout == NULL)
3850 return;
3851 Py_INCREF(socket_timeout);
3852 PyModule_AddObject(m, "timeout", socket_timeout);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003853 Py_INCREF((PyObject *)&sock_type);
Fred Drake4baedc12002-04-01 14:53:37 +00003854 if (PyModule_AddObject(m, "SocketType",
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003855 (PyObject *)&sock_type) != 0)
Guido van Rossum0cb96de1997-10-01 04:29:29 +00003856 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003857 Py_INCREF((PyObject *)&sock_type);
Fred Drake4baedc12002-04-01 14:53:37 +00003858 if (PyModule_AddObject(m, "socket",
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003859 (PyObject *)&sock_type) != 0)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003860 return;
Guido van Rossum09be4091999-08-09 14:40:40 +00003861
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003862#ifdef ENABLE_IPV6
3863 has_ipv6 = Py_True;
3864#else
3865 has_ipv6 = Py_False;
3866#endif
3867 Py_INCREF(has_ipv6);
3868 PyModule_AddObject(m, "has_ipv6", has_ipv6);
3869
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00003870 /* Export C API */
Fred Drake4baedc12002-04-01 14:53:37 +00003871 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00003872 PyCObject_FromVoidPtr((void *)&PySocketModuleAPI, NULL)
3873 ) != 0)
3874 return;
3875
Guido van Rossum09be4091999-08-09 14:40:40 +00003876 /* Address families (we only support AF_INET and AF_UNIX) */
3877#ifdef AF_UNSPEC
Fred Drake4baedc12002-04-01 14:53:37 +00003878 PyModule_AddIntConstant(m, "AF_UNSPEC", AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00003879#endif
Fred Drake4baedc12002-04-01 14:53:37 +00003880 PyModule_AddIntConstant(m, "AF_INET", AF_INET);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003881#ifdef AF_INET6
Fred Drake4baedc12002-04-01 14:53:37 +00003882 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003883#endif /* AF_INET6 */
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00003884#if defined(AF_UNIX)
Fred Drake4baedc12002-04-01 14:53:37 +00003885 PyModule_AddIntConstant(m, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00003886#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00003887#ifdef AF_AX25
Fred Drake4baedc12002-04-01 14:53:37 +00003888 /* Amateur Radio AX.25 */
3889 PyModule_AddIntConstant(m, "AF_AX25", AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00003890#endif
3891#ifdef AF_IPX
Fred Drake4baedc12002-04-01 14:53:37 +00003892 PyModule_AddIntConstant(m, "AF_IPX", AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00003893#endif
3894#ifdef AF_APPLETALK
Fred Drake4baedc12002-04-01 14:53:37 +00003895 /* Appletalk DDP */
3896 PyModule_AddIntConstant(m, "AF_APPLETALK", AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00003897#endif
3898#ifdef AF_NETROM
Fred Drake4baedc12002-04-01 14:53:37 +00003899 /* Amateur radio NetROM */
3900 PyModule_AddIntConstant(m, "AF_NETROM", AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00003901#endif
3902#ifdef AF_BRIDGE
Fred Drake4baedc12002-04-01 14:53:37 +00003903 /* Multiprotocol bridge */
3904 PyModule_AddIntConstant(m, "AF_BRIDGE", AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00003905#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00003906#ifdef AF_ATMPVC
3907 /* ATM PVCs */
3908 PyModule_AddIntConstant(m, "AF_ATMPVC", AF_ATMPVC);
3909#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00003910#ifdef AF_AAL5
Fred Drake4baedc12002-04-01 14:53:37 +00003911 /* Reserved for Werner's ATM */
3912 PyModule_AddIntConstant(m, "AF_AAL5", AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00003913#endif
3914#ifdef AF_X25
Fred Drake4baedc12002-04-01 14:53:37 +00003915 /* Reserved for X.25 project */
3916 PyModule_AddIntConstant(m, "AF_X25", AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00003917#endif
3918#ifdef AF_INET6
Fred Drake4baedc12002-04-01 14:53:37 +00003919 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00003920#endif
3921#ifdef AF_ROSE
Fred Drake4baedc12002-04-01 14:53:37 +00003922 /* Amateur Radio X.25 PLP */
3923 PyModule_AddIntConstant(m, "AF_ROSE", AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00003924#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00003925#ifdef AF_DECnet
3926 /* Reserved for DECnet project */
3927 PyModule_AddIntConstant(m, "AF_DECnet", AF_DECnet);
3928#endif
3929#ifdef AF_NETBEUI
3930 /* Reserved for 802.2LLC project */
3931 PyModule_AddIntConstant(m, "AF_NETBEUI", AF_NETBEUI);
3932#endif
3933#ifdef AF_SECURITY
3934 /* Security callback pseudo AF */
3935 PyModule_AddIntConstant(m, "AF_SECURITY", AF_SECURITY);
3936#endif
3937#ifdef AF_KEY
3938 /* PF_KEY key management API */
3939 PyModule_AddIntConstant(m, "AF_KEY", AF_KEY);
3940#endif
3941#ifdef AF_NETLINK
3942 /* */
3943 PyModule_AddIntConstant(m, "AF_NETLINK", AF_NETLINK);
3944#endif
3945#ifdef AF_ROUTE
3946 /* Alias to emulate 4.4BSD */
3947 PyModule_AddIntConstant(m, "AF_ROUTE", AF_ROUTE);
3948#endif
3949#ifdef AF_ASH
3950 /* Ash */
3951 PyModule_AddIntConstant(m, "AF_ASH", AF_ASH);
3952#endif
3953#ifdef AF_ECONET
3954 /* Acorn Econet */
3955 PyModule_AddIntConstant(m, "AF_ECONET", AF_ECONET);
3956#endif
3957#ifdef AF_ATMSVC
3958 /* ATM SVCs */
3959 PyModule_AddIntConstant(m, "AF_ATMSVC", AF_ATMSVC);
3960#endif
3961#ifdef AF_SNA
3962 /* Linux SNA Project (nutters!) */
3963 PyModule_AddIntConstant(m, "AF_SNA", AF_SNA);
3964#endif
3965#ifdef AF_IRDA
3966 /* IRDA sockets */
3967 PyModule_AddIntConstant(m, "AF_IRDA", AF_IRDA);
3968#endif
3969#ifdef AF_PPPOX
3970 /* PPPoX sockets */
3971 PyModule_AddIntConstant(m, "AF_PPPOX", AF_PPPOX);
3972#endif
3973#ifdef AF_WANPIPE
3974 /* Wanpipe API Sockets */
3975 PyModule_AddIntConstant(m, "AF_WANPIPE", AF_WANPIPE);
3976#endif
3977#ifdef AF_LLC
3978 /* Linux LLC */
3979 PyModule_AddIntConstant(m, "AF_LLC", AF_LLC);
3980#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00003981
Hye-Shik Chang81268602004-02-02 06:05:24 +00003982#ifdef USE_BLUETOOTH
Martin v. Löwis12af0482004-01-31 12:34:17 +00003983 PyModule_AddIntConstant(m, "AF_BLUETOOTH", AF_BLUETOOTH);
3984 PyModule_AddIntConstant(m, "BTPROTO_L2CAP", BTPROTO_L2CAP);
Hye-Shik Chang81268602004-02-02 06:05:24 +00003985#if !defined(__FreeBSD__)
Martin v. Löwis12af0482004-01-31 12:34:17 +00003986 PyModule_AddIntConstant(m, "BTPROTO_SCO", BTPROTO_SCO);
Hye-Shik Chang81268602004-02-02 06:05:24 +00003987#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00003988 PyModule_AddIntConstant(m, "BTPROTO_RFCOMM", BTPROTO_RFCOMM);
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00003989 PyModule_AddObject(m, "BDADDR_ANY", Py_BuildValue("s", "00:00:00:00:00:00"));
3990 PyModule_AddObject(m, "BDADDR_LOCAL", Py_BuildValue("s", "00:00:00:FF:FF:FF"));
Martin v. Löwis12af0482004-01-31 12:34:17 +00003991#endif
3992
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00003993#ifdef HAVE_NETPACKET_PACKET_H
Fred Drake4baedc12002-04-01 14:53:37 +00003994 PyModule_AddIntConstant(m, "AF_PACKET", AF_PACKET);
3995 PyModule_AddIntConstant(m, "PF_PACKET", PF_PACKET);
3996 PyModule_AddIntConstant(m, "PACKET_HOST", PACKET_HOST);
3997 PyModule_AddIntConstant(m, "PACKET_BROADCAST", PACKET_BROADCAST);
3998 PyModule_AddIntConstant(m, "PACKET_MULTICAST", PACKET_MULTICAST);
3999 PyModule_AddIntConstant(m, "PACKET_OTHERHOST", PACKET_OTHERHOST);
4000 PyModule_AddIntConstant(m, "PACKET_OUTGOING", PACKET_OUTGOING);
4001 PyModule_AddIntConstant(m, "PACKET_LOOPBACK", PACKET_LOOPBACK);
4002 PyModule_AddIntConstant(m, "PACKET_FASTROUTE", PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00004003#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00004004
4005 /* Socket types */
Fred Drake4baedc12002-04-01 14:53:37 +00004006 PyModule_AddIntConstant(m, "SOCK_STREAM", SOCK_STREAM);
4007 PyModule_AddIntConstant(m, "SOCK_DGRAM", SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00004008#ifndef __BEOS__
4009/* We have incomplete socket support. */
Fred Drake4baedc12002-04-01 14:53:37 +00004010 PyModule_AddIntConstant(m, "SOCK_RAW", SOCK_RAW);
4011 PyModule_AddIntConstant(m, "SOCK_SEQPACKET", SOCK_SEQPACKET);
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00004012#if defined(SOCK_RDM)
Fred Drake4baedc12002-04-01 14:53:37 +00004013 PyModule_AddIntConstant(m, "SOCK_RDM", SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00004014#endif
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00004015#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004016
4017#ifdef SO_DEBUG
Fred Drake4baedc12002-04-01 14:53:37 +00004018 PyModule_AddIntConstant(m, "SO_DEBUG", SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004019#endif
4020#ifdef SO_ACCEPTCONN
Fred Drake4baedc12002-04-01 14:53:37 +00004021 PyModule_AddIntConstant(m, "SO_ACCEPTCONN", SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004022#endif
4023#ifdef SO_REUSEADDR
Fred Drake4baedc12002-04-01 14:53:37 +00004024 PyModule_AddIntConstant(m, "SO_REUSEADDR", SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004025#endif
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00004026#ifdef SO_EXCLUSIVEADDRUSE
4027 PyModule_AddIntConstant(m, "SO_EXCLUSIVEADDRUSE", SO_EXCLUSIVEADDRUSE);
4028#endif
4029
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004030#ifdef SO_KEEPALIVE
Fred Drake4baedc12002-04-01 14:53:37 +00004031 PyModule_AddIntConstant(m, "SO_KEEPALIVE", SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004032#endif
4033#ifdef SO_DONTROUTE
Fred Drake4baedc12002-04-01 14:53:37 +00004034 PyModule_AddIntConstant(m, "SO_DONTROUTE", SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004035#endif
4036#ifdef SO_BROADCAST
Fred Drake4baedc12002-04-01 14:53:37 +00004037 PyModule_AddIntConstant(m, "SO_BROADCAST", SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004038#endif
4039#ifdef SO_USELOOPBACK
Fred Drake4baedc12002-04-01 14:53:37 +00004040 PyModule_AddIntConstant(m, "SO_USELOOPBACK", SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004041#endif
4042#ifdef SO_LINGER
Fred Drake4baedc12002-04-01 14:53:37 +00004043 PyModule_AddIntConstant(m, "SO_LINGER", SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004044#endif
4045#ifdef SO_OOBINLINE
Fred Drake4baedc12002-04-01 14:53:37 +00004046 PyModule_AddIntConstant(m, "SO_OOBINLINE", SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004047#endif
4048#ifdef SO_REUSEPORT
Fred Drake4baedc12002-04-01 14:53:37 +00004049 PyModule_AddIntConstant(m, "SO_REUSEPORT", SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004050#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004051#ifdef SO_SNDBUF
Fred Drake4baedc12002-04-01 14:53:37 +00004052 PyModule_AddIntConstant(m, "SO_SNDBUF", SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004053#endif
4054#ifdef SO_RCVBUF
Fred Drake4baedc12002-04-01 14:53:37 +00004055 PyModule_AddIntConstant(m, "SO_RCVBUF", SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004056#endif
4057#ifdef SO_SNDLOWAT
Fred Drake4baedc12002-04-01 14:53:37 +00004058 PyModule_AddIntConstant(m, "SO_SNDLOWAT", SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004059#endif
4060#ifdef SO_RCVLOWAT
Fred Drake4baedc12002-04-01 14:53:37 +00004061 PyModule_AddIntConstant(m, "SO_RCVLOWAT", SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004062#endif
4063#ifdef SO_SNDTIMEO
Fred Drake4baedc12002-04-01 14:53:37 +00004064 PyModule_AddIntConstant(m, "SO_SNDTIMEO", SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004065#endif
4066#ifdef SO_RCVTIMEO
Fred Drake4baedc12002-04-01 14:53:37 +00004067 PyModule_AddIntConstant(m, "SO_RCVTIMEO", SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004068#endif
4069#ifdef SO_ERROR
Fred Drake4baedc12002-04-01 14:53:37 +00004070 PyModule_AddIntConstant(m, "SO_ERROR", SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004071#endif
4072#ifdef SO_TYPE
Fred Drake4baedc12002-04-01 14:53:37 +00004073 PyModule_AddIntConstant(m, "SO_TYPE", SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004074#endif
4075
4076 /* Maximum number of connections for "listen" */
4077#ifdef SOMAXCONN
Fred Drake4baedc12002-04-01 14:53:37 +00004078 PyModule_AddIntConstant(m, "SOMAXCONN", SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004079#else
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004080 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004081#endif
4082
4083 /* Flags for send, recv */
4084#ifdef MSG_OOB
Fred Drake4baedc12002-04-01 14:53:37 +00004085 PyModule_AddIntConstant(m, "MSG_OOB", MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004086#endif
4087#ifdef MSG_PEEK
Fred Drake4baedc12002-04-01 14:53:37 +00004088 PyModule_AddIntConstant(m, "MSG_PEEK", MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004089#endif
4090#ifdef MSG_DONTROUTE
Fred Drake4baedc12002-04-01 14:53:37 +00004091 PyModule_AddIntConstant(m, "MSG_DONTROUTE", MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004092#endif
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00004093#ifdef MSG_DONTWAIT
Fred Drake4baedc12002-04-01 14:53:37 +00004094 PyModule_AddIntConstant(m, "MSG_DONTWAIT", MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00004095#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004096#ifdef MSG_EOR
Fred Drake4baedc12002-04-01 14:53:37 +00004097 PyModule_AddIntConstant(m, "MSG_EOR", MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004098#endif
4099#ifdef MSG_TRUNC
Fred Drake4baedc12002-04-01 14:53:37 +00004100 PyModule_AddIntConstant(m, "MSG_TRUNC", MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004101#endif
4102#ifdef MSG_CTRUNC
Fred Drake4baedc12002-04-01 14:53:37 +00004103 PyModule_AddIntConstant(m, "MSG_CTRUNC", MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004104#endif
4105#ifdef MSG_WAITALL
Fred Drake4baedc12002-04-01 14:53:37 +00004106 PyModule_AddIntConstant(m, "MSG_WAITALL", MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004107#endif
4108#ifdef MSG_BTAG
Fred Drake4baedc12002-04-01 14:53:37 +00004109 PyModule_AddIntConstant(m, "MSG_BTAG", MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004110#endif
4111#ifdef MSG_ETAG
Fred Drake4baedc12002-04-01 14:53:37 +00004112 PyModule_AddIntConstant(m, "MSG_ETAG", MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004113#endif
4114
4115 /* Protocol level and numbers, usable for [gs]etsockopt */
4116#ifdef SOL_SOCKET
Fred Drake4baedc12002-04-01 14:53:37 +00004117 PyModule_AddIntConstant(m, "SOL_SOCKET", SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004118#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00004119#ifdef SOL_IP
Fred Drake4baedc12002-04-01 14:53:37 +00004120 PyModule_AddIntConstant(m, "SOL_IP", SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00004121#else
Fred Drake4baedc12002-04-01 14:53:37 +00004122 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00004123#endif
4124#ifdef SOL_IPX
Fred Drake4baedc12002-04-01 14:53:37 +00004125 PyModule_AddIntConstant(m, "SOL_IPX", SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00004126#endif
4127#ifdef SOL_AX25
Fred Drake4baedc12002-04-01 14:53:37 +00004128 PyModule_AddIntConstant(m, "SOL_AX25", SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00004129#endif
4130#ifdef SOL_ATALK
Fred Drake4baedc12002-04-01 14:53:37 +00004131 PyModule_AddIntConstant(m, "SOL_ATALK", SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00004132#endif
4133#ifdef SOL_NETROM
Fred Drake4baedc12002-04-01 14:53:37 +00004134 PyModule_AddIntConstant(m, "SOL_NETROM", SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00004135#endif
4136#ifdef SOL_ROSE
Fred Drake4baedc12002-04-01 14:53:37 +00004137 PyModule_AddIntConstant(m, "SOL_ROSE", SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00004138#endif
4139#ifdef SOL_TCP
Fred Drake4baedc12002-04-01 14:53:37 +00004140 PyModule_AddIntConstant(m, "SOL_TCP", SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00004141#else
Fred Drake4baedc12002-04-01 14:53:37 +00004142 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00004143#endif
4144#ifdef SOL_UDP
Fred Drake4baedc12002-04-01 14:53:37 +00004145 PyModule_AddIntConstant(m, "SOL_UDP", SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00004146#else
Fred Drake4baedc12002-04-01 14:53:37 +00004147 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00004148#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004149#ifdef IPPROTO_IP
Fred Drake4baedc12002-04-01 14:53:37 +00004150 PyModule_AddIntConstant(m, "IPPROTO_IP", IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00004151#else
Fred Drake4baedc12002-04-01 14:53:37 +00004152 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004153#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004154#ifdef IPPROTO_HOPOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00004155 PyModule_AddIntConstant(m, "IPPROTO_HOPOPTS", IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004156#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004157#ifdef IPPROTO_ICMP
Fred Drake4baedc12002-04-01 14:53:37 +00004158 PyModule_AddIntConstant(m, "IPPROTO_ICMP", IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00004159#else
Fred Drake4baedc12002-04-01 14:53:37 +00004160 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004161#endif
4162#ifdef IPPROTO_IGMP
Fred Drake4baedc12002-04-01 14:53:37 +00004163 PyModule_AddIntConstant(m, "IPPROTO_IGMP", IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004164#endif
4165#ifdef IPPROTO_GGP
Fred Drake4baedc12002-04-01 14:53:37 +00004166 PyModule_AddIntConstant(m, "IPPROTO_GGP", IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004167#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004168#ifdef IPPROTO_IPV4
Fred Drake4baedc12002-04-01 14:53:37 +00004169 PyModule_AddIntConstant(m, "IPPROTO_IPV4", IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004170#endif
Martin v. Löwisa0f17342003-10-03 13:56:20 +00004171#ifdef IPPROTO_IPV6
4172 PyModule_AddIntConstant(m, "IPPROTO_IPV6", IPPROTO_IPV6);
4173#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004174#ifdef IPPROTO_IPIP
Fred Drake4baedc12002-04-01 14:53:37 +00004175 PyModule_AddIntConstant(m, "IPPROTO_IPIP", IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004176#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004177#ifdef IPPROTO_TCP
Fred Drake4baedc12002-04-01 14:53:37 +00004178 PyModule_AddIntConstant(m, "IPPROTO_TCP", IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00004179#else
Fred Drake4baedc12002-04-01 14:53:37 +00004180 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004181#endif
4182#ifdef IPPROTO_EGP
Fred Drake4baedc12002-04-01 14:53:37 +00004183 PyModule_AddIntConstant(m, "IPPROTO_EGP", IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004184#endif
4185#ifdef IPPROTO_PUP
Fred Drake4baedc12002-04-01 14:53:37 +00004186 PyModule_AddIntConstant(m, "IPPROTO_PUP", IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004187#endif
4188#ifdef IPPROTO_UDP
Fred Drake4baedc12002-04-01 14:53:37 +00004189 PyModule_AddIntConstant(m, "IPPROTO_UDP", IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00004190#else
Fred Drake4baedc12002-04-01 14:53:37 +00004191 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004192#endif
4193#ifdef IPPROTO_IDP
Fred Drake4baedc12002-04-01 14:53:37 +00004194 PyModule_AddIntConstant(m, "IPPROTO_IDP", IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004195#endif
4196#ifdef IPPROTO_HELLO
Fred Drake4baedc12002-04-01 14:53:37 +00004197 PyModule_AddIntConstant(m, "IPPROTO_HELLO", IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004198#endif
4199#ifdef IPPROTO_ND
Fred Drake4baedc12002-04-01 14:53:37 +00004200 PyModule_AddIntConstant(m, "IPPROTO_ND", IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004201#endif
4202#ifdef IPPROTO_TP
Fred Drake4baedc12002-04-01 14:53:37 +00004203 PyModule_AddIntConstant(m, "IPPROTO_TP", IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004204#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004205#ifdef IPPROTO_IPV6
Fred Drake4baedc12002-04-01 14:53:37 +00004206 PyModule_AddIntConstant(m, "IPPROTO_IPV6", IPPROTO_IPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004207#endif
4208#ifdef IPPROTO_ROUTING
Fred Drake4baedc12002-04-01 14:53:37 +00004209 PyModule_AddIntConstant(m, "IPPROTO_ROUTING", IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004210#endif
4211#ifdef IPPROTO_FRAGMENT
Fred Drake4baedc12002-04-01 14:53:37 +00004212 PyModule_AddIntConstant(m, "IPPROTO_FRAGMENT", IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004213#endif
4214#ifdef IPPROTO_RSVP
Fred Drake4baedc12002-04-01 14:53:37 +00004215 PyModule_AddIntConstant(m, "IPPROTO_RSVP", IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004216#endif
4217#ifdef IPPROTO_GRE
Fred Drake4baedc12002-04-01 14:53:37 +00004218 PyModule_AddIntConstant(m, "IPPROTO_GRE", IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004219#endif
4220#ifdef IPPROTO_ESP
Fred Drake4baedc12002-04-01 14:53:37 +00004221 PyModule_AddIntConstant(m, "IPPROTO_ESP", IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004222#endif
4223#ifdef IPPROTO_AH
Fred Drake4baedc12002-04-01 14:53:37 +00004224 PyModule_AddIntConstant(m, "IPPROTO_AH", IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004225#endif
4226#ifdef IPPROTO_MOBILE
Fred Drake4baedc12002-04-01 14:53:37 +00004227 PyModule_AddIntConstant(m, "IPPROTO_MOBILE", IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004228#endif
4229#ifdef IPPROTO_ICMPV6
Fred Drake4baedc12002-04-01 14:53:37 +00004230 PyModule_AddIntConstant(m, "IPPROTO_ICMPV6", IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004231#endif
4232#ifdef IPPROTO_NONE
Fred Drake4baedc12002-04-01 14:53:37 +00004233 PyModule_AddIntConstant(m, "IPPROTO_NONE", IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004234#endif
4235#ifdef IPPROTO_DSTOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00004236 PyModule_AddIntConstant(m, "IPPROTO_DSTOPTS", IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004237#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004238#ifdef IPPROTO_XTP
Fred Drake4baedc12002-04-01 14:53:37 +00004239 PyModule_AddIntConstant(m, "IPPROTO_XTP", IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004240#endif
4241#ifdef IPPROTO_EON
Fred Drake4baedc12002-04-01 14:53:37 +00004242 PyModule_AddIntConstant(m, "IPPROTO_EON", IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004243#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004244#ifdef IPPROTO_PIM
Fred Drake4baedc12002-04-01 14:53:37 +00004245 PyModule_AddIntConstant(m, "IPPROTO_PIM", IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004246#endif
4247#ifdef IPPROTO_IPCOMP
Fred Drake4baedc12002-04-01 14:53:37 +00004248 PyModule_AddIntConstant(m, "IPPROTO_IPCOMP", IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004249#endif
4250#ifdef IPPROTO_VRRP
Fred Drake4baedc12002-04-01 14:53:37 +00004251 PyModule_AddIntConstant(m, "IPPROTO_VRRP", IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004252#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004253#ifdef IPPROTO_BIP
Fred Drake4baedc12002-04-01 14:53:37 +00004254 PyModule_AddIntConstant(m, "IPPROTO_BIP", IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004255#endif
4256/**/
4257#ifdef IPPROTO_RAW
Fred Drake4baedc12002-04-01 14:53:37 +00004258 PyModule_AddIntConstant(m, "IPPROTO_RAW", IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00004259#else
Fred Drake4baedc12002-04-01 14:53:37 +00004260 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004261#endif
4262#ifdef IPPROTO_MAX
Fred Drake4baedc12002-04-01 14:53:37 +00004263 PyModule_AddIntConstant(m, "IPPROTO_MAX", IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004264#endif
4265
4266 /* Some port configuration */
4267#ifdef IPPORT_RESERVED
Fred Drake4baedc12002-04-01 14:53:37 +00004268 PyModule_AddIntConstant(m, "IPPORT_RESERVED", IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004269#else
Fred Drake4baedc12002-04-01 14:53:37 +00004270 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004271#endif
4272#ifdef IPPORT_USERRESERVED
Fred Drake4baedc12002-04-01 14:53:37 +00004273 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004274#else
Fred Drake4baedc12002-04-01 14:53:37 +00004275 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004276#endif
4277
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004278 /* Some reserved IP v.4 addresses */
4279#ifdef INADDR_ANY
Fred Drake4baedc12002-04-01 14:53:37 +00004280 PyModule_AddIntConstant(m, "INADDR_ANY", INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004281#else
Fred Drake4baedc12002-04-01 14:53:37 +00004282 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004283#endif
4284#ifdef INADDR_BROADCAST
Fred Drake4baedc12002-04-01 14:53:37 +00004285 PyModule_AddIntConstant(m, "INADDR_BROADCAST", INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004286#else
Fred Drake4baedc12002-04-01 14:53:37 +00004287 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004288#endif
4289#ifdef INADDR_LOOPBACK
Fred Drake4baedc12002-04-01 14:53:37 +00004290 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004291#else
Fred Drake4baedc12002-04-01 14:53:37 +00004292 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004293#endif
4294#ifdef INADDR_UNSPEC_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00004295 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004296#else
Fred Drake4baedc12002-04-01 14:53:37 +00004297 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004298#endif
4299#ifdef INADDR_ALLHOSTS_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00004300 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
4301 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004302#else
Fred Drake4baedc12002-04-01 14:53:37 +00004303 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004304#endif
4305#ifdef INADDR_MAX_LOCAL_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00004306 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP",
4307 INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004308#else
Fred Drake4baedc12002-04-01 14:53:37 +00004309 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004310#endif
4311#ifdef INADDR_NONE
Fred Drake4baedc12002-04-01 14:53:37 +00004312 PyModule_AddIntConstant(m, "INADDR_NONE", INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004313#else
Fred Drake4baedc12002-04-01 14:53:37 +00004314 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004315#endif
4316
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004317 /* IPv4 [gs]etsockopt options */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004318#ifdef IP_OPTIONS
Fred Drake4baedc12002-04-01 14:53:37 +00004319 PyModule_AddIntConstant(m, "IP_OPTIONS", IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004320#endif
4321#ifdef IP_HDRINCL
Fred Drake4baedc12002-04-01 14:53:37 +00004322 PyModule_AddIntConstant(m, "IP_HDRINCL", IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004323#endif
4324#ifdef IP_TOS
Fred Drake4baedc12002-04-01 14:53:37 +00004325 PyModule_AddIntConstant(m, "IP_TOS", IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004326#endif
4327#ifdef IP_TTL
Fred Drake4baedc12002-04-01 14:53:37 +00004328 PyModule_AddIntConstant(m, "IP_TTL", IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004329#endif
4330#ifdef IP_RECVOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00004331 PyModule_AddIntConstant(m, "IP_RECVOPTS", IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004332#endif
4333#ifdef IP_RECVRETOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00004334 PyModule_AddIntConstant(m, "IP_RECVRETOPTS", IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004335#endif
4336#ifdef IP_RECVDSTADDR
Fred Drake4baedc12002-04-01 14:53:37 +00004337 PyModule_AddIntConstant(m, "IP_RECVDSTADDR", IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004338#endif
4339#ifdef IP_RETOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00004340 PyModule_AddIntConstant(m, "IP_RETOPTS", IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004341#endif
4342#ifdef IP_MULTICAST_IF
Fred Drake4baedc12002-04-01 14:53:37 +00004343 PyModule_AddIntConstant(m, "IP_MULTICAST_IF", IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004344#endif
4345#ifdef IP_MULTICAST_TTL
Fred Drake4baedc12002-04-01 14:53:37 +00004346 PyModule_AddIntConstant(m, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004347#endif
4348#ifdef IP_MULTICAST_LOOP
Fred Drake4baedc12002-04-01 14:53:37 +00004349 PyModule_AddIntConstant(m, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004350#endif
4351#ifdef IP_ADD_MEMBERSHIP
Fred Drake4baedc12002-04-01 14:53:37 +00004352 PyModule_AddIntConstant(m, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004353#endif
4354#ifdef IP_DROP_MEMBERSHIP
Fred Drake4baedc12002-04-01 14:53:37 +00004355 PyModule_AddIntConstant(m, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004356#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00004357#ifdef IP_DEFAULT_MULTICAST_TTL
Fred Drake4baedc12002-04-01 14:53:37 +00004358 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_TTL",
4359 IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00004360#endif
4361#ifdef IP_DEFAULT_MULTICAST_LOOP
Fred Drake4baedc12002-04-01 14:53:37 +00004362 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_LOOP",
4363 IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00004364#endif
4365#ifdef IP_MAX_MEMBERSHIPS
Fred Drake4baedc12002-04-01 14:53:37 +00004366 PyModule_AddIntConstant(m, "IP_MAX_MEMBERSHIPS", IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00004367#endif
4368
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004369 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
4370#ifdef IPV6_JOIN_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00004371 PyModule_AddIntConstant(m, "IPV6_JOIN_GROUP", IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004372#endif
4373#ifdef IPV6_LEAVE_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00004374 PyModule_AddIntConstant(m, "IPV6_LEAVE_GROUP", IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004375#endif
4376#ifdef IPV6_MULTICAST_HOPS
Fred Drake4baedc12002-04-01 14:53:37 +00004377 PyModule_AddIntConstant(m, "IPV6_MULTICAST_HOPS", IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004378#endif
4379#ifdef IPV6_MULTICAST_IF
Fred Drake4baedc12002-04-01 14:53:37 +00004380 PyModule_AddIntConstant(m, "IPV6_MULTICAST_IF", IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004381#endif
4382#ifdef IPV6_MULTICAST_LOOP
Fred Drake4baedc12002-04-01 14:53:37 +00004383 PyModule_AddIntConstant(m, "IPV6_MULTICAST_LOOP", IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004384#endif
4385#ifdef IPV6_UNICAST_HOPS
Fred Drake4baedc12002-04-01 14:53:37 +00004386 PyModule_AddIntConstant(m, "IPV6_UNICAST_HOPS", IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004387#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00004388 /* Additional IPV6 socket options, defined in RFC 3493 */
4389#ifdef IPV6_V6ONLY
4390 PyModule_AddIntConstant(m, "IPV6_V6ONLY", IPV6_V6ONLY);
4391#endif
4392 /* Advanced IPV6 socket options, from RFC 3542 */
4393#ifdef IPV6_CHECKSUM
4394 PyModule_AddIntConstant(m, "IPV6_CHECKSUM", IPV6_CHECKSUM);
4395#endif
4396#ifdef IPV6_DONTFRAG
4397 PyModule_AddIntConstant(m, "IPV6_DONTFRAG", IPV6_DONTFRAG);
4398#endif
4399#ifdef IPV6_DSTOPTS
4400 PyModule_AddIntConstant(m, "IPV6_DSTOPTS", IPV6_DSTOPTS);
4401#endif
4402#ifdef IPV6_HOPLIMIT
4403 PyModule_AddIntConstant(m, "IPV6_HOPLIMIT", IPV6_HOPLIMIT);
4404#endif
4405#ifdef IPV6_HOPOPTS
4406 PyModule_AddIntConstant(m, "IPV6_HOPOPTS", IPV6_HOPOPTS);
4407#endif
4408#ifdef IPV6_NEXTHOP
4409 PyModule_AddIntConstant(m, "IPV6_NEXTHOP", IPV6_NEXTHOP);
4410#endif
4411#ifdef IPV6_PATHMTU
4412 PyModule_AddIntConstant(m, "IPV6_PATHMTU", IPV6_PATHMTU);
4413#endif
4414#ifdef IPV6_PKTINFO
4415 PyModule_AddIntConstant(m, "IPV6_PKTINFO", IPV6_PKTINFO);
4416#endif
4417#ifdef IPV6_RECVDSTOPTS
4418 PyModule_AddIntConstant(m, "IPV6_RECVDSTOPTS", IPV6_RECVDSTOPTS);
4419#endif
4420#ifdef IPV6_RECVHOPLIMIT
4421 PyModule_AddIntConstant(m, "IPV6_RECVHOPLIMIT", IPV6_RECVHOPLIMIT);
4422#endif
4423#ifdef IPV6_RECVHOPOPTS
4424 PyModule_AddIntConstant(m, "IPV6_RECVHOPOPTS", IPV6_RECVHOPOPTS);
4425#endif
4426#ifdef IPV6_RECVPKTINFO
4427 PyModule_AddIntConstant(m, "IPV6_RECVPKTINFO", IPV6_RECVPKTINFO);
4428#endif
4429#ifdef IPV6_RECVRTHDR
4430 PyModule_AddIntConstant(m, "IPV6_RECVRTHDR", IPV6_RECVRTHDR);
4431#endif
4432#ifdef IPV6_RECVTCLASS
4433 PyModule_AddIntConstant(m, "IPV6_RECVTCLASS", IPV6_RECVTCLASS);
4434#endif
4435#ifdef IPV6_RTHDR
4436 PyModule_AddIntConstant(m, "IPV6_RTHDR", IPV6_RTHDR);
4437#endif
4438#ifdef IPV6_RTHDRDSTOPTS
4439 PyModule_AddIntConstant(m, "IPV6_RTHDRDSTOPTS", IPV6_RTHDRDSTOPTS);
4440#endif
4441#ifdef IPV6_RTHDR_TYPE_0
4442 PyModule_AddIntConstant(m, "IPV6_RTHDR_TYPE_0", IPV6_RTHDR_TYPE_0);
4443#endif
4444#ifdef IPV6_RECVPATHMTU
4445 PyModule_AddIntConstant(m, "IPV6_RECVPATHMTU", IPV6_RECVPATHMTU);
4446#endif
4447#ifdef IPV6_TCLASS
4448 PyModule_AddIntConstant(m, "IPV6_TCLASS", IPV6_TCLASS);
4449#endif
4450#ifdef IPV6_USE_MIN_MTU
4451 PyModule_AddIntConstant(m, "IPV6_USE_MIN_MTU", IPV6_USE_MIN_MTU);
4452#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004453
Guido van Rossum09be4091999-08-09 14:40:40 +00004454 /* TCP options */
4455#ifdef TCP_NODELAY
Fred Drake4baedc12002-04-01 14:53:37 +00004456 PyModule_AddIntConstant(m, "TCP_NODELAY", TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00004457#endif
4458#ifdef TCP_MAXSEG
Fred Drake4baedc12002-04-01 14:53:37 +00004459 PyModule_AddIntConstant(m, "TCP_MAXSEG", TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00004460#endif
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004461#ifdef TCP_CORK
Fred Drake4baedc12002-04-01 14:53:37 +00004462 PyModule_AddIntConstant(m, "TCP_CORK", TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004463#endif
4464#ifdef TCP_KEEPIDLE
Fred Drake4baedc12002-04-01 14:53:37 +00004465 PyModule_AddIntConstant(m, "TCP_KEEPIDLE", TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004466#endif
4467#ifdef TCP_KEEPINTVL
Fred Drake4baedc12002-04-01 14:53:37 +00004468 PyModule_AddIntConstant(m, "TCP_KEEPINTVL", TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004469#endif
4470#ifdef TCP_KEEPCNT
Fred Drake4baedc12002-04-01 14:53:37 +00004471 PyModule_AddIntConstant(m, "TCP_KEEPCNT", TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004472#endif
4473#ifdef TCP_SYNCNT
Fred Drake4baedc12002-04-01 14:53:37 +00004474 PyModule_AddIntConstant(m, "TCP_SYNCNT", TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004475#endif
4476#ifdef TCP_LINGER2
Fred Drake4baedc12002-04-01 14:53:37 +00004477 PyModule_AddIntConstant(m, "TCP_LINGER2", TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004478#endif
4479#ifdef TCP_DEFER_ACCEPT
Fred Drake4baedc12002-04-01 14:53:37 +00004480 PyModule_AddIntConstant(m, "TCP_DEFER_ACCEPT", TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004481#endif
4482#ifdef TCP_WINDOW_CLAMP
Fred Drake4baedc12002-04-01 14:53:37 +00004483 PyModule_AddIntConstant(m, "TCP_WINDOW_CLAMP", TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004484#endif
4485#ifdef TCP_INFO
Fred Drake4baedc12002-04-01 14:53:37 +00004486 PyModule_AddIntConstant(m, "TCP_INFO", TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004487#endif
4488#ifdef TCP_QUICKACK
Fred Drake4baedc12002-04-01 14:53:37 +00004489 PyModule_AddIntConstant(m, "TCP_QUICKACK", TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004490#endif
4491
Guido van Rossum09be4091999-08-09 14:40:40 +00004492
4493 /* IPX options */
4494#ifdef IPX_TYPE
Fred Drake4baedc12002-04-01 14:53:37 +00004495 PyModule_AddIntConstant(m, "IPX_TYPE", IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00004496#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004497
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004498 /* get{addr,name}info parameters */
4499#ifdef EAI_ADDRFAMILY
Fred Drake4baedc12002-04-01 14:53:37 +00004500 PyModule_AddIntConstant(m, "EAI_ADDRFAMILY", EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004501#endif
4502#ifdef EAI_AGAIN
Fred Drake4baedc12002-04-01 14:53:37 +00004503 PyModule_AddIntConstant(m, "EAI_AGAIN", EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004504#endif
4505#ifdef EAI_BADFLAGS
Fred Drake4baedc12002-04-01 14:53:37 +00004506 PyModule_AddIntConstant(m, "EAI_BADFLAGS", EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004507#endif
4508#ifdef EAI_FAIL
Fred Drake4baedc12002-04-01 14:53:37 +00004509 PyModule_AddIntConstant(m, "EAI_FAIL", EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004510#endif
4511#ifdef EAI_FAMILY
Fred Drake4baedc12002-04-01 14:53:37 +00004512 PyModule_AddIntConstant(m, "EAI_FAMILY", EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004513#endif
4514#ifdef EAI_MEMORY
Fred Drake4baedc12002-04-01 14:53:37 +00004515 PyModule_AddIntConstant(m, "EAI_MEMORY", EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004516#endif
4517#ifdef EAI_NODATA
Fred Drake4baedc12002-04-01 14:53:37 +00004518 PyModule_AddIntConstant(m, "EAI_NODATA", EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004519#endif
4520#ifdef EAI_NONAME
Fred Drake4baedc12002-04-01 14:53:37 +00004521 PyModule_AddIntConstant(m, "EAI_NONAME", EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004522#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00004523#ifdef EAI_OVERFLOW
4524 PyModule_AddIntConstant(m, "EAI_OVERFLOW", EAI_OVERFLOW);
4525#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004526#ifdef EAI_SERVICE
Fred Drake4baedc12002-04-01 14:53:37 +00004527 PyModule_AddIntConstant(m, "EAI_SERVICE", EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004528#endif
4529#ifdef EAI_SOCKTYPE
Fred Drake4baedc12002-04-01 14:53:37 +00004530 PyModule_AddIntConstant(m, "EAI_SOCKTYPE", EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004531#endif
4532#ifdef EAI_SYSTEM
Fred Drake4baedc12002-04-01 14:53:37 +00004533 PyModule_AddIntConstant(m, "EAI_SYSTEM", EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004534#endif
4535#ifdef EAI_BADHINTS
Fred Drake4baedc12002-04-01 14:53:37 +00004536 PyModule_AddIntConstant(m, "EAI_BADHINTS", EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004537#endif
4538#ifdef EAI_PROTOCOL
Fred Drake4baedc12002-04-01 14:53:37 +00004539 PyModule_AddIntConstant(m, "EAI_PROTOCOL", EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004540#endif
4541#ifdef EAI_MAX
Fred Drake4baedc12002-04-01 14:53:37 +00004542 PyModule_AddIntConstant(m, "EAI_MAX", EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004543#endif
4544#ifdef AI_PASSIVE
Fred Drake4baedc12002-04-01 14:53:37 +00004545 PyModule_AddIntConstant(m, "AI_PASSIVE", AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004546#endif
4547#ifdef AI_CANONNAME
Fred Drake4baedc12002-04-01 14:53:37 +00004548 PyModule_AddIntConstant(m, "AI_CANONNAME", AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004549#endif
4550#ifdef AI_NUMERICHOST
Fred Drake4baedc12002-04-01 14:53:37 +00004551 PyModule_AddIntConstant(m, "AI_NUMERICHOST", AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004552#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00004553#ifdef AI_NUMERICSERV
4554 PyModule_AddIntConstant(m, "AI_NUMERICSERV", AI_NUMERICSERV);
4555#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004556#ifdef AI_MASK
Fred Drake4baedc12002-04-01 14:53:37 +00004557 PyModule_AddIntConstant(m, "AI_MASK", AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004558#endif
4559#ifdef AI_ALL
Fred Drake4baedc12002-04-01 14:53:37 +00004560 PyModule_AddIntConstant(m, "AI_ALL", AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004561#endif
4562#ifdef AI_V4MAPPED_CFG
Fred Drake4baedc12002-04-01 14:53:37 +00004563 PyModule_AddIntConstant(m, "AI_V4MAPPED_CFG", AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004564#endif
4565#ifdef AI_ADDRCONFIG
Fred Drake4baedc12002-04-01 14:53:37 +00004566 PyModule_AddIntConstant(m, "AI_ADDRCONFIG", AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004567#endif
4568#ifdef AI_V4MAPPED
Fred Drake4baedc12002-04-01 14:53:37 +00004569 PyModule_AddIntConstant(m, "AI_V4MAPPED", AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004570#endif
4571#ifdef AI_DEFAULT
Fred Drake4baedc12002-04-01 14:53:37 +00004572 PyModule_AddIntConstant(m, "AI_DEFAULT", AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004573#endif
4574#ifdef NI_MAXHOST
Fred Drake4baedc12002-04-01 14:53:37 +00004575 PyModule_AddIntConstant(m, "NI_MAXHOST", NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004576#endif
4577#ifdef NI_MAXSERV
Fred Drake4baedc12002-04-01 14:53:37 +00004578 PyModule_AddIntConstant(m, "NI_MAXSERV", NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004579#endif
4580#ifdef NI_NOFQDN
Fred Drake4baedc12002-04-01 14:53:37 +00004581 PyModule_AddIntConstant(m, "NI_NOFQDN", NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004582#endif
4583#ifdef NI_NUMERICHOST
Fred Drake4baedc12002-04-01 14:53:37 +00004584 PyModule_AddIntConstant(m, "NI_NUMERICHOST", NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004585#endif
4586#ifdef NI_NAMEREQD
Fred Drake4baedc12002-04-01 14:53:37 +00004587 PyModule_AddIntConstant(m, "NI_NAMEREQD", NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004588#endif
4589#ifdef NI_NUMERICSERV
Fred Drake4baedc12002-04-01 14:53:37 +00004590 PyModule_AddIntConstant(m, "NI_NUMERICSERV", NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004591#endif
4592#ifdef NI_DGRAM
Fred Drake4baedc12002-04-01 14:53:37 +00004593 PyModule_AddIntConstant(m, "NI_DGRAM", NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004594#endif
4595
Martin v. Löwis94681fc2003-11-27 19:40:22 +00004596 /* shutdown() parameters */
4597#ifdef SHUT_RD
4598 PyModule_AddIntConstant(m, "SHUT_RD", SHUT_RD);
4599#elif defined(SD_RECEIVE)
4600 PyModule_AddIntConstant(m, "SHUT_RD", SD_RECEIVE);
4601#else
4602 PyModule_AddIntConstant(m, "SHUT_RD", 0);
4603#endif
4604#ifdef SHUT_WR
4605 PyModule_AddIntConstant(m, "SHUT_WR", SHUT_WR);
4606#elif defined(SD_SEND)
4607 PyModule_AddIntConstant(m, "SHUT_WR", SD_SEND);
4608#else
4609 PyModule_AddIntConstant(m, "SHUT_WR", 1);
4610#endif
4611#ifdef SHUT_RDWR
4612 PyModule_AddIntConstant(m, "SHUT_RDWR", SHUT_RDWR);
4613#elif defined(SD_BOTH)
4614 PyModule_AddIntConstant(m, "SHUT_RDWR", SD_BOTH);
4615#else
4616 PyModule_AddIntConstant(m, "SHUT_RDWR", 2);
4617#endif
4618
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004619 /* Initialize gethostbyname lock */
Just van Rossum1040d2c2003-05-09 07:53:18 +00004620#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
4621 netdb_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004622#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004623}
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004624
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004625
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004626#ifndef HAVE_INET_PTON
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004627
4628/* Simplistic emulation code for inet_pton that only works for IPv4 */
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004629/* These are not exposed because they do not set errno properly */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004630
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004631int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004632inet_pton(int af, const char *src, void *dst)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004633{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004634 if (af == AF_INET) {
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004635 long packed_addr;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004636 packed_addr = inet_addr(src);
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004637 if (packed_addr == INADDR_NONE)
4638 return 0;
4639 memcpy(dst, &packed_addr, 4);
4640 return 1;
4641 }
4642 /* Should set errno to EAFNOSUPPORT */
4643 return -1;
4644}
4645
Martin v. Löwisc925b1532001-07-21 09:42:15 +00004646const char *
4647inet_ntop(int af, const void *src, char *dst, socklen_t size)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004648{
4649 if (af == AF_INET) {
4650 struct in_addr packed_addr;
4651 if (size < 16)
4652 /* Should set errno to ENOSPC. */
4653 return NULL;
4654 memcpy(&packed_addr, src, sizeof(packed_addr));
4655 return strncpy(dst, inet_ntoa(packed_addr), size);
4656 }
4657 /* Should set errno to EAFNOSUPPORT */
4658 return NULL;
4659}
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004660
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004661#endif