blob: e3573e37d15ce99581690cfc585a5990fb47f43f [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
Hye-Shik Chang9ceebd52005-09-24 14:58:47 +0000143/* To use __FreeBSD_version */
144#ifdef HAVE_SYS_PARAM_H
145#include <sys/param.h>
146#endif
Just van Rossum1040d2c2003-05-09 07:53:18 +0000147/* On systems on which getaddrinfo() is believed to not be thread-safe,
Just van Rossum09aecd72003-05-09 08:03:44 +0000148 (this includes the getaddrinfo emulation) protect access with a lock. */
Hye-Shik Chang9ceebd52005-09-24 14:58:47 +0000149#if defined(WITH_THREAD) && (defined(__APPLE__) || \
150 (defined(__FreeBSD__) && __FreeBSD_version+0 < 503000) || \
Just van Rossum16e426b2003-05-09 08:12:00 +0000151 defined(__OpenBSD__) || defined(__NetBSD__) || !defined(HAVE_GETADDRINFO))
Just van Rossum1040d2c2003-05-09 07:53:18 +0000152#define USE_GETADDRINFO_LOCK
153#endif
154
155#ifdef USE_GETADDRINFO_LOCK
156#define ACQUIRE_GETADDRINFO_LOCK PyThread_acquire_lock(netdb_lock, 1);
157#define RELEASE_GETADDRINFO_LOCK PyThread_release_lock(netdb_lock);
158#else
159#define ACQUIRE_GETADDRINFO_LOCK
160#define RELEASE_GETADDRINFO_LOCK
161#endif
162
163#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000164# include "pythread.h"
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000165#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000166
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000167#if defined(PYCC_VACPP)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000168# include <types.h>
169# include <io.h>
170# include <sys/ioctl.h>
171# include <utils.h>
172# include <ctype.h>
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000173#endif
174
Martin v. Löwis9e437302002-12-06 12:57:26 +0000175#if defined(__VMS)
176#if ! defined(_SOCKADDR_LEN)
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000177# ifdef getaddrinfo
178# undef getaddrinfo
179# endif
180# include "TCPIP_IOCTL_ROUTINE"
181#else
182# include <ioctl.h>
183#endif
Martin v. Löwis9e437302002-12-06 12:57:26 +0000184#endif
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000185
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000186#if defined(PYOS_OS2)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000187# define INCL_DOS
188# define INCL_DOSERRORS
189# define INCL_NOPMAPI
190# include <os2.h>
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000191#endif
192
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000193#if defined(__sgi) && _COMPILER_VERSION>700 && !_SGIAPI
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000194/* make sure that the reentrant (gethostbyaddr_r etc)
195 functions are declared correctly if compiling with
196 MIPSPro 7.x in ANSI C mode (default) */
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000197
198/* XXX Using _SGIAPI is the wrong thing,
199 but I don't know what the right thing is. */
Trent Mick8ea5bdf2004-09-13 17:48:41 +0000200#undef _SGIAPI /* to avoid warning */
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000201#define _SGIAPI 1
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000202
Trent Mick8ea5bdf2004-09-13 17:48:41 +0000203#undef _XOPEN_SOURCE
204#include <sys/socket.h>
205#include <sys/types.h>
206#include <netinet/in.h>
207#ifdef _SS_ALIGNSIZE
208#define HAVE_GETADDRINFO 1
209#define HAVE_GETNAMEINFO 1
210#endif
211
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000212#define HAVE_INET_PTON
213#include <netdb.h>
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000214#endif
215
Anthony Baxterbab23cf2003-10-04 08:00:49 +0000216/* Irix 6.5 fails to define this variable at all. This is needed
217 for both GCC and SGI's compiler. I'd say that the SGI headers
218 are just busted. */
219#if defined(__sgi) && !defined(INET_ADDRSTRLEN)
220#define INET_ADDRSTRLEN 16
221#endif
222
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000223/* Generic includes */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000224#include <sys/types.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000225
Marc-André Lemburg976ade62002-02-16 18:47:07 +0000226/* Generic socket object definitions and includes */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000227#define PySocket_BUILDING_SOCKET
Marc-André Lemburgbb8b78b2002-02-16 18:44:52 +0000228#include "socketmodule.h"
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000229
230/* Addressing includes */
231
Guido van Rossum6f489d91996-06-28 20:15:15 +0000232#ifndef MS_WINDOWS
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000233
234/* Non-MS WINDOWS includes */
235# include <netdb.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000236
Guido van Rossum9376b741999-09-15 22:01:40 +0000237/* Headers needed for inet_ntoa() and inet_addr() */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000238# ifdef __BEOS__
239# include <net/netdb.h>
240# elif defined(PYOS_OS2) && defined(PYCC_VACPP)
241# include <netdb.h>
Tim Peters603c6832001-11-05 02:45:59 +0000242typedef size_t socklen_t;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000243# else
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000244# include <arpa/inet.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000245# endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000246
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000247# ifndef RISCOS
248# include <fcntl.h>
249# else
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000250# include <sys/ioctl.h>
251# include <socklib.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000252# define NO_DUP
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000253int h_errno; /* not used */
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000254# define INET_ADDRSTRLEN 16
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000255# endif
256
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000257#else
Guido van Rossum48a680c2001-03-02 06:34:14 +0000258
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000259/* MS_WINDOWS includes */
260# include <fcntl.h>
Guido van Rossum48a680c2001-03-02 06:34:14 +0000261
Jeremy Hylton22308652001-02-02 03:23:09 +0000262#endif
263
Skip Montanaro7befb992004-02-10 16:50:21 +0000264#include <stddef.h>
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000265
266#ifndef offsetof
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000267# define offsetof(type, member) ((size_t)(&((type *)0)->member))
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000268#endif
269
Neal Norwitz39d22e52002-11-02 19:55:21 +0000270#ifndef O_NONBLOCK
271# define O_NONBLOCK O_NDELAY
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000272#endif
273
Trent Micka708d6e2004-09-07 17:48:26 +0000274/* include Python's addrinfo.h unless it causes trouble */
275#if defined(__sgi) && _COMPILER_VERSION>700 && defined(_SS_ALIGNSIZE)
276 /* Do not include addinfo.h on some newer IRIX versions.
277 * _SS_ALIGNSIZE is defined in sys/socket.h by 6.5.21,
278 * for example, but not by 6.5.10.
279 */
280#elif defined(_MSC_VER) && _MSC_VER>1200
281 /* Do not include addrinfo.h for MSVC7 or greater. 'addrinfo' and
282 * EAI_* constants are defined in (the already included) ws2tcpip.h.
283 */
284#else
285# include "addrinfo.h"
286#endif
Jason Tishlerc246cb72004-08-09 13:25:59 +0000287
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000288#ifndef HAVE_INET_PTON
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000289int inet_pton(int af, const char *src, void *dst);
Martin v. Löwisc925b1532001-07-21 09:42:15 +0000290const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000291#endif
292
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000293#ifdef __APPLE__
294/* On OS X, getaddrinfo returns no error indication of lookup
295 failure, so we must use the emulation instead of the libinfo
296 implementation. Unfortunately, performing an autoconf test
297 for this bug would require DNS access for the machine performing
298 the configuration, which is not acceptable. Therefore, we
299 determine the bug just by checking for __APPLE__. If this bug
300 gets ever fixed, perhaps checking for sys/version.h would be
301 appropriate, which is 10/0 on the system with the bug. */
Jack Jansen84262fb2002-07-02 14:40:42 +0000302#ifndef HAVE_GETNAMEINFO
303/* This bug seems to be fixed in Jaguar. Ths easiest way I could
304 Find to check for Jaguar is that it has getnameinfo(), which
305 older releases don't have */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000306#undef HAVE_GETADDRINFO
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000307#endif
Jack Jansen84262fb2002-07-02 14:40:42 +0000308#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000309
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000310/* I know this is a bad practice, but it is the easiest... */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000311#if !defined(HAVE_GETADDRINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000312/* avoid clashes with the C library definition of the symbol. */
313#define getaddrinfo fake_getaddrinfo
314#define gai_strerror fake_gai_strerror
315#define freeaddrinfo fake_freeaddrinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000316#include "getaddrinfo.c"
317#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000318#if !defined(HAVE_GETNAMEINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000319#define getnameinfo fake_getnameinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000320#include "getnameinfo.c"
321#endif
322
Guido van Rossumbcc20741998-08-04 22:53:56 +0000323#if defined(MS_WINDOWS) || defined(__BEOS__)
324/* BeOS suffers from the same socket dichotomy as Win32... - [cjh] */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000325/* seem to be a few differences in the API */
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000326#define SOCKETCLOSE closesocket
Guido van Rossumbe32c891996-06-20 16:25:29 +0000327#define NO_DUP /* Actually it exists on NT 3.5, but what the heck... */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000328#endif
329
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000330#ifdef MS_WIN32
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000331#define EAFNOSUPPORT WSAEAFNOSUPPORT
332#define snprintf _snprintf
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000333#endif
Fred Drakea04eaad2000-06-30 02:46:07 +0000334
Andrew MacIntyreba43e872002-03-03 03:03:52 +0000335#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000336#define SOCKETCLOSE soclose
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000337#define NO_DUP /* Sockets are Not Actual File Handles under OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000338#endif
339
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000340#ifndef SOCKETCLOSE
341#define SOCKETCLOSE close
342#endif
343
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000344#ifdef __VMS
345/* TCP/IP Services for VMS uses a maximum send/revc buffer length of 65535 */
346#define SEGMENT_SIZE 65535
347#endif
348
Hye-Shik Chang81268602004-02-02 06:05:24 +0000349#if defined(HAVE_BLUETOOTH_H) || defined(HAVE_BLUETOOTH_BLUETOOTH_H)
350#define USE_BLUETOOTH 1
351#if defined(__FreeBSD__)
352#define BTPROTO_L2CAP BLUETOOTH_PROTO_L2CAP
353#define BTPROTO_RFCOMM BLUETOOTH_PROTO_RFCOMM
354#define sockaddr_l2 sockaddr_l2cap
355#define sockaddr_rc sockaddr_rfcomm
356#define _BT_SOCKADDR_MEMB(s, proto) &((s)->sock_addr)
357#define _BT_L2_MEMB(sa, memb) ((sa)->l2cap_##memb)
358#define _BT_RC_MEMB(sa, memb) ((sa)->rfcomm_##memb)
359#else
Anthony Baxter5d7c0672004-02-16 05:35:28 +0000360#define _BT_SOCKADDR_MEMB(s, proto) (&((s)->sock_addr).bt_##proto)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000361#define _BT_L2_MEMB(sa, memb) ((sa)->l2_##memb)
362#define _BT_RC_MEMB(sa, memb) ((sa)->rc_##memb)
363#define _BT_SCO_MEMB(sa, memb) ((sa)->sco_##memb)
364#endif
365#endif
366
Martin v. Löwise9416172003-05-03 10:12:45 +0000367/*
368 * Constants for getnameinfo()
369 */
370#if !defined(NI_MAXHOST)
371#define NI_MAXHOST 1025
372#endif
373#if !defined(NI_MAXSERV)
374#define NI_MAXSERV 32
375#endif
376
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000377/* XXX There's a problem here: *static* functions are not supposed to have
378 a Py prefix (or use CapitalizedWords). Later... */
379
Guido van Rossum30a685f1991-06-27 15:51:29 +0000380/* Global variable holding the exception type for errors detected
381 by this module (but not argument type or memory errors, etc.). */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000382static PyObject *socket_error;
383static PyObject *socket_herror;
384static PyObject *socket_gaierror;
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000385static PyObject *socket_timeout;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000386
Guido van Rossum48a680c2001-03-02 06:34:14 +0000387#ifdef RISCOS
388/* Global variable which is !=0 if Python is running in a RISC OS taskwindow */
389static int taskwindow;
390#endif
391
Tim Peters643a7fc2002-02-17 04:13:21 +0000392/* A forward reference to the socket type object.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000393 The sock_type variable contains pointers to various functions,
394 some of which call new_sockobject(), which uses sock_type, so
Tim Peters643a7fc2002-02-17 04:13:21 +0000395 there has to be a circular reference. */
Jeremy Hylton938ace62002-07-17 16:30:39 +0000396static PyTypeObject sock_type;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000397
Guido van Rossum30a685f1991-06-27 15:51:29 +0000398/* Convenience function to raise an error according to errno
399 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000400
Guido van Rossum73624e91994-10-10 17:59:00 +0000401static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000402set_error(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000403{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000404#ifdef MS_WINDOWS
Mark Hammond46a733d2000-07-24 01:45:11 +0000405 int err_no = WSAGetLastError();
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000406 static struct {
407 int no;
408 const char *msg;
409 } *msgp, msgs[] = {
410 {WSAEINTR, "Interrupted system call"},
411 {WSAEBADF, "Bad file descriptor"},
412 {WSAEACCES, "Permission denied"},
413 {WSAEFAULT, "Bad address"},
414 {WSAEINVAL, "Invalid argument"},
415 {WSAEMFILE, "Too many open files"},
416 {WSAEWOULDBLOCK,
417 "The socket operation could not complete "
418 "without blocking"},
419 {WSAEINPROGRESS, "Operation now in progress"},
420 {WSAEALREADY, "Operation already in progress"},
421 {WSAENOTSOCK, "Socket operation on non-socket"},
422 {WSAEDESTADDRREQ, "Destination address required"},
423 {WSAEMSGSIZE, "Message too long"},
424 {WSAEPROTOTYPE, "Protocol wrong type for socket"},
425 {WSAENOPROTOOPT, "Protocol not available"},
426 {WSAEPROTONOSUPPORT, "Protocol not supported"},
427 {WSAESOCKTNOSUPPORT, "Socket type not supported"},
428 {WSAEOPNOTSUPP, "Operation not supported"},
429 {WSAEPFNOSUPPORT, "Protocol family not supported"},
430 {WSAEAFNOSUPPORT, "Address family not supported"},
431 {WSAEADDRINUSE, "Address already in use"},
432 {WSAEADDRNOTAVAIL, "Can't assign requested address"},
433 {WSAENETDOWN, "Network is down"},
434 {WSAENETUNREACH, "Network is unreachable"},
435 {WSAENETRESET, "Network dropped connection on reset"},
436 {WSAECONNABORTED, "Software caused connection abort"},
437 {WSAECONNRESET, "Connection reset by peer"},
438 {WSAENOBUFS, "No buffer space available"},
439 {WSAEISCONN, "Socket is already connected"},
440 {WSAENOTCONN, "Socket is not connected"},
441 {WSAESHUTDOWN, "Can't send after socket shutdown"},
442 {WSAETOOMANYREFS, "Too many references: can't splice"},
443 {WSAETIMEDOUT, "Operation timed out"},
444 {WSAECONNREFUSED, "Connection refused"},
445 {WSAELOOP, "Too many levels of symbolic links"},
446 {WSAENAMETOOLONG, "File name too long"},
447 {WSAEHOSTDOWN, "Host is down"},
448 {WSAEHOSTUNREACH, "No route to host"},
449 {WSAENOTEMPTY, "Directory not empty"},
450 {WSAEPROCLIM, "Too many processes"},
451 {WSAEUSERS, "Too many users"},
452 {WSAEDQUOT, "Disc quota exceeded"},
453 {WSAESTALE, "Stale NFS file handle"},
454 {WSAEREMOTE, "Too many levels of remote in path"},
455 {WSASYSNOTREADY, "Network subsystem is unvailable"},
456 {WSAVERNOTSUPPORTED, "WinSock version is not supported"},
457 {WSANOTINITIALISED,
458 "Successful WSAStartup() not yet performed"},
459 {WSAEDISCON, "Graceful shutdown in progress"},
460 /* Resolver errors */
461 {WSAHOST_NOT_FOUND, "No such host is known"},
462 {WSATRY_AGAIN, "Host not found, or server failed"},
463 {WSANO_RECOVERY, "Unexpected server error encountered"},
464 {WSANO_DATA, "Valid name without requested data"},
465 {WSANO_ADDRESS, "No address, look for MX record"},
466 {0, NULL}
467 };
Mark Hammond46a733d2000-07-24 01:45:11 +0000468 if (err_no) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000469 PyObject *v;
Mark Hammond46a733d2000-07-24 01:45:11 +0000470 const char *msg = "winsock error";
Guido van Rossum48a680c2001-03-02 06:34:14 +0000471
Mark Hammond46a733d2000-07-24 01:45:11 +0000472 for (msgp = msgs; msgp->msg; msgp++) {
473 if (err_no == msgp->no) {
474 msg = msgp->msg;
475 break;
476 }
477 }
478
479 v = Py_BuildValue("(is)", err_no, msg);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000480 if (v != NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000481 PyErr_SetObject(socket_error, v);
Guido van Rossum73624e91994-10-10 17:59:00 +0000482 Py_DECREF(v);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000483 }
484 return NULL;
485 }
486 else
487#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000488
Andrew MacIntyreba43e872002-03-03 03:03:52 +0000489#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000490 if (sock_errno() != NO_ERROR) {
491 APIRET rc;
492 ULONG msglen;
493 char outbuf[100];
494 int myerrorcode = sock_errno();
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000495
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000496 /* Retrieve socket-related error message from MPTN.MSG file */
497 rc = DosGetMessage(NULL, 0, outbuf, sizeof(outbuf),
498 myerrorcode - SOCBASEERR + 26,
499 "mptn.msg",
500 &msglen);
501 if (rc == NO_ERROR) {
502 PyObject *v;
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000503
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000504 /* OS/2 doesn't guarantee a terminator */
505 outbuf[msglen] = '\0';
506 if (strlen(outbuf) > 0) {
507 /* If non-empty msg, trim CRLF */
508 char *lastc = &outbuf[ strlen(outbuf)-1 ];
509 while (lastc > outbuf && isspace(*lastc)) {
510 /* Trim trailing whitespace (CRLF) */
511 *lastc-- = '\0';
512 }
513 }
514 v = Py_BuildValue("(is)", myerrorcode, outbuf);
515 if (v != NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000516 PyErr_SetObject(socket_error, v);
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000517 Py_DECREF(v);
518 }
519 return NULL;
520 }
521 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000522#endif
523
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000524#if defined(RISCOS)
525 if (_inet_error.errnum != NULL) {
526 PyObject *v;
527 v = Py_BuildValue("(is)", errno, _inet_err());
528 if (v != NULL) {
529 PyErr_SetObject(socket_error, v);
530 Py_DECREF(v);
531 }
532 return NULL;
533 }
534#endif
535
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000536 return PyErr_SetFromErrno(socket_error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000537}
538
Guido van Rossum30a685f1991-06-27 15:51:29 +0000539
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000540static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000541set_herror(int h_error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000542{
543 PyObject *v;
544
545#ifdef HAVE_HSTRERROR
546 v = Py_BuildValue("(is)", h_error, (char *)hstrerror(h_error));
547#else
548 v = Py_BuildValue("(is)", h_error, "host not found");
549#endif
550 if (v != NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000551 PyErr_SetObject(socket_herror, v);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000552 Py_DECREF(v);
553 }
554
555 return NULL;
556}
557
558
559static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000560set_gaierror(int error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000561{
562 PyObject *v;
563
Martin v. Löwis272cb402002-03-01 08:31:07 +0000564#ifdef EAI_SYSTEM
565 /* EAI_SYSTEM is not available on Windows XP. */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000566 if (error == EAI_SYSTEM)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000567 return set_error();
Martin v. Löwis272cb402002-03-01 08:31:07 +0000568#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000569
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000570#ifdef HAVE_GAI_STRERROR
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000571 v = Py_BuildValue("(is)", error, gai_strerror(error));
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000572#else
573 v = Py_BuildValue("(is)", error, "getaddrinfo failed");
574#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000575 if (v != NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000576 PyErr_SetObject(socket_gaierror, v);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000577 Py_DECREF(v);
578 }
579
580 return NULL;
581}
582
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000583/* Function to perform the setting of socket blocking mode
584 internally. block = (1 | 0). */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000585static int
586internal_setblocking(PySocketSockObject *s, int block)
587{
588#ifndef RISCOS
589#ifndef MS_WINDOWS
590 int delay_flag;
591#endif
592#endif
593
594 Py_BEGIN_ALLOW_THREADS
595#ifdef __BEOS__
596 block = !block;
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000597 setsockopt(s->sock_fd, SOL_SOCKET, SO_NONBLOCK,
598 (void *)(&block), sizeof(int));
Guido van Rossum67f7a382002-06-06 21:08:16 +0000599#else
600#ifndef RISCOS
601#ifndef MS_WINDOWS
602#if defined(PYOS_OS2) && !defined(PYCC_GCC)
603 block = !block;
604 ioctl(s->sock_fd, FIONBIO, (caddr_t)&block, sizeof(block));
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000605#elif defined(__VMS)
606 block = !block;
607 ioctl(s->sock_fd, FIONBIO, (char *)&block);
608#else /* !PYOS_OS2 && !_VMS */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000609 delay_flag = fcntl(s->sock_fd, F_GETFL, 0);
610 if (block)
Neal Norwitz39d22e52002-11-02 19:55:21 +0000611 delay_flag &= (~O_NONBLOCK);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000612 else
Neal Norwitz39d22e52002-11-02 19:55:21 +0000613 delay_flag |= O_NONBLOCK;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000614 fcntl(s->sock_fd, F_SETFL, delay_flag);
615#endif /* !PYOS_OS2 */
616#else /* MS_WINDOWS */
617 block = !block;
618 ioctlsocket(s->sock_fd, FIONBIO, (u_long*)&block);
619#endif /* MS_WINDOWS */
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000620#else /* RISCOS */
621 block = !block;
622 socketioctl(s->sock_fd, FIONBIO, (u_long*)&block);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000623#endif /* RISCOS */
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000624#endif /* __BEOS__ */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000625 Py_END_ALLOW_THREADS
626
627 /* Since these don't return anything */
628 return 1;
629}
630
Guido van Rossum11ba0942002-06-13 15:07:44 +0000631/* Do a select() on the socket, if necessary (sock_timeout > 0).
632 The argument writing indicates the direction.
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000633 This does not raise an exception; we'll let our caller do that
634 after they've reacquired the interpreter lock.
635 Returns 1 on timeout, 0 otherwise. */
636static int
Guido van Rossumb9e916a2002-06-07 01:42:47 +0000637internal_select(PySocketSockObject *s, int writing)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000638{
639 fd_set fds;
640 struct timeval tv;
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000641 int n;
Guido van Rossum11ba0942002-06-13 15:07:44 +0000642
Guido van Rossumad654902002-07-19 12:44:59 +0000643 /* Nothing to do unless we're in timeout mode (not non-blocking) */
Guido van Rossum11ba0942002-06-13 15:07:44 +0000644 if (s->sock_timeout <= 0.0)
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000645 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000646
Guido van Rossumad654902002-07-19 12:44:59 +0000647 /* Guard against closed socket */
648 if (s->sock_fd < 0)
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000649 return 0;
Guido van Rossumad654902002-07-19 12:44:59 +0000650
Guido van Rossum67f7a382002-06-06 21:08:16 +0000651 /* Construct the arguments to select */
652 tv.tv_sec = (int)s->sock_timeout;
Guido van Rossumb9e916a2002-06-07 01:42:47 +0000653 tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000654 FD_ZERO(&fds);
655 FD_SET(s->sock_fd, &fds);
656
657 /* See if the socket is ready */
Guido van Rossumb9e916a2002-06-07 01:42:47 +0000658 if (writing)
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000659 n = select(s->sock_fd+1, NULL, &fds, NULL, &tv);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000660 else
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000661 n = select(s->sock_fd+1, &fds, NULL, NULL, &tv);
662 if (n == 0)
663 return 1;
664 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000665}
666
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000667/* Initialize a new socket object. */
668
Tim Petersa12b4cf2002-07-18 22:38:44 +0000669static double defaulttimeout = -1.0; /* Default timeout for new sockets */
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000670
Mark Hammond62b1ab12002-07-23 06:31:15 +0000671PyMODINIT_FUNC
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000672init_sockobject(PySocketSockObject *s,
673 SOCKET_T fd, int family, int type, int proto)
674{
675#ifdef RISCOS
676 int block = 1;
677#endif
678 s->sock_fd = fd;
679 s->sock_family = family;
680 s->sock_type = type;
681 s->sock_proto = proto;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000682 s->sock_timeout = defaulttimeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000683
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000684 s->errorhandler = &set_error;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000685
686 if (defaulttimeout >= 0.0)
687 internal_setblocking(s, 0);
688
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000689#ifdef RISCOS
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000690 if (taskwindow)
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000691 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000692#endif
693}
694
695
Guido van Rossum30a685f1991-06-27 15:51:29 +0000696/* Create a new socket object.
697 This just creates the object and initializes it.
698 If the creation fails, return NULL and set an exception (implicit
699 in NEWOBJ()). */
700
Guido van Rossum73624e91994-10-10 17:59:00 +0000701static PySocketSockObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000702new_sockobject(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000703{
Guido van Rossum73624e91994-10-10 17:59:00 +0000704 PySocketSockObject *s;
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000705 s = (PySocketSockObject *)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000706 PyType_GenericNew(&sock_type, NULL, NULL);
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000707 if (s != NULL)
708 init_sockobject(s, fd, family, type, proto);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000709 return s;
710}
711
Guido van Rossum30a685f1991-06-27 15:51:29 +0000712
Guido van Rossum48a680c2001-03-02 06:34:14 +0000713/* Lock to allow python interpreter to continue, but only allow one
Just van Rossum1040d2c2003-05-09 07:53:18 +0000714 thread to be in gethostbyname or getaddrinfo */
715#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
716PyThread_type_lock netdb_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000717#endif
718
719
Guido van Rossum30a685f1991-06-27 15:51:29 +0000720/* Convert a string specifying a host name or one of a few symbolic
721 names to a numeric IP address. This usually calls gethostbyname()
722 to do the work; the names "" and "<broadcast>" are special.
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000723 Return the length (IPv4 should be 4 bytes), or negative if
Guido van Rossum30a685f1991-06-27 15:51:29 +0000724 an error occurred; then an exception is raised. */
725
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000726static int
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000727setipaddr(char *name, struct sockaddr *addr_ret, size_t addr_ret_size, int af)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000728{
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000729 struct addrinfo hints, *res;
730 int error;
Anthony Baxter0e85f9d2003-05-02 15:40:46 +0000731 int d1, d2, d3, d4;
732 char ch;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000733
Guido van Rossuma376cc51996-12-05 23:43:35 +0000734 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
Guido van Rossum30a685f1991-06-27 15:51:29 +0000735 if (name[0] == '\0') {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000736 int siz;
737 memset(&hints, 0, sizeof(hints));
738 hints.ai_family = af;
739 hints.ai_socktype = SOCK_DGRAM; /*dummy*/
740 hints.ai_flags = AI_PASSIVE;
Just van Rossum1040d2c2003-05-09 07:53:18 +0000741 Py_BEGIN_ALLOW_THREADS
742 ACQUIRE_GETADDRINFO_LOCK
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000743 error = getaddrinfo(NULL, "0", &hints, &res);
Just van Rossum1040d2c2003-05-09 07:53:18 +0000744 Py_END_ALLOW_THREADS
745 /* We assume that those thread-unsafe getaddrinfo() versions
746 *are* safe regarding their return value, ie. that a
747 subsequent call to getaddrinfo() does not destroy the
748 outcome of the first call. */
749 RELEASE_GETADDRINFO_LOCK
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000750 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000751 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000752 return -1;
753 }
754 switch (res->ai_family) {
755 case AF_INET:
756 siz = 4;
757 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000758#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000759 case AF_INET6:
760 siz = 16;
761 break;
762#endif
763 default:
764 freeaddrinfo(res);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000765 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000766 "unsupported address family");
767 return -1;
768 }
769 if (res->ai_next) {
Martin v. Löwisf0b11d22001-11-07 08:31:03 +0000770 freeaddrinfo(res);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000771 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000772 "wildcard resolved to multiple address");
773 return -1;
774 }
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000775 if (res->ai_addrlen < addr_ret_size)
776 addr_ret_size = res->ai_addrlen;
777 memcpy(addr_ret, res->ai_addr, addr_ret_size);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000778 freeaddrinfo(res);
779 return siz;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000780 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000781 if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000782 struct sockaddr_in *sin;
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +0000783 if (af != AF_INET && af != AF_UNSPEC) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000784 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000785 "address family mismatched");
786 return -1;
787 }
788 sin = (struct sockaddr_in *)addr_ret;
789 memset((void *) sin, '\0', sizeof(*sin));
790 sin->sin_family = AF_INET;
791#ifdef HAVE_SOCKADDR_SA_LEN
792 sin->sin_len = sizeof(*sin);
793#endif
794 sin->sin_addr.s_addr = INADDR_BROADCAST;
795 return sizeof(sin->sin_addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000796 }
Anthony Baxter0e85f9d2003-05-02 15:40:46 +0000797 if (sscanf(name, "%d.%d.%d.%d%c", &d1, &d2, &d3, &d4, &ch) == 4 &&
798 0 <= d1 && d1 <= 255 && 0 <= d2 && d2 <= 255 &&
799 0 <= d3 && d3 <= 255 && 0 <= d4 && d4 <= 255) {
800 struct sockaddr_in *sin;
801 sin = (struct sockaddr_in *)addr_ret;
802 sin->sin_addr.s_addr = htonl(
803 ((long) d1 << 24) | ((long) d2 << 16) |
804 ((long) d3 << 8) | ((long) d4 << 0));
805 sin->sin_family = AF_INET;
806#ifdef HAVE_SOCKADDR_SA_LEN
807 sin->sin_len = sizeof(*sin);
808#endif
809 return 4;
810 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000811 memset(&hints, 0, sizeof(hints));
812 hints.ai_family = af;
Just van Rossum1040d2c2003-05-09 07:53:18 +0000813 Py_BEGIN_ALLOW_THREADS
814 ACQUIRE_GETADDRINFO_LOCK
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000815 error = getaddrinfo(name, NULL, &hints, &res);
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000816#if defined(__digital__) && defined(__unix__)
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000817 if (error == EAI_NONAME && af == AF_UNSPEC) {
818 /* On Tru64 V5.1, numeric-to-addr conversion fails
819 if no address family is given. Assume IPv4 for now.*/
820 hints.ai_family = AF_INET;
821 error = getaddrinfo(name, NULL, &hints, &res);
822 }
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000823#endif
Just van Rossum1040d2c2003-05-09 07:53:18 +0000824 Py_END_ALLOW_THREADS
825 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000826 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000827 set_gaierror(error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000828 return -1;
829 }
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000830 if (res->ai_addrlen < addr_ret_size)
831 addr_ret_size = res->ai_addrlen;
832 memcpy((char *) addr_ret, res->ai_addr, addr_ret_size);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000833 freeaddrinfo(res);
834 switch (addr_ret->sa_family) {
835 case AF_INET:
836 return 4;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000837#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000838 case AF_INET6:
839 return 16;
Guido van Rossum955becc1999-03-22 20:14:53 +0000840#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000841 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000842 PyErr_SetString(socket_error, "unknown address family");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000843 return -1;
844 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000845}
846
Guido van Rossum30a685f1991-06-27 15:51:29 +0000847
Guido van Rossum30a685f1991-06-27 15:51:29 +0000848/* Create a string object representing an IP address.
849 This is always a string of the form 'dd.dd.dd.dd' (with variable
850 size numbers). */
851
Guido van Rossum73624e91994-10-10 17:59:00 +0000852static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000853makeipaddr(struct sockaddr *addr, int addrlen)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000854{
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000855 char buf[NI_MAXHOST];
856 int error;
857
858 error = getnameinfo(addr, addrlen, buf, sizeof(buf), NULL, 0,
859 NI_NUMERICHOST);
860 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000861 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000862 return NULL;
863 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000864 return PyString_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000865}
866
867
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000868#ifdef USE_BLUETOOTH
869/* Convert a string representation of a Bluetooth address into a numeric
870 address. Returns the length (6), or raises an exception and returns -1 if
871 an error occurred. */
872
873static int
874setbdaddr(char *name, bdaddr_t *bdaddr)
875{
876 unsigned int b0, b1, b2, b3, b4, b5;
877 char ch;
878 int n;
879
880 n = sscanf(name, "%X:%X:%X:%X:%X:%X%c",
881 &b5, &b4, &b3, &b2, &b1, &b0, &ch);
882 if (n == 6 && (b0 | b1 | b2 | b3 | b4 | b5) < 256) {
883 bdaddr->b[0] = b0;
884 bdaddr->b[1] = b1;
885 bdaddr->b[2] = b2;
886 bdaddr->b[3] = b3;
887 bdaddr->b[4] = b4;
888 bdaddr->b[5] = b5;
889 return 6;
890 } else {
891 PyErr_SetString(socket_error, "bad bluetooth address");
892 return -1;
893 }
894}
895
896/* Create a string representation of the Bluetooth address. This is always a
897 string of the form 'XX:XX:XX:XX:XX:XX' where XX is a two digit hexadecimal
898 value (zero padded if necessary). */
899
900static PyObject *
901makebdaddr(bdaddr_t *bdaddr)
902{
903 char buf[(6 * 2) + 5 + 1];
904
905 sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X",
906 bdaddr->b[5], bdaddr->b[4], bdaddr->b[3],
907 bdaddr->b[2], bdaddr->b[1], bdaddr->b[0]);
908 return PyString_FromString(buf);
909}
910#endif
911
912
Guido van Rossum30a685f1991-06-27 15:51:29 +0000913/* Create an object representing the given socket address,
914 suitable for passing it back to bind(), connect() etc.
915 The family field of the sockaddr structure is inspected
916 to determine what kind of address it really is. */
917
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000918/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000919static PyObject *
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000920makesockaddr(int sockfd, struct sockaddr *addr, int addrlen, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000921{
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000922 if (addrlen == 0) {
923 /* No address -- may be recvfrom() from known socket */
Guido van Rossum73624e91994-10-10 17:59:00 +0000924 Py_INCREF(Py_None);
925 return Py_None;
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000926 }
927
Guido van Rossumbcc20741998-08-04 22:53:56 +0000928#ifdef __BEOS__
Guido van Rossum2c8bcb82000-04-25 21:34:53 +0000929 /* XXX: BeOS version of accept() doesn't set family correctly */
Guido van Rossumbcc20741998-08-04 22:53:56 +0000930 addr->sa_family = AF_INET;
931#endif
932
Guido van Rossum30a685f1991-06-27 15:51:29 +0000933 switch (addr->sa_family) {
934
935 case AF_INET:
936 {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000937 struct sockaddr_in *a;
938 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
Barry Warsaw752300b1997-01-03 17:18:10 +0000939 PyObject *ret = NULL;
940 if (addrobj) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000941 a = (struct sockaddr_in *)addr;
Barry Warsaw752300b1997-01-03 17:18:10 +0000942 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
943 Py_DECREF(addrobj);
944 }
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000945 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000946 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000947
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +0000948#if defined(AF_UNIX)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000949 case AF_UNIX:
950 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000951 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000952 return PyString_FromString(a->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000953 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000954#endif /* AF_UNIX */
955
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000956#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000957 case AF_INET6:
958 {
959 struct sockaddr_in6 *a;
960 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
961 PyObject *ret = NULL;
962 if (addrobj) {
963 a = (struct sockaddr_in6 *)addr;
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000964 ret = Py_BuildValue("Oiii",
965 addrobj,
966 ntohs(a->sin6_port),
967 a->sin6_flowinfo,
968 a->sin6_scope_id);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000969 Py_DECREF(addrobj);
970 }
971 return ret;
972 }
Jeremy Hylton22308652001-02-02 03:23:09 +0000973#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +0000974
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000975#ifdef USE_BLUETOOTH
976 case AF_BLUETOOTH:
977 switch (proto) {
978
979 case BTPROTO_L2CAP:
980 {
981 struct sockaddr_l2 *a = (struct sockaddr_l2 *) addr;
982 PyObject *addrobj = makebdaddr(&_BT_L2_MEMB(a, bdaddr));
983 PyObject *ret = NULL;
984 if (addrobj) {
985 ret = Py_BuildValue("Oi",
986 addrobj,
987 _BT_L2_MEMB(a, psm));
988 Py_DECREF(addrobj);
989 }
990 return ret;
991 }
992
993 case BTPROTO_RFCOMM:
994 {
995 struct sockaddr_rc *a = (struct sockaddr_rc *) addr;
996 PyObject *addrobj = makebdaddr(&_BT_RC_MEMB(a, bdaddr));
997 PyObject *ret = NULL;
998 if (addrobj) {
999 ret = Py_BuildValue("Oi",
1000 addrobj,
1001 _BT_RC_MEMB(a, channel));
1002 Py_DECREF(addrobj);
1003 }
1004 return ret;
1005 }
1006
1007#if !defined(__FreeBSD__)
1008 case BTPROTO_SCO:
1009 {
1010 struct sockaddr_sco *a = (struct sockaddr_sco *) addr;
1011 return makebdaddr(&_BT_SCO_MEMB(a, bdaddr));
1012 }
1013#endif
1014
1015 }
1016#endif
1017
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00001018#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +00001019 case AF_PACKET:
1020 {
1021 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
1022 char *ifname = "";
1023 struct ifreq ifr;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001024 /* need to look up interface name give index */
1025 if (a->sll_ifindex) {
Jeremy Hylton22308652001-02-02 03:23:09 +00001026 ifr.ifr_ifindex = a->sll_ifindex;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001027 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
Jeremy Hylton22308652001-02-02 03:23:09 +00001028 ifname = ifr.ifr_name;
Jeremy Hylton22308652001-02-02 03:23:09 +00001029 }
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001030 return Py_BuildValue("shbhs#",
1031 ifname,
1032 ntohs(a->sll_protocol),
1033 a->sll_pkttype,
1034 a->sll_hatype,
1035 a->sll_addr,
1036 a->sll_halen);
Jeremy Hylton22308652001-02-02 03:23:09 +00001037 }
1038#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001039
Guido van Rossum30a685f1991-06-27 15:51:29 +00001040 /* More cases here... */
1041
1042 default:
Guido van Rossumaa948df1997-05-07 17:41:48 +00001043 /* If we don't know the address family, don't raise an
1044 exception -- return it as a tuple. */
1045 return Py_BuildValue("is#",
1046 addr->sa_family,
1047 addr->sa_data,
1048 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001049
Guido van Rossum30a685f1991-06-27 15:51:29 +00001050 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001051}
1052
Guido van Rossum30a685f1991-06-27 15:51:29 +00001053
1054/* Parse a socket address argument according to the socket object's
1055 address family. Return 1 if the address was in the proper format,
1056 0 of not. The address is returned through addr_ret, its length
1057 through len_ret. */
1058
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001059static int
Guido van Rossum48a680c2001-03-02 06:34:14 +00001060getsockaddrarg(PySocketSockObject *s, PyObject *args,
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001061 struct sockaddr **addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001062{
Guido van Rossum30a685f1991-06-27 15:51:29 +00001063 switch (s->sock_family) {
1064
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001065#if defined(AF_UNIX)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001066 case AF_UNIX:
1067 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001068 struct sockaddr_un* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001069 char *path;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001070 int len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001071 addr = (struct sockaddr_un*)&(s->sock_addr).un;
Guido van Rossum7e488981998-10-08 02:25:24 +00001072 if (!PyArg_Parse(args, "t#", &path, &len))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001073 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001074 if (len > sizeof addr->sun_path) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001075 PyErr_SetString(socket_error,
Barry Warsaw752300b1997-01-03 17:18:10 +00001076 "AF_UNIX path too long");
Guido van Rossum30a685f1991-06-27 15:51:29 +00001077 return 0;
1078 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001079 addr->sun_family = s->sock_family;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001080 memcpy(addr->sun_path, path, len);
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001081 addr->sun_path[len] = 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001082 *addr_ret = (struct sockaddr *) addr;
Andrew MacIntyredaedf212004-04-11 12:03:57 +00001083#if defined(PYOS_OS2)
1084 *len_ret = sizeof(*addr);
1085#else
Guido van Rossum65af28a1996-06-11 18:36:33 +00001086 *len_ret = len + sizeof(*addr) - sizeof(addr->sun_path);
Andrew MacIntyredaedf212004-04-11 12:03:57 +00001087#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001088 return 1;
1089 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001090#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001091
Guido van Rossum30a685f1991-06-27 15:51:29 +00001092 case AF_INET:
1093 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001094 struct sockaddr_in* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001095 char *host;
Martin v. Löwis5db099a2003-08-07 11:55:15 +00001096 int port, result;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001097 addr=(struct sockaddr_in*)&(s->sock_addr).in;
Guido van Rossume4dad902000-12-01 13:13:11 +00001098 if (!PyTuple_Check(args)) {
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001099 PyErr_Format(
1100 PyExc_TypeError,
1101 "getsockaddrarg: "
1102 "AF_INET address must be tuple, not %.500s",
1103 args->ob_type->tp_name);
Guido van Rossume4dad902000-12-01 13:13:11 +00001104 return 0;
1105 }
Martin v. Löwis2548c732003-04-18 10:39:54 +00001106 if (!PyArg_ParseTuple(args, "eti:getsockaddrarg",
1107 "idna", &host, &port))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001108 return 0;
Martin v. Löwis5db099a2003-08-07 11:55:15 +00001109 result = setipaddr(host, (struct sockaddr *)addr,
1110 sizeof(*addr), AF_INET);
1111 PyMem_Free(host);
1112 if (result < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001113 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001114 addr->sin_family = AF_INET;
Guido van Rossum644a12b1997-04-09 19:24:53 +00001115 addr->sin_port = htons((short)port);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001116 *addr_ret = (struct sockaddr *) addr;
1117 *len_ret = sizeof *addr;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001118 return 1;
1119 }
1120
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001121#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001122 case AF_INET6:
1123 {
1124 struct sockaddr_in6* addr;
1125 char *host;
Martin v. Löwis5db099a2003-08-07 11:55:15 +00001126 int port, flowinfo, scope_id, result;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001127 addr = (struct sockaddr_in6*)&(s->sock_addr).in6;
1128 flowinfo = scope_id = 0;
Martin v. Löwis2548c732003-04-18 10:39:54 +00001129 if (!PyArg_ParseTuple(args, "eti|ii",
1130 "idna", &host, &port, &flowinfo,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001131 &scope_id)) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001132 return 0;
1133 }
Martin v. Löwis5db099a2003-08-07 11:55:15 +00001134 result = setipaddr(host, (struct sockaddr *)addr,
1135 sizeof(*addr), AF_INET6);
1136 PyMem_Free(host);
1137 if (result < 0)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001138 return 0;
1139 addr->sin6_family = s->sock_family;
1140 addr->sin6_port = htons((short)port);
1141 addr->sin6_flowinfo = flowinfo;
1142 addr->sin6_scope_id = scope_id;
1143 *addr_ret = (struct sockaddr *) addr;
1144 *len_ret = sizeof *addr;
1145 return 1;
1146 }
1147#endif
1148
Hye-Shik Chang81268602004-02-02 06:05:24 +00001149#ifdef USE_BLUETOOTH
Martin v. Löwis12af0482004-01-31 12:34:17 +00001150 case AF_BLUETOOTH:
1151 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001152 switch (s->sock_proto) {
1153 case BTPROTO_L2CAP:
Martin v. Löwis12af0482004-01-31 12:34:17 +00001154 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001155 struct sockaddr_l2 *addr = (struct sockaddr_l2 *) _BT_SOCKADDR_MEMB(s, l2);
1156 char *straddr;
Martin v. Löwis12af0482004-01-31 12:34:17 +00001157
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001158 _BT_L2_MEMB(addr, family) = AF_BLUETOOTH;
1159 if (!PyArg_ParseTuple(args, "si", &straddr,
1160 &_BT_L2_MEMB(addr, psm))) {
1161 PyErr_SetString(socket_error, "getsockaddrarg: "
1162 "wrong format");
Martin v. Löwis12af0482004-01-31 12:34:17 +00001163 return 0;
1164 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001165 if (setbdaddr(straddr, &_BT_L2_MEMB(addr, bdaddr)) < 0)
1166 return 0;
1167
1168 *addr_ret = (struct sockaddr *) addr;
1169 *len_ret = sizeof *addr;
1170 return 1;
1171 }
1172 case BTPROTO_RFCOMM:
1173 {
1174 struct sockaddr_rc *addr = (struct sockaddr_rc *) _BT_SOCKADDR_MEMB(s, rc);
1175 char *straddr;
1176
1177 _BT_RC_MEMB(addr, family) = AF_BLUETOOTH;
1178 if (!PyArg_ParseTuple(args, "si", &straddr,
1179 &_BT_RC_MEMB(addr, channel))) {
1180 PyErr_SetString(socket_error, "getsockaddrarg: "
1181 "wrong format");
1182 return 0;
1183 }
1184 if (setbdaddr(straddr, &_BT_RC_MEMB(addr, bdaddr)) < 0)
1185 return 0;
1186
1187 *addr_ret = (struct sockaddr *) addr;
1188 *len_ret = sizeof *addr;
1189 return 1;
1190 }
1191#if !defined(__FreeBSD__)
1192 case BTPROTO_SCO:
1193 {
1194 struct sockaddr_sco *addr = (struct sockaddr_sco *) _BT_SOCKADDR_MEMB(s, sco);
1195 char *straddr;
1196
1197 _BT_SCO_MEMB(addr, family) = AF_BLUETOOTH;
1198 straddr = PyString_AsString(args);
1199 if (straddr == NULL) {
1200 PyErr_SetString(socket_error, "getsockaddrarg: "
1201 "wrong format");
1202 return 0;
1203 }
1204 if (setbdaddr(straddr, &_BT_SCO_MEMB(addr, bdaddr)) < 0)
1205 return 0;
1206
1207 *addr_ret = (struct sockaddr *) addr;
1208 *len_ret = sizeof *addr;
1209 return 1;
1210 }
1211#endif
1212 default:
1213 PyErr_SetString(socket_error, "getsockaddrarg: unknown Bluetooth protocol");
1214 return 0;
Martin v. Löwis12af0482004-01-31 12:34:17 +00001215 }
1216 }
1217#endif
1218
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00001219#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +00001220 case AF_PACKET:
1221 {
1222 struct sockaddr_ll* addr;
1223 struct ifreq ifr;
1224 char *interfaceName;
1225 int protoNumber;
1226 int hatype = 0;
1227 int pkttype = 0;
Andrew M. Kuchlingb8e17172004-07-10 23:39:35 +00001228 char *haddr = NULL;
1229 unsigned int halen = 0;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001230
Andrew M. Kuchlingb8e17172004-07-10 23:39:35 +00001231 if (!PyArg_ParseTuple(args, "si|iis#", &interfaceName,
1232 &protoNumber, &pkttype, &hatype,
1233 &haddr, &halen))
Jeremy Hylton22308652001-02-02 03:23:09 +00001234 return 0;
1235 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
1236 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001237 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001238 s->errorhandler();
Jeremy Hylton22308652001-02-02 03:23:09 +00001239 return 0;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001240 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001241 addr = &(s->sock_addr.ll);
1242 addr->sll_family = AF_PACKET;
1243 addr->sll_protocol = htons((short)protoNumber);
1244 addr->sll_ifindex = ifr.ifr_ifindex;
1245 addr->sll_pkttype = pkttype;
1246 addr->sll_hatype = hatype;
Andrew M. Kuchlingb8e17172004-07-10 23:39:35 +00001247 if (halen > 8) {
1248 PyErr_SetString(PyExc_ValueError,
1249 "Hardware address must be 8 bytes or less");
1250 return 0;
1251 }
1252 if (halen != 0) {
1253 memcpy(&addr->sll_addr, haddr, halen);
1254 }
1255 addr->sll_halen = halen;
Jeremy Hylton22308652001-02-02 03:23:09 +00001256 *addr_ret = (struct sockaddr *) addr;
1257 *len_ret = sizeof *addr;
1258 return 1;
1259 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00001260#endif
1261
Guido van Rossum30a685f1991-06-27 15:51:29 +00001262 /* More cases here... */
1263
1264 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001265 PyErr_SetString(socket_error, "getsockaddrarg: bad family");
Guido van Rossum30a685f1991-06-27 15:51:29 +00001266 return 0;
1267
1268 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001269}
1270
Guido van Rossum30a685f1991-06-27 15:51:29 +00001271
Guido van Rossum48a680c2001-03-02 06:34:14 +00001272/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +00001273 Return 1 if the family is known, 0 otherwise. The length is returned
1274 through len_ret. */
1275
1276static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +00001277getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +00001278{
1279 switch (s->sock_family) {
1280
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001281#if defined(AF_UNIX)
Guido van Rossum710e1df1992-06-12 10:39:36 +00001282 case AF_UNIX:
1283 {
1284 *len_ret = sizeof (struct sockaddr_un);
1285 return 1;
1286 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001287#endif /* AF_UNIX */
Guido van Rossum710e1df1992-06-12 10:39:36 +00001288
1289 case AF_INET:
1290 {
1291 *len_ret = sizeof (struct sockaddr_in);
1292 return 1;
1293 }
1294
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001295#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001296 case AF_INET6:
1297 {
1298 *len_ret = sizeof (struct sockaddr_in6);
1299 return 1;
1300 }
1301#endif
1302
Hye-Shik Chang81268602004-02-02 06:05:24 +00001303#ifdef USE_BLUETOOTH
Martin v. Löwis12af0482004-01-31 12:34:17 +00001304 case AF_BLUETOOTH:
1305 {
1306 switch(s->sock_proto)
1307 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001308
1309 case BTPROTO_L2CAP:
1310 *len_ret = sizeof (struct sockaddr_l2);
1311 return 1;
1312 case BTPROTO_RFCOMM:
1313 *len_ret = sizeof (struct sockaddr_rc);
1314 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00001315#if !defined(__FreeBSD__)
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001316 case BTPROTO_SCO:
1317 *len_ret = sizeof (struct sockaddr_sco);
1318 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00001319#endif
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001320 default:
1321 PyErr_SetString(socket_error, "getsockaddrlen: "
1322 "unknown BT protocol");
1323 return 0;
1324
Martin v. Löwis12af0482004-01-31 12:34:17 +00001325 }
1326 }
1327#endif
1328
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00001329#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +00001330 case AF_PACKET:
1331 {
1332 *len_ret = sizeof (struct sockaddr_ll);
1333 return 1;
1334 }
1335#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001336
Guido van Rossum710e1df1992-06-12 10:39:36 +00001337 /* More cases here... */
1338
1339 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001340 PyErr_SetString(socket_error, "getsockaddrlen: bad family");
Guido van Rossum710e1df1992-06-12 10:39:36 +00001341 return 0;
1342
1343 }
1344}
1345
1346
Guido van Rossum30a685f1991-06-27 15:51:29 +00001347/* s.accept() method */
1348
Guido van Rossum73624e91994-10-10 17:59:00 +00001349static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001350sock_accept(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001351{
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001352 sock_addr_t addrbuf;
Fred Drakea04eaad2000-06-30 02:46:07 +00001353 SOCKET_T newfd;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001354 socklen_t addrlen;
Barry Warsaw752300b1997-01-03 17:18:10 +00001355 PyObject *sock = NULL;
1356 PyObject *addr = NULL;
1357 PyObject *res = NULL;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001358 int timeout;
Barry Warsaw752300b1997-01-03 17:18:10 +00001359
Guido van Rossum710e1df1992-06-12 10:39:36 +00001360 if (!getsockaddrlen(s, &addrlen))
1361 return NULL;
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001362 memset(&addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001363
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001364#ifdef MS_WINDOWS
1365 newfd = INVALID_SOCKET;
1366#else
1367 newfd = -1;
1368#endif
1369
Guido van Rossum73624e91994-10-10 17:59:00 +00001370 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001371 timeout = internal_select(s, 0);
1372 if (!timeout)
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001373 newfd = accept(s->sock_fd, (struct sockaddr *) &addrbuf,
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001374 &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001375 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001376
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001377 if (timeout) {
1378 PyErr_SetString(socket_timeout, "timed out");
1379 return NULL;
1380 }
1381
Fred Drakea04eaad2000-06-30 02:46:07 +00001382#ifdef MS_WINDOWS
1383 if (newfd == INVALID_SOCKET)
1384#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001385 if (newfd < 0)
Fred Drakea04eaad2000-06-30 02:46:07 +00001386#endif
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001387 return s->errorhandler();
Barry Warsaw752300b1997-01-03 17:18:10 +00001388
Guido van Rossum30a685f1991-06-27 15:51:29 +00001389 /* Create the new object with unspecified family,
1390 to avoid calls to bind() etc. on it. */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001391 sock = (PyObject *) new_sockobject(newfd,
1392 s->sock_family,
1393 s->sock_type,
1394 s->sock_proto);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001395
Barry Warsaw752300b1997-01-03 17:18:10 +00001396 if (sock == NULL) {
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001397 SOCKETCLOSE(newfd);
Barry Warsaw752300b1997-01-03 17:18:10 +00001398 goto finally;
1399 }
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001400 addr = makesockaddr(s->sock_fd, (struct sockaddr *) &addrbuf,
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001401 addrlen, s->sock_proto);
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001402 if (addr == NULL)
Barry Warsaw752300b1997-01-03 17:18:10 +00001403 goto finally;
1404
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001405 res = PyTuple_Pack(2, sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00001406
Guido van Rossum67f7a382002-06-06 21:08:16 +00001407finally:
Guido van Rossum73624e91994-10-10 17:59:00 +00001408 Py_XDECREF(sock);
1409 Py_XDECREF(addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001410 return res;
1411}
1412
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001413PyDoc_STRVAR(accept_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001414"accept() -> (socket object, address info)\n\
1415\n\
1416Wait for an incoming connection. Return a new socket representing the\n\
1417connection, and the address of the client. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001418info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001419
Guido van Rossum11ba0942002-06-13 15:07:44 +00001420/* s.setblocking(flag) method. Argument:
1421 False -- non-blocking mode; same as settimeout(0)
1422 True -- blocking mode; same as settimeout(None)
1423*/
Guido van Rossume4485b01994-09-07 14:32:49 +00001424
Guido van Rossum73624e91994-10-10 17:59:00 +00001425static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001426sock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00001427{
1428 int block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001429
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001430 block = PyInt_AsLong(arg);
1431 if (block == -1 && PyErr_Occurred())
Guido van Rossume4485b01994-09-07 14:32:49 +00001432 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001433
Guido van Rossum11ba0942002-06-13 15:07:44 +00001434 s->sock_timeout = block ? -1.0 : 0.0;
Guido van Rossume8008f02002-06-07 03:36:20 +00001435 internal_setblocking(s, block);
Guido van Rossume4485b01994-09-07 14:32:49 +00001436
Guido van Rossum73624e91994-10-10 17:59:00 +00001437 Py_INCREF(Py_None);
1438 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +00001439}
Guido van Rossume4485b01994-09-07 14:32:49 +00001440
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001441PyDoc_STRVAR(setblocking_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001442"setblocking(flag)\n\
1443\n\
1444Set the socket to blocking (flag is true) or non-blocking (false).\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00001445setblocking(True) is equivalent to settimeout(None);\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001446setblocking(False) is equivalent to settimeout(0.0).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001447
Guido van Rossum11ba0942002-06-13 15:07:44 +00001448/* s.settimeout(timeout) method. Argument:
1449 None -- no timeout, blocking mode; same as setblocking(True)
1450 0.0 -- non-blocking mode; same as setblocking(False)
1451 > 0 -- timeout mode; operations time out after timeout seconds
1452 < 0 -- illegal; raises an exception
1453*/
Guido van Rossum67f7a382002-06-06 21:08:16 +00001454static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001455sock_settimeout(PySocketSockObject *s, PyObject *arg)
Guido van Rossum67f7a382002-06-06 21:08:16 +00001456{
Guido van Rossum11ba0942002-06-13 15:07:44 +00001457 double timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001458
1459 if (arg == Py_None)
Guido van Rossum11ba0942002-06-13 15:07:44 +00001460 timeout = -1.0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001461 else {
Guido van Rossum11ba0942002-06-13 15:07:44 +00001462 timeout = PyFloat_AsDouble(arg);
1463 if (timeout < 0.0) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00001464 if (!PyErr_Occurred())
1465 PyErr_SetString(PyExc_ValueError,
Guido van Rossum11ba0942002-06-13 15:07:44 +00001466 "Timeout value out of range");
Guido van Rossum67f7a382002-06-06 21:08:16 +00001467 return NULL;
1468 }
1469 }
1470
Guido van Rossum11ba0942002-06-13 15:07:44 +00001471 s->sock_timeout = timeout;
1472 internal_setblocking(s, timeout < 0.0);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001473
1474 Py_INCREF(Py_None);
1475 return Py_None;
1476}
1477
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001478PyDoc_STRVAR(settimeout_doc,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001479"settimeout(timeout)\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00001480\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00001481Set a timeout on socket operations. 'timeout' can be a float,\n\
1482giving in seconds, or None. Setting a timeout of None disables\n\
1483the timeout feature and is equivalent to setblocking(1).\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001484Setting a timeout of zero is the same as setblocking(0).");
Guido van Rossum67f7a382002-06-06 21:08:16 +00001485
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001486/* s.gettimeout() method.
1487 Returns the timeout associated with a socket. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00001488static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001489sock_gettimeout(PySocketSockObject *s)
Guido van Rossum67f7a382002-06-06 21:08:16 +00001490{
1491 if (s->sock_timeout < 0.0) {
1492 Py_INCREF(Py_None);
1493 return Py_None;
1494 }
1495 else
1496 return PyFloat_FromDouble(s->sock_timeout);
1497}
1498
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001499PyDoc_STRVAR(gettimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00001500"gettimeout() -> timeout\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00001501\n\
1502Returns the timeout in floating seconds associated with socket \n\
1503operations. A timeout of None indicates that timeouts on socket \n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001504operations are disabled.");
Guido van Rossume4485b01994-09-07 14:32:49 +00001505
Guido van Rossum48a680c2001-03-02 06:34:14 +00001506#ifdef RISCOS
1507/* s.sleeptaskw(1 | 0) method */
1508
1509static PyObject *
Martin v. Löwisa94568a2003-05-10 07:36:56 +00001510sock_sleeptaskw(PySocketSockObject *s,PyObject *arg)
Guido van Rossum48a680c2001-03-02 06:34:14 +00001511{
Guido van Rossum67f7a382002-06-06 21:08:16 +00001512 int block;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00001513 block = PyInt_AsLong(arg);
1514 if (block == -1 && PyErr_Occurred())
Guido van Rossum67f7a382002-06-06 21:08:16 +00001515 return NULL;
1516 Py_BEGIN_ALLOW_THREADS
1517 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
1518 Py_END_ALLOW_THREADS
Guido van Rossum48a680c2001-03-02 06:34:14 +00001519
Guido van Rossum67f7a382002-06-06 21:08:16 +00001520 Py_INCREF(Py_None);
1521 return Py_None;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001522}
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001523PyDoc_STRVAR(sleeptaskw_doc,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001524"sleeptaskw(flag)\n\
1525\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001526Allow sleeps in taskwindows.");
Guido van Rossum48a680c2001-03-02 06:34:14 +00001527#endif
1528
1529
Guido van Rossumaee08791992-09-08 09:05:33 +00001530/* s.setsockopt() method.
1531 With an integer third argument, sets an integer option.
1532 With a string third argument, sets an option from a buffer;
1533 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001534
Guido van Rossum73624e91994-10-10 17:59:00 +00001535static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001536sock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001537{
1538 int level;
1539 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001540 int res;
Guido van Rossumaee08791992-09-08 09:05:33 +00001541 char *buf;
1542 int buflen;
1543 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001544
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001545 if (PyArg_ParseTuple(args, "iii:setsockopt",
1546 &level, &optname, &flag)) {
Guido van Rossumaee08791992-09-08 09:05:33 +00001547 buf = (char *) &flag;
1548 buflen = sizeof flag;
1549 }
1550 else {
Guido van Rossum73624e91994-10-10 17:59:00 +00001551 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001552 if (!PyArg_ParseTuple(args, "iis#:setsockopt",
1553 &level, &optname, &buf, &buflen))
Guido van Rossumaee08791992-09-08 09:05:33 +00001554 return NULL;
1555 }
Thomas Wouters334fb892000-07-25 12:56:38 +00001556 res = setsockopt(s->sock_fd, level, optname, (void *)buf, buflen);
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001557 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001558 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001559 Py_INCREF(Py_None);
1560 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001561}
1562
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001563PyDoc_STRVAR(setsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001564"setsockopt(level, option, value)\n\
1565\n\
1566Set a socket option. See the Unix manual for level and option.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001567The value argument can either be an integer or a string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001568
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001569
Guido van Rossumaee08791992-09-08 09:05:33 +00001570/* s.getsockopt() method.
1571 With two arguments, retrieves an integer option.
1572 With a third integer argument, retrieves a string buffer of that size;
1573 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001574
Guido van Rossum73624e91994-10-10 17:59:00 +00001575static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001576sock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001577{
1578 int level;
1579 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001580 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +00001581 PyObject *buf;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001582 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001583
Guido van Rossumbcc20741998-08-04 22:53:56 +00001584#ifdef __BEOS__
Fred Drake564a6cc2001-05-11 20:12:26 +00001585 /* We have incomplete socket support. */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001586 PyErr_SetString(socket_error, "getsockopt not supported");
Guido van Rossumbcc20741998-08-04 22:53:56 +00001587 return NULL;
1588#else
1589
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001590 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
1591 &level, &optname, &buflen))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001592 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001593
Guido van Rossumbe32c891996-06-20 16:25:29 +00001594 if (buflen == 0) {
Guido van Rossumaee08791992-09-08 09:05:33 +00001595 int flag = 0;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001596 socklen_t flagsize = sizeof flag;
Guido van Rossumb376a4a1993-11-23 17:53:17 +00001597 res = getsockopt(s->sock_fd, level, optname,
Thomas Wouters334fb892000-07-25 12:56:38 +00001598 (void *)&flag, &flagsize);
Guido van Rossumaee08791992-09-08 09:05:33 +00001599 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001600 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001601 return PyInt_FromLong(flag);
Guido van Rossumaee08791992-09-08 09:05:33 +00001602 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001603#ifdef __VMS
1604 if (buflen > 1024) {
1605#else
Guido van Rossumaee08791992-09-08 09:05:33 +00001606 if (buflen <= 0 || buflen > 1024) {
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001607#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001608 PyErr_SetString(socket_error,
Barry Warsaw752300b1997-01-03 17:18:10 +00001609 "getsockopt buflen out of range");
Guido van Rossumaee08791992-09-08 09:05:33 +00001610 return NULL;
1611 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001612 buf = PyString_FromStringAndSize((char *)NULL, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001613 if (buf == NULL)
1614 return NULL;
Guido van Rossumb376a4a1993-11-23 17:53:17 +00001615 res = getsockopt(s->sock_fd, level, optname,
Fred Drake564a6cc2001-05-11 20:12:26 +00001616 (void *)PyString_AS_STRING(buf), &buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001617 if (res < 0) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001618 Py_DECREF(buf);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001619 return s->errorhandler();
Guido van Rossumaee08791992-09-08 09:05:33 +00001620 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001621 _PyString_Resize(&buf, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001622 return buf;
Guido van Rossumbcc20741998-08-04 22:53:56 +00001623#endif /* __BEOS__ */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001624}
1625
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001626PyDoc_STRVAR(getsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001627"getsockopt(level, option[, buffersize]) -> value\n\
1628\n\
1629Get a socket option. See the Unix manual for level and option.\n\
1630If a nonzero buffersize argument is given, the return value is a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001631string of that length; otherwise it is an integer.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001632
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001633
Fred Drake728819a2000-07-01 03:40:12 +00001634/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001635
Guido van Rossum73624e91994-10-10 17:59:00 +00001636static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001637sock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001638{
1639 struct sockaddr *addr;
1640 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001641 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001642
Fred Drake728819a2000-07-01 03:40:12 +00001643 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001644 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001645 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001646 res = bind(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001647 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001648 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001649 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001650 Py_INCREF(Py_None);
1651 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001652}
1653
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001654PyDoc_STRVAR(bind_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001655"bind(address)\n\
1656\n\
1657Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00001658pair (host, port); the host must refer to the local host. For raw packet\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001659sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001660
Guido van Rossum30a685f1991-06-27 15:51:29 +00001661
1662/* s.close() method.
1663 Set the file descriptor to -1 so operations tried subsequently
1664 will surely fail. */
1665
Guido van Rossum73624e91994-10-10 17:59:00 +00001666static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001667sock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001668{
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001669 SOCKET_T fd;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001670
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001671 if ((fd = s->sock_fd) != -1) {
1672 s->sock_fd = -1;
Guido van Rossum08481461996-10-12 14:07:22 +00001673 Py_BEGIN_ALLOW_THREADS
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001674 (void) SOCKETCLOSE(fd);
Guido van Rossum08481461996-10-12 14:07:22 +00001675 Py_END_ALLOW_THREADS
1676 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001677 Py_INCREF(Py_None);
1678 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001679}
1680
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001681PyDoc_STRVAR(close_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001682"close()\n\
1683\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001684Close the socket. It cannot be used after this call.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001685
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001686static int
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001687internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen,
1688 int *timeoutp)
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001689{
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001690 int res, timeout;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001691
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001692 timeout = 0;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001693 res = connect(s->sock_fd, addr, addrlen);
1694
1695#ifdef MS_WINDOWS
1696
1697 if (s->sock_timeout > 0.0) {
1698 if (res < 0 && WSAGetLastError() == WSAEWOULDBLOCK) {
Guido van Rossumb76bdf82003-02-19 17:50:16 +00001699 /* This is a mess. Best solution: trust select */
1700 fd_set fds;
Mark Hammonda57ec932004-08-03 05:06:26 +00001701 fd_set fds_exc;
Guido van Rossumb76bdf82003-02-19 17:50:16 +00001702 struct timeval tv;
1703 tv.tv_sec = (int)s->sock_timeout;
1704 tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6);
1705 FD_ZERO(&fds);
1706 FD_SET(s->sock_fd, &fds);
Mark Hammonda57ec932004-08-03 05:06:26 +00001707 FD_ZERO(&fds_exc);
1708 FD_SET(s->sock_fd, &fds_exc);
1709 res = select(s->sock_fd+1, NULL, &fds, &fds_exc, &tv);
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001710 if (res == 0) {
Guido van Rossumb76bdf82003-02-19 17:50:16 +00001711 res = WSAEWOULDBLOCK;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001712 timeout = 1;
Mark Hammonda57ec932004-08-03 05:06:26 +00001713 } else if (res > 0) {
1714 if (FD_ISSET(s->sock_fd, &fds))
1715 /* The socket is in the writeable set - this
1716 means connected */
1717 res = 0;
1718 else {
1719 /* As per MS docs, we need to call getsockopt()
1720 to get the underlying error */
1721 int res_size = sizeof res;
1722 /* It must be in the exception set */
1723 assert(FD_ISSET(s->sock_fd, &fds_exc));
1724 if (0 == getsockopt(s->sock_fd, SOL_SOCKET, SO_ERROR,
1725 (char *)&res, &res_size))
1726 /* getsockopt also clears WSAGetLastError,
1727 so reset it back. */
1728 WSASetLastError(res);
1729 else
1730 res = WSAGetLastError();
1731 }
1732 }
Guido van Rossumb76bdf82003-02-19 17:50:16 +00001733 /* else if (res < 0) an error occurred */
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001734 }
1735 }
1736
1737 if (res < 0)
1738 res = WSAGetLastError();
1739
1740#else
1741
1742 if (s->sock_timeout > 0.0) {
1743 if (res < 0 && errno == EINPROGRESS) {
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001744 timeout = internal_select(s, 1);
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001745 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum12e3c712002-08-08 20:39:30 +00001746 if (res < 0 && errno == EISCONN)
1747 res = 0;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001748 }
1749 }
1750
1751 if (res < 0)
1752 res = errno;
1753
1754#endif
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001755 *timeoutp = timeout;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001756
1757 return res;
1758}
Guido van Rossum30a685f1991-06-27 15:51:29 +00001759
Fred Drake728819a2000-07-01 03:40:12 +00001760/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001761
Guido van Rossum73624e91994-10-10 17:59:00 +00001762static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001763sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001764{
1765 struct sockaddr *addr;
1766 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001767 int res;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001768 int timeout;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001769
Fred Drake728819a2000-07-01 03:40:12 +00001770 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001771 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001772
Guido van Rossum73624e91994-10-10 17:59:00 +00001773 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001774 res = internal_connect(s, addr, addrlen, &timeout);
Guido van Rossum11ba0942002-06-13 15:07:44 +00001775 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001776
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001777 if (timeout) {
1778 PyErr_SetString(socket_timeout, "timed out");
1779 return NULL;
1780 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001781 if (res != 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001782 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001783 Py_INCREF(Py_None);
1784 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001785}
1786
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001787PyDoc_STRVAR(connect_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001788"connect(address)\n\
1789\n\
1790Connect the socket to a remote address. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001791is a pair (host, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001792
Guido van Rossum30a685f1991-06-27 15:51:29 +00001793
Fred Drake728819a2000-07-01 03:40:12 +00001794/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001795
1796static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001797sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001798{
1799 struct sockaddr *addr;
1800 int addrlen;
1801 int res;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001802 int timeout;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001803
Fred Drake728819a2000-07-01 03:40:12 +00001804 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001805 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001806
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001807 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001808 res = internal_connect(s, addr, addrlen, &timeout);
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001809 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001810
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001811 return PyInt_FromLong((long) res);
1812}
1813
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001814PyDoc_STRVAR(connect_ex_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00001815"connect_ex(address) -> errno\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00001816\n\
1817This is like connect(address), but returns an error code (the errno value)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001818instead of raising an exception when an error occurs.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001819
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001820
Guido van Rossumed233a51992-06-23 09:07:03 +00001821/* s.fileno() method */
1822
Guido van Rossum73624e91994-10-10 17:59:00 +00001823static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001824sock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00001825{
Fred Drakea04eaad2000-06-30 02:46:07 +00001826#if SIZEOF_SOCKET_T <= SIZEOF_LONG
Guido van Rossum73624e91994-10-10 17:59:00 +00001827 return PyInt_FromLong((long) s->sock_fd);
Fred Drakea04eaad2000-06-30 02:46:07 +00001828#else
Martin v. Löwisb9a0f912003-03-29 10:06:18 +00001829 return PyLong_FromLongLong((PY_LONG_LONG)s->sock_fd);
Fred Drakea04eaad2000-06-30 02:46:07 +00001830#endif
Guido van Rossumed233a51992-06-23 09:07:03 +00001831}
1832
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001833PyDoc_STRVAR(fileno_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001834"fileno() -> integer\n\
1835\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001836Return the integer file descriptor of the socket.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001837
Guido van Rossumed233a51992-06-23 09:07:03 +00001838
Guido van Rossumbe32c891996-06-20 16:25:29 +00001839#ifndef NO_DUP
1840/* s.dup() method */
1841
1842static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001843sock_dup(PySocketSockObject *s)
Guido van Rossumbe32c891996-06-20 16:25:29 +00001844{
Fred Drakea04eaad2000-06-30 02:46:07 +00001845 SOCKET_T newfd;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001846 PyObject *sock;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001847
Guido van Rossumbe32c891996-06-20 16:25:29 +00001848 newfd = dup(s->sock_fd);
1849 if (newfd < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001850 return s->errorhandler();
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001851 sock = (PyObject *) new_sockobject(newfd,
1852 s->sock_family,
1853 s->sock_type,
1854 s->sock_proto);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001855 if (sock == NULL)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001856 SOCKETCLOSE(newfd);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001857 return sock;
1858}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001859
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001860PyDoc_STRVAR(dup_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001861"dup() -> socket object\n\
1862\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001863Return a new socket object connected to the same system resource.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001864
Guido van Rossumbe32c891996-06-20 16:25:29 +00001865#endif
1866
1867
Guido van Rossumc89705d1992-11-26 08:54:07 +00001868/* s.getsockname() method */
1869
Guido van Rossum73624e91994-10-10 17:59:00 +00001870static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001871sock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001872{
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001873 sock_addr_t addrbuf;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001874 int res;
1875 socklen_t addrlen;
1876
Guido van Rossumc89705d1992-11-26 08:54:07 +00001877 if (!getsockaddrlen(s, &addrlen))
1878 return NULL;
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001879 memset(&addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001880 Py_BEGIN_ALLOW_THREADS
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001881 res = getsockname(s->sock_fd, (struct sockaddr *) &addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001882 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001883 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001884 return s->errorhandler();
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001885 return makesockaddr(s->sock_fd, (struct sockaddr *) &addrbuf, addrlen,
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001886 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001887}
1888
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001889PyDoc_STRVAR(getsockname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001890"getsockname() -> address info\n\
1891\n\
1892Return the address of the local endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001893info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001894
Guido van Rossumc89705d1992-11-26 08:54:07 +00001895
Guido van Rossumb6775db1994-08-01 11:34:53 +00001896#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001897/* s.getpeername() method */
1898
Guido van Rossum73624e91994-10-10 17:59:00 +00001899static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001900sock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001901{
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001902 sock_addr_t addrbuf;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001903 int res;
1904 socklen_t addrlen;
1905
Guido van Rossumc89705d1992-11-26 08:54:07 +00001906 if (!getsockaddrlen(s, &addrlen))
1907 return NULL;
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001908 memset(&addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001909 Py_BEGIN_ALLOW_THREADS
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001910 res = getpeername(s->sock_fd, (struct sockaddr *) &addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001911 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001912 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001913 return s->errorhandler();
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001914 return makesockaddr(s->sock_fd, (struct sockaddr *) &addrbuf, addrlen,
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001915 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001916}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001917
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001918PyDoc_STRVAR(getpeername_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001919"getpeername() -> address info\n\
1920\n\
1921Return the address of the remote endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001922info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001923
Guido van Rossumb6775db1994-08-01 11:34:53 +00001924#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001925
1926
Guido van Rossum30a685f1991-06-27 15:51:29 +00001927/* s.listen(n) method */
1928
Guido van Rossum73624e91994-10-10 17:59:00 +00001929static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001930sock_listen(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001931{
1932 int backlog;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001933 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001934
1935 backlog = PyInt_AsLong(arg);
1936 if (backlog == -1 && PyErr_Occurred())
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001937 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001938 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +00001939 if (backlog < 1)
1940 backlog = 1;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001941 res = listen(s->sock_fd, backlog);
Guido van Rossum73624e91994-10-10 17:59:00 +00001942 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001943 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001944 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001945 Py_INCREF(Py_None);
1946 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001947}
1948
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001949PyDoc_STRVAR(listen_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001950"listen(backlog)\n\
1951\n\
1952Enable a server to accept connections. The backlog argument must be at\n\
1953least 1; it specifies the number of unaccepted connection that the system\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001954will allow before refusing new connections.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001955
1956
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001957#ifndef NO_DUP
Guido van Rossum30a685f1991-06-27 15:51:29 +00001958/* s.makefile(mode) method.
1959 Create a new open file object referring to a dupped version of
1960 the socket's file descriptor. (The dup() call is necessary so
1961 that the open file and socket objects may be closed independent
1962 of each other.)
1963 The mode argument specifies 'r' or 'w' passed to fdopen(). */
1964
Guido van Rossum73624e91994-10-10 17:59:00 +00001965static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001966sock_makefile(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001967{
Tim Petersdbd9ba62000-07-09 03:09:57 +00001968 extern int fclose(FILE *);
Guido van Rossum6b144911995-03-14 15:05:13 +00001969 char *mode = "r";
1970 int bufsize = -1;
Fred Drakea04eaad2000-06-30 02:46:07 +00001971#ifdef MS_WIN32
Tim Peters79248aa2001-08-29 21:37:10 +00001972 Py_intptr_t fd;
Fred Drakea04eaad2000-06-30 02:46:07 +00001973#else
Guido van Rossum30a685f1991-06-27 15:51:29 +00001974 int fd;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001975#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001976 FILE *fp;
Guido van Rossum6b144911995-03-14 15:05:13 +00001977 PyObject *f;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001978#ifdef __VMS
1979 char *mode_r = "r";
1980 char *mode_w = "w";
1981#endif
Guido van Rossum6b144911995-03-14 15:05:13 +00001982
Guido van Rossum43713e52000-02-29 13:59:29 +00001983 if (!PyArg_ParseTuple(args, "|si:makefile", &mode, &bufsize))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001984 return NULL;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001985#ifdef __VMS
1986 if (strcmp(mode,"rb") == 0) {
1987 mode = mode_r;
1988 }
1989 else {
1990 if (strcmp(mode,"wb") == 0) {
1991 mode = mode_w;
1992 }
1993 }
1994#endif
Guido van Rossum8d665e61996-06-26 18:22:49 +00001995#ifdef MS_WIN32
Guido van Rossum82a5c661998-07-07 20:45:43 +00001996 if (((fd = _open_osfhandle(s->sock_fd, _O_BINARY)) < 0) ||
1997 ((fd = dup(fd)) < 0) || ((fp = fdopen(fd, mode)) == NULL))
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001998#else
Guido van Rossum82a5c661998-07-07 20:45:43 +00001999 if ((fd = dup(s->sock_fd)) < 0 || (fp = fdopen(fd, mode)) == NULL)
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00002000#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00002001 {
Guido van Rossum6b144911995-03-14 15:05:13 +00002002 if (fd >= 0)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00002003 SOCKETCLOSE(fd);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002004 return s->errorhandler();
Guido van Rossum6b144911995-03-14 15:05:13 +00002005 }
2006 f = PyFile_FromFile(fp, "<socket>", mode, fclose);
2007 if (f != NULL)
2008 PyFile_SetBufSize(f, bufsize);
2009 return f;
Guido van Rossum30a685f1991-06-27 15:51:29 +00002010}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002011
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002012PyDoc_STRVAR(makefile_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002013"makefile([mode[, buffersize]]) -> file object\n\
2014\n\
2015Return a regular file object corresponding to the socket.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002016The mode and buffersize arguments are as for the built-in open() function.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002017
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002018#endif /* NO_DUP */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002019
Guido van Rossum48a680c2001-03-02 06:34:14 +00002020
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002021/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002022
Guido van Rossum73624e91994-10-10 17:59:00 +00002023static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002024sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002025{
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002026 int len, n = 0, flags = 0, timeout;
Guido van Rossum73624e91994-10-10 17:59:00 +00002027 PyObject *buf;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002028#ifdef __VMS
2029 int read_length;
2030 char *read_buf;
2031#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00002032
Guido van Rossum43713e52000-02-29 13:59:29 +00002033 if (!PyArg_ParseTuple(args, "i|i:recv", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00002034 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002035
2036 if (len < 0) {
Martin v. Löwisfba64e12001-11-19 10:41:26 +00002037 PyErr_SetString(PyExc_ValueError,
Guido van Rossum11ba0942002-06-13 15:07:44 +00002038 "negative buffersize in recv");
Martin v. Löwisfba64e12001-11-19 10:41:26 +00002039 return NULL;
2040 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002041
Guido van Rossum73624e91994-10-10 17:59:00 +00002042 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002043 if (buf == NULL)
2044 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002045
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002046#ifndef __VMS
Guido van Rossum73624e91994-10-10 17:59:00 +00002047 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002048 timeout = internal_select(s, 0);
2049 if (!timeout)
2050 n = recv(s->sock_fd, PyString_AS_STRING(buf), len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00002051 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002052
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002053 if (timeout) {
2054 Py_DECREF(buf);
2055 PyErr_SetString(socket_timeout, "timed out");
2056 return NULL;
2057 }
Guido van Rossum7c53b771995-09-13 18:39:47 +00002058 if (n < 0) {
2059 Py_DECREF(buf);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002060 return s->errorhandler();
Guido van Rossum7c53b771995-09-13 18:39:47 +00002061 }
Tim Peters5de98422002-04-27 18:44:32 +00002062 if (n != len)
2063 _PyString_Resize(&buf, n);
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002064#else
2065 read_buf = PyString_AsString(buf);
2066 read_length = len;
2067 while (read_length != 0) {
2068 unsigned int segment;
2069
2070 segment = read_length /SEGMENT_SIZE;
2071 if (segment != 0) {
2072 segment = SEGMENT_SIZE;
2073 }
2074 else {
2075 segment = read_length;
2076 }
2077
2078 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002079 timeout = internal_select(s, 0);
2080 if (!timeout)
2081 n = recv(s->sock_fd, read_buf, segment, flags);
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002082 Py_END_ALLOW_THREADS
2083
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002084 if (timeout) {
2085 Py_DECREF(buf);
2086 PyErr_SetString(socket_timeout, "timed out");
2087 return NULL;
2088 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002089 if (n < 0) {
2090 Py_DECREF(buf);
2091 return s->errorhandler();
2092 }
2093 if (n != read_length) {
2094 read_buf += n;
2095 break;
2096 }
2097
2098 read_length -= segment;
2099 read_buf += segment;
2100 }
2101 if (_PyString_Resize(&buf, (read_buf - PyString_AsString(buf))) < 0)
2102 {
2103 return NULL;
2104 }
2105#endif /* !__VMS */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002106 return buf;
2107}
2108
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002109PyDoc_STRVAR(recv_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002110"recv(buffersize[, flags]) -> data\n\
2111\n\
2112Receive up to buffersize bytes from the socket. For the optional flags\n\
2113argument, see the Unix manual. When no data is available, block until\n\
2114at least one byte is available or until the remote end is closed. When\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002115the remote end is closed and all data is read, return the empty string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002116
Guido van Rossum30a685f1991-06-27 15:51:29 +00002117
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002118/* s.recvfrom(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002119
Guido van Rossum73624e91994-10-10 17:59:00 +00002120static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002121sock_recvfrom(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002122{
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00002123 sock_addr_t addrbuf;
Barry Warsaw752300b1997-01-03 17:18:10 +00002124 PyObject *buf = NULL;
2125 PyObject *addr = NULL;
2126 PyObject *ret = NULL;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002127 int len, n = 0, flags = 0, timeout;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002128 socklen_t addrlen;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002129
Guido van Rossum43713e52000-02-29 13:59:29 +00002130 if (!PyArg_ParseTuple(args, "i|i:recvfrom", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00002131 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002132
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00002133 if (!getsockaddrlen(s, &addrlen))
2134 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00002135 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00002136 if (buf == NULL)
2137 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002138
Guido van Rossum73624e91994-10-10 17:59:00 +00002139 Py_BEGIN_ALLOW_THREADS
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00002140 memset(&addrbuf, 0, addrlen);
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002141 timeout = internal_select(s, 0);
2142 if (!timeout)
2143 n = recvfrom(s->sock_fd, PyString_AS_STRING(buf), len, flags,
Guido van Rossum8d665e61996-06-26 18:22:49 +00002144#ifndef MS_WINDOWS
Andrew MacIntyreba43e872002-03-03 03:03:52 +00002145#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00002146 (struct sockaddr *) &addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00002147#else
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00002148 (void *) &addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00002149#endif
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002150#else
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00002151 (struct sockaddr *) &addrbuf, &addrlen
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002152#endif
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002153 );
Guido van Rossum73624e91994-10-10 17:59:00 +00002154 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002155
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002156 if (timeout) {
2157 Py_DECREF(buf);
2158 PyErr_SetString(socket_timeout, "timed out");
2159 return NULL;
2160 }
Guido van Rossum7c53b771995-09-13 18:39:47 +00002161 if (n < 0) {
2162 Py_DECREF(buf);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002163 return s->errorhandler();
Guido van Rossum7c53b771995-09-13 18:39:47 +00002164 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002165
Guido van Rossum53a9bf81996-06-11 18:35:24 +00002166 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002167 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002168
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00002169 if (!(addr = makesockaddr(s->sock_fd, (struct sockaddr *) &addrbuf,
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00002170 addrlen, s->sock_proto)))
Barry Warsaw752300b1997-01-03 17:18:10 +00002171 goto finally;
2172
Raymond Hettinger8ae46892003-10-12 19:09:37 +00002173 ret = PyTuple_Pack(2, buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002174
2175finally:
Guido van Rossum73624e91994-10-10 17:59:00 +00002176 Py_XDECREF(addr);
2177 Py_XDECREF(buf);
Guido van Rossum6f5afc91993-02-05 09:46:15 +00002178 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002179}
2180
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002181PyDoc_STRVAR(recvfrom_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002182"recvfrom(buffersize[, flags]) -> (data, address info)\n\
2183\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002184Like recv(buffersize, flags) but also return the sender's address info.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002185
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002186/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002187
Guido van Rossum73624e91994-10-10 17:59:00 +00002188static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002189sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002190{
Guido van Rossumff4949e1992-08-05 19:58:53 +00002191 char *buf;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002192 int len, n = 0, flags = 0, timeout;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002193#ifdef __VMS
2194 int send_length;
2195#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00002196
Guido van Rossum43713e52000-02-29 13:59:29 +00002197 if (!PyArg_ParseTuple(args, "s#|i:send", &buf, &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00002198 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002199
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002200#ifndef __VMS
Guido van Rossum73624e91994-10-10 17:59:00 +00002201 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002202 timeout = internal_select(s, 1);
2203 if (!timeout)
2204 n = send(s->sock_fd, buf, len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00002205 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002206
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002207 if (timeout) {
2208 PyErr_SetString(socket_timeout, "timed out");
2209 return NULL;
2210 }
Guido van Rossum30a685f1991-06-27 15:51:29 +00002211 if (n < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002212 return s->errorhandler();
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002213#else
2214 /* Divide packet into smaller segments for */
2215 /* TCP/IP Services for OpenVMS */
2216 send_length = len;
2217 while (send_length != 0) {
2218 unsigned int segment;
2219
2220 segment = send_length / SEGMENT_SIZE;
2221 if (segment != 0) {
2222 segment = SEGMENT_SIZE;
2223 }
2224 else {
2225 segment = send_length;
2226 }
2227 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002228 timeout = internal_select(s, 1);
2229 if (!timeout)
2230 n = send(s->sock_fd, buf, segment, flags);
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002231 Py_END_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002232 if (timeout) {
2233 PyErr_SetString(socket_timeout, "timed out");
2234 return NULL;
2235 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002236 if (n < 0) {
2237 return s->errorhandler();
2238 }
2239 send_length -= segment;
2240 buf += segment;
2241 } /* end while */
2242#endif /* !__VMS */
Guido van Rossum73624e91994-10-10 17:59:00 +00002243 return PyInt_FromLong((long)n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00002244}
2245
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002246PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002247"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002248\n\
2249Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002250argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002251sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002252
2253
2254/* s.sendall(data [,flags]) method */
2255
2256static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002257sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002258{
2259 char *buf;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002260 int len, n = 0, flags = 0, timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002261
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002262 if (!PyArg_ParseTuple(args, "s#|i:sendall", &buf, &len, &flags))
2263 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002264
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002265 Py_BEGIN_ALLOW_THREADS
2266 do {
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002267 timeout = internal_select(s, 1);
2268 if (timeout)
2269 break;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002270 n = send(s->sock_fd, buf, len, flags);
2271 if (n < 0)
2272 break;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002273 buf += n;
2274 len -= n;
2275 } while (len > 0);
2276 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002277
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002278 if (timeout) {
2279 PyErr_SetString(socket_timeout, "timed out");
2280 return NULL;
2281 }
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002282 if (n < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002283 return s->errorhandler();
Guido van Rossum67f7a382002-06-06 21:08:16 +00002284
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002285 Py_INCREF(Py_None);
2286 return Py_None;
2287}
2288
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002289PyDoc_STRVAR(sendall_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002290"sendall(data[, flags])\n\
2291\n\
2292Send a data string to the socket. For the optional flags\n\
2293argument, see the Unix manual. This calls send() repeatedly\n\
2294until all data is sent. If an error occurs, it's impossible\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002295to tell how much data has been sent.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002296
Guido van Rossum30a685f1991-06-27 15:51:29 +00002297
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002298/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002299
Guido van Rossum73624e91994-10-10 17:59:00 +00002300static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002301sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002302{
Guido van Rossum73624e91994-10-10 17:59:00 +00002303 PyObject *addro;
Guido van Rossumff4949e1992-08-05 19:58:53 +00002304 char *buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002305 struct sockaddr *addr;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002306 int addrlen, len, n = 0, flags, timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002307
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002308 flags = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002309 if (!PyArg_ParseTuple(args, "s#O:sendto", &buf, &len, &addro)) {
Guido van Rossum73624e91994-10-10 17:59:00 +00002310 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002311 if (!PyArg_ParseTuple(args, "s#iO:sendto",
2312 &buf, &len, &flags, &addro))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002313 return NULL;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002314 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002315
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002316 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002317 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002318
Guido van Rossum73624e91994-10-10 17:59:00 +00002319 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002320 timeout = internal_select(s, 1);
2321 if (!timeout)
2322 n = sendto(s->sock_fd, buf, len, flags, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00002323 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002324
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002325 if (timeout) {
2326 PyErr_SetString(socket_timeout, "timed out");
2327 return NULL;
2328 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002329 if (n < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002330 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00002331 return PyInt_FromLong((long)n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002332}
2333
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002334PyDoc_STRVAR(sendto_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002335"sendto(data[, flags], address) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002336\n\
2337Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002338For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002339
Guido van Rossum30a685f1991-06-27 15:51:29 +00002340
2341/* s.shutdown(how) method */
2342
Guido van Rossum73624e91994-10-10 17:59:00 +00002343static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002344sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002345{
2346 int how;
Guido van Rossumff4949e1992-08-05 19:58:53 +00002347 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002348
2349 how = PyInt_AsLong(arg);
2350 if (how == -1 && PyErr_Occurred())
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002351 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00002352 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002353 res = shutdown(s->sock_fd, how);
Guido van Rossum73624e91994-10-10 17:59:00 +00002354 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002355 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002356 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00002357 Py_INCREF(Py_None);
2358 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002359}
2360
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002361PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002362"shutdown(flag)\n\
2363\n\
Martin v. Löwis94681fc2003-11-27 19:40:22 +00002364Shut down the reading side of the socket (flag == SHUT_RD), the writing side\n\
2365of the socket (flag == SHUT_WR), or both ends (flag == SHUT_RDWR).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002366
Guido van Rossum30a685f1991-06-27 15:51:29 +00002367
2368/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002369
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002370static PyMethodDef sock_methods[] = {
2371 {"accept", (PyCFunction)sock_accept, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002372 accept_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002373 {"bind", (PyCFunction)sock_bind, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002374 bind_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002375 {"close", (PyCFunction)sock_close, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002376 close_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002377 {"connect", (PyCFunction)sock_connect, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002378 connect_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002379 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002380 connect_ex_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00002381#ifndef NO_DUP
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002382 {"dup", (PyCFunction)sock_dup, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002383 dup_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00002384#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002385 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002386 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00002387#ifdef HAVE_GETPEERNAME
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002388 {"getpeername", (PyCFunction)sock_getpeername,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002389 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00002390#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002391 {"getsockname", (PyCFunction)sock_getsockname,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002392 METH_NOARGS, getsockname_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002393 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002394 getsockopt_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002395 {"listen", (PyCFunction)sock_listen, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002396 listen_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002397#ifndef NO_DUP
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002398 {"makefile", (PyCFunction)sock_makefile, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002399 makefile_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002400#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002401 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002402 recv_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002403 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002404 recvfrom_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002405 {"send", (PyCFunction)sock_send, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002406 send_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002407 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002408 sendall_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002409 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002410 sendto_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002411 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002412 setblocking_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002413 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
Guido van Rossum67f7a382002-06-06 21:08:16 +00002414 settimeout_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002415 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
Guido van Rossum67f7a382002-06-06 21:08:16 +00002416 gettimeout_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002417 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002418 setsockopt_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002419 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002420 shutdown_doc},
2421#ifdef RISCOS
Martin v. Löwisa94568a2003-05-10 07:36:56 +00002422 {"sleeptaskw", (PyCFunction)sock_sleeptaskw, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002423 sleeptaskw_doc},
2424#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +00002425 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002426};
2427
Guido van Rossum30a685f1991-06-27 15:51:29 +00002428
Guido van Rossum73624e91994-10-10 17:59:00 +00002429/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00002430 First close the file description. */
2431
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002432static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002433sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002434{
Guido van Rossumfa972c92000-04-10 12:45:45 +00002435 if (s->sock_fd != -1)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00002436 (void) SOCKETCLOSE(s->sock_fd);
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002437 s->ob_type->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002438}
2439
Guido van Rossum30a685f1991-06-27 15:51:29 +00002440
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002441static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002442sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002443{
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002444 char buf[512];
Fred Drakea04eaad2000-06-30 02:46:07 +00002445#if SIZEOF_SOCKET_T > SIZEOF_LONG
2446 if (s->sock_fd > LONG_MAX) {
2447 /* this can occur on Win64, and actually there is a special
2448 ugly printf formatter for decimal pointer length integer
2449 printing, only bother if necessary*/
2450 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002451 "no printf formatter to display "
2452 "the socket descriptor in decimal");
Fred Drakea04eaad2000-06-30 02:46:07 +00002453 return NULL;
2454 }
2455#endif
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002456 PyOS_snprintf(
2457 buf, sizeof(buf),
2458 "<socket object, fd=%ld, family=%d, type=%d, protocol=%d>",
2459 (long)s->sock_fd, s->sock_family,
2460 s->sock_type,
2461 s->sock_proto);
Guido van Rossumdc1c64a1996-02-27 15:21:19 +00002462 return PyString_FromString(buf);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002463}
2464
2465
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002466/* Create a new, uninitialized socket object. */
2467
2468static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002469sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002470{
2471 PyObject *new;
2472
2473 new = type->tp_alloc(type, 0);
Guido van Rossume1c478f2002-06-06 20:08:25 +00002474 if (new != NULL) {
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002475 ((PySocketSockObject *)new)->sock_fd = -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002476 ((PySocketSockObject *)new)->sock_timeout = -1.0;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002477 ((PySocketSockObject *)new)->errorhandler = &set_error;
Guido van Rossume1c478f2002-06-06 20:08:25 +00002478 }
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002479 return new;
2480}
2481
2482
2483/* Initialize a new socket object. */
2484
2485/*ARGSUSED*/
2486static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00002487sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002488{
2489 PySocketSockObject *s = (PySocketSockObject *)self;
2490 SOCKET_T fd;
2491 int family = AF_INET, type = SOCK_STREAM, proto = 0;
2492 static char *keywords[] = {"family", "type", "proto", 0};
2493
2494 if (!PyArg_ParseTupleAndKeywords(args, kwds,
2495 "|iii:socket", keywords,
2496 &family, &type, &proto))
2497 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002498
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002499 Py_BEGIN_ALLOW_THREADS
2500 fd = socket(family, type, proto);
2501 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002502
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002503#ifdef MS_WINDOWS
2504 if (fd == INVALID_SOCKET)
2505#else
2506 if (fd < 0)
2507#endif
2508 {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002509 set_error();
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002510 return -1;
2511 }
2512 init_sockobject(s, fd, family, type, proto);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002513
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002514 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002515
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002516}
2517
2518
Guido van Rossumb6775db1994-08-01 11:34:53 +00002519/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002520
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002521static PyTypeObject sock_type = {
Guido van Rossum55558541996-05-23 22:54:50 +00002522 PyObject_HEAD_INIT(0) /* Must fill in type value later */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002523 0, /* ob_size */
Guido van Rossumca6dfa52001-10-28 12:31:33 +00002524 "_socket.socket", /* tp_name */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002525 sizeof(PySocketSockObject), /* tp_basicsize */
2526 0, /* tp_itemsize */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002527 (destructor)sock_dealloc, /* tp_dealloc */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002528 0, /* tp_print */
2529 0, /* tp_getattr */
2530 0, /* tp_setattr */
2531 0, /* tp_compare */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002532 (reprfunc)sock_repr, /* tp_repr */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002533 0, /* tp_as_number */
2534 0, /* tp_as_sequence */
2535 0, /* tp_as_mapping */
2536 0, /* tp_hash */
2537 0, /* tp_call */
2538 0, /* tp_str */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002539 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002540 0, /* tp_setattro */
2541 0, /* tp_as_buffer */
2542 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002543 sock_doc, /* tp_doc */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002544 0, /* tp_traverse */
2545 0, /* tp_clear */
2546 0, /* tp_richcompare */
2547 0, /* tp_weaklistoffset */
2548 0, /* tp_iter */
2549 0, /* tp_iternext */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002550 sock_methods, /* tp_methods */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002551 0, /* tp_members */
2552 0, /* tp_getset */
2553 0, /* tp_base */
2554 0, /* tp_dict */
2555 0, /* tp_descr_get */
2556 0, /* tp_descr_set */
2557 0, /* tp_dictoffset */
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00002558 sock_initobj, /* tp_init */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002559 PyType_GenericAlloc, /* tp_alloc */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002560 sock_new, /* tp_new */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002561 PyObject_Del, /* tp_free */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002562};
2563
Guido van Rossum30a685f1991-06-27 15:51:29 +00002564
Guido van Rossum81194471991-07-27 21:42:02 +00002565/* Python interface to gethostname(). */
2566
2567/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002568static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002569socket_gethostname(PyObject *self, PyObject *args)
Guido van Rossum81194471991-07-27 21:42:02 +00002570{
2571 char buf[1024];
Guido van Rossumff4949e1992-08-05 19:58:53 +00002572 int res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002573 if (!PyArg_ParseTuple(args, ":gethostname"))
Guido van Rossum81194471991-07-27 21:42:02 +00002574 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00002575 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002576 res = gethostname(buf, (int) sizeof buf - 1);
Guido van Rossum73624e91994-10-10 17:59:00 +00002577 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002578 if (res < 0)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002579 return set_error();
Guido van Rossum81194471991-07-27 21:42:02 +00002580 buf[sizeof buf - 1] = '\0';
Guido van Rossum73624e91994-10-10 17:59:00 +00002581 return PyString_FromString(buf);
Guido van Rossum81194471991-07-27 21:42:02 +00002582}
Guido van Rossumff4949e1992-08-05 19:58:53 +00002583
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002584PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002585"gethostname() -> string\n\
2586\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002587Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002588
Guido van Rossumff4949e1992-08-05 19:58:53 +00002589
Guido van Rossum30a685f1991-06-27 15:51:29 +00002590/* Python interface to gethostbyname(name). */
2591
2592/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002593static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002594socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002595{
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002596 char *name;
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00002597 sock_addr_t addrbuf;
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{
Raymond Hettinger87de0ca2004-09-28 02:19:40 +00002947 unsigned short port;
Barry Warsaw11b91a02004-06-28 00:50:43 +00002948 char *proto=NULL;
2949 struct servent *sp;
Raymond Hettinger87de0ca2004-09-28 02:19:40 +00002950 if (!PyArg_ParseTuple(args, "H|s:getservbyport", &port, &proto))
Barry Warsaw11b91a02004-06-28 00:50:43 +00002951 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 */
Georg Brandld2e3ba72005-08-26 08:34:00 +00003242 /* special-case this address as inet_addr might return INADDR_NONE
3243 * for this */
3244 if (strcmp(ip_addr, "255.255.255.255") == 0) {
3245 packed_addr = 0xFFFFFFFF;
3246 } else {
3247
3248 packed_addr = inet_addr(ip_addr);
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003249
Georg Brandld2e3ba72005-08-26 08:34:00 +00003250 if (packed_addr == INADDR_NONE) { /* invalid address */
3251 PyErr_SetString(socket_error,
3252 "illegal IP address string passed to inet_aton");
3253 return NULL;
3254 }
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003255 }
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003256 return PyString_FromStringAndSize((char *) &packed_addr,
3257 sizeof(packed_addr));
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003258#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003259}
3260
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003261PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00003262"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003263\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003264Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003265
3266static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003267socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003268{
3269 char *packed_str;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003270 int addr_len;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003271 struct in_addr packed_addr;
3272
Guido van Rossum27fc3c02000-03-24 20:56:56 +00003273 if (!PyArg_ParseTuple(args, "s#:inet_ntoa", &packed_str, &addr_len)) {
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003274 return NULL;
3275 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00003276
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003277 if (addr_len != sizeof(packed_addr)) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003278 PyErr_SetString(socket_error,
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003279 "packed IP wrong length for inet_ntoa");
3280 return NULL;
3281 }
3282
3283 memcpy(&packed_addr, packed_str, addr_len);
3284
3285 return PyString_FromString(inet_ntoa(packed_addr));
3286}
Guido van Rossum82a5c661998-07-07 20:45:43 +00003287
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003288#ifdef HAVE_INET_PTON
3289
3290PyDoc_STRVAR(inet_pton_doc,
3291"inet_pton(af, ip) -> packed IP address string\n\
3292\n\
3293Convert an IP address from string format to a packed string suitable\n\
3294for use with low-level network functions.");
3295
3296static PyObject *
3297socket_inet_pton(PyObject *self, PyObject *args)
3298{
3299 int af;
3300 char* ip;
3301 int retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003302#ifdef ENABLE_IPV6
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003303 char packed[MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003304#else
3305 char packed[sizeof(struct in_addr)];
3306#endif
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003307 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
3308 return NULL;
3309 }
3310
Martin v. Löwis04697e82004-06-02 12:35:29 +00003311#if !defined(ENABLE_IPV6) && defined(AF_INET6)
Martin v. Löwis10649092003-08-05 06:25:06 +00003312 if(af == AF_INET6) {
3313 PyErr_SetString(socket_error,
3314 "can't use AF_INET6, IPv6 is disabled");
3315 return NULL;
3316 }
3317#endif
3318
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003319 retval = inet_pton(af, ip, packed);
3320 if (retval < 0) {
3321 PyErr_SetFromErrno(socket_error);
3322 return NULL;
3323 } else if (retval == 0) {
3324 PyErr_SetString(socket_error,
3325 "illegal IP address string passed to inet_pton");
3326 return NULL;
3327 } else if (af == AF_INET) {
3328 return PyString_FromStringAndSize(packed,
3329 sizeof(struct in_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003330#ifdef ENABLE_IPV6
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003331 } else if (af == AF_INET6) {
3332 return PyString_FromStringAndSize(packed,
3333 sizeof(struct in6_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003334#endif
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003335 } else {
3336 PyErr_SetString(socket_error, "unknown address family");
3337 return NULL;
3338 }
3339}
3340
3341PyDoc_STRVAR(inet_ntop_doc,
3342"inet_ntop(af, packed_ip) -> string formatted IP address\n\
3343\n\
3344Convert a packed IP address of the given family to string format.");
3345
3346static PyObject *
3347socket_inet_ntop(PyObject *self, PyObject *args)
3348{
3349 int af;
3350 char* packed;
3351 int len;
3352 const char* retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003353#ifdef ENABLE_IPV6
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003354 char ip[MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003355#else
3356 char ip[INET_ADDRSTRLEN + 1];
3357#endif
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003358
3359 /* Guarantee NUL-termination for PyString_FromString() below */
Jeremy Hylton80961f32004-11-07 14:24:25 +00003360 memset((void *) &ip[0], '\0', sizeof(ip));
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003361
3362 if (!PyArg_ParseTuple(args, "is#:inet_ntop", &af, &packed, &len)) {
3363 return NULL;
3364 }
3365
3366 if (af == AF_INET) {
3367 if (len != sizeof(struct in_addr)) {
3368 PyErr_SetString(PyExc_ValueError,
3369 "invalid length of packed IP address string");
3370 return NULL;
3371 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003372#ifdef ENABLE_IPV6
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003373 } else if (af == AF_INET6) {
3374 if (len != sizeof(struct in6_addr)) {
3375 PyErr_SetString(PyExc_ValueError,
3376 "invalid length of packed IP address string");
3377 return NULL;
3378 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003379#endif
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003380 } else {
3381 PyErr_Format(PyExc_ValueError,
3382 "unknown address family %d", af);
3383 return NULL;
3384 }
3385
3386 retval = inet_ntop(af, packed, ip, sizeof(ip));
3387 if (!retval) {
3388 PyErr_SetFromErrno(socket_error);
3389 return NULL;
3390 } else {
3391 return PyString_FromString(retval);
3392 }
3393
3394 /* NOTREACHED */
3395 PyErr_SetString(PyExc_RuntimeError, "invalid handling of inet_ntop");
3396 return NULL;
3397}
3398
3399#endif /* HAVE_INET_PTON */
3400
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003401/* Python interface to getaddrinfo(host, port). */
3402
3403/*ARGSUSED*/
3404static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003405socket_getaddrinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003406{
Martin v. Löwisf0b11d22001-11-07 08:31:03 +00003407 struct addrinfo hints, *res;
3408 struct addrinfo *res0 = NULL;
Martin v. Löwis2548c732003-04-18 10:39:54 +00003409 PyObject *hobj = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003410 PyObject *pobj = (PyObject *)NULL;
Martin v. Löwisf65b1a12001-08-12 09:28:40 +00003411 char pbuf[30];
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003412 char *hptr, *pptr;
3413 int family, socktype, protocol, flags;
3414 int error;
3415 PyObject *all = (PyObject *)NULL;
3416 PyObject *single = (PyObject *)NULL;
Martin v. Löwis2548c732003-04-18 10:39:54 +00003417 PyObject *idna = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003418
3419 family = socktype = protocol = flags = 0;
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00003420 family = AF_UNSPEC;
Martin v. Löwis2548c732003-04-18 10:39:54 +00003421 if (!PyArg_ParseTuple(args, "OO|iiii:getaddrinfo",
3422 &hobj, &pobj, &family, &socktype,
3423 &protocol, &flags)) {
3424 return NULL;
3425 }
3426 if (hobj == Py_None) {
3427 hptr = NULL;
3428 } else if (PyUnicode_Check(hobj)) {
3429 idna = PyObject_CallMethod(hobj, "encode", "s", "idna");
3430 if (!idna)
3431 return NULL;
3432 hptr = PyString_AsString(idna);
3433 } else if (PyString_Check(hobj)) {
3434 hptr = PyString_AsString(hobj);
3435 } else {
3436 PyErr_SetString(PyExc_TypeError,
3437 "getaddrinfo() argument 1 must be string or None");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003438 return NULL;
3439 }
3440 if (PyInt_Check(pobj)) {
Marc-André Lemburg03d1b182001-07-31 18:05:33 +00003441 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", PyInt_AsLong(pobj));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003442 pptr = pbuf;
3443 } else if (PyString_Check(pobj)) {
3444 pptr = PyString_AsString(pobj);
3445 } else if (pobj == Py_None) {
3446 pptr = (char *)NULL;
3447 } else {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003448 PyErr_SetString(socket_error, "Int or String expected");
Martin v. Löwis5db099a2003-08-07 11:55:15 +00003449 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003450 }
3451 memset(&hints, 0, sizeof(hints));
3452 hints.ai_family = family;
3453 hints.ai_socktype = socktype;
3454 hints.ai_protocol = protocol;
3455 hints.ai_flags = flags;
Just van Rossum1040d2c2003-05-09 07:53:18 +00003456 Py_BEGIN_ALLOW_THREADS
3457 ACQUIRE_GETADDRINFO_LOCK
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003458 error = getaddrinfo(hptr, pptr, &hints, &res0);
Just van Rossum1040d2c2003-05-09 07:53:18 +00003459 Py_END_ALLOW_THREADS
3460 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003461 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003462 set_gaierror(error);
Martin v. Löwis5db099a2003-08-07 11:55:15 +00003463 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003464 }
3465
3466 if ((all = PyList_New(0)) == NULL)
3467 goto err;
3468 for (res = res0; res; res = res->ai_next) {
Guido van Rossum716aac02001-10-12 18:59:27 +00003469 PyObject *addr =
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00003470 makesockaddr(-1, res->ai_addr, res->ai_addrlen, protocol);
Guido van Rossum716aac02001-10-12 18:59:27 +00003471 if (addr == NULL)
3472 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003473 single = Py_BuildValue("iiisO", res->ai_family,
3474 res->ai_socktype, res->ai_protocol,
3475 res->ai_canonname ? res->ai_canonname : "",
Guido van Rossum716aac02001-10-12 18:59:27 +00003476 addr);
3477 Py_DECREF(addr);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003478 if (single == NULL)
3479 goto err;
3480
3481 if (PyList_Append(all, single))
3482 goto err;
3483 Py_XDECREF(single);
3484 }
Martin v. Löwis2548c732003-04-18 10:39:54 +00003485 Py_XDECREF(idna);
Neal Norwitz90128ba2002-08-09 03:37:42 +00003486 if (res0)
3487 freeaddrinfo(res0);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003488 return all;
3489 err:
3490 Py_XDECREF(single);
3491 Py_XDECREF(all);
Martin v. Löwis2548c732003-04-18 10:39:54 +00003492 Py_XDECREF(idna);
Martin v. Löwisf0b11d22001-11-07 08:31:03 +00003493 if (res0)
3494 freeaddrinfo(res0);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003495 return (PyObject *)NULL;
3496}
3497
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003498PyDoc_STRVAR(getaddrinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003499"getaddrinfo(host, port [, family, socktype, proto, flags])\n\
3500 -> list of (family, socktype, proto, canonname, sockaddr)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003501\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003502Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003503
3504/* Python interface to getnameinfo(sa, flags). */
3505
3506/*ARGSUSED*/
3507static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003508socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003509{
3510 PyObject *sa = (PyObject *)NULL;
3511 int flags;
3512 char *hostp;
Martin v. Löwis06b1d212001-11-02 23:34:52 +00003513 int port, flowinfo, scope_id;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003514 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
3515 struct addrinfo hints, *res = NULL;
3516 int error;
3517 PyObject *ret = (PyObject *)NULL;
3518
3519 flags = flowinfo = scope_id = 0;
Martin v. Löwis06b1d212001-11-02 23:34:52 +00003520 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003521 return NULL;
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003522 if (!PyArg_ParseTuple(sa, "si|ii",
3523 &hostp, &port, &flowinfo, &scope_id))
Martin v. Löwis06b1d212001-11-02 23:34:52 +00003524 return NULL;
Marc-André Lemburg03d1b182001-07-31 18:05:33 +00003525 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003526 memset(&hints, 0, sizeof(hints));
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00003527 hints.ai_family = AF_UNSPEC;
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003528 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Just van Rossum1040d2c2003-05-09 07:53:18 +00003529 Py_BEGIN_ALLOW_THREADS
3530 ACQUIRE_GETADDRINFO_LOCK
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003531 error = getaddrinfo(hostp, pbuf, &hints, &res);
Just van Rossum1040d2c2003-05-09 07:53:18 +00003532 Py_END_ALLOW_THREADS
3533 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003534 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003535 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003536 goto fail;
3537 }
3538 if (res->ai_next) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003539 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003540 "sockaddr resolved to multiple addresses");
3541 goto fail;
3542 }
3543 switch (res->ai_family) {
3544 case AF_INET:
3545 {
3546 char *t1;
3547 int t2;
3548 if (PyArg_ParseTuple(sa, "si", &t1, &t2) == 0) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003549 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003550 "IPv4 sockaddr must be 2 tuple");
3551 goto fail;
3552 }
3553 break;
3554 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00003555#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003556 case AF_INET6:
3557 {
3558 struct sockaddr_in6 *sin6;
3559 sin6 = (struct sockaddr_in6 *)res->ai_addr;
3560 sin6->sin6_flowinfo = flowinfo;
3561 sin6->sin6_scope_id = scope_id;
3562 break;
3563 }
3564#endif
3565 }
3566 error = getnameinfo(res->ai_addr, res->ai_addrlen,
3567 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
3568 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003569 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003570 goto fail;
3571 }
3572 ret = Py_BuildValue("ss", hbuf, pbuf);
3573
3574fail:
3575 if (res)
3576 freeaddrinfo(res);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003577 return ret;
3578}
3579
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003580PyDoc_STRVAR(getnameinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003581"getnameinfo(sockaddr, flags) --> (host, port)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003582\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003583Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003584
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00003585
3586/* Python API to getting and setting the default timeout value. */
3587
3588static PyObject *
3589socket_getdefaulttimeout(PyObject *self)
3590{
3591 if (defaulttimeout < 0.0) {
3592 Py_INCREF(Py_None);
3593 return Py_None;
3594 }
3595 else
3596 return PyFloat_FromDouble(defaulttimeout);
3597}
3598
3599PyDoc_STRVAR(getdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003600"getdefaulttimeout() -> timeout\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00003601\n\
3602Returns the default timeout in floating seconds for new socket objects.\n\
3603A value of None indicates that new socket objects have no timeout.\n\
3604When the socket module is first imported, the default is None.");
3605
3606static PyObject *
3607socket_setdefaulttimeout(PyObject *self, PyObject *arg)
3608{
3609 double timeout;
3610
3611 if (arg == Py_None)
3612 timeout = -1.0;
3613 else {
3614 timeout = PyFloat_AsDouble(arg);
3615 if (timeout < 0.0) {
3616 if (!PyErr_Occurred())
3617 PyErr_SetString(PyExc_ValueError,
3618 "Timeout value out of range");
3619 return NULL;
3620 }
3621 }
3622
3623 defaulttimeout = timeout;
3624
3625 Py_INCREF(Py_None);
3626 return Py_None;
3627}
3628
3629PyDoc_STRVAR(setdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003630"setdefaulttimeout(timeout)\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00003631\n\
3632Set the default timeout in floating seconds for new socket objects.\n\
3633A value of None indicates that new socket objects have no timeout.\n\
3634When the socket module is first imported, the default is None.");
3635
3636
Guido van Rossum30a685f1991-06-27 15:51:29 +00003637/* List of functions exported by this module. */
3638
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003639static PyMethodDef socket_methods[] = {
3640 {"gethostbyname", socket_gethostbyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003641 METH_VARARGS, gethostbyname_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003642 {"gethostbyname_ex", socket_gethostbyname_ex,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003643 METH_VARARGS, ghbn_ex_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003644 {"gethostbyaddr", socket_gethostbyaddr,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003645 METH_VARARGS, gethostbyaddr_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003646 {"gethostname", socket_gethostname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003647 METH_VARARGS, gethostname_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003648 {"getservbyname", socket_getservbyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003649 METH_VARARGS, getservbyname_doc},
Barry Warsaw11b91a02004-06-28 00:50:43 +00003650 {"getservbyport", socket_getservbyport,
3651 METH_VARARGS, getservbyport_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003652 {"getprotobyname", socket_getprotobyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003653 METH_VARARGS,getprotobyname_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00003654#ifndef NO_DUP
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003655 {"fromfd", socket_fromfd,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003656 METH_VARARGS, fromfd_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00003657#endif
Dave Cole331708b2004-08-09 04:51:41 +00003658#ifdef HAVE_SOCKETPAIR
3659 {"socketpair", socket_socketpair,
3660 METH_VARARGS, socketpair_doc},
3661#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003662 {"ntohs", socket_ntohs,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003663 METH_VARARGS, ntohs_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003664 {"ntohl", socket_ntohl,
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003665 METH_O, ntohl_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003666 {"htons", socket_htons,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003667 METH_VARARGS, htons_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003668 {"htonl", socket_htonl,
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003669 METH_O, htonl_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003670 {"inet_aton", socket_inet_aton,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003671 METH_VARARGS, inet_aton_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003672 {"inet_ntoa", socket_inet_ntoa,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003673 METH_VARARGS, inet_ntoa_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003674#ifdef HAVE_INET_PTON
3675 {"inet_pton", socket_inet_pton,
3676 METH_VARARGS, inet_pton_doc},
3677 {"inet_ntop", socket_inet_ntop,
3678 METH_VARARGS, inet_ntop_doc},
3679#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003680 {"getaddrinfo", socket_getaddrinfo,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003681 METH_VARARGS, getaddrinfo_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003682 {"getnameinfo", socket_getnameinfo,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003683 METH_VARARGS, getnameinfo_doc},
Guido van Rossum1693ba82002-07-18 21:11:26 +00003684 {"getdefaulttimeout", (PyCFunction)socket_getdefaulttimeout,
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00003685 METH_NOARGS, getdefaulttimeout_doc},
3686 {"setdefaulttimeout", socket_setdefaulttimeout,
3687 METH_O, setdefaulttimeout_doc},
Guido van Rossum30a685f1991-06-27 15:51:29 +00003688 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003689};
3690
Guido van Rossum30a685f1991-06-27 15:51:29 +00003691
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003692#ifdef RISCOS
3693#define OS_INIT_DEFINED
Guido van Rossumbe32c891996-06-20 16:25:29 +00003694
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003695static int
3696os_init(void)
3697{
3698 _kernel_swi_regs r;
3699
3700 r.r[0] = 0;
3701 _kernel_swi(0x43380, &r, &r);
3702 taskwindow = r.r[0];
3703
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003704 return 1;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003705}
3706
3707#endif /* RISCOS */
3708
3709
3710#ifdef MS_WINDOWS
3711#define OS_INIT_DEFINED
3712
3713/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00003714
3715static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003716os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00003717{
3718 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00003719}
3720
3721static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003722os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00003723{
3724 WSADATA WSAData;
3725 int ret;
3726 char buf[100];
3727 ret = WSAStartup(0x0101, &WSAData);
3728 switch (ret) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003729 case 0: /* No error */
Mark Hammond14350ab2003-07-09 04:57:46 +00003730 Py_AtExit(os_cleanup);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003731 return 1; /* Success */
Guido van Rossumbe32c891996-06-20 16:25:29 +00003732 case WSASYSNOTREADY:
3733 PyErr_SetString(PyExc_ImportError,
3734 "WSAStartup failed: network not ready");
3735 break;
3736 case WSAVERNOTSUPPORTED:
3737 case WSAEINVAL:
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003738 PyErr_SetString(
3739 PyExc_ImportError,
3740 "WSAStartup failed: requested version not supported");
Guido van Rossumbe32c891996-06-20 16:25:29 +00003741 break;
3742 default:
Tim Peters885d4572001-11-28 20:27:42 +00003743 PyOS_snprintf(buf, sizeof(buf),
3744 "WSAStartup failed: error code %d", ret);
Guido van Rossumbe32c891996-06-20 16:25:29 +00003745 PyErr_SetString(PyExc_ImportError, buf);
3746 break;
3747 }
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003748 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00003749}
3750
Guido van Rossum8d665e61996-06-26 18:22:49 +00003751#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00003752
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003753
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003754#ifdef PYOS_OS2
3755#define OS_INIT_DEFINED
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003756
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003757/* Additional initialization for OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003758
3759static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003760os_init(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003761{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003762#ifndef PYCC_GCC
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003763 char reason[64];
3764 int rc = sock_init();
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003765
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003766 if (rc == 0) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003767 return 1; /* Success */
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003768 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003769
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003770 PyOS_snprintf(reason, sizeof(reason),
3771 "OS/2 TCP/IP Error# %d", sock_errno());
3772 PyErr_SetString(PyExc_ImportError, reason);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003773
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003774 return 0; /* Failure */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00003775#else
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003776 /* No need to initialise sockets with GCC/EMX */
3777 return 1; /* Success */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00003778#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003779}
3780
3781#endif /* PYOS_OS2 */
3782
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003783
3784#ifndef OS_INIT_DEFINED
3785static int
3786os_init(void)
3787{
3788 return 1; /* Success */
3789}
3790#endif
3791
3792
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00003793/* C API table - always add new things to the end for binary
3794 compatibility. */
3795static
3796PySocketModule_APIObject PySocketModuleAPI =
3797{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003798 &sock_type,
Brett Cannon06c34792004-03-23 23:16:54 +00003799 NULL
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00003800};
3801
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003802
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003803/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003804
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003805 This module is actually called "_socket", and there's a wrapper
3806 "socket.py" which implements some additional functionality. On some
3807 platforms (e.g. Windows and OS/2), socket.py also implements a
3808 wrapper for the socket type that provides missing functionality such
3809 as makefile(), dup() and fromfd(). The import of "_socket" may fail
3810 with an ImportError exception if os-specific initialization fails.
3811 On Windows, this does WINSOCK initialization. When WINSOCK is
3812 initialized succesfully, a call to WSACleanup() is scheduled to be
3813 made at exit time.
3814*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003815
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003816PyDoc_STRVAR(socket_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003817"Implementation module for socket operations.\n\
3818\n\
3819See the socket module for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003820
Mark Hammondfe51c6d2002-08-02 02:27:13 +00003821PyMODINIT_FUNC
Thomas Wouters1e0c2f42000-07-24 16:06:23 +00003822init_socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003823{
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003824 PyObject *m, *has_ipv6;
Fred Drake4baedc12002-04-01 14:53:37 +00003825
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003826 if (!os_init())
Guido van Rossum0cb96de1997-10-01 04:29:29 +00003827 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003828
3829 sock_type.ob_type = &PyType_Type;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003830 m = Py_InitModule3(PySocket_MODULE_NAME,
3831 socket_methods,
3832 socket_doc);
3833
3834 socket_error = PyErr_NewException("socket.error", NULL, NULL);
3835 if (socket_error == NULL)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003836 return;
Brett Cannon06c34792004-03-23 23:16:54 +00003837 PySocketModuleAPI.error = socket_error;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003838 Py_INCREF(socket_error);
3839 PyModule_AddObject(m, "error", socket_error);
3840 socket_herror = PyErr_NewException("socket.herror",
3841 socket_error, NULL);
3842 if (socket_herror == NULL)
3843 return;
3844 Py_INCREF(socket_herror);
3845 PyModule_AddObject(m, "herror", socket_herror);
3846 socket_gaierror = PyErr_NewException("socket.gaierror", socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003847 NULL);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003848 if (socket_gaierror == NULL)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003849 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003850 Py_INCREF(socket_gaierror);
3851 PyModule_AddObject(m, "gaierror", socket_gaierror);
Raymond Hettingeref7343c2003-06-29 03:08:05 +00003852 socket_timeout = PyErr_NewException("socket.timeout",
3853 socket_error, NULL);
3854 if (socket_timeout == NULL)
3855 return;
3856 Py_INCREF(socket_timeout);
3857 PyModule_AddObject(m, "timeout", socket_timeout);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003858 Py_INCREF((PyObject *)&sock_type);
Fred Drake4baedc12002-04-01 14:53:37 +00003859 if (PyModule_AddObject(m, "SocketType",
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003860 (PyObject *)&sock_type) != 0)
Guido van Rossum0cb96de1997-10-01 04:29:29 +00003861 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003862 Py_INCREF((PyObject *)&sock_type);
Fred Drake4baedc12002-04-01 14:53:37 +00003863 if (PyModule_AddObject(m, "socket",
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003864 (PyObject *)&sock_type) != 0)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003865 return;
Guido van Rossum09be4091999-08-09 14:40:40 +00003866
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003867#ifdef ENABLE_IPV6
3868 has_ipv6 = Py_True;
3869#else
3870 has_ipv6 = Py_False;
3871#endif
3872 Py_INCREF(has_ipv6);
3873 PyModule_AddObject(m, "has_ipv6", has_ipv6);
3874
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00003875 /* Export C API */
Fred Drake4baedc12002-04-01 14:53:37 +00003876 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00003877 PyCObject_FromVoidPtr((void *)&PySocketModuleAPI, NULL)
3878 ) != 0)
3879 return;
3880
Guido van Rossum09be4091999-08-09 14:40:40 +00003881 /* Address families (we only support AF_INET and AF_UNIX) */
3882#ifdef AF_UNSPEC
Fred Drake4baedc12002-04-01 14:53:37 +00003883 PyModule_AddIntConstant(m, "AF_UNSPEC", AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00003884#endif
Fred Drake4baedc12002-04-01 14:53:37 +00003885 PyModule_AddIntConstant(m, "AF_INET", AF_INET);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003886#ifdef AF_INET6
Fred Drake4baedc12002-04-01 14:53:37 +00003887 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003888#endif /* AF_INET6 */
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00003889#if defined(AF_UNIX)
Fred Drake4baedc12002-04-01 14:53:37 +00003890 PyModule_AddIntConstant(m, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00003891#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00003892#ifdef AF_AX25
Fred Drake4baedc12002-04-01 14:53:37 +00003893 /* Amateur Radio AX.25 */
3894 PyModule_AddIntConstant(m, "AF_AX25", AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00003895#endif
3896#ifdef AF_IPX
Fred Drake4baedc12002-04-01 14:53:37 +00003897 PyModule_AddIntConstant(m, "AF_IPX", AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00003898#endif
3899#ifdef AF_APPLETALK
Fred Drake4baedc12002-04-01 14:53:37 +00003900 /* Appletalk DDP */
3901 PyModule_AddIntConstant(m, "AF_APPLETALK", AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00003902#endif
3903#ifdef AF_NETROM
Fred Drake4baedc12002-04-01 14:53:37 +00003904 /* Amateur radio NetROM */
3905 PyModule_AddIntConstant(m, "AF_NETROM", AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00003906#endif
3907#ifdef AF_BRIDGE
Fred Drake4baedc12002-04-01 14:53:37 +00003908 /* Multiprotocol bridge */
3909 PyModule_AddIntConstant(m, "AF_BRIDGE", AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00003910#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00003911#ifdef AF_ATMPVC
3912 /* ATM PVCs */
3913 PyModule_AddIntConstant(m, "AF_ATMPVC", AF_ATMPVC);
3914#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00003915#ifdef AF_AAL5
Fred Drake4baedc12002-04-01 14:53:37 +00003916 /* Reserved for Werner's ATM */
3917 PyModule_AddIntConstant(m, "AF_AAL5", AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00003918#endif
3919#ifdef AF_X25
Fred Drake4baedc12002-04-01 14:53:37 +00003920 /* Reserved for X.25 project */
3921 PyModule_AddIntConstant(m, "AF_X25", AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00003922#endif
3923#ifdef AF_INET6
Fred Drake4baedc12002-04-01 14:53:37 +00003924 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00003925#endif
3926#ifdef AF_ROSE
Fred Drake4baedc12002-04-01 14:53:37 +00003927 /* Amateur Radio X.25 PLP */
3928 PyModule_AddIntConstant(m, "AF_ROSE", AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00003929#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00003930#ifdef AF_DECnet
3931 /* Reserved for DECnet project */
3932 PyModule_AddIntConstant(m, "AF_DECnet", AF_DECnet);
3933#endif
3934#ifdef AF_NETBEUI
3935 /* Reserved for 802.2LLC project */
3936 PyModule_AddIntConstant(m, "AF_NETBEUI", AF_NETBEUI);
3937#endif
3938#ifdef AF_SECURITY
3939 /* Security callback pseudo AF */
3940 PyModule_AddIntConstant(m, "AF_SECURITY", AF_SECURITY);
3941#endif
3942#ifdef AF_KEY
3943 /* PF_KEY key management API */
3944 PyModule_AddIntConstant(m, "AF_KEY", AF_KEY);
3945#endif
3946#ifdef AF_NETLINK
3947 /* */
3948 PyModule_AddIntConstant(m, "AF_NETLINK", AF_NETLINK);
3949#endif
3950#ifdef AF_ROUTE
3951 /* Alias to emulate 4.4BSD */
3952 PyModule_AddIntConstant(m, "AF_ROUTE", AF_ROUTE);
3953#endif
3954#ifdef AF_ASH
3955 /* Ash */
3956 PyModule_AddIntConstant(m, "AF_ASH", AF_ASH);
3957#endif
3958#ifdef AF_ECONET
3959 /* Acorn Econet */
3960 PyModule_AddIntConstant(m, "AF_ECONET", AF_ECONET);
3961#endif
3962#ifdef AF_ATMSVC
3963 /* ATM SVCs */
3964 PyModule_AddIntConstant(m, "AF_ATMSVC", AF_ATMSVC);
3965#endif
3966#ifdef AF_SNA
3967 /* Linux SNA Project (nutters!) */
3968 PyModule_AddIntConstant(m, "AF_SNA", AF_SNA);
3969#endif
3970#ifdef AF_IRDA
3971 /* IRDA sockets */
3972 PyModule_AddIntConstant(m, "AF_IRDA", AF_IRDA);
3973#endif
3974#ifdef AF_PPPOX
3975 /* PPPoX sockets */
3976 PyModule_AddIntConstant(m, "AF_PPPOX", AF_PPPOX);
3977#endif
3978#ifdef AF_WANPIPE
3979 /* Wanpipe API Sockets */
3980 PyModule_AddIntConstant(m, "AF_WANPIPE", AF_WANPIPE);
3981#endif
3982#ifdef AF_LLC
3983 /* Linux LLC */
3984 PyModule_AddIntConstant(m, "AF_LLC", AF_LLC);
3985#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00003986
Hye-Shik Chang81268602004-02-02 06:05:24 +00003987#ifdef USE_BLUETOOTH
Martin v. Löwis12af0482004-01-31 12:34:17 +00003988 PyModule_AddIntConstant(m, "AF_BLUETOOTH", AF_BLUETOOTH);
3989 PyModule_AddIntConstant(m, "BTPROTO_L2CAP", BTPROTO_L2CAP);
Hye-Shik Chang81268602004-02-02 06:05:24 +00003990#if !defined(__FreeBSD__)
Martin v. Löwis12af0482004-01-31 12:34:17 +00003991 PyModule_AddIntConstant(m, "BTPROTO_SCO", BTPROTO_SCO);
Hye-Shik Chang81268602004-02-02 06:05:24 +00003992#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00003993 PyModule_AddIntConstant(m, "BTPROTO_RFCOMM", BTPROTO_RFCOMM);
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00003994 PyModule_AddObject(m, "BDADDR_ANY", Py_BuildValue("s", "00:00:00:00:00:00"));
3995 PyModule_AddObject(m, "BDADDR_LOCAL", Py_BuildValue("s", "00:00:00:FF:FF:FF"));
Martin v. Löwis12af0482004-01-31 12:34:17 +00003996#endif
3997
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00003998#ifdef HAVE_NETPACKET_PACKET_H
Fred Drake4baedc12002-04-01 14:53:37 +00003999 PyModule_AddIntConstant(m, "AF_PACKET", AF_PACKET);
4000 PyModule_AddIntConstant(m, "PF_PACKET", PF_PACKET);
4001 PyModule_AddIntConstant(m, "PACKET_HOST", PACKET_HOST);
4002 PyModule_AddIntConstant(m, "PACKET_BROADCAST", PACKET_BROADCAST);
4003 PyModule_AddIntConstant(m, "PACKET_MULTICAST", PACKET_MULTICAST);
4004 PyModule_AddIntConstant(m, "PACKET_OTHERHOST", PACKET_OTHERHOST);
4005 PyModule_AddIntConstant(m, "PACKET_OUTGOING", PACKET_OUTGOING);
4006 PyModule_AddIntConstant(m, "PACKET_LOOPBACK", PACKET_LOOPBACK);
4007 PyModule_AddIntConstant(m, "PACKET_FASTROUTE", PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00004008#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00004009
4010 /* Socket types */
Fred Drake4baedc12002-04-01 14:53:37 +00004011 PyModule_AddIntConstant(m, "SOCK_STREAM", SOCK_STREAM);
4012 PyModule_AddIntConstant(m, "SOCK_DGRAM", SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00004013#ifndef __BEOS__
4014/* We have incomplete socket support. */
Fred Drake4baedc12002-04-01 14:53:37 +00004015 PyModule_AddIntConstant(m, "SOCK_RAW", SOCK_RAW);
4016 PyModule_AddIntConstant(m, "SOCK_SEQPACKET", SOCK_SEQPACKET);
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00004017#if defined(SOCK_RDM)
Fred Drake4baedc12002-04-01 14:53:37 +00004018 PyModule_AddIntConstant(m, "SOCK_RDM", SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00004019#endif
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00004020#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004021
4022#ifdef SO_DEBUG
Fred Drake4baedc12002-04-01 14:53:37 +00004023 PyModule_AddIntConstant(m, "SO_DEBUG", SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004024#endif
4025#ifdef SO_ACCEPTCONN
Fred Drake4baedc12002-04-01 14:53:37 +00004026 PyModule_AddIntConstant(m, "SO_ACCEPTCONN", SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004027#endif
4028#ifdef SO_REUSEADDR
Fred Drake4baedc12002-04-01 14:53:37 +00004029 PyModule_AddIntConstant(m, "SO_REUSEADDR", SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004030#endif
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00004031#ifdef SO_EXCLUSIVEADDRUSE
4032 PyModule_AddIntConstant(m, "SO_EXCLUSIVEADDRUSE", SO_EXCLUSIVEADDRUSE);
4033#endif
4034
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004035#ifdef SO_KEEPALIVE
Fred Drake4baedc12002-04-01 14:53:37 +00004036 PyModule_AddIntConstant(m, "SO_KEEPALIVE", SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004037#endif
4038#ifdef SO_DONTROUTE
Fred Drake4baedc12002-04-01 14:53:37 +00004039 PyModule_AddIntConstant(m, "SO_DONTROUTE", SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004040#endif
4041#ifdef SO_BROADCAST
Fred Drake4baedc12002-04-01 14:53:37 +00004042 PyModule_AddIntConstant(m, "SO_BROADCAST", SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004043#endif
4044#ifdef SO_USELOOPBACK
Fred Drake4baedc12002-04-01 14:53:37 +00004045 PyModule_AddIntConstant(m, "SO_USELOOPBACK", SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004046#endif
4047#ifdef SO_LINGER
Fred Drake4baedc12002-04-01 14:53:37 +00004048 PyModule_AddIntConstant(m, "SO_LINGER", SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004049#endif
4050#ifdef SO_OOBINLINE
Fred Drake4baedc12002-04-01 14:53:37 +00004051 PyModule_AddIntConstant(m, "SO_OOBINLINE", SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004052#endif
4053#ifdef SO_REUSEPORT
Fred Drake4baedc12002-04-01 14:53:37 +00004054 PyModule_AddIntConstant(m, "SO_REUSEPORT", SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004055#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004056#ifdef SO_SNDBUF
Fred Drake4baedc12002-04-01 14:53:37 +00004057 PyModule_AddIntConstant(m, "SO_SNDBUF", SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004058#endif
4059#ifdef SO_RCVBUF
Fred Drake4baedc12002-04-01 14:53:37 +00004060 PyModule_AddIntConstant(m, "SO_RCVBUF", SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004061#endif
4062#ifdef SO_SNDLOWAT
Fred Drake4baedc12002-04-01 14:53:37 +00004063 PyModule_AddIntConstant(m, "SO_SNDLOWAT", SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004064#endif
4065#ifdef SO_RCVLOWAT
Fred Drake4baedc12002-04-01 14:53:37 +00004066 PyModule_AddIntConstant(m, "SO_RCVLOWAT", SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004067#endif
4068#ifdef SO_SNDTIMEO
Fred Drake4baedc12002-04-01 14:53:37 +00004069 PyModule_AddIntConstant(m, "SO_SNDTIMEO", SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004070#endif
4071#ifdef SO_RCVTIMEO
Fred Drake4baedc12002-04-01 14:53:37 +00004072 PyModule_AddIntConstant(m, "SO_RCVTIMEO", SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004073#endif
4074#ifdef SO_ERROR
Fred Drake4baedc12002-04-01 14:53:37 +00004075 PyModule_AddIntConstant(m, "SO_ERROR", SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004076#endif
4077#ifdef SO_TYPE
Fred Drake4baedc12002-04-01 14:53:37 +00004078 PyModule_AddIntConstant(m, "SO_TYPE", SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004079#endif
4080
4081 /* Maximum number of connections for "listen" */
4082#ifdef SOMAXCONN
Fred Drake4baedc12002-04-01 14:53:37 +00004083 PyModule_AddIntConstant(m, "SOMAXCONN", SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004084#else
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004085 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004086#endif
4087
4088 /* Flags for send, recv */
4089#ifdef MSG_OOB
Fred Drake4baedc12002-04-01 14:53:37 +00004090 PyModule_AddIntConstant(m, "MSG_OOB", MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004091#endif
4092#ifdef MSG_PEEK
Fred Drake4baedc12002-04-01 14:53:37 +00004093 PyModule_AddIntConstant(m, "MSG_PEEK", MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004094#endif
4095#ifdef MSG_DONTROUTE
Fred Drake4baedc12002-04-01 14:53:37 +00004096 PyModule_AddIntConstant(m, "MSG_DONTROUTE", MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004097#endif
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00004098#ifdef MSG_DONTWAIT
Fred Drake4baedc12002-04-01 14:53:37 +00004099 PyModule_AddIntConstant(m, "MSG_DONTWAIT", MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00004100#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004101#ifdef MSG_EOR
Fred Drake4baedc12002-04-01 14:53:37 +00004102 PyModule_AddIntConstant(m, "MSG_EOR", MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004103#endif
4104#ifdef MSG_TRUNC
Fred Drake4baedc12002-04-01 14:53:37 +00004105 PyModule_AddIntConstant(m, "MSG_TRUNC", MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004106#endif
4107#ifdef MSG_CTRUNC
Fred Drake4baedc12002-04-01 14:53:37 +00004108 PyModule_AddIntConstant(m, "MSG_CTRUNC", MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004109#endif
4110#ifdef MSG_WAITALL
Fred Drake4baedc12002-04-01 14:53:37 +00004111 PyModule_AddIntConstant(m, "MSG_WAITALL", MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004112#endif
4113#ifdef MSG_BTAG
Fred Drake4baedc12002-04-01 14:53:37 +00004114 PyModule_AddIntConstant(m, "MSG_BTAG", MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004115#endif
4116#ifdef MSG_ETAG
Fred Drake4baedc12002-04-01 14:53:37 +00004117 PyModule_AddIntConstant(m, "MSG_ETAG", MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004118#endif
4119
4120 /* Protocol level and numbers, usable for [gs]etsockopt */
4121#ifdef SOL_SOCKET
Fred Drake4baedc12002-04-01 14:53:37 +00004122 PyModule_AddIntConstant(m, "SOL_SOCKET", SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004123#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00004124#ifdef SOL_IP
Fred Drake4baedc12002-04-01 14:53:37 +00004125 PyModule_AddIntConstant(m, "SOL_IP", SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00004126#else
Fred Drake4baedc12002-04-01 14:53:37 +00004127 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00004128#endif
4129#ifdef SOL_IPX
Fred Drake4baedc12002-04-01 14:53:37 +00004130 PyModule_AddIntConstant(m, "SOL_IPX", SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00004131#endif
4132#ifdef SOL_AX25
Fred Drake4baedc12002-04-01 14:53:37 +00004133 PyModule_AddIntConstant(m, "SOL_AX25", SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00004134#endif
4135#ifdef SOL_ATALK
Fred Drake4baedc12002-04-01 14:53:37 +00004136 PyModule_AddIntConstant(m, "SOL_ATALK", SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00004137#endif
4138#ifdef SOL_NETROM
Fred Drake4baedc12002-04-01 14:53:37 +00004139 PyModule_AddIntConstant(m, "SOL_NETROM", SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00004140#endif
4141#ifdef SOL_ROSE
Fred Drake4baedc12002-04-01 14:53:37 +00004142 PyModule_AddIntConstant(m, "SOL_ROSE", SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00004143#endif
4144#ifdef SOL_TCP
Fred Drake4baedc12002-04-01 14:53:37 +00004145 PyModule_AddIntConstant(m, "SOL_TCP", SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00004146#else
Fred Drake4baedc12002-04-01 14:53:37 +00004147 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00004148#endif
4149#ifdef SOL_UDP
Fred Drake4baedc12002-04-01 14:53:37 +00004150 PyModule_AddIntConstant(m, "SOL_UDP", SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00004151#else
Fred Drake4baedc12002-04-01 14:53:37 +00004152 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00004153#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004154#ifdef IPPROTO_IP
Fred Drake4baedc12002-04-01 14:53:37 +00004155 PyModule_AddIntConstant(m, "IPPROTO_IP", IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00004156#else
Fred Drake4baedc12002-04-01 14:53:37 +00004157 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004158#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004159#ifdef IPPROTO_HOPOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00004160 PyModule_AddIntConstant(m, "IPPROTO_HOPOPTS", IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004161#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004162#ifdef IPPROTO_ICMP
Fred Drake4baedc12002-04-01 14:53:37 +00004163 PyModule_AddIntConstant(m, "IPPROTO_ICMP", IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00004164#else
Fred Drake4baedc12002-04-01 14:53:37 +00004165 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004166#endif
4167#ifdef IPPROTO_IGMP
Fred Drake4baedc12002-04-01 14:53:37 +00004168 PyModule_AddIntConstant(m, "IPPROTO_IGMP", IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004169#endif
4170#ifdef IPPROTO_GGP
Fred Drake4baedc12002-04-01 14:53:37 +00004171 PyModule_AddIntConstant(m, "IPPROTO_GGP", IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004172#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004173#ifdef IPPROTO_IPV4
Fred Drake4baedc12002-04-01 14:53:37 +00004174 PyModule_AddIntConstant(m, "IPPROTO_IPV4", IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004175#endif
Martin v. Löwisa0f17342003-10-03 13:56:20 +00004176#ifdef IPPROTO_IPV6
4177 PyModule_AddIntConstant(m, "IPPROTO_IPV6", IPPROTO_IPV6);
4178#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004179#ifdef IPPROTO_IPIP
Fred Drake4baedc12002-04-01 14:53:37 +00004180 PyModule_AddIntConstant(m, "IPPROTO_IPIP", IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004181#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004182#ifdef IPPROTO_TCP
Fred Drake4baedc12002-04-01 14:53:37 +00004183 PyModule_AddIntConstant(m, "IPPROTO_TCP", IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00004184#else
Fred Drake4baedc12002-04-01 14:53:37 +00004185 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004186#endif
4187#ifdef IPPROTO_EGP
Fred Drake4baedc12002-04-01 14:53:37 +00004188 PyModule_AddIntConstant(m, "IPPROTO_EGP", IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004189#endif
4190#ifdef IPPROTO_PUP
Fred Drake4baedc12002-04-01 14:53:37 +00004191 PyModule_AddIntConstant(m, "IPPROTO_PUP", IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004192#endif
4193#ifdef IPPROTO_UDP
Fred Drake4baedc12002-04-01 14:53:37 +00004194 PyModule_AddIntConstant(m, "IPPROTO_UDP", IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00004195#else
Fred Drake4baedc12002-04-01 14:53:37 +00004196 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004197#endif
4198#ifdef IPPROTO_IDP
Fred Drake4baedc12002-04-01 14:53:37 +00004199 PyModule_AddIntConstant(m, "IPPROTO_IDP", IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004200#endif
4201#ifdef IPPROTO_HELLO
Fred Drake4baedc12002-04-01 14:53:37 +00004202 PyModule_AddIntConstant(m, "IPPROTO_HELLO", IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004203#endif
4204#ifdef IPPROTO_ND
Fred Drake4baedc12002-04-01 14:53:37 +00004205 PyModule_AddIntConstant(m, "IPPROTO_ND", IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004206#endif
4207#ifdef IPPROTO_TP
Fred Drake4baedc12002-04-01 14:53:37 +00004208 PyModule_AddIntConstant(m, "IPPROTO_TP", IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004209#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004210#ifdef IPPROTO_IPV6
Fred Drake4baedc12002-04-01 14:53:37 +00004211 PyModule_AddIntConstant(m, "IPPROTO_IPV6", IPPROTO_IPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004212#endif
4213#ifdef IPPROTO_ROUTING
Fred Drake4baedc12002-04-01 14:53:37 +00004214 PyModule_AddIntConstant(m, "IPPROTO_ROUTING", IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004215#endif
4216#ifdef IPPROTO_FRAGMENT
Fred Drake4baedc12002-04-01 14:53:37 +00004217 PyModule_AddIntConstant(m, "IPPROTO_FRAGMENT", IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004218#endif
4219#ifdef IPPROTO_RSVP
Fred Drake4baedc12002-04-01 14:53:37 +00004220 PyModule_AddIntConstant(m, "IPPROTO_RSVP", IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004221#endif
4222#ifdef IPPROTO_GRE
Fred Drake4baedc12002-04-01 14:53:37 +00004223 PyModule_AddIntConstant(m, "IPPROTO_GRE", IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004224#endif
4225#ifdef IPPROTO_ESP
Fred Drake4baedc12002-04-01 14:53:37 +00004226 PyModule_AddIntConstant(m, "IPPROTO_ESP", IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004227#endif
4228#ifdef IPPROTO_AH
Fred Drake4baedc12002-04-01 14:53:37 +00004229 PyModule_AddIntConstant(m, "IPPROTO_AH", IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004230#endif
4231#ifdef IPPROTO_MOBILE
Fred Drake4baedc12002-04-01 14:53:37 +00004232 PyModule_AddIntConstant(m, "IPPROTO_MOBILE", IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004233#endif
4234#ifdef IPPROTO_ICMPV6
Fred Drake4baedc12002-04-01 14:53:37 +00004235 PyModule_AddIntConstant(m, "IPPROTO_ICMPV6", IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004236#endif
4237#ifdef IPPROTO_NONE
Fred Drake4baedc12002-04-01 14:53:37 +00004238 PyModule_AddIntConstant(m, "IPPROTO_NONE", IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004239#endif
4240#ifdef IPPROTO_DSTOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00004241 PyModule_AddIntConstant(m, "IPPROTO_DSTOPTS", IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004242#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004243#ifdef IPPROTO_XTP
Fred Drake4baedc12002-04-01 14:53:37 +00004244 PyModule_AddIntConstant(m, "IPPROTO_XTP", IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004245#endif
4246#ifdef IPPROTO_EON
Fred Drake4baedc12002-04-01 14:53:37 +00004247 PyModule_AddIntConstant(m, "IPPROTO_EON", IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004248#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004249#ifdef IPPROTO_PIM
Fred Drake4baedc12002-04-01 14:53:37 +00004250 PyModule_AddIntConstant(m, "IPPROTO_PIM", IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004251#endif
4252#ifdef IPPROTO_IPCOMP
Fred Drake4baedc12002-04-01 14:53:37 +00004253 PyModule_AddIntConstant(m, "IPPROTO_IPCOMP", IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004254#endif
4255#ifdef IPPROTO_VRRP
Fred Drake4baedc12002-04-01 14:53:37 +00004256 PyModule_AddIntConstant(m, "IPPROTO_VRRP", IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004257#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004258#ifdef IPPROTO_BIP
Fred Drake4baedc12002-04-01 14:53:37 +00004259 PyModule_AddIntConstant(m, "IPPROTO_BIP", IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004260#endif
4261/**/
4262#ifdef IPPROTO_RAW
Fred Drake4baedc12002-04-01 14:53:37 +00004263 PyModule_AddIntConstant(m, "IPPROTO_RAW", IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00004264#else
Fred Drake4baedc12002-04-01 14:53:37 +00004265 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004266#endif
4267#ifdef IPPROTO_MAX
Fred Drake4baedc12002-04-01 14:53:37 +00004268 PyModule_AddIntConstant(m, "IPPROTO_MAX", IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004269#endif
4270
4271 /* Some port configuration */
4272#ifdef IPPORT_RESERVED
Fred Drake4baedc12002-04-01 14:53:37 +00004273 PyModule_AddIntConstant(m, "IPPORT_RESERVED", IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004274#else
Fred Drake4baedc12002-04-01 14:53:37 +00004275 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004276#endif
4277#ifdef IPPORT_USERRESERVED
Fred Drake4baedc12002-04-01 14:53:37 +00004278 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004279#else
Fred Drake4baedc12002-04-01 14:53:37 +00004280 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004281#endif
4282
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004283 /* Some reserved IP v.4 addresses */
4284#ifdef INADDR_ANY
Fred Drake4baedc12002-04-01 14:53:37 +00004285 PyModule_AddIntConstant(m, "INADDR_ANY", INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004286#else
Fred Drake4baedc12002-04-01 14:53:37 +00004287 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004288#endif
4289#ifdef INADDR_BROADCAST
Fred Drake4baedc12002-04-01 14:53:37 +00004290 PyModule_AddIntConstant(m, "INADDR_BROADCAST", INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004291#else
Fred Drake4baedc12002-04-01 14:53:37 +00004292 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004293#endif
4294#ifdef INADDR_LOOPBACK
Fred Drake4baedc12002-04-01 14:53:37 +00004295 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004296#else
Fred Drake4baedc12002-04-01 14:53:37 +00004297 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004298#endif
4299#ifdef INADDR_UNSPEC_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00004300 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004301#else
Fred Drake4baedc12002-04-01 14:53:37 +00004302 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004303#endif
4304#ifdef INADDR_ALLHOSTS_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00004305 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
4306 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004307#else
Fred Drake4baedc12002-04-01 14:53:37 +00004308 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004309#endif
4310#ifdef INADDR_MAX_LOCAL_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00004311 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP",
4312 INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004313#else
Fred Drake4baedc12002-04-01 14:53:37 +00004314 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004315#endif
4316#ifdef INADDR_NONE
Fred Drake4baedc12002-04-01 14:53:37 +00004317 PyModule_AddIntConstant(m, "INADDR_NONE", INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004318#else
Fred Drake4baedc12002-04-01 14:53:37 +00004319 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004320#endif
4321
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004322 /* IPv4 [gs]etsockopt options */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004323#ifdef IP_OPTIONS
Fred Drake4baedc12002-04-01 14:53:37 +00004324 PyModule_AddIntConstant(m, "IP_OPTIONS", IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004325#endif
4326#ifdef IP_HDRINCL
Fred Drake4baedc12002-04-01 14:53:37 +00004327 PyModule_AddIntConstant(m, "IP_HDRINCL", IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004328#endif
4329#ifdef IP_TOS
Fred Drake4baedc12002-04-01 14:53:37 +00004330 PyModule_AddIntConstant(m, "IP_TOS", IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004331#endif
4332#ifdef IP_TTL
Fred Drake4baedc12002-04-01 14:53:37 +00004333 PyModule_AddIntConstant(m, "IP_TTL", IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004334#endif
4335#ifdef IP_RECVOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00004336 PyModule_AddIntConstant(m, "IP_RECVOPTS", IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004337#endif
4338#ifdef IP_RECVRETOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00004339 PyModule_AddIntConstant(m, "IP_RECVRETOPTS", IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004340#endif
4341#ifdef IP_RECVDSTADDR
Fred Drake4baedc12002-04-01 14:53:37 +00004342 PyModule_AddIntConstant(m, "IP_RECVDSTADDR", IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004343#endif
4344#ifdef IP_RETOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00004345 PyModule_AddIntConstant(m, "IP_RETOPTS", IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004346#endif
4347#ifdef IP_MULTICAST_IF
Fred Drake4baedc12002-04-01 14:53:37 +00004348 PyModule_AddIntConstant(m, "IP_MULTICAST_IF", IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004349#endif
4350#ifdef IP_MULTICAST_TTL
Fred Drake4baedc12002-04-01 14:53:37 +00004351 PyModule_AddIntConstant(m, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004352#endif
4353#ifdef IP_MULTICAST_LOOP
Fred Drake4baedc12002-04-01 14:53:37 +00004354 PyModule_AddIntConstant(m, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004355#endif
4356#ifdef IP_ADD_MEMBERSHIP
Fred Drake4baedc12002-04-01 14:53:37 +00004357 PyModule_AddIntConstant(m, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004358#endif
4359#ifdef IP_DROP_MEMBERSHIP
Fred Drake4baedc12002-04-01 14:53:37 +00004360 PyModule_AddIntConstant(m, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004361#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00004362#ifdef IP_DEFAULT_MULTICAST_TTL
Fred Drake4baedc12002-04-01 14:53:37 +00004363 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_TTL",
4364 IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00004365#endif
4366#ifdef IP_DEFAULT_MULTICAST_LOOP
Fred Drake4baedc12002-04-01 14:53:37 +00004367 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_LOOP",
4368 IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00004369#endif
4370#ifdef IP_MAX_MEMBERSHIPS
Fred Drake4baedc12002-04-01 14:53:37 +00004371 PyModule_AddIntConstant(m, "IP_MAX_MEMBERSHIPS", IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00004372#endif
4373
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004374 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
4375#ifdef IPV6_JOIN_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00004376 PyModule_AddIntConstant(m, "IPV6_JOIN_GROUP", IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004377#endif
4378#ifdef IPV6_LEAVE_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00004379 PyModule_AddIntConstant(m, "IPV6_LEAVE_GROUP", IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004380#endif
4381#ifdef IPV6_MULTICAST_HOPS
Fred Drake4baedc12002-04-01 14:53:37 +00004382 PyModule_AddIntConstant(m, "IPV6_MULTICAST_HOPS", IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004383#endif
4384#ifdef IPV6_MULTICAST_IF
Fred Drake4baedc12002-04-01 14:53:37 +00004385 PyModule_AddIntConstant(m, "IPV6_MULTICAST_IF", IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004386#endif
4387#ifdef IPV6_MULTICAST_LOOP
Fred Drake4baedc12002-04-01 14:53:37 +00004388 PyModule_AddIntConstant(m, "IPV6_MULTICAST_LOOP", IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004389#endif
4390#ifdef IPV6_UNICAST_HOPS
Fred Drake4baedc12002-04-01 14:53:37 +00004391 PyModule_AddIntConstant(m, "IPV6_UNICAST_HOPS", IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004392#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00004393 /* Additional IPV6 socket options, defined in RFC 3493 */
4394#ifdef IPV6_V6ONLY
4395 PyModule_AddIntConstant(m, "IPV6_V6ONLY", IPV6_V6ONLY);
4396#endif
4397 /* Advanced IPV6 socket options, from RFC 3542 */
4398#ifdef IPV6_CHECKSUM
4399 PyModule_AddIntConstant(m, "IPV6_CHECKSUM", IPV6_CHECKSUM);
4400#endif
4401#ifdef IPV6_DONTFRAG
4402 PyModule_AddIntConstant(m, "IPV6_DONTFRAG", IPV6_DONTFRAG);
4403#endif
4404#ifdef IPV6_DSTOPTS
4405 PyModule_AddIntConstant(m, "IPV6_DSTOPTS", IPV6_DSTOPTS);
4406#endif
4407#ifdef IPV6_HOPLIMIT
4408 PyModule_AddIntConstant(m, "IPV6_HOPLIMIT", IPV6_HOPLIMIT);
4409#endif
4410#ifdef IPV6_HOPOPTS
4411 PyModule_AddIntConstant(m, "IPV6_HOPOPTS", IPV6_HOPOPTS);
4412#endif
4413#ifdef IPV6_NEXTHOP
4414 PyModule_AddIntConstant(m, "IPV6_NEXTHOP", IPV6_NEXTHOP);
4415#endif
4416#ifdef IPV6_PATHMTU
4417 PyModule_AddIntConstant(m, "IPV6_PATHMTU", IPV6_PATHMTU);
4418#endif
4419#ifdef IPV6_PKTINFO
4420 PyModule_AddIntConstant(m, "IPV6_PKTINFO", IPV6_PKTINFO);
4421#endif
4422#ifdef IPV6_RECVDSTOPTS
4423 PyModule_AddIntConstant(m, "IPV6_RECVDSTOPTS", IPV6_RECVDSTOPTS);
4424#endif
4425#ifdef IPV6_RECVHOPLIMIT
4426 PyModule_AddIntConstant(m, "IPV6_RECVHOPLIMIT", IPV6_RECVHOPLIMIT);
4427#endif
4428#ifdef IPV6_RECVHOPOPTS
4429 PyModule_AddIntConstant(m, "IPV6_RECVHOPOPTS", IPV6_RECVHOPOPTS);
4430#endif
4431#ifdef IPV6_RECVPKTINFO
4432 PyModule_AddIntConstant(m, "IPV6_RECVPKTINFO", IPV6_RECVPKTINFO);
4433#endif
4434#ifdef IPV6_RECVRTHDR
4435 PyModule_AddIntConstant(m, "IPV6_RECVRTHDR", IPV6_RECVRTHDR);
4436#endif
4437#ifdef IPV6_RECVTCLASS
4438 PyModule_AddIntConstant(m, "IPV6_RECVTCLASS", IPV6_RECVTCLASS);
4439#endif
4440#ifdef IPV6_RTHDR
4441 PyModule_AddIntConstant(m, "IPV6_RTHDR", IPV6_RTHDR);
4442#endif
4443#ifdef IPV6_RTHDRDSTOPTS
4444 PyModule_AddIntConstant(m, "IPV6_RTHDRDSTOPTS", IPV6_RTHDRDSTOPTS);
4445#endif
4446#ifdef IPV6_RTHDR_TYPE_0
4447 PyModule_AddIntConstant(m, "IPV6_RTHDR_TYPE_0", IPV6_RTHDR_TYPE_0);
4448#endif
4449#ifdef IPV6_RECVPATHMTU
4450 PyModule_AddIntConstant(m, "IPV6_RECVPATHMTU", IPV6_RECVPATHMTU);
4451#endif
4452#ifdef IPV6_TCLASS
4453 PyModule_AddIntConstant(m, "IPV6_TCLASS", IPV6_TCLASS);
4454#endif
4455#ifdef IPV6_USE_MIN_MTU
4456 PyModule_AddIntConstant(m, "IPV6_USE_MIN_MTU", IPV6_USE_MIN_MTU);
4457#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004458
Guido van Rossum09be4091999-08-09 14:40:40 +00004459 /* TCP options */
4460#ifdef TCP_NODELAY
Fred Drake4baedc12002-04-01 14:53:37 +00004461 PyModule_AddIntConstant(m, "TCP_NODELAY", TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00004462#endif
4463#ifdef TCP_MAXSEG
Fred Drake4baedc12002-04-01 14:53:37 +00004464 PyModule_AddIntConstant(m, "TCP_MAXSEG", TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00004465#endif
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004466#ifdef TCP_CORK
Fred Drake4baedc12002-04-01 14:53:37 +00004467 PyModule_AddIntConstant(m, "TCP_CORK", TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004468#endif
4469#ifdef TCP_KEEPIDLE
Fred Drake4baedc12002-04-01 14:53:37 +00004470 PyModule_AddIntConstant(m, "TCP_KEEPIDLE", TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004471#endif
4472#ifdef TCP_KEEPINTVL
Fred Drake4baedc12002-04-01 14:53:37 +00004473 PyModule_AddIntConstant(m, "TCP_KEEPINTVL", TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004474#endif
4475#ifdef TCP_KEEPCNT
Fred Drake4baedc12002-04-01 14:53:37 +00004476 PyModule_AddIntConstant(m, "TCP_KEEPCNT", TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004477#endif
4478#ifdef TCP_SYNCNT
Fred Drake4baedc12002-04-01 14:53:37 +00004479 PyModule_AddIntConstant(m, "TCP_SYNCNT", TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004480#endif
4481#ifdef TCP_LINGER2
Fred Drake4baedc12002-04-01 14:53:37 +00004482 PyModule_AddIntConstant(m, "TCP_LINGER2", TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004483#endif
4484#ifdef TCP_DEFER_ACCEPT
Fred Drake4baedc12002-04-01 14:53:37 +00004485 PyModule_AddIntConstant(m, "TCP_DEFER_ACCEPT", TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004486#endif
4487#ifdef TCP_WINDOW_CLAMP
Fred Drake4baedc12002-04-01 14:53:37 +00004488 PyModule_AddIntConstant(m, "TCP_WINDOW_CLAMP", TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004489#endif
4490#ifdef TCP_INFO
Fred Drake4baedc12002-04-01 14:53:37 +00004491 PyModule_AddIntConstant(m, "TCP_INFO", TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004492#endif
4493#ifdef TCP_QUICKACK
Fred Drake4baedc12002-04-01 14:53:37 +00004494 PyModule_AddIntConstant(m, "TCP_QUICKACK", TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004495#endif
4496
Guido van Rossum09be4091999-08-09 14:40:40 +00004497
4498 /* IPX options */
4499#ifdef IPX_TYPE
Fred Drake4baedc12002-04-01 14:53:37 +00004500 PyModule_AddIntConstant(m, "IPX_TYPE", IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00004501#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004502
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004503 /* get{addr,name}info parameters */
4504#ifdef EAI_ADDRFAMILY
Fred Drake4baedc12002-04-01 14:53:37 +00004505 PyModule_AddIntConstant(m, "EAI_ADDRFAMILY", EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004506#endif
4507#ifdef EAI_AGAIN
Fred Drake4baedc12002-04-01 14:53:37 +00004508 PyModule_AddIntConstant(m, "EAI_AGAIN", EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004509#endif
4510#ifdef EAI_BADFLAGS
Fred Drake4baedc12002-04-01 14:53:37 +00004511 PyModule_AddIntConstant(m, "EAI_BADFLAGS", EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004512#endif
4513#ifdef EAI_FAIL
Fred Drake4baedc12002-04-01 14:53:37 +00004514 PyModule_AddIntConstant(m, "EAI_FAIL", EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004515#endif
4516#ifdef EAI_FAMILY
Fred Drake4baedc12002-04-01 14:53:37 +00004517 PyModule_AddIntConstant(m, "EAI_FAMILY", EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004518#endif
4519#ifdef EAI_MEMORY
Fred Drake4baedc12002-04-01 14:53:37 +00004520 PyModule_AddIntConstant(m, "EAI_MEMORY", EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004521#endif
4522#ifdef EAI_NODATA
Fred Drake4baedc12002-04-01 14:53:37 +00004523 PyModule_AddIntConstant(m, "EAI_NODATA", EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004524#endif
4525#ifdef EAI_NONAME
Fred Drake4baedc12002-04-01 14:53:37 +00004526 PyModule_AddIntConstant(m, "EAI_NONAME", EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004527#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00004528#ifdef EAI_OVERFLOW
4529 PyModule_AddIntConstant(m, "EAI_OVERFLOW", EAI_OVERFLOW);
4530#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004531#ifdef EAI_SERVICE
Fred Drake4baedc12002-04-01 14:53:37 +00004532 PyModule_AddIntConstant(m, "EAI_SERVICE", EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004533#endif
4534#ifdef EAI_SOCKTYPE
Fred Drake4baedc12002-04-01 14:53:37 +00004535 PyModule_AddIntConstant(m, "EAI_SOCKTYPE", EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004536#endif
4537#ifdef EAI_SYSTEM
Fred Drake4baedc12002-04-01 14:53:37 +00004538 PyModule_AddIntConstant(m, "EAI_SYSTEM", EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004539#endif
4540#ifdef EAI_BADHINTS
Fred Drake4baedc12002-04-01 14:53:37 +00004541 PyModule_AddIntConstant(m, "EAI_BADHINTS", EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004542#endif
4543#ifdef EAI_PROTOCOL
Fred Drake4baedc12002-04-01 14:53:37 +00004544 PyModule_AddIntConstant(m, "EAI_PROTOCOL", EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004545#endif
4546#ifdef EAI_MAX
Fred Drake4baedc12002-04-01 14:53:37 +00004547 PyModule_AddIntConstant(m, "EAI_MAX", EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004548#endif
4549#ifdef AI_PASSIVE
Fred Drake4baedc12002-04-01 14:53:37 +00004550 PyModule_AddIntConstant(m, "AI_PASSIVE", AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004551#endif
4552#ifdef AI_CANONNAME
Fred Drake4baedc12002-04-01 14:53:37 +00004553 PyModule_AddIntConstant(m, "AI_CANONNAME", AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004554#endif
4555#ifdef AI_NUMERICHOST
Fred Drake4baedc12002-04-01 14:53:37 +00004556 PyModule_AddIntConstant(m, "AI_NUMERICHOST", AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004557#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00004558#ifdef AI_NUMERICSERV
4559 PyModule_AddIntConstant(m, "AI_NUMERICSERV", AI_NUMERICSERV);
4560#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004561#ifdef AI_MASK
Fred Drake4baedc12002-04-01 14:53:37 +00004562 PyModule_AddIntConstant(m, "AI_MASK", AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004563#endif
4564#ifdef AI_ALL
Fred Drake4baedc12002-04-01 14:53:37 +00004565 PyModule_AddIntConstant(m, "AI_ALL", AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004566#endif
4567#ifdef AI_V4MAPPED_CFG
Fred Drake4baedc12002-04-01 14:53:37 +00004568 PyModule_AddIntConstant(m, "AI_V4MAPPED_CFG", AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004569#endif
4570#ifdef AI_ADDRCONFIG
Fred Drake4baedc12002-04-01 14:53:37 +00004571 PyModule_AddIntConstant(m, "AI_ADDRCONFIG", AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004572#endif
4573#ifdef AI_V4MAPPED
Fred Drake4baedc12002-04-01 14:53:37 +00004574 PyModule_AddIntConstant(m, "AI_V4MAPPED", AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004575#endif
4576#ifdef AI_DEFAULT
Fred Drake4baedc12002-04-01 14:53:37 +00004577 PyModule_AddIntConstant(m, "AI_DEFAULT", AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004578#endif
4579#ifdef NI_MAXHOST
Fred Drake4baedc12002-04-01 14:53:37 +00004580 PyModule_AddIntConstant(m, "NI_MAXHOST", NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004581#endif
4582#ifdef NI_MAXSERV
Fred Drake4baedc12002-04-01 14:53:37 +00004583 PyModule_AddIntConstant(m, "NI_MAXSERV", NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004584#endif
4585#ifdef NI_NOFQDN
Fred Drake4baedc12002-04-01 14:53:37 +00004586 PyModule_AddIntConstant(m, "NI_NOFQDN", NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004587#endif
4588#ifdef NI_NUMERICHOST
Fred Drake4baedc12002-04-01 14:53:37 +00004589 PyModule_AddIntConstant(m, "NI_NUMERICHOST", NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004590#endif
4591#ifdef NI_NAMEREQD
Fred Drake4baedc12002-04-01 14:53:37 +00004592 PyModule_AddIntConstant(m, "NI_NAMEREQD", NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004593#endif
4594#ifdef NI_NUMERICSERV
Fred Drake4baedc12002-04-01 14:53:37 +00004595 PyModule_AddIntConstant(m, "NI_NUMERICSERV", NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004596#endif
4597#ifdef NI_DGRAM
Fred Drake4baedc12002-04-01 14:53:37 +00004598 PyModule_AddIntConstant(m, "NI_DGRAM", NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004599#endif
4600
Martin v. Löwis94681fc2003-11-27 19:40:22 +00004601 /* shutdown() parameters */
4602#ifdef SHUT_RD
4603 PyModule_AddIntConstant(m, "SHUT_RD", SHUT_RD);
4604#elif defined(SD_RECEIVE)
4605 PyModule_AddIntConstant(m, "SHUT_RD", SD_RECEIVE);
4606#else
4607 PyModule_AddIntConstant(m, "SHUT_RD", 0);
4608#endif
4609#ifdef SHUT_WR
4610 PyModule_AddIntConstant(m, "SHUT_WR", SHUT_WR);
4611#elif defined(SD_SEND)
4612 PyModule_AddIntConstant(m, "SHUT_WR", SD_SEND);
4613#else
4614 PyModule_AddIntConstant(m, "SHUT_WR", 1);
4615#endif
4616#ifdef SHUT_RDWR
4617 PyModule_AddIntConstant(m, "SHUT_RDWR", SHUT_RDWR);
4618#elif defined(SD_BOTH)
4619 PyModule_AddIntConstant(m, "SHUT_RDWR", SD_BOTH);
4620#else
4621 PyModule_AddIntConstant(m, "SHUT_RDWR", 2);
4622#endif
4623
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004624 /* Initialize gethostbyname lock */
Just van Rossum1040d2c2003-05-09 07:53:18 +00004625#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
4626 netdb_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004627#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004628}
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004629
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004630
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004631#ifndef HAVE_INET_PTON
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004632
4633/* Simplistic emulation code for inet_pton that only works for IPv4 */
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004634/* These are not exposed because they do not set errno properly */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004635
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004636int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004637inet_pton(int af, const char *src, void *dst)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004638{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004639 if (af == AF_INET) {
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004640 long packed_addr;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004641 packed_addr = inet_addr(src);
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004642 if (packed_addr == INADDR_NONE)
4643 return 0;
4644 memcpy(dst, &packed_addr, 4);
4645 return 1;
4646 }
4647 /* Should set errno to EAFNOSUPPORT */
4648 return -1;
4649}
4650
Martin v. Löwisc925b1532001-07-21 09:42:15 +00004651const char *
4652inet_ntop(int af, const void *src, char *dst, socklen_t size)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004653{
4654 if (af == AF_INET) {
4655 struct in_addr packed_addr;
4656 if (size < 16)
4657 /* Should set errno to ENOSPC. */
4658 return NULL;
4659 memcpy(&packed_addr, src, sizeof(packed_addr));
4660 return strncpy(dst, inet_ntoa(packed_addr), size);
4661 }
4662 /* Should set errno to EAFNOSUPPORT */
4663 return NULL;
4664}
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004665
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004666#endif