blob: 46015f16cd47bb8a671ace7cbb05a7e965621fd8 [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
Guido van Rossum006bf911996-06-12 04:04:55 +000031- socket.ntohs(16 bit value) --> new int object
32- socket.ntohl(32 bit value) --> new int object
33- socket.htons(16 bit value) --> new int object
34- socket.htonl(32 bit value) --> new int object
Martin v. Löwis2d8d4272001-07-21 18:05:31 +000035- socket.getaddrinfo(host, port [, family, socktype, proto, flags])
36 --> List of (family, socktype, proto, canonname, sockaddr)
37- socket.getnameinfo(sockaddr, flags) --> (host, port)
Guido van Rossum27e177d1995-03-16 15:43:47 +000038- socket.AF_INET, socket.SOCK_STREAM, etc.: constants from <socket.h>
Guido van Rossum47dfa4a2003-04-25 05:48:32 +000039- socket.has_ipv6: boolean value indicating if IPv6 is supported
Guido van Rossum5c9eb211999-08-20 18:21:51 +000040- socket.inet_aton(IP address) -> 32-bit packed IP representation
41- socket.inet_ntoa(packed IP) -> IP address string
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +000042- socket.getdefaulttimeout() -> None | float
43- socket.setdefaulttimeout(None | float)
Guido van Rossum6574b3e1991-06-25 21:36:08 +000044- an Internet socket address is a pair (hostname, port)
45 where hostname can be anything recognized by gethostbyname()
46 (including the dd.dd.dd.dd notation) and port is in host byte order
47- where a hostname is returned, the dd.dd.dd.dd notation is used
Guido van Rossum27e177d1995-03-16 15:43:47 +000048- a UNIX domain socket address is a string specifying the pathname
Jeremy Hylton22308652001-02-02 03:23:09 +000049- an AF_PACKET socket address is a tuple containing a string
50 specifying the ethernet interface and an integer specifying
51 the Ethernet protocol number to be received. For example:
Jeremy Hyltondbfb6622001-02-02 19:55:17 +000052 ("eth0",0x1234). Optional 3rd,4th,5th elements in the tuple
53 specify packet-type and ha-type/addr -- these are ignored by
Jeremy Hylton22308652001-02-02 03:23:09 +000054 networking code, but accepted since they are returned by the
55 getsockname() method.
Guido van Rossum6574b3e1991-06-25 21:36:08 +000056
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000057Local naming conventions:
Guido van Rossum6574b3e1991-06-25 21:36:08 +000058
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000059- names starting with sock_ are socket object methods
60- names starting with socket_ are module-level functions
61- names starting with PySocket are exported through socketmodule.h
Guido van Rossum30a685f1991-06-27 15:51:29 +000062
Guido van Rossum6574b3e1991-06-25 21:36:08 +000063*/
64
Michael W. Hudson76b8cc82004-05-26 17:06:31 +000065#if defined(__sgi) && _COMPILER_VERSION>700 && !_SGIAPI
66#define _BSD_TYPES
67#endif
68
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000069#include "Python.h"
70
Guido van Rossum47dfa4a2003-04-25 05:48:32 +000071#undef MAX
72#define MAX(x, y) ((x) < (y) ? (y) : (x))
73
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000074/* Socket object documentation */
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000075PyDoc_STRVAR(sock_doc,
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000076"socket([family[, type[, proto]]]) -> socket object\n\
77\n\
78Open a socket of the given type. The family argument specifies the\n\
79address family; it defaults to AF_INET. The type argument specifies\n\
80whether this is a stream (SOCK_STREAM, this is the default)\n\
81or datagram (SOCK_DGRAM) socket. The protocol argument defaults to 0,\n\
82specifying the default protocol. Keyword arguments are accepted.\n\
83\n\
84A socket object represents one endpoint of a network connection.\n\
85\n\
86Methods of socket objects (keyword arguments not allowed):\n\
87\n\
88accept() -- accept a connection, returning new socket and client address\n\
89bind(addr) -- bind the socket to a local address\n\
90close() -- close the socket\n\
91connect(addr) -- connect the socket to a remote address\n\
92connect_ex(addr) -- connect, return an error code instead of an exception\n\
93dup() -- return a new socket object identical to the current one [*]\n\
94fileno() -- return underlying file descriptor\n\
95getpeername() -- return remote address [*]\n\
96getsockname() -- return local address\n\
97getsockopt(level, optname[, buflen]) -- get socket options\n\
98gettimeout() -- return timeout or None\n\
99listen(n) -- start listening for incoming connections\n\
100makefile([mode, [bufsize]]) -- return a file object for the socket [*]\n\
101recv(buflen[, flags]) -- receive data\n\
102recvfrom(buflen[, flags]) -- receive data and sender's address\n\
103sendall(data[, flags]) -- send all data\n\
104send(data[, flags]) -- send data, may not send all of it\n\
105sendto(data[, flags], addr) -- send data to a given address\n\
106setblocking(0 | 1) -- set or clear the blocking I/O flag\n\
107setsockopt(level, optname, value) -- set socket options\n\
108settimeout(None | float) -- set or clear the timeout\n\
109shutdown(how) -- shut down traffic in one or both directions\n\
110\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000111 [*] not available on all platforms!");
Guido van Rossum3baaa131999-03-22 21:44:51 +0000112
Walter Dörwaldf0dfc7a2003-10-20 14:01:56 +0000113/* XXX This is a terrible mess of platform-dependent preprocessor hacks.
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000114 I hope some day someone can clean this up please... */
115
Guido van Rossum9376b741999-09-15 22:01:40 +0000116/* Hacks for gethostbyname_r(). On some non-Linux platforms, the configure
117 script doesn't get this right, so we hardcode some platform checks below.
118 On the other hand, not all Linux versions agree, so there the settings
119 computed by the configure script are needed! */
120
121#ifndef linux
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000122# undef HAVE_GETHOSTBYNAME_R_3_ARG
123# undef HAVE_GETHOSTBYNAME_R_5_ARG
124# undef HAVE_GETHOSTBYNAME_R_6_ARG
Guido van Rossum9376b741999-09-15 22:01:40 +0000125#endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000126
Guido van Rossum7a122991999-04-13 04:07:32 +0000127#ifndef WITH_THREAD
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000128# undef HAVE_GETHOSTBYNAME_R
Guido van Rossum7a122991999-04-13 04:07:32 +0000129#endif
130
Guido van Rossume7de2061999-03-24 17:24:33 +0000131#ifdef HAVE_GETHOSTBYNAME_R
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000132# if defined(_AIX) || defined(__osf__)
133# define HAVE_GETHOSTBYNAME_R_3_ARG
134# elif defined(__sun) || defined(__sgi)
135# define HAVE_GETHOSTBYNAME_R_5_ARG
136# elif defined(linux)
Guido van Rossum9376b741999-09-15 22:01:40 +0000137/* Rely on the configure script */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000138# else
139# undef HAVE_GETHOSTBYNAME_R
140# endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000141#endif
142
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000143#if !defined(HAVE_GETHOSTBYNAME_R) && defined(WITH_THREAD) && \
144 !defined(MS_WINDOWS)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000145# define USE_GETHOSTBYNAME_LOCK
Guido van Rossum3baaa131999-03-22 21:44:51 +0000146#endif
147
Just van Rossum1040d2c2003-05-09 07:53:18 +0000148/* On systems on which getaddrinfo() is believed to not be thread-safe,
Just van Rossum09aecd72003-05-09 08:03:44 +0000149 (this includes the getaddrinfo emulation) protect access with a lock. */
Just van Rossum16e426b2003-05-09 08:12:00 +0000150#if defined(WITH_THREAD) && (defined(__APPLE__) || defined(__FreeBSD__) || \
151 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. */
Michael W. Hudson76b8cc82004-05-26 17:06:31 +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
Michael W. Hudson76b8cc82004-05-26 17:06:31 +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>
Guido van Rossum81194471991-07-27 21:42:02 +0000225#include <signal.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000226
Marc-André Lemburg976ade62002-02-16 18:47:07 +0000227/* Generic socket object definitions and includes */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000228#define PySocket_BUILDING_SOCKET
Marc-André Lemburgbb8b78b2002-02-16 18:44:52 +0000229#include "socketmodule.h"
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000230
231/* Addressing includes */
232
Guido van Rossum6f489d91996-06-28 20:15:15 +0000233#ifndef MS_WINDOWS
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000234
235/* Non-MS WINDOWS includes */
236# include <netdb.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000237
Guido van Rossum9376b741999-09-15 22:01:40 +0000238/* Headers needed for inet_ntoa() and inet_addr() */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000239# ifdef __BEOS__
240# include <net/netdb.h>
241# elif defined(PYOS_OS2) && defined(PYCC_VACPP)
242# include <netdb.h>
Tim Peters603c6832001-11-05 02:45:59 +0000243typedef size_t socklen_t;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000244# else
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000245# include <arpa/inet.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000246# endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000247
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000248# ifndef RISCOS
249# include <fcntl.h>
250# else
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000251# include <sys/ioctl.h>
252# include <socklib.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000253# define NO_DUP
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000254int h_errno; /* not used */
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000255# define INET_ADDRSTRLEN 16
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000256# endif
257
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000258#else
Guido van Rossum48a680c2001-03-02 06:34:14 +0000259
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000260/* MS_WINDOWS includes */
261# include <fcntl.h>
Guido van Rossum48a680c2001-03-02 06:34:14 +0000262
Jeremy Hylton22308652001-02-02 03:23:09 +0000263#endif
264
Skip Montanaro7befb992004-02-10 16:50:21 +0000265#include <stddef.h>
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000266
267#ifndef offsetof
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000268# define offsetof(type, member) ((size_t)(&((type *)0)->member))
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000269#endif
270
Neal Norwitz39d22e52002-11-02 19:55:21 +0000271#ifndef O_NONBLOCK
272# define O_NONBLOCK O_NDELAY
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000273#endif
274
Michael W. Hudson76b8cc82004-05-26 17:06:31 +0000275#if defined(__sgi) && _COMPILER_VERSION>700 \
276 && !defined(_SS_ALIGNSIZE) /* defined in sys/socket.h */
277 /* by some newer versions of IRIX */
278 /* (e.g. not by 6.5.10 but by 6.5.21) */
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000279#include "addrinfo.h"
Michael W. Hudson76b8cc82004-05-26 17:06:31 +0000280#endif
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000281
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000282#ifndef HAVE_INET_PTON
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000283int inet_pton(int af, const char *src, void *dst);
Martin v. Löwisc925b1532001-07-21 09:42:15 +0000284const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000285#endif
286
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000287#ifdef __APPLE__
288/* On OS X, getaddrinfo returns no error indication of lookup
289 failure, so we must use the emulation instead of the libinfo
290 implementation. Unfortunately, performing an autoconf test
291 for this bug would require DNS access for the machine performing
292 the configuration, which is not acceptable. Therefore, we
293 determine the bug just by checking for __APPLE__. If this bug
294 gets ever fixed, perhaps checking for sys/version.h would be
295 appropriate, which is 10/0 on the system with the bug. */
Jack Jansen84262fb2002-07-02 14:40:42 +0000296#ifndef HAVE_GETNAMEINFO
297/* This bug seems to be fixed in Jaguar. Ths easiest way I could
298 Find to check for Jaguar is that it has getnameinfo(), which
299 older releases don't have */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000300#undef HAVE_GETADDRINFO
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000301#endif
Jack Jansen84262fb2002-07-02 14:40:42 +0000302#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000303
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000304/* I know this is a bad practice, but it is the easiest... */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000305#if !defined(HAVE_GETADDRINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000306/* avoid clashes with the C library definition of the symbol. */
307#define getaddrinfo fake_getaddrinfo
308#define gai_strerror fake_gai_strerror
309#define freeaddrinfo fake_freeaddrinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000310#include "getaddrinfo.c"
311#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000312#if !defined(HAVE_GETNAMEINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000313#define getnameinfo fake_getnameinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000314#include "getnameinfo.c"
315#endif
316
Guido van Rossumbcc20741998-08-04 22:53:56 +0000317#if defined(MS_WINDOWS) || defined(__BEOS__)
318/* BeOS suffers from the same socket dichotomy as Win32... - [cjh] */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000319/* seem to be a few differences in the API */
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000320#define SOCKETCLOSE closesocket
Guido van Rossumbe32c891996-06-20 16:25:29 +0000321#define NO_DUP /* Actually it exists on NT 3.5, but what the heck... */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000322#endif
323
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000324#ifdef MS_WIN32
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000325#define EAFNOSUPPORT WSAEAFNOSUPPORT
326#define snprintf _snprintf
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000327#endif
Fred Drakea04eaad2000-06-30 02:46:07 +0000328
Andrew MacIntyreba43e872002-03-03 03:03:52 +0000329#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000330#define SOCKETCLOSE soclose
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000331#define NO_DUP /* Sockets are Not Actual File Handles under OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000332#endif
333
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000334#ifndef SOCKETCLOSE
335#define SOCKETCLOSE close
336#endif
337
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000338#ifdef __VMS
339/* TCP/IP Services for VMS uses a maximum send/revc buffer length of 65535 */
340#define SEGMENT_SIZE 65535
341#endif
342
Hye-Shik Chang81268602004-02-02 06:05:24 +0000343#if defined(HAVE_BLUETOOTH_H) || defined(HAVE_BLUETOOTH_BLUETOOTH_H)
344#define USE_BLUETOOTH 1
345#if defined(__FreeBSD__)
346#define BTPROTO_L2CAP BLUETOOTH_PROTO_L2CAP
347#define BTPROTO_RFCOMM BLUETOOTH_PROTO_RFCOMM
348#define sockaddr_l2 sockaddr_l2cap
349#define sockaddr_rc sockaddr_rfcomm
350#define _BT_SOCKADDR_MEMB(s, proto) &((s)->sock_addr)
351#define _BT_L2_MEMB(sa, memb) ((sa)->l2cap_##memb)
352#define _BT_RC_MEMB(sa, memb) ((sa)->rfcomm_##memb)
353#else
Anthony Baxter5d7c0672004-02-16 05:35:28 +0000354#define _BT_SOCKADDR_MEMB(s, proto) (&((s)->sock_addr).bt_##proto)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000355#define _BT_L2_MEMB(sa, memb) ((sa)->l2_##memb)
356#define _BT_RC_MEMB(sa, memb) ((sa)->rc_##memb)
357#define _BT_SCO_MEMB(sa, memb) ((sa)->sco_##memb)
358#endif
359#endif
360
Martin v. Löwise9416172003-05-03 10:12:45 +0000361/*
362 * Constants for getnameinfo()
363 */
364#if !defined(NI_MAXHOST)
365#define NI_MAXHOST 1025
366#endif
367#if !defined(NI_MAXSERV)
368#define NI_MAXSERV 32
369#endif
370
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000371/* XXX There's a problem here: *static* functions are not supposed to have
372 a Py prefix (or use CapitalizedWords). Later... */
373
Guido van Rossum30a685f1991-06-27 15:51:29 +0000374/* Global variable holding the exception type for errors detected
375 by this module (but not argument type or memory errors, etc.). */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000376static PyObject *socket_error;
377static PyObject *socket_herror;
378static PyObject *socket_gaierror;
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000379static PyObject *socket_timeout;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000380
Guido van Rossum48a680c2001-03-02 06:34:14 +0000381#ifdef RISCOS
382/* Global variable which is !=0 if Python is running in a RISC OS taskwindow */
383static int taskwindow;
384#endif
385
Tim Peters643a7fc2002-02-17 04:13:21 +0000386/* A forward reference to the socket type object.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000387 The sock_type variable contains pointers to various functions,
388 some of which call new_sockobject(), which uses sock_type, so
Tim Peters643a7fc2002-02-17 04:13:21 +0000389 there has to be a circular reference. */
Jeremy Hylton938ace62002-07-17 16:30:39 +0000390static PyTypeObject sock_type;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000391
Guido van Rossum30a685f1991-06-27 15:51:29 +0000392/* Convenience function to raise an error according to errno
393 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000394
Guido van Rossum73624e91994-10-10 17:59:00 +0000395static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000396set_error(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000397{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000398#ifdef MS_WINDOWS
Mark Hammond46a733d2000-07-24 01:45:11 +0000399 int err_no = WSAGetLastError();
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000400 static struct {
401 int no;
402 const char *msg;
403 } *msgp, msgs[] = {
404 {WSAEINTR, "Interrupted system call"},
405 {WSAEBADF, "Bad file descriptor"},
406 {WSAEACCES, "Permission denied"},
407 {WSAEFAULT, "Bad address"},
408 {WSAEINVAL, "Invalid argument"},
409 {WSAEMFILE, "Too many open files"},
410 {WSAEWOULDBLOCK,
411 "The socket operation could not complete "
412 "without blocking"},
413 {WSAEINPROGRESS, "Operation now in progress"},
414 {WSAEALREADY, "Operation already in progress"},
415 {WSAENOTSOCK, "Socket operation on non-socket"},
416 {WSAEDESTADDRREQ, "Destination address required"},
417 {WSAEMSGSIZE, "Message too long"},
418 {WSAEPROTOTYPE, "Protocol wrong type for socket"},
419 {WSAENOPROTOOPT, "Protocol not available"},
420 {WSAEPROTONOSUPPORT, "Protocol not supported"},
421 {WSAESOCKTNOSUPPORT, "Socket type not supported"},
422 {WSAEOPNOTSUPP, "Operation not supported"},
423 {WSAEPFNOSUPPORT, "Protocol family not supported"},
424 {WSAEAFNOSUPPORT, "Address family not supported"},
425 {WSAEADDRINUSE, "Address already in use"},
426 {WSAEADDRNOTAVAIL, "Can't assign requested address"},
427 {WSAENETDOWN, "Network is down"},
428 {WSAENETUNREACH, "Network is unreachable"},
429 {WSAENETRESET, "Network dropped connection on reset"},
430 {WSAECONNABORTED, "Software caused connection abort"},
431 {WSAECONNRESET, "Connection reset by peer"},
432 {WSAENOBUFS, "No buffer space available"},
433 {WSAEISCONN, "Socket is already connected"},
434 {WSAENOTCONN, "Socket is not connected"},
435 {WSAESHUTDOWN, "Can't send after socket shutdown"},
436 {WSAETOOMANYREFS, "Too many references: can't splice"},
437 {WSAETIMEDOUT, "Operation timed out"},
438 {WSAECONNREFUSED, "Connection refused"},
439 {WSAELOOP, "Too many levels of symbolic links"},
440 {WSAENAMETOOLONG, "File name too long"},
441 {WSAEHOSTDOWN, "Host is down"},
442 {WSAEHOSTUNREACH, "No route to host"},
443 {WSAENOTEMPTY, "Directory not empty"},
444 {WSAEPROCLIM, "Too many processes"},
445 {WSAEUSERS, "Too many users"},
446 {WSAEDQUOT, "Disc quota exceeded"},
447 {WSAESTALE, "Stale NFS file handle"},
448 {WSAEREMOTE, "Too many levels of remote in path"},
449 {WSASYSNOTREADY, "Network subsystem is unvailable"},
450 {WSAVERNOTSUPPORTED, "WinSock version is not supported"},
451 {WSANOTINITIALISED,
452 "Successful WSAStartup() not yet performed"},
453 {WSAEDISCON, "Graceful shutdown in progress"},
454 /* Resolver errors */
455 {WSAHOST_NOT_FOUND, "No such host is known"},
456 {WSATRY_AGAIN, "Host not found, or server failed"},
457 {WSANO_RECOVERY, "Unexpected server error encountered"},
458 {WSANO_DATA, "Valid name without requested data"},
459 {WSANO_ADDRESS, "No address, look for MX record"},
460 {0, NULL}
461 };
Mark Hammond46a733d2000-07-24 01:45:11 +0000462 if (err_no) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000463 PyObject *v;
Mark Hammond46a733d2000-07-24 01:45:11 +0000464 const char *msg = "winsock error";
Guido van Rossum48a680c2001-03-02 06:34:14 +0000465
Mark Hammond46a733d2000-07-24 01:45:11 +0000466 for (msgp = msgs; msgp->msg; msgp++) {
467 if (err_no == msgp->no) {
468 msg = msgp->msg;
469 break;
470 }
471 }
472
473 v = Py_BuildValue("(is)", err_no, msg);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000474 if (v != NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000475 PyErr_SetObject(socket_error, v);
Guido van Rossum73624e91994-10-10 17:59:00 +0000476 Py_DECREF(v);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000477 }
478 return NULL;
479 }
480 else
481#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000482
Andrew MacIntyreba43e872002-03-03 03:03:52 +0000483#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000484 if (sock_errno() != NO_ERROR) {
485 APIRET rc;
486 ULONG msglen;
487 char outbuf[100];
488 int myerrorcode = sock_errno();
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000489
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000490 /* Retrieve socket-related error message from MPTN.MSG file */
491 rc = DosGetMessage(NULL, 0, outbuf, sizeof(outbuf),
492 myerrorcode - SOCBASEERR + 26,
493 "mptn.msg",
494 &msglen);
495 if (rc == NO_ERROR) {
496 PyObject *v;
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000497
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000498 /* OS/2 doesn't guarantee a terminator */
499 outbuf[msglen] = '\0';
500 if (strlen(outbuf) > 0) {
501 /* If non-empty msg, trim CRLF */
502 char *lastc = &outbuf[ strlen(outbuf)-1 ];
503 while (lastc > outbuf && isspace(*lastc)) {
504 /* Trim trailing whitespace (CRLF) */
505 *lastc-- = '\0';
506 }
507 }
508 v = Py_BuildValue("(is)", myerrorcode, outbuf);
509 if (v != NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000510 PyErr_SetObject(socket_error, v);
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000511 Py_DECREF(v);
512 }
513 return NULL;
514 }
515 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000516#endif
517
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000518#if defined(RISCOS)
519 if (_inet_error.errnum != NULL) {
520 PyObject *v;
521 v = Py_BuildValue("(is)", errno, _inet_err());
522 if (v != NULL) {
523 PyErr_SetObject(socket_error, v);
524 Py_DECREF(v);
525 }
526 return NULL;
527 }
528#endif
529
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000530 return PyErr_SetFromErrno(socket_error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000531}
532
Guido van Rossum30a685f1991-06-27 15:51:29 +0000533
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000534static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000535set_herror(int h_error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000536{
537 PyObject *v;
538
539#ifdef HAVE_HSTRERROR
540 v = Py_BuildValue("(is)", h_error, (char *)hstrerror(h_error));
541#else
542 v = Py_BuildValue("(is)", h_error, "host not found");
543#endif
544 if (v != NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000545 PyErr_SetObject(socket_herror, v);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000546 Py_DECREF(v);
547 }
548
549 return NULL;
550}
551
552
553static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000554set_gaierror(int error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000555{
556 PyObject *v;
557
Martin v. Löwis272cb402002-03-01 08:31:07 +0000558#ifdef EAI_SYSTEM
559 /* EAI_SYSTEM is not available on Windows XP. */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000560 if (error == EAI_SYSTEM)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000561 return set_error();
Martin v. Löwis272cb402002-03-01 08:31:07 +0000562#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000563
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000564#ifdef HAVE_GAI_STRERROR
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000565 v = Py_BuildValue("(is)", error, gai_strerror(error));
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000566#else
567 v = Py_BuildValue("(is)", error, "getaddrinfo failed");
568#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000569 if (v != NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000570 PyErr_SetObject(socket_gaierror, v);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000571 Py_DECREF(v);
572 }
573
574 return NULL;
575}
576
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000577/* Function to perform the setting of socket blocking mode
578 internally. block = (1 | 0). */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000579static int
580internal_setblocking(PySocketSockObject *s, int block)
581{
582#ifndef RISCOS
583#ifndef MS_WINDOWS
584 int delay_flag;
585#endif
586#endif
587
588 Py_BEGIN_ALLOW_THREADS
589#ifdef __BEOS__
590 block = !block;
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000591 setsockopt(s->sock_fd, SOL_SOCKET, SO_NONBLOCK,
592 (void *)(&block), sizeof(int));
Guido van Rossum67f7a382002-06-06 21:08:16 +0000593#else
594#ifndef RISCOS
595#ifndef MS_WINDOWS
596#if defined(PYOS_OS2) && !defined(PYCC_GCC)
597 block = !block;
598 ioctl(s->sock_fd, FIONBIO, (caddr_t)&block, sizeof(block));
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000599#elif defined(__VMS)
600 block = !block;
601 ioctl(s->sock_fd, FIONBIO, (char *)&block);
602#else /* !PYOS_OS2 && !_VMS */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000603 delay_flag = fcntl(s->sock_fd, F_GETFL, 0);
604 if (block)
Neal Norwitz39d22e52002-11-02 19:55:21 +0000605 delay_flag &= (~O_NONBLOCK);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000606 else
Neal Norwitz39d22e52002-11-02 19:55:21 +0000607 delay_flag |= O_NONBLOCK;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000608 fcntl(s->sock_fd, F_SETFL, delay_flag);
609#endif /* !PYOS_OS2 */
610#else /* MS_WINDOWS */
611 block = !block;
612 ioctlsocket(s->sock_fd, FIONBIO, (u_long*)&block);
613#endif /* MS_WINDOWS */
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000614#else /* RISCOS */
615 block = !block;
616 socketioctl(s->sock_fd, FIONBIO, (u_long*)&block);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000617#endif /* RISCOS */
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000618#endif /* __BEOS__ */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000619 Py_END_ALLOW_THREADS
620
621 /* Since these don't return anything */
622 return 1;
623}
624
Guido van Rossum11ba0942002-06-13 15:07:44 +0000625/* Do a select() on the socket, if necessary (sock_timeout > 0).
626 The argument writing indicates the direction.
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000627 This does not raise an exception; we'll let our caller do that
628 after they've reacquired the interpreter lock.
629 Returns 1 on timeout, 0 otherwise. */
630static int
Guido van Rossumb9e916a2002-06-07 01:42:47 +0000631internal_select(PySocketSockObject *s, int writing)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000632{
633 fd_set fds;
634 struct timeval tv;
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000635 int n;
Guido van Rossum11ba0942002-06-13 15:07:44 +0000636
Guido van Rossumad654902002-07-19 12:44:59 +0000637 /* Nothing to do unless we're in timeout mode (not non-blocking) */
Guido van Rossum11ba0942002-06-13 15:07:44 +0000638 if (s->sock_timeout <= 0.0)
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000639 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000640
Guido van Rossumad654902002-07-19 12:44:59 +0000641 /* Guard against closed socket */
642 if (s->sock_fd < 0)
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000643 return 0;
Guido van Rossumad654902002-07-19 12:44:59 +0000644
Guido van Rossum67f7a382002-06-06 21:08:16 +0000645 /* Construct the arguments to select */
646 tv.tv_sec = (int)s->sock_timeout;
Guido van Rossumb9e916a2002-06-07 01:42:47 +0000647 tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000648 FD_ZERO(&fds);
649 FD_SET(s->sock_fd, &fds);
650
651 /* See if the socket is ready */
Guido van Rossumb9e916a2002-06-07 01:42:47 +0000652 if (writing)
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000653 n = select(s->sock_fd+1, NULL, &fds, NULL, &tv);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000654 else
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000655 n = select(s->sock_fd+1, &fds, NULL, NULL, &tv);
656 if (n == 0)
657 return 1;
658 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000659}
660
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000661/* Initialize a new socket object. */
662
Tim Petersa12b4cf2002-07-18 22:38:44 +0000663static double defaulttimeout = -1.0; /* Default timeout for new sockets */
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000664
Mark Hammond62b1ab12002-07-23 06:31:15 +0000665PyMODINIT_FUNC
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000666init_sockobject(PySocketSockObject *s,
667 SOCKET_T fd, int family, int type, int proto)
668{
669#ifdef RISCOS
670 int block = 1;
671#endif
672 s->sock_fd = fd;
673 s->sock_family = family;
674 s->sock_type = type;
675 s->sock_proto = proto;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000676 s->sock_timeout = defaulttimeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000677
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000678 s->errorhandler = &set_error;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000679
680 if (defaulttimeout >= 0.0)
681 internal_setblocking(s, 0);
682
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000683#ifdef RISCOS
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000684 if (taskwindow)
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000685 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000686#endif
687}
688
689
Guido van Rossum30a685f1991-06-27 15:51:29 +0000690/* Create a new socket object.
691 This just creates the object and initializes it.
692 If the creation fails, return NULL and set an exception (implicit
693 in NEWOBJ()). */
694
Guido van Rossum73624e91994-10-10 17:59:00 +0000695static PySocketSockObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000696new_sockobject(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000697{
Guido van Rossum73624e91994-10-10 17:59:00 +0000698 PySocketSockObject *s;
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000699 s = (PySocketSockObject *)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000700 PyType_GenericNew(&sock_type, NULL, NULL);
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000701 if (s != NULL)
702 init_sockobject(s, fd, family, type, proto);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000703 return s;
704}
705
Guido van Rossum30a685f1991-06-27 15:51:29 +0000706
Guido van Rossum48a680c2001-03-02 06:34:14 +0000707/* Lock to allow python interpreter to continue, but only allow one
Just van Rossum1040d2c2003-05-09 07:53:18 +0000708 thread to be in gethostbyname or getaddrinfo */
709#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
710PyThread_type_lock netdb_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000711#endif
712
713
Guido van Rossum30a685f1991-06-27 15:51:29 +0000714/* Convert a string specifying a host name or one of a few symbolic
715 names to a numeric IP address. This usually calls gethostbyname()
716 to do the work; the names "" and "<broadcast>" are special.
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000717 Return the length (IPv4 should be 4 bytes), or negative if
Guido van Rossum30a685f1991-06-27 15:51:29 +0000718 an error occurred; then an exception is raised. */
719
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000720static int
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000721setipaddr(char *name, struct sockaddr *addr_ret, size_t addr_ret_size, int af)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000722{
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000723 struct addrinfo hints, *res;
724 int error;
Anthony Baxter0e85f9d2003-05-02 15:40:46 +0000725 int d1, d2, d3, d4;
726 char ch;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000727
Guido van Rossuma376cc51996-12-05 23:43:35 +0000728 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
Guido van Rossum30a685f1991-06-27 15:51:29 +0000729 if (name[0] == '\0') {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000730 int siz;
731 memset(&hints, 0, sizeof(hints));
732 hints.ai_family = af;
733 hints.ai_socktype = SOCK_DGRAM; /*dummy*/
734 hints.ai_flags = AI_PASSIVE;
Just van Rossum1040d2c2003-05-09 07:53:18 +0000735 Py_BEGIN_ALLOW_THREADS
736 ACQUIRE_GETADDRINFO_LOCK
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000737 error = getaddrinfo(NULL, "0", &hints, &res);
Just van Rossum1040d2c2003-05-09 07:53:18 +0000738 Py_END_ALLOW_THREADS
739 /* We assume that those thread-unsafe getaddrinfo() versions
740 *are* safe regarding their return value, ie. that a
741 subsequent call to getaddrinfo() does not destroy the
742 outcome of the first call. */
743 RELEASE_GETADDRINFO_LOCK
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000744 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000745 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000746 return -1;
747 }
748 switch (res->ai_family) {
749 case AF_INET:
750 siz = 4;
751 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000752#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000753 case AF_INET6:
754 siz = 16;
755 break;
756#endif
757 default:
758 freeaddrinfo(res);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000759 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000760 "unsupported address family");
761 return -1;
762 }
763 if (res->ai_next) {
Martin v. Löwisf0b11d22001-11-07 08:31:03 +0000764 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 "wildcard resolved to multiple address");
767 return -1;
768 }
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000769 if (res->ai_addrlen < addr_ret_size)
770 addr_ret_size = res->ai_addrlen;
771 memcpy(addr_ret, res->ai_addr, addr_ret_size);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000772 freeaddrinfo(res);
773 return siz;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000774 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000775 if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000776 struct sockaddr_in *sin;
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +0000777 if (af != AF_INET && af != AF_UNSPEC) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000778 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000779 "address family mismatched");
780 return -1;
781 }
782 sin = (struct sockaddr_in *)addr_ret;
783 memset((void *) sin, '\0', sizeof(*sin));
784 sin->sin_family = AF_INET;
785#ifdef HAVE_SOCKADDR_SA_LEN
786 sin->sin_len = sizeof(*sin);
787#endif
788 sin->sin_addr.s_addr = INADDR_BROADCAST;
789 return sizeof(sin->sin_addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000790 }
Anthony Baxter0e85f9d2003-05-02 15:40:46 +0000791 if (sscanf(name, "%d.%d.%d.%d%c", &d1, &d2, &d3, &d4, &ch) == 4 &&
792 0 <= d1 && d1 <= 255 && 0 <= d2 && d2 <= 255 &&
793 0 <= d3 && d3 <= 255 && 0 <= d4 && d4 <= 255) {
794 struct sockaddr_in *sin;
795 sin = (struct sockaddr_in *)addr_ret;
796 sin->sin_addr.s_addr = htonl(
797 ((long) d1 << 24) | ((long) d2 << 16) |
798 ((long) d3 << 8) | ((long) d4 << 0));
799 sin->sin_family = AF_INET;
800#ifdef HAVE_SOCKADDR_SA_LEN
801 sin->sin_len = sizeof(*sin);
802#endif
803 return 4;
804 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000805 memset(&hints, 0, sizeof(hints));
806 hints.ai_family = af;
Just van Rossum1040d2c2003-05-09 07:53:18 +0000807 Py_BEGIN_ALLOW_THREADS
808 ACQUIRE_GETADDRINFO_LOCK
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000809 error = getaddrinfo(name, NULL, &hints, &res);
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000810#if defined(__digital__) && defined(__unix__)
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000811 if (error == EAI_NONAME && af == AF_UNSPEC) {
812 /* On Tru64 V5.1, numeric-to-addr conversion fails
813 if no address family is given. Assume IPv4 for now.*/
814 hints.ai_family = AF_INET;
815 error = getaddrinfo(name, NULL, &hints, &res);
816 }
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000817#endif
Just van Rossum1040d2c2003-05-09 07:53:18 +0000818 Py_END_ALLOW_THREADS
819 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000820 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000821 set_gaierror(error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000822 return -1;
823 }
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000824 if (res->ai_addrlen < addr_ret_size)
825 addr_ret_size = res->ai_addrlen;
826 memcpy((char *) addr_ret, res->ai_addr, addr_ret_size);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000827 freeaddrinfo(res);
828 switch (addr_ret->sa_family) {
829 case AF_INET:
830 return 4;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000831#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000832 case AF_INET6:
833 return 16;
Guido van Rossum955becc1999-03-22 20:14:53 +0000834#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000835 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000836 PyErr_SetString(socket_error, "unknown address family");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000837 return -1;
838 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000839}
840
Guido van Rossum30a685f1991-06-27 15:51:29 +0000841
Guido van Rossum30a685f1991-06-27 15:51:29 +0000842/* Create a string object representing an IP address.
843 This is always a string of the form 'dd.dd.dd.dd' (with variable
844 size numbers). */
845
Guido van Rossum73624e91994-10-10 17:59:00 +0000846static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000847makeipaddr(struct sockaddr *addr, int addrlen)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000848{
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000849 char buf[NI_MAXHOST];
850 int error;
851
852 error = getnameinfo(addr, addrlen, buf, sizeof(buf), NULL, 0,
853 NI_NUMERICHOST);
854 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000855 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000856 return NULL;
857 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000858 return PyString_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000859}
860
861
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000862#ifdef USE_BLUETOOTH
863/* Convert a string representation of a Bluetooth address into a numeric
864 address. Returns the length (6), or raises an exception and returns -1 if
865 an error occurred. */
866
867static int
868setbdaddr(char *name, bdaddr_t *bdaddr)
869{
870 unsigned int b0, b1, b2, b3, b4, b5;
871 char ch;
872 int n;
873
874 n = sscanf(name, "%X:%X:%X:%X:%X:%X%c",
875 &b5, &b4, &b3, &b2, &b1, &b0, &ch);
876 if (n == 6 && (b0 | b1 | b2 | b3 | b4 | b5) < 256) {
877 bdaddr->b[0] = b0;
878 bdaddr->b[1] = b1;
879 bdaddr->b[2] = b2;
880 bdaddr->b[3] = b3;
881 bdaddr->b[4] = b4;
882 bdaddr->b[5] = b5;
883 return 6;
884 } else {
885 PyErr_SetString(socket_error, "bad bluetooth address");
886 return -1;
887 }
888}
889
890/* Create a string representation of the Bluetooth address. This is always a
891 string of the form 'XX:XX:XX:XX:XX:XX' where XX is a two digit hexadecimal
892 value (zero padded if necessary). */
893
894static PyObject *
895makebdaddr(bdaddr_t *bdaddr)
896{
897 char buf[(6 * 2) + 5 + 1];
898
899 sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X",
900 bdaddr->b[5], bdaddr->b[4], bdaddr->b[3],
901 bdaddr->b[2], bdaddr->b[1], bdaddr->b[0]);
902 return PyString_FromString(buf);
903}
904#endif
905
906
Guido van Rossum30a685f1991-06-27 15:51:29 +0000907/* Create an object representing the given socket address,
908 suitable for passing it back to bind(), connect() etc.
909 The family field of the sockaddr structure is inspected
910 to determine what kind of address it really is. */
911
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000912/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000913static PyObject *
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000914makesockaddr(int sockfd, struct sockaddr *addr, int addrlen, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000915{
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000916 if (addrlen == 0) {
917 /* No address -- may be recvfrom() from known socket */
Guido van Rossum73624e91994-10-10 17:59:00 +0000918 Py_INCREF(Py_None);
919 return Py_None;
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000920 }
921
Guido van Rossumbcc20741998-08-04 22:53:56 +0000922#ifdef __BEOS__
Guido van Rossum2c8bcb82000-04-25 21:34:53 +0000923 /* XXX: BeOS version of accept() doesn't set family correctly */
Guido van Rossumbcc20741998-08-04 22:53:56 +0000924 addr->sa_family = AF_INET;
925#endif
926
Guido van Rossum30a685f1991-06-27 15:51:29 +0000927 switch (addr->sa_family) {
928
929 case AF_INET:
930 {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000931 struct sockaddr_in *a;
932 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
Barry Warsaw752300b1997-01-03 17:18:10 +0000933 PyObject *ret = NULL;
934 if (addrobj) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000935 a = (struct sockaddr_in *)addr;
Barry Warsaw752300b1997-01-03 17:18:10 +0000936 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
937 Py_DECREF(addrobj);
938 }
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000939 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000940 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000941
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +0000942#if defined(AF_UNIX)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000943 case AF_UNIX:
944 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000945 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000946 return PyString_FromString(a->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000947 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000948#endif /* AF_UNIX */
949
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000950#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000951 case AF_INET6:
952 {
953 struct sockaddr_in6 *a;
954 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
955 PyObject *ret = NULL;
956 if (addrobj) {
957 a = (struct sockaddr_in6 *)addr;
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000958 ret = Py_BuildValue("Oiii",
959 addrobj,
960 ntohs(a->sin6_port),
961 a->sin6_flowinfo,
962 a->sin6_scope_id);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000963 Py_DECREF(addrobj);
964 }
965 return ret;
966 }
Jeremy Hylton22308652001-02-02 03:23:09 +0000967#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +0000968
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000969#ifdef USE_BLUETOOTH
970 case AF_BLUETOOTH:
971 switch (proto) {
972
973 case BTPROTO_L2CAP:
974 {
975 struct sockaddr_l2 *a = (struct sockaddr_l2 *) addr;
976 PyObject *addrobj = makebdaddr(&_BT_L2_MEMB(a, bdaddr));
977 PyObject *ret = NULL;
978 if (addrobj) {
979 ret = Py_BuildValue("Oi",
980 addrobj,
981 _BT_L2_MEMB(a, psm));
982 Py_DECREF(addrobj);
983 }
984 return ret;
985 }
986
987 case BTPROTO_RFCOMM:
988 {
989 struct sockaddr_rc *a = (struct sockaddr_rc *) addr;
990 PyObject *addrobj = makebdaddr(&_BT_RC_MEMB(a, bdaddr));
991 PyObject *ret = NULL;
992 if (addrobj) {
993 ret = Py_BuildValue("Oi",
994 addrobj,
995 _BT_RC_MEMB(a, channel));
996 Py_DECREF(addrobj);
997 }
998 return ret;
999 }
1000
1001#if !defined(__FreeBSD__)
1002 case BTPROTO_SCO:
1003 {
1004 struct sockaddr_sco *a = (struct sockaddr_sco *) addr;
1005 return makebdaddr(&_BT_SCO_MEMB(a, bdaddr));
1006 }
1007#endif
1008
1009 }
1010#endif
1011
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00001012#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +00001013 case AF_PACKET:
1014 {
1015 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
1016 char *ifname = "";
1017 struct ifreq ifr;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001018 /* need to look up interface name give index */
1019 if (a->sll_ifindex) {
Jeremy Hylton22308652001-02-02 03:23:09 +00001020 ifr.ifr_ifindex = a->sll_ifindex;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001021 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
Jeremy Hylton22308652001-02-02 03:23:09 +00001022 ifname = ifr.ifr_name;
Jeremy Hylton22308652001-02-02 03:23:09 +00001023 }
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001024 return Py_BuildValue("shbhs#",
1025 ifname,
1026 ntohs(a->sll_protocol),
1027 a->sll_pkttype,
1028 a->sll_hatype,
1029 a->sll_addr,
1030 a->sll_halen);
Jeremy Hylton22308652001-02-02 03:23:09 +00001031 }
1032#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001033
Guido van Rossum30a685f1991-06-27 15:51:29 +00001034 /* More cases here... */
1035
1036 default:
Guido van Rossumaa948df1997-05-07 17:41:48 +00001037 /* If we don't know the address family, don't raise an
1038 exception -- return it as a tuple. */
1039 return Py_BuildValue("is#",
1040 addr->sa_family,
1041 addr->sa_data,
1042 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001043
Guido van Rossum30a685f1991-06-27 15:51:29 +00001044 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001045}
1046
Guido van Rossum30a685f1991-06-27 15:51:29 +00001047
1048/* Parse a socket address argument according to the socket object's
1049 address family. Return 1 if the address was in the proper format,
1050 0 of not. The address is returned through addr_ret, its length
1051 through len_ret. */
1052
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001053static int
Guido van Rossum48a680c2001-03-02 06:34:14 +00001054getsockaddrarg(PySocketSockObject *s, PyObject *args,
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001055 struct sockaddr **addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001056{
Guido van Rossum30a685f1991-06-27 15:51:29 +00001057 switch (s->sock_family) {
1058
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001059#if defined(AF_UNIX)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001060 case AF_UNIX:
1061 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001062 struct sockaddr_un* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001063 char *path;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001064 int len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001065 addr = (struct sockaddr_un*)&(s->sock_addr).un;
Guido van Rossum7e488981998-10-08 02:25:24 +00001066 if (!PyArg_Parse(args, "t#", &path, &len))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001067 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001068 if (len > sizeof addr->sun_path) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001069 PyErr_SetString(socket_error,
Barry Warsaw752300b1997-01-03 17:18:10 +00001070 "AF_UNIX path too long");
Guido van Rossum30a685f1991-06-27 15:51:29 +00001071 return 0;
1072 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001073 addr->sun_family = s->sock_family;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001074 memcpy(addr->sun_path, path, len);
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001075 addr->sun_path[len] = 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001076 *addr_ret = (struct sockaddr *) addr;
Andrew MacIntyredaedf212004-04-11 12:03:57 +00001077#if defined(PYOS_OS2)
1078 *len_ret = sizeof(*addr);
1079#else
Guido van Rossum65af28a1996-06-11 18:36:33 +00001080 *len_ret = len + sizeof(*addr) - sizeof(addr->sun_path);
Andrew MacIntyredaedf212004-04-11 12:03:57 +00001081#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001082 return 1;
1083 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001084#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001085
Guido van Rossum30a685f1991-06-27 15:51:29 +00001086 case AF_INET:
1087 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001088 struct sockaddr_in* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001089 char *host;
Martin v. Löwis5db099a2003-08-07 11:55:15 +00001090 int port, result;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001091 addr=(struct sockaddr_in*)&(s->sock_addr).in;
Guido van Rossume4dad902000-12-01 13:13:11 +00001092 if (!PyTuple_Check(args)) {
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001093 PyErr_Format(
1094 PyExc_TypeError,
1095 "getsockaddrarg: "
1096 "AF_INET address must be tuple, not %.500s",
1097 args->ob_type->tp_name);
Guido van Rossume4dad902000-12-01 13:13:11 +00001098 return 0;
1099 }
Martin v. Löwis2548c732003-04-18 10:39:54 +00001100 if (!PyArg_ParseTuple(args, "eti:getsockaddrarg",
1101 "idna", &host, &port))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001102 return 0;
Martin v. Löwis5db099a2003-08-07 11:55:15 +00001103 result = setipaddr(host, (struct sockaddr *)addr,
1104 sizeof(*addr), AF_INET);
1105 PyMem_Free(host);
1106 if (result < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001107 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001108 addr->sin_family = AF_INET;
Guido van Rossum644a12b1997-04-09 19:24:53 +00001109 addr->sin_port = htons((short)port);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001110 *addr_ret = (struct sockaddr *) addr;
1111 *len_ret = sizeof *addr;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001112 return 1;
1113 }
1114
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001115#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001116 case AF_INET6:
1117 {
1118 struct sockaddr_in6* addr;
1119 char *host;
Martin v. Löwis5db099a2003-08-07 11:55:15 +00001120 int port, flowinfo, scope_id, result;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001121 addr = (struct sockaddr_in6*)&(s->sock_addr).in6;
1122 flowinfo = scope_id = 0;
Martin v. Löwis2548c732003-04-18 10:39:54 +00001123 if (!PyArg_ParseTuple(args, "eti|ii",
1124 "idna", &host, &port, &flowinfo,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001125 &scope_id)) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001126 return 0;
1127 }
Martin v. Löwis5db099a2003-08-07 11:55:15 +00001128 result = setipaddr(host, (struct sockaddr *)addr,
1129 sizeof(*addr), AF_INET6);
1130 PyMem_Free(host);
1131 if (result < 0)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001132 return 0;
1133 addr->sin6_family = s->sock_family;
1134 addr->sin6_port = htons((short)port);
1135 addr->sin6_flowinfo = flowinfo;
1136 addr->sin6_scope_id = scope_id;
1137 *addr_ret = (struct sockaddr *) addr;
1138 *len_ret = sizeof *addr;
1139 return 1;
1140 }
1141#endif
1142
Hye-Shik Chang81268602004-02-02 06:05:24 +00001143#ifdef USE_BLUETOOTH
Martin v. Löwis12af0482004-01-31 12:34:17 +00001144 case AF_BLUETOOTH:
1145 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001146 switch (s->sock_proto) {
1147 case BTPROTO_L2CAP:
Martin v. Löwis12af0482004-01-31 12:34:17 +00001148 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001149 struct sockaddr_l2 *addr = (struct sockaddr_l2 *) _BT_SOCKADDR_MEMB(s, l2);
1150 char *straddr;
Martin v. Löwis12af0482004-01-31 12:34:17 +00001151
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001152 _BT_L2_MEMB(addr, family) = AF_BLUETOOTH;
1153 if (!PyArg_ParseTuple(args, "si", &straddr,
1154 &_BT_L2_MEMB(addr, psm))) {
1155 PyErr_SetString(socket_error, "getsockaddrarg: "
1156 "wrong format");
Martin v. Löwis12af0482004-01-31 12:34:17 +00001157 return 0;
1158 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001159 if (setbdaddr(straddr, &_BT_L2_MEMB(addr, bdaddr)) < 0)
1160 return 0;
1161
1162 *addr_ret = (struct sockaddr *) addr;
1163 *len_ret = sizeof *addr;
1164 return 1;
1165 }
1166 case BTPROTO_RFCOMM:
1167 {
1168 struct sockaddr_rc *addr = (struct sockaddr_rc *) _BT_SOCKADDR_MEMB(s, rc);
1169 char *straddr;
1170
1171 _BT_RC_MEMB(addr, family) = AF_BLUETOOTH;
1172 if (!PyArg_ParseTuple(args, "si", &straddr,
1173 &_BT_RC_MEMB(addr, channel))) {
1174 PyErr_SetString(socket_error, "getsockaddrarg: "
1175 "wrong format");
1176 return 0;
1177 }
1178 if (setbdaddr(straddr, &_BT_RC_MEMB(addr, bdaddr)) < 0)
1179 return 0;
1180
1181 *addr_ret = (struct sockaddr *) addr;
1182 *len_ret = sizeof *addr;
1183 return 1;
1184 }
1185#if !defined(__FreeBSD__)
1186 case BTPROTO_SCO:
1187 {
1188 struct sockaddr_sco *addr = (struct sockaddr_sco *) _BT_SOCKADDR_MEMB(s, sco);
1189 char *straddr;
1190
1191 _BT_SCO_MEMB(addr, family) = AF_BLUETOOTH;
1192 straddr = PyString_AsString(args);
1193 if (straddr == NULL) {
1194 PyErr_SetString(socket_error, "getsockaddrarg: "
1195 "wrong format");
1196 return 0;
1197 }
1198 if (setbdaddr(straddr, &_BT_SCO_MEMB(addr, bdaddr)) < 0)
1199 return 0;
1200
1201 *addr_ret = (struct sockaddr *) addr;
1202 *len_ret = sizeof *addr;
1203 return 1;
1204 }
1205#endif
1206 default:
1207 PyErr_SetString(socket_error, "getsockaddrarg: unknown Bluetooth protocol");
1208 return 0;
Martin v. Löwis12af0482004-01-31 12:34:17 +00001209 }
1210 }
1211#endif
1212
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00001213#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +00001214 case AF_PACKET:
1215 {
1216 struct sockaddr_ll* addr;
1217 struct ifreq ifr;
1218 char *interfaceName;
1219 int protoNumber;
1220 int hatype = 0;
1221 int pkttype = 0;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001222 char *haddr;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001223
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001224 if (!PyArg_ParseTuple(args, "si|iis", &interfaceName,
1225 &protoNumber, &pkttype, &hatype, &haddr))
Jeremy Hylton22308652001-02-02 03:23:09 +00001226 return 0;
1227 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
1228 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001229 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001230 s->errorhandler();
Jeremy Hylton22308652001-02-02 03:23:09 +00001231 return 0;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001232 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001233 addr = &(s->sock_addr.ll);
1234 addr->sll_family = AF_PACKET;
1235 addr->sll_protocol = htons((short)protoNumber);
1236 addr->sll_ifindex = ifr.ifr_ifindex;
1237 addr->sll_pkttype = pkttype;
1238 addr->sll_hatype = hatype;
1239 *addr_ret = (struct sockaddr *) addr;
1240 *len_ret = sizeof *addr;
1241 return 1;
1242 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00001243#endif
1244
Guido van Rossum30a685f1991-06-27 15:51:29 +00001245 /* More cases here... */
1246
1247 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001248 PyErr_SetString(socket_error, "getsockaddrarg: bad family");
Guido van Rossum30a685f1991-06-27 15:51:29 +00001249 return 0;
1250
1251 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001252}
1253
Guido van Rossum30a685f1991-06-27 15:51:29 +00001254
Guido van Rossum48a680c2001-03-02 06:34:14 +00001255/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +00001256 Return 1 if the family is known, 0 otherwise. The length is returned
1257 through len_ret. */
1258
1259static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +00001260getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +00001261{
1262 switch (s->sock_family) {
1263
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001264#if defined(AF_UNIX)
Guido van Rossum710e1df1992-06-12 10:39:36 +00001265 case AF_UNIX:
1266 {
1267 *len_ret = sizeof (struct sockaddr_un);
1268 return 1;
1269 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001270#endif /* AF_UNIX */
Guido van Rossum710e1df1992-06-12 10:39:36 +00001271
1272 case AF_INET:
1273 {
1274 *len_ret = sizeof (struct sockaddr_in);
1275 return 1;
1276 }
1277
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001278#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001279 case AF_INET6:
1280 {
1281 *len_ret = sizeof (struct sockaddr_in6);
1282 return 1;
1283 }
1284#endif
1285
Hye-Shik Chang81268602004-02-02 06:05:24 +00001286#ifdef USE_BLUETOOTH
Martin v. Löwis12af0482004-01-31 12:34:17 +00001287 case AF_BLUETOOTH:
1288 {
1289 switch(s->sock_proto)
1290 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001291
1292 case BTPROTO_L2CAP:
1293 *len_ret = sizeof (struct sockaddr_l2);
1294 return 1;
1295 case BTPROTO_RFCOMM:
1296 *len_ret = sizeof (struct sockaddr_rc);
1297 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00001298#if !defined(__FreeBSD__)
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001299 case BTPROTO_SCO:
1300 *len_ret = sizeof (struct sockaddr_sco);
1301 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00001302#endif
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001303 default:
1304 PyErr_SetString(socket_error, "getsockaddrlen: "
1305 "unknown BT protocol");
1306 return 0;
1307
Martin v. Löwis12af0482004-01-31 12:34:17 +00001308 }
1309 }
1310#endif
1311
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00001312#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +00001313 case AF_PACKET:
1314 {
1315 *len_ret = sizeof (struct sockaddr_ll);
1316 return 1;
1317 }
1318#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001319
Guido van Rossum710e1df1992-06-12 10:39:36 +00001320 /* More cases here... */
1321
1322 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001323 PyErr_SetString(socket_error, "getsockaddrlen: bad family");
Guido van Rossum710e1df1992-06-12 10:39:36 +00001324 return 0;
1325
1326 }
1327}
1328
1329
Guido van Rossum30a685f1991-06-27 15:51:29 +00001330/* s.accept() method */
1331
Guido van Rossum73624e91994-10-10 17:59:00 +00001332static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001333sock_accept(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001334{
1335 char addrbuf[256];
Fred Drakea04eaad2000-06-30 02:46:07 +00001336 SOCKET_T newfd;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001337 socklen_t addrlen;
Barry Warsaw752300b1997-01-03 17:18:10 +00001338 PyObject *sock = NULL;
1339 PyObject *addr = NULL;
1340 PyObject *res = NULL;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001341 int timeout;
Barry Warsaw752300b1997-01-03 17:18:10 +00001342
Guido van Rossum710e1df1992-06-12 10:39:36 +00001343 if (!getsockaddrlen(s, &addrlen))
1344 return NULL;
Fred Drakefd168342001-05-09 19:11:33 +00001345 memset(addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001346
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001347#ifdef MS_WINDOWS
1348 newfd = INVALID_SOCKET;
1349#else
1350 newfd = -1;
1351#endif
1352
Guido van Rossum73624e91994-10-10 17:59:00 +00001353 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001354 timeout = internal_select(s, 0);
1355 if (!timeout)
1356 newfd = accept(s->sock_fd, (struct sockaddr *) addrbuf,
1357 &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001358 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001359
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001360 if (timeout) {
1361 PyErr_SetString(socket_timeout, "timed out");
1362 return NULL;
1363 }
1364
Fred Drakea04eaad2000-06-30 02:46:07 +00001365#ifdef MS_WINDOWS
1366 if (newfd == INVALID_SOCKET)
1367#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001368 if (newfd < 0)
Fred Drakea04eaad2000-06-30 02:46:07 +00001369#endif
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001370 return s->errorhandler();
Barry Warsaw752300b1997-01-03 17:18:10 +00001371
Guido van Rossum30a685f1991-06-27 15:51:29 +00001372 /* Create the new object with unspecified family,
1373 to avoid calls to bind() etc. on it. */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001374 sock = (PyObject *) new_sockobject(newfd,
1375 s->sock_family,
1376 s->sock_type,
1377 s->sock_proto);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001378
Barry Warsaw752300b1997-01-03 17:18:10 +00001379 if (sock == NULL) {
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001380 SOCKETCLOSE(newfd);
Barry Warsaw752300b1997-01-03 17:18:10 +00001381 goto finally;
1382 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00001383 addr = makesockaddr(s->sock_fd, (struct sockaddr *)addrbuf,
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001384 addrlen, s->sock_proto);
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001385 if (addr == NULL)
Barry Warsaw752300b1997-01-03 17:18:10 +00001386 goto finally;
1387
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001388 res = PyTuple_Pack(2, sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00001389
Guido van Rossum67f7a382002-06-06 21:08:16 +00001390finally:
Guido van Rossum73624e91994-10-10 17:59:00 +00001391 Py_XDECREF(sock);
1392 Py_XDECREF(addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001393 return res;
1394}
1395
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001396PyDoc_STRVAR(accept_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001397"accept() -> (socket object, address info)\n\
1398\n\
1399Wait for an incoming connection. Return a new socket representing the\n\
1400connection, and the address of the client. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001401info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001402
Guido van Rossum11ba0942002-06-13 15:07:44 +00001403/* s.setblocking(flag) method. Argument:
1404 False -- non-blocking mode; same as settimeout(0)
1405 True -- blocking mode; same as settimeout(None)
1406*/
Guido van Rossume4485b01994-09-07 14:32:49 +00001407
Guido van Rossum73624e91994-10-10 17:59:00 +00001408static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001409sock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00001410{
1411 int block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001412
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001413 block = PyInt_AsLong(arg);
1414 if (block == -1 && PyErr_Occurred())
Guido van Rossume4485b01994-09-07 14:32:49 +00001415 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001416
Guido van Rossum11ba0942002-06-13 15:07:44 +00001417 s->sock_timeout = block ? -1.0 : 0.0;
Guido van Rossume8008f02002-06-07 03:36:20 +00001418 internal_setblocking(s, block);
Guido van Rossume4485b01994-09-07 14:32:49 +00001419
Guido van Rossum73624e91994-10-10 17:59:00 +00001420 Py_INCREF(Py_None);
1421 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +00001422}
Guido van Rossume4485b01994-09-07 14:32:49 +00001423
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001424PyDoc_STRVAR(setblocking_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001425"setblocking(flag)\n\
1426\n\
1427Set the socket to blocking (flag is true) or non-blocking (false).\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00001428setblocking(True) is equivalent to settimeout(None);\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001429setblocking(False) is equivalent to settimeout(0.0).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001430
Guido van Rossum11ba0942002-06-13 15:07:44 +00001431/* s.settimeout(timeout) method. Argument:
1432 None -- no timeout, blocking mode; same as setblocking(True)
1433 0.0 -- non-blocking mode; same as setblocking(False)
1434 > 0 -- timeout mode; operations time out after timeout seconds
1435 < 0 -- illegal; raises an exception
1436*/
Guido van Rossum67f7a382002-06-06 21:08:16 +00001437static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001438sock_settimeout(PySocketSockObject *s, PyObject *arg)
Guido van Rossum67f7a382002-06-06 21:08:16 +00001439{
Guido van Rossum11ba0942002-06-13 15:07:44 +00001440 double timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001441
1442 if (arg == Py_None)
Guido van Rossum11ba0942002-06-13 15:07:44 +00001443 timeout = -1.0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001444 else {
Guido van Rossum11ba0942002-06-13 15:07:44 +00001445 timeout = PyFloat_AsDouble(arg);
1446 if (timeout < 0.0) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00001447 if (!PyErr_Occurred())
1448 PyErr_SetString(PyExc_ValueError,
Guido van Rossum11ba0942002-06-13 15:07:44 +00001449 "Timeout value out of range");
Guido van Rossum67f7a382002-06-06 21:08:16 +00001450 return NULL;
1451 }
1452 }
1453
Guido van Rossum11ba0942002-06-13 15:07:44 +00001454 s->sock_timeout = timeout;
1455 internal_setblocking(s, timeout < 0.0);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001456
1457 Py_INCREF(Py_None);
1458 return Py_None;
1459}
1460
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001461PyDoc_STRVAR(settimeout_doc,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001462"settimeout(timeout)\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00001463\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00001464Set a timeout on socket operations. 'timeout' can be a float,\n\
1465giving in seconds, or None. Setting a timeout of None disables\n\
1466the timeout feature and is equivalent to setblocking(1).\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001467Setting a timeout of zero is the same as setblocking(0).");
Guido van Rossum67f7a382002-06-06 21:08:16 +00001468
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001469/* s.gettimeout() method.
1470 Returns the timeout associated with a socket. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00001471static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001472sock_gettimeout(PySocketSockObject *s)
Guido van Rossum67f7a382002-06-06 21:08:16 +00001473{
1474 if (s->sock_timeout < 0.0) {
1475 Py_INCREF(Py_None);
1476 return Py_None;
1477 }
1478 else
1479 return PyFloat_FromDouble(s->sock_timeout);
1480}
1481
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001482PyDoc_STRVAR(gettimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00001483"gettimeout() -> timeout\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00001484\n\
1485Returns the timeout in floating seconds associated with socket \n\
1486operations. A timeout of None indicates that timeouts on socket \n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001487operations are disabled.");
Guido van Rossume4485b01994-09-07 14:32:49 +00001488
Guido van Rossum48a680c2001-03-02 06:34:14 +00001489#ifdef RISCOS
1490/* s.sleeptaskw(1 | 0) method */
1491
1492static PyObject *
Martin v. Löwisa94568a2003-05-10 07:36:56 +00001493sock_sleeptaskw(PySocketSockObject *s,PyObject *arg)
Guido van Rossum48a680c2001-03-02 06:34:14 +00001494{
Guido van Rossum67f7a382002-06-06 21:08:16 +00001495 int block;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00001496 block = PyInt_AsLong(arg);
1497 if (block == -1 && PyErr_Occurred())
Guido van Rossum67f7a382002-06-06 21:08:16 +00001498 return NULL;
1499 Py_BEGIN_ALLOW_THREADS
1500 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
1501 Py_END_ALLOW_THREADS
Guido van Rossum48a680c2001-03-02 06:34:14 +00001502
Guido van Rossum67f7a382002-06-06 21:08:16 +00001503 Py_INCREF(Py_None);
1504 return Py_None;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001505}
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001506PyDoc_STRVAR(sleeptaskw_doc,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001507"sleeptaskw(flag)\n\
1508\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001509Allow sleeps in taskwindows.");
Guido van Rossum48a680c2001-03-02 06:34:14 +00001510#endif
1511
1512
Guido van Rossumaee08791992-09-08 09:05:33 +00001513/* s.setsockopt() method.
1514 With an integer third argument, sets an integer option.
1515 With a string third argument, sets an option from a buffer;
1516 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001517
Guido van Rossum73624e91994-10-10 17:59:00 +00001518static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001519sock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001520{
1521 int level;
1522 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001523 int res;
Guido van Rossumaee08791992-09-08 09:05:33 +00001524 char *buf;
1525 int buflen;
1526 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001527
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001528 if (PyArg_ParseTuple(args, "iii:setsockopt",
1529 &level, &optname, &flag)) {
Guido van Rossumaee08791992-09-08 09:05:33 +00001530 buf = (char *) &flag;
1531 buflen = sizeof flag;
1532 }
1533 else {
Guido van Rossum73624e91994-10-10 17:59:00 +00001534 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001535 if (!PyArg_ParseTuple(args, "iis#:setsockopt",
1536 &level, &optname, &buf, &buflen))
Guido van Rossumaee08791992-09-08 09:05:33 +00001537 return NULL;
1538 }
Thomas Wouters334fb892000-07-25 12:56:38 +00001539 res = setsockopt(s->sock_fd, level, optname, (void *)buf, buflen);
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001540 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001541 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001542 Py_INCREF(Py_None);
1543 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001544}
1545
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001546PyDoc_STRVAR(setsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001547"setsockopt(level, option, value)\n\
1548\n\
1549Set a socket option. See the Unix manual for level and option.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001550The value argument can either be an integer or a string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001551
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001552
Guido van Rossumaee08791992-09-08 09:05:33 +00001553/* s.getsockopt() method.
1554 With two arguments, retrieves an integer option.
1555 With a third integer argument, retrieves a string buffer of that size;
1556 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001557
Guido van Rossum73624e91994-10-10 17:59:00 +00001558static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001559sock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001560{
1561 int level;
1562 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001563 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +00001564 PyObject *buf;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001565 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001566
Guido van Rossumbcc20741998-08-04 22:53:56 +00001567#ifdef __BEOS__
Fred Drake564a6cc2001-05-11 20:12:26 +00001568 /* We have incomplete socket support. */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001569 PyErr_SetString(socket_error, "getsockopt not supported");
Guido van Rossumbcc20741998-08-04 22:53:56 +00001570 return NULL;
1571#else
1572
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001573 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
1574 &level, &optname, &buflen))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001575 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001576
Guido van Rossumbe32c891996-06-20 16:25:29 +00001577 if (buflen == 0) {
Guido van Rossumaee08791992-09-08 09:05:33 +00001578 int flag = 0;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001579 socklen_t flagsize = sizeof flag;
Guido van Rossumb376a4a1993-11-23 17:53:17 +00001580 res = getsockopt(s->sock_fd, level, optname,
Thomas Wouters334fb892000-07-25 12:56:38 +00001581 (void *)&flag, &flagsize);
Guido van Rossumaee08791992-09-08 09:05:33 +00001582 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001583 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001584 return PyInt_FromLong(flag);
Guido van Rossumaee08791992-09-08 09:05:33 +00001585 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001586#ifdef __VMS
1587 if (buflen > 1024) {
1588#else
Guido van Rossumaee08791992-09-08 09:05:33 +00001589 if (buflen <= 0 || buflen > 1024) {
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001590#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001591 PyErr_SetString(socket_error,
Barry Warsaw752300b1997-01-03 17:18:10 +00001592 "getsockopt buflen out of range");
Guido van Rossumaee08791992-09-08 09:05:33 +00001593 return NULL;
1594 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001595 buf = PyString_FromStringAndSize((char *)NULL, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001596 if (buf == NULL)
1597 return NULL;
Guido van Rossumb376a4a1993-11-23 17:53:17 +00001598 res = getsockopt(s->sock_fd, level, optname,
Fred Drake564a6cc2001-05-11 20:12:26 +00001599 (void *)PyString_AS_STRING(buf), &buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001600 if (res < 0) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001601 Py_DECREF(buf);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001602 return s->errorhandler();
Guido van Rossumaee08791992-09-08 09:05:33 +00001603 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001604 _PyString_Resize(&buf, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001605 return buf;
Guido van Rossumbcc20741998-08-04 22:53:56 +00001606#endif /* __BEOS__ */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001607}
1608
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001609PyDoc_STRVAR(getsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001610"getsockopt(level, option[, buffersize]) -> value\n\
1611\n\
1612Get a socket option. See the Unix manual for level and option.\n\
1613If a nonzero buffersize argument is given, the return value is a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001614string of that length; otherwise it is an integer.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001615
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001616
Fred Drake728819a2000-07-01 03:40:12 +00001617/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001618
Guido van Rossum73624e91994-10-10 17:59:00 +00001619static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001620sock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001621{
1622 struct sockaddr *addr;
1623 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001624 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001625
Fred Drake728819a2000-07-01 03:40:12 +00001626 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001627 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001628 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001629 res = bind(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001630 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001631 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001632 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001633 Py_INCREF(Py_None);
1634 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001635}
1636
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001637PyDoc_STRVAR(bind_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001638"bind(address)\n\
1639\n\
1640Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00001641pair (host, port); the host must refer to the local host. For raw packet\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001642sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001643
Guido van Rossum30a685f1991-06-27 15:51:29 +00001644
1645/* s.close() method.
1646 Set the file descriptor to -1 so operations tried subsequently
1647 will surely fail. */
1648
Guido van Rossum73624e91994-10-10 17:59:00 +00001649static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001650sock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001651{
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001652 SOCKET_T fd;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001653
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001654 if ((fd = s->sock_fd) != -1) {
1655 s->sock_fd = -1;
Guido van Rossum08481461996-10-12 14:07:22 +00001656 Py_BEGIN_ALLOW_THREADS
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001657 (void) SOCKETCLOSE(fd);
Guido van Rossum08481461996-10-12 14:07:22 +00001658 Py_END_ALLOW_THREADS
1659 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001660 Py_INCREF(Py_None);
1661 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001662}
1663
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001664PyDoc_STRVAR(close_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001665"close()\n\
1666\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001667Close the socket. It cannot be used after this call.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001668
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001669static int
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001670internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen,
1671 int *timeoutp)
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001672{
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001673 int res, timeout;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001674
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001675 timeout = 0;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001676 res = connect(s->sock_fd, addr, addrlen);
1677
1678#ifdef MS_WINDOWS
1679
1680 if (s->sock_timeout > 0.0) {
1681 if (res < 0 && WSAGetLastError() == WSAEWOULDBLOCK) {
Guido van Rossumb76bdf82003-02-19 17:50:16 +00001682 /* This is a mess. Best solution: trust select */
1683 fd_set fds;
1684 struct timeval tv;
1685 tv.tv_sec = (int)s->sock_timeout;
1686 tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6);
1687 FD_ZERO(&fds);
1688 FD_SET(s->sock_fd, &fds);
1689 res = select(s->sock_fd+1, NULL, &fds, NULL, &tv);
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001690 if (res == 0) {
Guido van Rossumb76bdf82003-02-19 17:50:16 +00001691 res = WSAEWOULDBLOCK;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001692 timeout = 1;
1693 } else if (res > 0)
Guido van Rossumb76bdf82003-02-19 17:50:16 +00001694 res = 0;
1695 /* else if (res < 0) an error occurred */
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001696 }
1697 }
1698
1699 if (res < 0)
1700 res = WSAGetLastError();
1701
1702#else
1703
1704 if (s->sock_timeout > 0.0) {
1705 if (res < 0 && errno == EINPROGRESS) {
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001706 timeout = internal_select(s, 1);
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001707 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum12e3c712002-08-08 20:39:30 +00001708 if (res < 0 && errno == EISCONN)
1709 res = 0;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001710 }
1711 }
1712
1713 if (res < 0)
1714 res = errno;
1715
1716#endif
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001717 *timeoutp = timeout;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001718
1719 return res;
1720}
Guido van Rossum30a685f1991-06-27 15:51:29 +00001721
Fred Drake728819a2000-07-01 03:40:12 +00001722/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001723
Guido van Rossum73624e91994-10-10 17:59:00 +00001724static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001725sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001726{
1727 struct sockaddr *addr;
1728 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001729 int res;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001730 int timeout;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001731
Fred Drake728819a2000-07-01 03:40:12 +00001732 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001733 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001734
Guido van Rossum73624e91994-10-10 17:59:00 +00001735 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001736 res = internal_connect(s, addr, addrlen, &timeout);
Guido van Rossum11ba0942002-06-13 15:07:44 +00001737 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001738
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001739 if (timeout) {
1740 PyErr_SetString(socket_timeout, "timed out");
1741 return NULL;
1742 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001743 if (res != 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001744 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001745 Py_INCREF(Py_None);
1746 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001747}
1748
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001749PyDoc_STRVAR(connect_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001750"connect(address)\n\
1751\n\
1752Connect the socket to a remote address. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001753is a pair (host, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001754
Guido van Rossum30a685f1991-06-27 15:51:29 +00001755
Fred Drake728819a2000-07-01 03:40:12 +00001756/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001757
1758static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001759sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001760{
1761 struct sockaddr *addr;
1762 int addrlen;
1763 int res;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001764 int timeout;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001765
Fred Drake728819a2000-07-01 03:40:12 +00001766 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001767 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001768
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001769 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001770 res = internal_connect(s, addr, addrlen, &timeout);
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001771 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001772
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001773 return PyInt_FromLong((long) res);
1774}
1775
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001776PyDoc_STRVAR(connect_ex_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00001777"connect_ex(address) -> errno\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00001778\n\
1779This is like connect(address), but returns an error code (the errno value)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001780instead of raising an exception when an error occurs.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001781
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001782
Guido van Rossumed233a51992-06-23 09:07:03 +00001783/* s.fileno() method */
1784
Guido van Rossum73624e91994-10-10 17:59:00 +00001785static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001786sock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00001787{
Fred Drakea04eaad2000-06-30 02:46:07 +00001788#if SIZEOF_SOCKET_T <= SIZEOF_LONG
Guido van Rossum73624e91994-10-10 17:59:00 +00001789 return PyInt_FromLong((long) s->sock_fd);
Fred Drakea04eaad2000-06-30 02:46:07 +00001790#else
Martin v. Löwisb9a0f912003-03-29 10:06:18 +00001791 return PyLong_FromLongLong((PY_LONG_LONG)s->sock_fd);
Fred Drakea04eaad2000-06-30 02:46:07 +00001792#endif
Guido van Rossumed233a51992-06-23 09:07:03 +00001793}
1794
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001795PyDoc_STRVAR(fileno_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001796"fileno() -> integer\n\
1797\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001798Return the integer file descriptor of the socket.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001799
Guido van Rossumed233a51992-06-23 09:07:03 +00001800
Guido van Rossumbe32c891996-06-20 16:25:29 +00001801#ifndef NO_DUP
1802/* s.dup() method */
1803
1804static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001805sock_dup(PySocketSockObject *s)
Guido van Rossumbe32c891996-06-20 16:25:29 +00001806{
Fred Drakea04eaad2000-06-30 02:46:07 +00001807 SOCKET_T newfd;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001808 PyObject *sock;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001809
Guido van Rossumbe32c891996-06-20 16:25:29 +00001810 newfd = dup(s->sock_fd);
1811 if (newfd < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001812 return s->errorhandler();
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001813 sock = (PyObject *) new_sockobject(newfd,
1814 s->sock_family,
1815 s->sock_type,
1816 s->sock_proto);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001817 if (sock == NULL)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001818 SOCKETCLOSE(newfd);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001819 return sock;
1820}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001821
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001822PyDoc_STRVAR(dup_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001823"dup() -> socket object\n\
1824\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001825Return a new socket object connected to the same system resource.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001826
Guido van Rossumbe32c891996-06-20 16:25:29 +00001827#endif
1828
1829
Guido van Rossumc89705d1992-11-26 08:54:07 +00001830/* s.getsockname() method */
1831
Guido van Rossum73624e91994-10-10 17:59:00 +00001832static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001833sock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001834{
1835 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001836 int res;
1837 socklen_t addrlen;
1838
Guido van Rossumc89705d1992-11-26 08:54:07 +00001839 if (!getsockaddrlen(s, &addrlen))
1840 return NULL;
Guido van Rossumca42b161996-01-12 01:36:05 +00001841 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001842 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001843 res = getsockname(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001844 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001845 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001846 return s->errorhandler();
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001847 return makesockaddr(s->sock_fd, (struct sockaddr *) addrbuf, addrlen,
1848 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001849}
1850
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001851PyDoc_STRVAR(getsockname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001852"getsockname() -> address info\n\
1853\n\
1854Return the address of the local endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001855info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001856
Guido van Rossumc89705d1992-11-26 08:54:07 +00001857
Guido van Rossumb6775db1994-08-01 11:34:53 +00001858#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001859/* s.getpeername() method */
1860
Guido van Rossum73624e91994-10-10 17:59:00 +00001861static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001862sock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001863{
1864 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001865 int res;
1866 socklen_t addrlen;
1867
Guido van Rossumc89705d1992-11-26 08:54:07 +00001868 if (!getsockaddrlen(s, &addrlen))
1869 return NULL;
Fred Drakefd168342001-05-09 19:11:33 +00001870 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001871 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001872 res = getpeername(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001873 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001874 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001875 return s->errorhandler();
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001876 return makesockaddr(s->sock_fd, (struct sockaddr *) addrbuf, addrlen,
1877 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001878}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001879
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001880PyDoc_STRVAR(getpeername_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001881"getpeername() -> address info\n\
1882\n\
1883Return the address of the remote endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001884info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001885
Guido van Rossumb6775db1994-08-01 11:34:53 +00001886#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001887
1888
Guido van Rossum30a685f1991-06-27 15:51:29 +00001889/* s.listen(n) method */
1890
Guido van Rossum73624e91994-10-10 17:59:00 +00001891static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001892sock_listen(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001893{
1894 int backlog;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001895 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001896
1897 backlog = PyInt_AsLong(arg);
1898 if (backlog == -1 && PyErr_Occurred())
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001899 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001900 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +00001901 if (backlog < 1)
1902 backlog = 1;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001903 res = listen(s->sock_fd, backlog);
Guido van Rossum73624e91994-10-10 17:59:00 +00001904 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001905 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001906 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001907 Py_INCREF(Py_None);
1908 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001909}
1910
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001911PyDoc_STRVAR(listen_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001912"listen(backlog)\n\
1913\n\
1914Enable a server to accept connections. The backlog argument must be at\n\
1915least 1; it specifies the number of unaccepted connection that the system\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001916will allow before refusing new connections.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001917
1918
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001919#ifndef NO_DUP
Guido van Rossum30a685f1991-06-27 15:51:29 +00001920/* s.makefile(mode) method.
1921 Create a new open file object referring to a dupped version of
1922 the socket's file descriptor. (The dup() call is necessary so
1923 that the open file and socket objects may be closed independent
1924 of each other.)
1925 The mode argument specifies 'r' or 'w' passed to fdopen(). */
1926
Guido van Rossum73624e91994-10-10 17:59:00 +00001927static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001928sock_makefile(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001929{
Tim Petersdbd9ba62000-07-09 03:09:57 +00001930 extern int fclose(FILE *);
Guido van Rossum6b144911995-03-14 15:05:13 +00001931 char *mode = "r";
1932 int bufsize = -1;
Fred Drakea04eaad2000-06-30 02:46:07 +00001933#ifdef MS_WIN32
Tim Peters79248aa2001-08-29 21:37:10 +00001934 Py_intptr_t fd;
Fred Drakea04eaad2000-06-30 02:46:07 +00001935#else
Guido van Rossum30a685f1991-06-27 15:51:29 +00001936 int fd;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001937#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001938 FILE *fp;
Guido van Rossum6b144911995-03-14 15:05:13 +00001939 PyObject *f;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001940#ifdef __VMS
1941 char *mode_r = "r";
1942 char *mode_w = "w";
1943#endif
Guido van Rossum6b144911995-03-14 15:05:13 +00001944
Guido van Rossum43713e52000-02-29 13:59:29 +00001945 if (!PyArg_ParseTuple(args, "|si:makefile", &mode, &bufsize))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001946 return NULL;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001947#ifdef __VMS
1948 if (strcmp(mode,"rb") == 0) {
1949 mode = mode_r;
1950 }
1951 else {
1952 if (strcmp(mode,"wb") == 0) {
1953 mode = mode_w;
1954 }
1955 }
1956#endif
Guido van Rossum8d665e61996-06-26 18:22:49 +00001957#ifdef MS_WIN32
Guido van Rossum82a5c661998-07-07 20:45:43 +00001958 if (((fd = _open_osfhandle(s->sock_fd, _O_BINARY)) < 0) ||
1959 ((fd = dup(fd)) < 0) || ((fp = fdopen(fd, mode)) == NULL))
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001960#else
Guido van Rossum82a5c661998-07-07 20:45:43 +00001961 if ((fd = dup(s->sock_fd)) < 0 || (fp = fdopen(fd, mode)) == NULL)
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001962#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001963 {
Guido van Rossum6b144911995-03-14 15:05:13 +00001964 if (fd >= 0)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001965 SOCKETCLOSE(fd);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001966 return s->errorhandler();
Guido van Rossum6b144911995-03-14 15:05:13 +00001967 }
1968 f = PyFile_FromFile(fp, "<socket>", mode, fclose);
1969 if (f != NULL)
1970 PyFile_SetBufSize(f, bufsize);
1971 return f;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001972}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001973
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001974PyDoc_STRVAR(makefile_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001975"makefile([mode[, buffersize]]) -> file object\n\
1976\n\
1977Return a regular file object corresponding to the socket.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001978The mode and buffersize arguments are as for the built-in open() function.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001979
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001980#endif /* NO_DUP */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001981
Guido van Rossum48a680c2001-03-02 06:34:14 +00001982
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001983/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001984
Guido van Rossum73624e91994-10-10 17:59:00 +00001985static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001986sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001987{
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001988 int len, n = 0, flags = 0, timeout;
Guido van Rossum73624e91994-10-10 17:59:00 +00001989 PyObject *buf;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001990#ifdef __VMS
1991 int read_length;
1992 char *read_buf;
1993#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00001994
Guido van Rossum43713e52000-02-29 13:59:29 +00001995 if (!PyArg_ParseTuple(args, "i|i:recv", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001996 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001997
1998 if (len < 0) {
Martin v. Löwisfba64e12001-11-19 10:41:26 +00001999 PyErr_SetString(PyExc_ValueError,
Guido van Rossum11ba0942002-06-13 15:07:44 +00002000 "negative buffersize in recv");
Martin v. Löwisfba64e12001-11-19 10:41:26 +00002001 return NULL;
2002 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002003
Guido van Rossum73624e91994-10-10 17:59:00 +00002004 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002005 if (buf == NULL)
2006 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002007
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002008#ifndef __VMS
Guido van Rossum73624e91994-10-10 17:59:00 +00002009 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002010 timeout = internal_select(s, 0);
2011 if (!timeout)
2012 n = recv(s->sock_fd, PyString_AS_STRING(buf), len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00002013 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002014
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002015 if (timeout) {
2016 Py_DECREF(buf);
2017 PyErr_SetString(socket_timeout, "timed out");
2018 return NULL;
2019 }
Guido van Rossum7c53b771995-09-13 18:39:47 +00002020 if (n < 0) {
2021 Py_DECREF(buf);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002022 return s->errorhandler();
Guido van Rossum7c53b771995-09-13 18:39:47 +00002023 }
Tim Peters5de98422002-04-27 18:44:32 +00002024 if (n != len)
2025 _PyString_Resize(&buf, n);
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002026#else
2027 read_buf = PyString_AsString(buf);
2028 read_length = len;
2029 while (read_length != 0) {
2030 unsigned int segment;
2031
2032 segment = read_length /SEGMENT_SIZE;
2033 if (segment != 0) {
2034 segment = SEGMENT_SIZE;
2035 }
2036 else {
2037 segment = read_length;
2038 }
2039
2040 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002041 timeout = internal_select(s, 0);
2042 if (!timeout)
2043 n = recv(s->sock_fd, read_buf, segment, flags);
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002044 Py_END_ALLOW_THREADS
2045
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002046 if (timeout) {
2047 Py_DECREF(buf);
2048 PyErr_SetString(socket_timeout, "timed out");
2049 return NULL;
2050 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002051 if (n < 0) {
2052 Py_DECREF(buf);
2053 return s->errorhandler();
2054 }
2055 if (n != read_length) {
2056 read_buf += n;
2057 break;
2058 }
2059
2060 read_length -= segment;
2061 read_buf += segment;
2062 }
2063 if (_PyString_Resize(&buf, (read_buf - PyString_AsString(buf))) < 0)
2064 {
2065 return NULL;
2066 }
2067#endif /* !__VMS */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002068 return buf;
2069}
2070
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002071PyDoc_STRVAR(recv_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002072"recv(buffersize[, flags]) -> data\n\
2073\n\
2074Receive up to buffersize bytes from the socket. For the optional flags\n\
2075argument, see the Unix manual. When no data is available, block until\n\
2076at least one byte is available or until the remote end is closed. When\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002077the remote end is closed and all data is read, return the empty string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002078
Guido van Rossum30a685f1991-06-27 15:51:29 +00002079
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002080/* s.recvfrom(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002081
Guido van Rossum73624e91994-10-10 17:59:00 +00002082static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002083sock_recvfrom(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002084{
2085 char addrbuf[256];
Barry Warsaw752300b1997-01-03 17:18:10 +00002086 PyObject *buf = NULL;
2087 PyObject *addr = NULL;
2088 PyObject *ret = NULL;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002089 int len, n = 0, flags = 0, timeout;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002090 socklen_t addrlen;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002091
Guido van Rossum43713e52000-02-29 13:59:29 +00002092 if (!PyArg_ParseTuple(args, "i|i:recvfrom", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00002093 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002094
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00002095 if (!getsockaddrlen(s, &addrlen))
2096 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00002097 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00002098 if (buf == NULL)
2099 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002100
Guido van Rossum73624e91994-10-10 17:59:00 +00002101 Py_BEGIN_ALLOW_THREADS
Fred Drakefd168342001-05-09 19:11:33 +00002102 memset(addrbuf, 0, addrlen);
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002103 timeout = internal_select(s, 0);
2104 if (!timeout)
2105 n = recvfrom(s->sock_fd, PyString_AS_STRING(buf), len, flags,
Guido van Rossum8d665e61996-06-26 18:22:49 +00002106#ifndef MS_WINDOWS
Andrew MacIntyreba43e872002-03-03 03:03:52 +00002107#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002108 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00002109#else
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002110 (void *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00002111#endif
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002112#else
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002113 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002114#endif
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002115 );
Guido van Rossum73624e91994-10-10 17:59:00 +00002116 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002117
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002118 if (timeout) {
2119 Py_DECREF(buf);
2120 PyErr_SetString(socket_timeout, "timed out");
2121 return NULL;
2122 }
Guido van Rossum7c53b771995-09-13 18:39:47 +00002123 if (n < 0) {
2124 Py_DECREF(buf);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002125 return s->errorhandler();
Guido van Rossum7c53b771995-09-13 18:39:47 +00002126 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002127
Guido van Rossum53a9bf81996-06-11 18:35:24 +00002128 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002129 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002130
Guido van Rossum67f7a382002-06-06 21:08:16 +00002131 if (!(addr = makesockaddr(s->sock_fd, (struct sockaddr *)addrbuf,
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00002132 addrlen, s->sock_proto)))
Barry Warsaw752300b1997-01-03 17:18:10 +00002133 goto finally;
2134
Raymond Hettinger8ae46892003-10-12 19:09:37 +00002135 ret = PyTuple_Pack(2, buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002136
2137finally:
Guido van Rossum73624e91994-10-10 17:59:00 +00002138 Py_XDECREF(addr);
2139 Py_XDECREF(buf);
Guido van Rossum6f5afc91993-02-05 09:46:15 +00002140 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002141}
2142
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002143PyDoc_STRVAR(recvfrom_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002144"recvfrom(buffersize[, flags]) -> (data, address info)\n\
2145\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002146Like recv(buffersize, flags) but also return the sender's address info.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002147
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002148/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002149
Guido van Rossum73624e91994-10-10 17:59:00 +00002150static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002151sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002152{
Guido van Rossumff4949e1992-08-05 19:58:53 +00002153 char *buf;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002154 int len, n = 0, flags = 0, timeout;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002155#ifdef __VMS
2156 int send_length;
2157#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00002158
Guido van Rossum43713e52000-02-29 13:59:29 +00002159 if (!PyArg_ParseTuple(args, "s#|i:send", &buf, &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00002160 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002161
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002162#ifndef __VMS
Guido van Rossum73624e91994-10-10 17:59:00 +00002163 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002164 timeout = internal_select(s, 1);
2165 if (!timeout)
2166 n = send(s->sock_fd, buf, len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00002167 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002168
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002169 if (timeout) {
2170 PyErr_SetString(socket_timeout, "timed out");
2171 return NULL;
2172 }
Guido van Rossum30a685f1991-06-27 15:51:29 +00002173 if (n < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002174 return s->errorhandler();
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002175#else
2176 /* Divide packet into smaller segments for */
2177 /* TCP/IP Services for OpenVMS */
2178 send_length = len;
2179 while (send_length != 0) {
2180 unsigned int segment;
2181
2182 segment = send_length / SEGMENT_SIZE;
2183 if (segment != 0) {
2184 segment = SEGMENT_SIZE;
2185 }
2186 else {
2187 segment = send_length;
2188 }
2189 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002190 timeout = internal_select(s, 1);
2191 if (!timeout)
2192 n = send(s->sock_fd, buf, segment, flags);
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002193 Py_END_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002194 if (timeout) {
2195 PyErr_SetString(socket_timeout, "timed out");
2196 return NULL;
2197 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002198 if (n < 0) {
2199 return s->errorhandler();
2200 }
2201 send_length -= segment;
2202 buf += segment;
2203 } /* end while */
2204#endif /* !__VMS */
Guido van Rossum73624e91994-10-10 17:59:00 +00002205 return PyInt_FromLong((long)n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00002206}
2207
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002208PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002209"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002210\n\
2211Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002212argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002213sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002214
2215
2216/* s.sendall(data [,flags]) method */
2217
2218static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002219sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002220{
2221 char *buf;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002222 int len, n = 0, flags = 0, timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002223
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002224 if (!PyArg_ParseTuple(args, "s#|i:sendall", &buf, &len, &flags))
2225 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002226
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002227 Py_BEGIN_ALLOW_THREADS
2228 do {
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002229 timeout = internal_select(s, 1);
2230 if (timeout)
2231 break;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002232 n = send(s->sock_fd, buf, len, flags);
2233 if (n < 0)
2234 break;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002235 buf += n;
2236 len -= n;
2237 } while (len > 0);
2238 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002239
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002240 if (timeout) {
2241 PyErr_SetString(socket_timeout, "timed out");
2242 return NULL;
2243 }
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002244 if (n < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002245 return s->errorhandler();
Guido van Rossum67f7a382002-06-06 21:08:16 +00002246
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002247 Py_INCREF(Py_None);
2248 return Py_None;
2249}
2250
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002251PyDoc_STRVAR(sendall_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002252"sendall(data[, flags])\n\
2253\n\
2254Send a data string to the socket. For the optional flags\n\
2255argument, see the Unix manual. This calls send() repeatedly\n\
2256until all data is sent. If an error occurs, it's impossible\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002257to tell how much data has been sent.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002258
Guido van Rossum30a685f1991-06-27 15:51:29 +00002259
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002260/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002261
Guido van Rossum73624e91994-10-10 17:59:00 +00002262static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002263sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002264{
Guido van Rossum73624e91994-10-10 17:59:00 +00002265 PyObject *addro;
Guido van Rossumff4949e1992-08-05 19:58:53 +00002266 char *buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002267 struct sockaddr *addr;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002268 int addrlen, len, n = 0, flags, timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002269
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002270 flags = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002271 if (!PyArg_ParseTuple(args, "s#O:sendto", &buf, &len, &addro)) {
Guido van Rossum73624e91994-10-10 17:59:00 +00002272 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002273 if (!PyArg_ParseTuple(args, "s#iO:sendto",
2274 &buf, &len, &flags, &addro))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002275 return NULL;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002276 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002277
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002278 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002279 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002280
Guido van Rossum73624e91994-10-10 17:59:00 +00002281 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002282 timeout = internal_select(s, 1);
2283 if (!timeout)
2284 n = sendto(s->sock_fd, buf, len, flags, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00002285 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002286
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002287 if (timeout) {
2288 PyErr_SetString(socket_timeout, "timed out");
2289 return NULL;
2290 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002291 if (n < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002292 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00002293 return PyInt_FromLong((long)n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002294}
2295
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002296PyDoc_STRVAR(sendto_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002297"sendto(data[, flags], address) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002298\n\
2299Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002300For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002301
Guido van Rossum30a685f1991-06-27 15:51:29 +00002302
2303/* s.shutdown(how) method */
2304
Guido van Rossum73624e91994-10-10 17:59:00 +00002305static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002306sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002307{
2308 int how;
Guido van Rossumff4949e1992-08-05 19:58:53 +00002309 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002310
2311 how = PyInt_AsLong(arg);
2312 if (how == -1 && PyErr_Occurred())
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002313 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00002314 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002315 res = shutdown(s->sock_fd, how);
Guido van Rossum73624e91994-10-10 17:59:00 +00002316 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002317 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002318 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00002319 Py_INCREF(Py_None);
2320 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002321}
2322
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002323PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002324"shutdown(flag)\n\
2325\n\
Martin v. Löwis94681fc2003-11-27 19:40:22 +00002326Shut down the reading side of the socket (flag == SHUT_RD), the writing side\n\
2327of the socket (flag == SHUT_WR), or both ends (flag == SHUT_RDWR).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002328
Guido van Rossum30a685f1991-06-27 15:51:29 +00002329
2330/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002331
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002332static PyMethodDef sock_methods[] = {
2333 {"accept", (PyCFunction)sock_accept, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002334 accept_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002335 {"bind", (PyCFunction)sock_bind, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002336 bind_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002337 {"close", (PyCFunction)sock_close, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002338 close_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002339 {"connect", (PyCFunction)sock_connect, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002340 connect_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002341 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002342 connect_ex_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00002343#ifndef NO_DUP
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002344 {"dup", (PyCFunction)sock_dup, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002345 dup_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00002346#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002347 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002348 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00002349#ifdef HAVE_GETPEERNAME
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002350 {"getpeername", (PyCFunction)sock_getpeername,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002351 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00002352#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002353 {"getsockname", (PyCFunction)sock_getsockname,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002354 METH_NOARGS, getsockname_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002355 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002356 getsockopt_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002357 {"listen", (PyCFunction)sock_listen, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002358 listen_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002359#ifndef NO_DUP
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002360 {"makefile", (PyCFunction)sock_makefile, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002361 makefile_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002362#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002363 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002364 recv_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002365 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002366 recvfrom_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002367 {"send", (PyCFunction)sock_send, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002368 send_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002369 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002370 sendall_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002371 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002372 sendto_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002373 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002374 setblocking_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002375 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
Guido van Rossum67f7a382002-06-06 21:08:16 +00002376 settimeout_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002377 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
Guido van Rossum67f7a382002-06-06 21:08:16 +00002378 gettimeout_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002379 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002380 setsockopt_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002381 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002382 shutdown_doc},
2383#ifdef RISCOS
Martin v. Löwisa94568a2003-05-10 07:36:56 +00002384 {"sleeptaskw", (PyCFunction)sock_sleeptaskw, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002385 sleeptaskw_doc},
2386#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +00002387 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002388};
2389
Guido van Rossum30a685f1991-06-27 15:51:29 +00002390
Guido van Rossum73624e91994-10-10 17:59:00 +00002391/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00002392 First close the file description. */
2393
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002394static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002395sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002396{
Guido van Rossumfa972c92000-04-10 12:45:45 +00002397 if (s->sock_fd != -1)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00002398 (void) SOCKETCLOSE(s->sock_fd);
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002399 s->ob_type->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002400}
2401
Guido van Rossum30a685f1991-06-27 15:51:29 +00002402
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002403static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002404sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002405{
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002406 char buf[512];
Fred Drakea04eaad2000-06-30 02:46:07 +00002407#if SIZEOF_SOCKET_T > SIZEOF_LONG
2408 if (s->sock_fd > LONG_MAX) {
2409 /* this can occur on Win64, and actually there is a special
2410 ugly printf formatter for decimal pointer length integer
2411 printing, only bother if necessary*/
2412 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002413 "no printf formatter to display "
2414 "the socket descriptor in decimal");
Fred Drakea04eaad2000-06-30 02:46:07 +00002415 return NULL;
2416 }
2417#endif
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002418 PyOS_snprintf(
2419 buf, sizeof(buf),
2420 "<socket object, fd=%ld, family=%d, type=%d, protocol=%d>",
2421 (long)s->sock_fd, s->sock_family,
2422 s->sock_type,
2423 s->sock_proto);
Guido van Rossumdc1c64a1996-02-27 15:21:19 +00002424 return PyString_FromString(buf);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002425}
2426
2427
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002428/* Create a new, uninitialized socket object. */
2429
2430static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002431sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002432{
2433 PyObject *new;
2434
2435 new = type->tp_alloc(type, 0);
Guido van Rossume1c478f2002-06-06 20:08:25 +00002436 if (new != NULL) {
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002437 ((PySocketSockObject *)new)->sock_fd = -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002438 ((PySocketSockObject *)new)->sock_timeout = -1.0;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002439 ((PySocketSockObject *)new)->errorhandler = &set_error;
Guido van Rossume1c478f2002-06-06 20:08:25 +00002440 }
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002441 return new;
2442}
2443
2444
2445/* Initialize a new socket object. */
2446
2447/*ARGSUSED*/
2448static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00002449sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002450{
2451 PySocketSockObject *s = (PySocketSockObject *)self;
2452 SOCKET_T fd;
2453 int family = AF_INET, type = SOCK_STREAM, proto = 0;
2454 static char *keywords[] = {"family", "type", "proto", 0};
2455
2456 if (!PyArg_ParseTupleAndKeywords(args, kwds,
2457 "|iii:socket", keywords,
2458 &family, &type, &proto))
2459 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002460
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002461 Py_BEGIN_ALLOW_THREADS
2462 fd = socket(family, type, proto);
2463 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002464
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002465#ifdef MS_WINDOWS
2466 if (fd == INVALID_SOCKET)
2467#else
2468 if (fd < 0)
2469#endif
2470 {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002471 set_error();
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002472 return -1;
2473 }
2474 init_sockobject(s, fd, family, type, proto);
2475 /* From now on, ignore SIGPIPE and let the error checking
2476 do the work. */
2477#ifdef SIGPIPE
2478 (void) signal(SIGPIPE, SIG_IGN);
2479#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00002480
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002481 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002482
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002483}
2484
2485
Guido van Rossumb6775db1994-08-01 11:34:53 +00002486/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002487
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002488static PyTypeObject sock_type = {
Guido van Rossum55558541996-05-23 22:54:50 +00002489 PyObject_HEAD_INIT(0) /* Must fill in type value later */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002490 0, /* ob_size */
Guido van Rossumca6dfa52001-10-28 12:31:33 +00002491 "_socket.socket", /* tp_name */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002492 sizeof(PySocketSockObject), /* tp_basicsize */
2493 0, /* tp_itemsize */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002494 (destructor)sock_dealloc, /* tp_dealloc */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002495 0, /* tp_print */
2496 0, /* tp_getattr */
2497 0, /* tp_setattr */
2498 0, /* tp_compare */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002499 (reprfunc)sock_repr, /* tp_repr */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002500 0, /* tp_as_number */
2501 0, /* tp_as_sequence */
2502 0, /* tp_as_mapping */
2503 0, /* tp_hash */
2504 0, /* tp_call */
2505 0, /* tp_str */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002506 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002507 0, /* tp_setattro */
2508 0, /* tp_as_buffer */
2509 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002510 sock_doc, /* tp_doc */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002511 0, /* tp_traverse */
2512 0, /* tp_clear */
2513 0, /* tp_richcompare */
2514 0, /* tp_weaklistoffset */
2515 0, /* tp_iter */
2516 0, /* tp_iternext */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002517 sock_methods, /* tp_methods */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002518 0, /* tp_members */
2519 0, /* tp_getset */
2520 0, /* tp_base */
2521 0, /* tp_dict */
2522 0, /* tp_descr_get */
2523 0, /* tp_descr_set */
2524 0, /* tp_dictoffset */
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00002525 sock_initobj, /* tp_init */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002526 PyType_GenericAlloc, /* tp_alloc */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002527 sock_new, /* tp_new */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002528 PyObject_Del, /* tp_free */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002529};
2530
Guido van Rossum30a685f1991-06-27 15:51:29 +00002531
Guido van Rossum81194471991-07-27 21:42:02 +00002532/* Python interface to gethostname(). */
2533
2534/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002535static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002536socket_gethostname(PyObject *self, PyObject *args)
Guido van Rossum81194471991-07-27 21:42:02 +00002537{
2538 char buf[1024];
Guido van Rossumff4949e1992-08-05 19:58:53 +00002539 int res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002540 if (!PyArg_ParseTuple(args, ":gethostname"))
Guido van Rossum81194471991-07-27 21:42:02 +00002541 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00002542 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002543 res = gethostname(buf, (int) sizeof buf - 1);
Guido van Rossum73624e91994-10-10 17:59:00 +00002544 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002545 if (res < 0)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002546 return set_error();
Guido van Rossum81194471991-07-27 21:42:02 +00002547 buf[sizeof buf - 1] = '\0';
Guido van Rossum73624e91994-10-10 17:59:00 +00002548 return PyString_FromString(buf);
Guido van Rossum81194471991-07-27 21:42:02 +00002549}
Guido van Rossumff4949e1992-08-05 19:58:53 +00002550
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002551PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002552"gethostname() -> string\n\
2553\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002554Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002555
Guido van Rossumff4949e1992-08-05 19:58:53 +00002556
Guido van Rossum30a685f1991-06-27 15:51:29 +00002557/* Python interface to gethostbyname(name). */
2558
2559/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002560static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002561socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002562{
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002563 char *name;
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00002564#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002565 struct sockaddr_storage addrbuf;
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00002566#else
2567 struct sockaddr_in addrbuf;
2568#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002569
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002570 if (!PyArg_ParseTuple(args, "s:gethostbyname", &name))
Guido van Rossum30a685f1991-06-27 15:51:29 +00002571 return NULL;
Martin v. Löwisddc6f472002-07-28 16:10:31 +00002572 if (setipaddr(name, (struct sockaddr *)&addrbuf, sizeof(addrbuf), AF_INET) < 0)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002573 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002574 return makeipaddr((struct sockaddr *)&addrbuf,
2575 sizeof(struct sockaddr_in));
Guido van Rossum30a685f1991-06-27 15:51:29 +00002576}
2577
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002578PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002579"gethostbyname(host) -> address\n\
2580\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002581Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002582
2583
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002584/* Convenience function common to gethostbyname_ex and gethostbyaddr */
2585
2586static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002587gethost_common(struct hostent *h, struct sockaddr *addr, int alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002588{
2589 char **pch;
2590 PyObject *rtn_tuple = (PyObject *)NULL;
2591 PyObject *name_list = (PyObject *)NULL;
2592 PyObject *addr_list = (PyObject *)NULL;
2593 PyObject *tmp;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002594
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002595 if (h == NULL) {
Guido van Rossum48a680c2001-03-02 06:34:14 +00002596 /* Let's get real error message to return */
Guido van Rossume2ae77b2001-10-24 20:42:55 +00002597#ifndef RISCOS
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002598 set_herror(h_errno);
Guido van Rossume2ae77b2001-10-24 20:42:55 +00002599#else
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002600 PyErr_SetString(socket_error, "host not found");
Guido van Rossume2ae77b2001-10-24 20:42:55 +00002601#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002602 return NULL;
2603 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002604
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002605 if (h->h_addrtype != af) {
2606#ifdef HAVE_STRERROR
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002607 /* Let's get real error message to return */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002608 PyErr_SetString(socket_error,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002609 (char *)strerror(EAFNOSUPPORT));
2610#else
2611 PyErr_SetString(
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002612 socket_error,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002613 "Address family not supported by protocol family");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002614#endif
2615 return NULL;
2616 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002617
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002618 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00002619
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002620 case AF_INET:
2621 if (alen < sizeof(struct sockaddr_in))
2622 return NULL;
2623 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002624
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002625#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002626 case AF_INET6:
2627 if (alen < sizeof(struct sockaddr_in6))
2628 return NULL;
2629 break;
2630#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00002631
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002632 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002633
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002634 if ((name_list = PyList_New(0)) == NULL)
2635 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002636
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002637 if ((addr_list = PyList_New(0)) == NULL)
2638 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002639
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002640 for (pch = h->h_aliases; *pch != NULL; pch++) {
2641 int status;
2642 tmp = PyString_FromString(*pch);
2643 if (tmp == NULL)
2644 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002645
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002646 status = PyList_Append(name_list, tmp);
2647 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002648
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002649 if (status)
2650 goto err;
2651 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002652
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002653 for (pch = h->h_addr_list; *pch != NULL; pch++) {
2654 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002655
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002656 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00002657
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002658 case AF_INET:
2659 {
2660 struct sockaddr_in sin;
2661 memset(&sin, 0, sizeof(sin));
2662 sin.sin_family = af;
2663#ifdef HAVE_SOCKADDR_SA_LEN
2664 sin.sin_len = sizeof(sin);
2665#endif
2666 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
2667 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
Guido van Rossum67f7a382002-06-06 21:08:16 +00002668
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002669 if (pch == h->h_addr_list && alen >= sizeof(sin))
2670 memcpy((char *) addr, &sin, sizeof(sin));
2671 break;
2672 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002673
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002674#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002675 case AF_INET6:
2676 {
2677 struct sockaddr_in6 sin6;
2678 memset(&sin6, 0, sizeof(sin6));
2679 sin6.sin6_family = af;
2680#ifdef HAVE_SOCKADDR_SA_LEN
2681 sin6.sin6_len = sizeof(sin6);
2682#endif
2683 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
2684 tmp = makeipaddr((struct sockaddr *)&sin6,
2685 sizeof(sin6));
Guido van Rossum67f7a382002-06-06 21:08:16 +00002686
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002687 if (pch == h->h_addr_list && alen >= sizeof(sin6))
2688 memcpy((char *) addr, &sin6, sizeof(sin6));
2689 break;
2690 }
2691#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00002692
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002693 default: /* can't happen */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002694 PyErr_SetString(socket_error,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002695 "unsupported address family");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002696 return NULL;
2697 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002698
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002699 if (tmp == NULL)
2700 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002701
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002702 status = PyList_Append(addr_list, tmp);
2703 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002704
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002705 if (status)
2706 goto err;
2707 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002708
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002709 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002710
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002711 err:
2712 Py_XDECREF(name_list);
2713 Py_XDECREF(addr_list);
2714 return rtn_tuple;
2715}
2716
2717
2718/* Python interface to gethostbyname_ex(name). */
2719
2720/*ARGSUSED*/
2721static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002722socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002723{
2724 char *name;
2725 struct hostent *h;
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00002726#ifdef ENABLE_IPV6
2727 struct sockaddr_storage addr;
2728#else
2729 struct sockaddr_in addr;
2730#endif
Martin v. Löwis9db2f572001-07-23 01:30:10 +00002731 struct sockaddr *sa;
Guido van Rossum955becc1999-03-22 20:14:53 +00002732 PyObject *ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002733#ifdef HAVE_GETHOSTBYNAME_R
2734 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002735#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
2736 struct hostent_data data;
2737#else
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002738 char buf[16384];
2739 int buf_len = (sizeof buf) - 1;
2740 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002741#endif
2742#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002743 int result;
2744#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002745#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002746
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002747 if (!PyArg_ParseTuple(args, "s:gethostbyname_ex", &name))
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002748 return NULL;
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00002749 if (setipaddr(name, (struct sockaddr *)&addr, sizeof(addr), AF_INET) < 0)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002750 return NULL;
2751 Py_BEGIN_ALLOW_THREADS
2752#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002753#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002754 result = gethostbyname_r(name, &hp_allocated, buf, buf_len,
2755 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002756#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002757 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002758#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00002759 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002760 result = gethostbyname_r(name, &hp_allocated, &data);
2761 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002762#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002763#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00002764#ifdef USE_GETHOSTBYNAME_LOCK
Just van Rossum1040d2c2003-05-09 07:53:18 +00002765 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002766#endif
2767 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002768#endif /* HAVE_GETHOSTBYNAME_R */
2769 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002770 /* Some C libraries would require addr.__ss_family instead of
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002771 addr.ss_family.
2772 Therefore, we cast the sockaddr_storage into sockaddr to
2773 access sa_family. */
Martin v. Löwis9db2f572001-07-23 01:30:10 +00002774 sa = (struct sockaddr*)&addr;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002775 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr),
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002776 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00002777#ifdef USE_GETHOSTBYNAME_LOCK
Just van Rossum1040d2c2003-05-09 07:53:18 +00002778 PyThread_release_lock(netdb_lock);
Guido van Rossum955becc1999-03-22 20:14:53 +00002779#endif
2780 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002781}
2782
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002783PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002784"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
2785\n\
2786Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002787for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002788
2789
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002790/* Python interface to gethostbyaddr(IP). */
2791
2792/*ARGSUSED*/
2793static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002794socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002795{
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002796#ifdef ENABLE_IPV6
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002797 struct sockaddr_storage addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002798#else
Guido van Rossum48a680c2001-03-02 06:34:14 +00002799 struct sockaddr_in addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002800#endif
2801 struct sockaddr *sa = (struct sockaddr *)&addr;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002802 char *ip_num;
2803 struct hostent *h;
Guido van Rossum3baaa131999-03-22 21:44:51 +00002804 PyObject *ret;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002805#ifdef HAVE_GETHOSTBYNAME_R
2806 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002807#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
2808 struct hostent_data data;
2809#else
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002810 char buf[16384];
2811 int buf_len = (sizeof buf) - 1;
2812 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002813#endif
2814#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002815 int result;
2816#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002817#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002818 char *ap;
2819 int al;
2820 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002821
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002822 if (!PyArg_ParseTuple(args, "s:gethostbyaddr", &ip_num))
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002823 return NULL;
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00002824 af = AF_UNSPEC;
Martin v. Löwisddc6f472002-07-28 16:10:31 +00002825 if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002826 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002827 af = sa->sa_family;
2828 ap = NULL;
2829 al = 0;
2830 switch (af) {
2831 case AF_INET:
2832 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
2833 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
2834 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002835#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002836 case AF_INET6:
2837 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
2838 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
2839 break;
2840#endif
2841 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002842 PyErr_SetString(socket_error, "unsupported address family");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002843 return NULL;
2844 }
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002845 Py_BEGIN_ALLOW_THREADS
2846#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002847#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002848 result = gethostbyaddr_r(ap, al, af,
2849 &hp_allocated, buf, buf_len,
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002850 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002851#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002852 h = gethostbyaddr_r(ap, al, af,
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002853 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002854#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00002855 memset((void *) &data, '\0', sizeof(data));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002856 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002857 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002858#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002859#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00002860#ifdef USE_GETHOSTBYNAME_LOCK
Just van Rossum1040d2c2003-05-09 07:53:18 +00002861 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002862#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002863 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002864#endif /* HAVE_GETHOSTBYNAME_R */
2865 Py_END_ALLOW_THREADS
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002866 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00002867#ifdef USE_GETHOSTBYNAME_LOCK
Just van Rossum1040d2c2003-05-09 07:53:18 +00002868 PyThread_release_lock(netdb_lock);
Guido van Rossum3baaa131999-03-22 21:44:51 +00002869#endif
2870 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002871}
2872
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002873PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002874"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
2875\n\
2876Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002877for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002878
Guido van Rossum30a685f1991-06-27 15:51:29 +00002879
2880/* Python interface to getservbyname(name).
2881 This only returns the port number, since the other info is already
2882 known or not useful (like the list of aliases). */
2883
2884/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002885static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002886socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002887{
Barry Warsaw11b91a02004-06-28 00:50:43 +00002888 char *name, *proto=NULL;
Guido van Rossum30a685f1991-06-27 15:51:29 +00002889 struct servent *sp;
Barry Warsaw11b91a02004-06-28 00:50:43 +00002890 if (!PyArg_ParseTuple(args, "s|s:getservbyname", &name, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +00002891 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00002892 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002893 sp = getservbyname(name, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00002894 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00002895 if (sp == NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002896 PyErr_SetString(socket_error, "service/proto not found");
Guido van Rossum30a685f1991-06-27 15:51:29 +00002897 return NULL;
2898 }
Guido van Rossum73624e91994-10-10 17:59:00 +00002899 return PyInt_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00002900}
2901
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002902PyDoc_STRVAR(getservbyname_doc,
Barry Warsaw11b91a02004-06-28 00:50:43 +00002903"getservbyname(servicename[, protocolname]) -> integer\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002904\n\
2905Return a port number from a service name and protocol name.\n\
Barry Warsaw11b91a02004-06-28 00:50:43 +00002906The optional protocol name, if given, should be 'tcp' or 'udp',\n\
2907otherwise any protocol will match.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002908
Guido van Rossum30a685f1991-06-27 15:51:29 +00002909
Barry Warsaw11b91a02004-06-28 00:50:43 +00002910/* Python interface to getservbyport(port).
2911 This only returns the service name, since the other info is already
2912 known or not useful (like the list of aliases). */
2913
2914/*ARGSUSED*/
2915static PyObject *
2916socket_getservbyport(PyObject *self, PyObject *args)
2917{
2918 int port;
2919 char *proto=NULL;
2920 struct servent *sp;
2921 if (!PyArg_ParseTuple(args, "i|s:getservbyport", &port, &proto))
2922 return NULL;
2923 Py_BEGIN_ALLOW_THREADS
2924 sp = getservbyport(htons(port), proto);
2925 Py_END_ALLOW_THREADS
2926 if (sp == NULL) {
2927 PyErr_SetString(socket_error, "port/proto not found");
2928 return NULL;
2929 }
2930 return PyString_FromString(sp->s_name);
2931}
2932
2933PyDoc_STRVAR(getservbyport_doc,
2934"getservbyport(port[, protocolname]) -> string\n\
2935\n\
2936Return the service name from a port number and protocol name.\n\
2937The optional protocol name, if given, should be 'tcp' or 'udp',\n\
2938otherwise any protocol will match.");
2939
Guido van Rossum3901d851996-12-19 16:35:04 +00002940/* Python interface to getprotobyname(name).
2941 This only returns the protocol number, since the other info is
2942 already known or not useful (like the list of aliases). */
2943
2944/*ARGSUSED*/
2945static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002946socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00002947{
2948 char *name;
2949 struct protoent *sp;
Guido van Rossumbcc20741998-08-04 22:53:56 +00002950#ifdef __BEOS__
2951/* Not available in BeOS yet. - [cjh] */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002952 PyErr_SetString(socket_error, "getprotobyname not supported");
Guido van Rossumbcc20741998-08-04 22:53:56 +00002953 return NULL;
2954#else
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002955 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
Guido van Rossum3901d851996-12-19 16:35:04 +00002956 return NULL;
2957 Py_BEGIN_ALLOW_THREADS
2958 sp = getprotobyname(name);
2959 Py_END_ALLOW_THREADS
2960 if (sp == NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002961 PyErr_SetString(socket_error, "protocol not found");
Guido van Rossum3901d851996-12-19 16:35:04 +00002962 return NULL;
2963 }
2964 return PyInt_FromLong((long) sp->p_proto);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002965#endif
Guido van Rossum3901d851996-12-19 16:35:04 +00002966}
2967
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002968PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002969"getprotobyname(name) -> integer\n\
2970\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002971Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002972
Guido van Rossum3901d851996-12-19 16:35:04 +00002973
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002974#ifndef NO_DUP
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002975/* Create a socket object from a numeric file description.
2976 Useful e.g. if stdin is a socket.
2977 Additional arguments as for socket(). */
2978
2979/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002980static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002981socket_fromfd(PyObject *self, PyObject *args)
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002982{
Guido van Rossum73624e91994-10-10 17:59:00 +00002983 PySocketSockObject *s;
Fred Drakea04eaad2000-06-30 02:46:07 +00002984 SOCKET_T fd;
2985 int family, type, proto = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002986 if (!PyArg_ParseTuple(args, "iii|i:fromfd",
2987 &fd, &family, &type, &proto))
Guido van Rossumbe32c891996-06-20 16:25:29 +00002988 return NULL;
Guido van Rossum5f59d601992-12-14 16:59:51 +00002989 /* Dup the fd so it and the socket can be closed independently */
2990 fd = dup(fd);
2991 if (fd < 0)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002992 return set_error();
2993 s = new_sockobject(fd, family, type, proto);
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002994 /* From now on, ignore SIGPIPE and let the error checking
2995 do the work. */
Guido van Rossum48a680c2001-03-02 06:34:14 +00002996#ifdef SIGPIPE
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002997 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum48a680c2001-03-02 06:34:14 +00002998#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00002999 return (PyObject *) s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00003000}
Guido van Rossum82a5c661998-07-07 20:45:43 +00003001
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003002PyDoc_STRVAR(fromfd_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003003"fromfd(fd, family, type[, proto]) -> socket object\n\
3004\n\
3005Create a socket object from the given file descriptor.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003006The remaining arguments are the same as for socket().");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003007
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00003008#endif /* NO_DUP */
Guido van Rossum2a7178e1992-12-08 13:38:24 +00003009
Guido van Rossum82a5c661998-07-07 20:45:43 +00003010
Guido van Rossum006bf911996-06-12 04:04:55 +00003011static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003012socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00003013{
3014 int x1, x2;
3015
Guido van Rossum27fc3c02000-03-24 20:56:56 +00003016 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00003017 return NULL;
3018 }
3019 x2 = (int)ntohs((short)x1);
3020 return PyInt_FromLong(x2);
3021}
3022
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003023PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003024"ntohs(integer) -> integer\n\
3025\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003026Convert a 16-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003027
3028
Guido van Rossum006bf911996-06-12 04:04:55 +00003029static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003030socket_ntohl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00003031{
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003032 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00003033
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003034 if (PyInt_Check(arg)) {
3035 x = PyInt_AS_LONG(arg);
Jeremy Hylton825e47b2002-07-25 16:37:51 +00003036 if (x == (unsigned long) -1 && PyErr_Occurred())
3037 return NULL;
Guido van Rossum006bf911996-06-12 04:04:55 +00003038 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003039 else if (PyLong_Check(arg)) {
3040 x = PyLong_AsUnsignedLong(arg);
Jeremy Hylton825e47b2002-07-25 16:37:51 +00003041 if (x == (unsigned long) -1 && PyErr_Occurred())
3042 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003043#if SIZEOF_LONG > 4
3044 {
3045 unsigned long y;
3046 /* only want the trailing 32 bits */
3047 y = x & 0xFFFFFFFFUL;
3048 if (y ^ x)
3049 return PyErr_Format(PyExc_OverflowError,
3050 "long int larger than 32 bits");
3051 x = y;
Tim Peters58141872002-08-06 22:25:02 +00003052 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003053#endif
3054 }
3055 else
Tim Peters58141872002-08-06 22:25:02 +00003056 return PyErr_Format(PyExc_TypeError,
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003057 "expected int/long, %s found",
3058 arg->ob_type->tp_name);
3059 if (x == (unsigned long) -1 && PyErr_Occurred())
3060 return NULL;
3061 return PyInt_FromLong(ntohl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00003062}
3063
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003064PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003065"ntohl(integer) -> integer\n\
3066\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003067Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003068
3069
Guido van Rossum006bf911996-06-12 04:04:55 +00003070static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003071socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00003072{
Hye-Shik Changa7b673f2003-12-17 09:40:23 +00003073 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00003074
Guido van Rossum27fc3c02000-03-24 20:56:56 +00003075 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00003076 return NULL;
3077 }
3078 x2 = (int)htons((short)x1);
3079 return PyInt_FromLong(x2);
3080}
3081
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003082PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003083"htons(integer) -> integer\n\
3084\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003085Convert a 16-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003086
3087
Guido van Rossum006bf911996-06-12 04:04:55 +00003088static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003089socket_htonl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00003090{
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003091 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00003092
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003093 if (PyInt_Check(arg)) {
3094 x = PyInt_AS_LONG(arg);
Jeremy Hylton825e47b2002-07-25 16:37:51 +00003095 if (x == (unsigned long) -1 && PyErr_Occurred())
3096 return NULL;
Guido van Rossum006bf911996-06-12 04:04:55 +00003097 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003098 else if (PyLong_Check(arg)) {
3099 x = PyLong_AsUnsignedLong(arg);
Jeremy Hylton825e47b2002-07-25 16:37:51 +00003100 if (x == (unsigned long) -1 && PyErr_Occurred())
3101 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003102#if SIZEOF_LONG > 4
3103 {
3104 unsigned long y;
3105 /* only want the trailing 32 bits */
3106 y = x & 0xFFFFFFFFUL;
3107 if (y ^ x)
3108 return PyErr_Format(PyExc_OverflowError,
3109 "long int larger than 32 bits");
3110 x = y;
Tim Peters58141872002-08-06 22:25:02 +00003111 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003112#endif
3113 }
3114 else
Tim Peters58141872002-08-06 22:25:02 +00003115 return PyErr_Format(PyExc_TypeError,
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003116 "expected int/long, %s found",
3117 arg->ob_type->tp_name);
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003118 return PyInt_FromLong(htonl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00003119}
3120
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003121PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003122"htonl(integer) -> integer\n\
3123\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003124Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003125
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003126/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003127
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003128PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003129"inet_aton(string) -> packed 32-bit IP representation\n\
3130\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003131Convert 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 +00003132binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003133
3134static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003135socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003136{
Guido van Rossuma2e48551999-09-09 15:42:59 +00003137#ifndef INADDR_NONE
3138#define INADDR_NONE (-1)
3139#endif
Neal Norwitz88f115b2003-02-13 02:15:42 +00003140#ifdef HAVE_INET_ATON
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003141 struct in_addr buf;
Tim Peters1df9fdd2003-02-13 03:13:40 +00003142#else
3143 /* Have to use inet_addr() instead */
3144 unsigned long packed_addr;
3145#endif
3146 char *ip_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003147
Tim Peters1df9fdd2003-02-13 03:13:40 +00003148 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003149 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003150
Tim Peters1df9fdd2003-02-13 03:13:40 +00003151
3152#ifdef HAVE_INET_ATON
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003153 if (inet_aton(ip_addr, &buf))
3154 return PyString_FromStringAndSize((char *)(&buf),
3155 sizeof(buf));
3156
3157 PyErr_SetString(socket_error,
3158 "illegal IP address string passed to inet_aton");
3159 return NULL;
3160
Tim Peters1df9fdd2003-02-13 03:13:40 +00003161#else /* ! HAVE_INET_ATON */
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003162 /* XXX Problem here: inet_aton('255.255.255.255') raises
3163 an exception while it should be a valid address. */
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003164 packed_addr = inet_addr(ip_addr);
3165
3166 if (packed_addr == INADDR_NONE) { /* invalid address */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003167 PyErr_SetString(socket_error,
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003168 "illegal IP address string passed to inet_aton");
3169 return NULL;
3170 }
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003171 return PyString_FromStringAndSize((char *) &packed_addr,
3172 sizeof(packed_addr));
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003173#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003174}
3175
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003176PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00003177"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003178\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003179Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003180
3181static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003182socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003183{
3184 char *packed_str;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003185 int addr_len;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003186 struct in_addr packed_addr;
3187
Guido van Rossum27fc3c02000-03-24 20:56:56 +00003188 if (!PyArg_ParseTuple(args, "s#:inet_ntoa", &packed_str, &addr_len)) {
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003189 return NULL;
3190 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00003191
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003192 if (addr_len != sizeof(packed_addr)) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003193 PyErr_SetString(socket_error,
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003194 "packed IP wrong length for inet_ntoa");
3195 return NULL;
3196 }
3197
3198 memcpy(&packed_addr, packed_str, addr_len);
3199
3200 return PyString_FromString(inet_ntoa(packed_addr));
3201}
Guido van Rossum82a5c661998-07-07 20:45:43 +00003202
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003203#ifdef HAVE_INET_PTON
3204
3205PyDoc_STRVAR(inet_pton_doc,
3206"inet_pton(af, ip) -> packed IP address string\n\
3207\n\
3208Convert an IP address from string format to a packed string suitable\n\
3209for use with low-level network functions.");
3210
3211static PyObject *
3212socket_inet_pton(PyObject *self, PyObject *args)
3213{
3214 int af;
3215 char* ip;
3216 int retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003217#ifdef ENABLE_IPV6
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003218 char packed[MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003219#else
3220 char packed[sizeof(struct in_addr)];
3221#endif
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003222 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
3223 return NULL;
3224 }
3225
Martin v. Löwis04697e82004-06-02 12:35:29 +00003226#if !defined(ENABLE_IPV6) && defined(AF_INET6)
Martin v. Löwis10649092003-08-05 06:25:06 +00003227 if(af == AF_INET6) {
3228 PyErr_SetString(socket_error,
3229 "can't use AF_INET6, IPv6 is disabled");
3230 return NULL;
3231 }
3232#endif
3233
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003234 retval = inet_pton(af, ip, packed);
3235 if (retval < 0) {
3236 PyErr_SetFromErrno(socket_error);
3237 return NULL;
3238 } else if (retval == 0) {
3239 PyErr_SetString(socket_error,
3240 "illegal IP address string passed to inet_pton");
3241 return NULL;
3242 } else if (af == AF_INET) {
3243 return PyString_FromStringAndSize(packed,
3244 sizeof(struct in_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003245#ifdef ENABLE_IPV6
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003246 } else if (af == AF_INET6) {
3247 return PyString_FromStringAndSize(packed,
3248 sizeof(struct in6_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003249#endif
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003250 } else {
3251 PyErr_SetString(socket_error, "unknown address family");
3252 return NULL;
3253 }
3254}
3255
3256PyDoc_STRVAR(inet_ntop_doc,
3257"inet_ntop(af, packed_ip) -> string formatted IP address\n\
3258\n\
3259Convert a packed IP address of the given family to string format.");
3260
3261static PyObject *
3262socket_inet_ntop(PyObject *self, PyObject *args)
3263{
3264 int af;
3265 char* packed;
3266 int len;
3267 const char* retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003268#ifdef ENABLE_IPV6
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003269 char ip[MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003270#else
3271 char ip[INET_ADDRSTRLEN + 1];
3272#endif
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003273
3274 /* Guarantee NUL-termination for PyString_FromString() below */
3275 memset((void *) &ip[0], '\0', sizeof(ip) + 1);
3276
3277 if (!PyArg_ParseTuple(args, "is#:inet_ntop", &af, &packed, &len)) {
3278 return NULL;
3279 }
3280
3281 if (af == AF_INET) {
3282 if (len != sizeof(struct in_addr)) {
3283 PyErr_SetString(PyExc_ValueError,
3284 "invalid length of packed IP address string");
3285 return NULL;
3286 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003287#ifdef ENABLE_IPV6
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003288 } else if (af == AF_INET6) {
3289 if (len != sizeof(struct in6_addr)) {
3290 PyErr_SetString(PyExc_ValueError,
3291 "invalid length of packed IP address string");
3292 return NULL;
3293 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003294#endif
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003295 } else {
3296 PyErr_Format(PyExc_ValueError,
3297 "unknown address family %d", af);
3298 return NULL;
3299 }
3300
3301 retval = inet_ntop(af, packed, ip, sizeof(ip));
3302 if (!retval) {
3303 PyErr_SetFromErrno(socket_error);
3304 return NULL;
3305 } else {
3306 return PyString_FromString(retval);
3307 }
3308
3309 /* NOTREACHED */
3310 PyErr_SetString(PyExc_RuntimeError, "invalid handling of inet_ntop");
3311 return NULL;
3312}
3313
3314#endif /* HAVE_INET_PTON */
3315
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003316/* Python interface to getaddrinfo(host, port). */
3317
3318/*ARGSUSED*/
3319static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003320socket_getaddrinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003321{
Martin v. Löwisf0b11d22001-11-07 08:31:03 +00003322 struct addrinfo hints, *res;
3323 struct addrinfo *res0 = NULL;
Martin v. Löwis2548c732003-04-18 10:39:54 +00003324 PyObject *hobj = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003325 PyObject *pobj = (PyObject *)NULL;
Martin v. Löwisf65b1a12001-08-12 09:28:40 +00003326 char pbuf[30];
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003327 char *hptr, *pptr;
3328 int family, socktype, protocol, flags;
3329 int error;
3330 PyObject *all = (PyObject *)NULL;
3331 PyObject *single = (PyObject *)NULL;
Martin v. Löwis2548c732003-04-18 10:39:54 +00003332 PyObject *idna = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003333
3334 family = socktype = protocol = flags = 0;
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00003335 family = AF_UNSPEC;
Martin v. Löwis2548c732003-04-18 10:39:54 +00003336 if (!PyArg_ParseTuple(args, "OO|iiii:getaddrinfo",
3337 &hobj, &pobj, &family, &socktype,
3338 &protocol, &flags)) {
3339 return NULL;
3340 }
3341 if (hobj == Py_None) {
3342 hptr = NULL;
3343 } else if (PyUnicode_Check(hobj)) {
3344 idna = PyObject_CallMethod(hobj, "encode", "s", "idna");
3345 if (!idna)
3346 return NULL;
3347 hptr = PyString_AsString(idna);
3348 } else if (PyString_Check(hobj)) {
3349 hptr = PyString_AsString(hobj);
3350 } else {
3351 PyErr_SetString(PyExc_TypeError,
3352 "getaddrinfo() argument 1 must be string or None");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003353 return NULL;
3354 }
3355 if (PyInt_Check(pobj)) {
Marc-André Lemburg03d1b182001-07-31 18:05:33 +00003356 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", PyInt_AsLong(pobj));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003357 pptr = pbuf;
3358 } else if (PyString_Check(pobj)) {
3359 pptr = PyString_AsString(pobj);
3360 } else if (pobj == Py_None) {
3361 pptr = (char *)NULL;
3362 } else {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003363 PyErr_SetString(socket_error, "Int or String expected");
Martin v. Löwis5db099a2003-08-07 11:55:15 +00003364 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003365 }
3366 memset(&hints, 0, sizeof(hints));
3367 hints.ai_family = family;
3368 hints.ai_socktype = socktype;
3369 hints.ai_protocol = protocol;
3370 hints.ai_flags = flags;
Just van Rossum1040d2c2003-05-09 07:53:18 +00003371 Py_BEGIN_ALLOW_THREADS
3372 ACQUIRE_GETADDRINFO_LOCK
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003373 error = getaddrinfo(hptr, pptr, &hints, &res0);
Just van Rossum1040d2c2003-05-09 07:53:18 +00003374 Py_END_ALLOW_THREADS
3375 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003376 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003377 set_gaierror(error);
Martin v. Löwis5db099a2003-08-07 11:55:15 +00003378 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003379 }
3380
3381 if ((all = PyList_New(0)) == NULL)
3382 goto err;
3383 for (res = res0; res; res = res->ai_next) {
Guido van Rossum716aac02001-10-12 18:59:27 +00003384 PyObject *addr =
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00003385 makesockaddr(-1, res->ai_addr, res->ai_addrlen, protocol);
Guido van Rossum716aac02001-10-12 18:59:27 +00003386 if (addr == NULL)
3387 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003388 single = Py_BuildValue("iiisO", res->ai_family,
3389 res->ai_socktype, res->ai_protocol,
3390 res->ai_canonname ? res->ai_canonname : "",
Guido van Rossum716aac02001-10-12 18:59:27 +00003391 addr);
3392 Py_DECREF(addr);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003393 if (single == NULL)
3394 goto err;
3395
3396 if (PyList_Append(all, single))
3397 goto err;
3398 Py_XDECREF(single);
3399 }
Martin v. Löwis2548c732003-04-18 10:39:54 +00003400 Py_XDECREF(idna);
Neal Norwitz90128ba2002-08-09 03:37:42 +00003401 if (res0)
3402 freeaddrinfo(res0);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003403 return all;
3404 err:
3405 Py_XDECREF(single);
3406 Py_XDECREF(all);
Martin v. Löwis2548c732003-04-18 10:39:54 +00003407 Py_XDECREF(idna);
Martin v. Löwisf0b11d22001-11-07 08:31:03 +00003408 if (res0)
3409 freeaddrinfo(res0);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003410 return (PyObject *)NULL;
3411}
3412
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003413PyDoc_STRVAR(getaddrinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003414"getaddrinfo(host, port [, family, socktype, proto, flags])\n\
3415 -> list of (family, socktype, proto, canonname, sockaddr)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003416\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003417Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003418
3419/* Python interface to getnameinfo(sa, flags). */
3420
3421/*ARGSUSED*/
3422static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003423socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003424{
3425 PyObject *sa = (PyObject *)NULL;
3426 int flags;
3427 char *hostp;
Martin v. Löwis06b1d212001-11-02 23:34:52 +00003428 int port, flowinfo, scope_id;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003429 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
3430 struct addrinfo hints, *res = NULL;
3431 int error;
3432 PyObject *ret = (PyObject *)NULL;
3433
3434 flags = flowinfo = scope_id = 0;
Martin v. Löwis06b1d212001-11-02 23:34:52 +00003435 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003436 return NULL;
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003437 if (!PyArg_ParseTuple(sa, "si|ii",
3438 &hostp, &port, &flowinfo, &scope_id))
Martin v. Löwis06b1d212001-11-02 23:34:52 +00003439 return NULL;
Marc-André Lemburg03d1b182001-07-31 18:05:33 +00003440 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003441 memset(&hints, 0, sizeof(hints));
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00003442 hints.ai_family = AF_UNSPEC;
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003443 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Just van Rossum1040d2c2003-05-09 07:53:18 +00003444 Py_BEGIN_ALLOW_THREADS
3445 ACQUIRE_GETADDRINFO_LOCK
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003446 error = getaddrinfo(hostp, pbuf, &hints, &res);
Just van Rossum1040d2c2003-05-09 07:53:18 +00003447 Py_END_ALLOW_THREADS
3448 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003449 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003450 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003451 goto fail;
3452 }
3453 if (res->ai_next) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003454 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003455 "sockaddr resolved to multiple addresses");
3456 goto fail;
3457 }
3458 switch (res->ai_family) {
3459 case AF_INET:
3460 {
3461 char *t1;
3462 int t2;
3463 if (PyArg_ParseTuple(sa, "si", &t1, &t2) == 0) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003464 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003465 "IPv4 sockaddr must be 2 tuple");
3466 goto fail;
3467 }
3468 break;
3469 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00003470#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003471 case AF_INET6:
3472 {
3473 struct sockaddr_in6 *sin6;
3474 sin6 = (struct sockaddr_in6 *)res->ai_addr;
3475 sin6->sin6_flowinfo = flowinfo;
3476 sin6->sin6_scope_id = scope_id;
3477 break;
3478 }
3479#endif
3480 }
3481 error = getnameinfo(res->ai_addr, res->ai_addrlen,
3482 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
3483 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003484 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003485 goto fail;
3486 }
3487 ret = Py_BuildValue("ss", hbuf, pbuf);
3488
3489fail:
3490 if (res)
3491 freeaddrinfo(res);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003492 return ret;
3493}
3494
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003495PyDoc_STRVAR(getnameinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003496"getnameinfo(sockaddr, flags) --> (host, port)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003497\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003498Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003499
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00003500
3501/* Python API to getting and setting the default timeout value. */
3502
3503static PyObject *
3504socket_getdefaulttimeout(PyObject *self)
3505{
3506 if (defaulttimeout < 0.0) {
3507 Py_INCREF(Py_None);
3508 return Py_None;
3509 }
3510 else
3511 return PyFloat_FromDouble(defaulttimeout);
3512}
3513
3514PyDoc_STRVAR(getdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003515"getdefaulttimeout() -> timeout\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00003516\n\
3517Returns the default timeout in floating seconds for new socket objects.\n\
3518A value of None indicates that new socket objects have no timeout.\n\
3519When the socket module is first imported, the default is None.");
3520
3521static PyObject *
3522socket_setdefaulttimeout(PyObject *self, PyObject *arg)
3523{
3524 double timeout;
3525
3526 if (arg == Py_None)
3527 timeout = -1.0;
3528 else {
3529 timeout = PyFloat_AsDouble(arg);
3530 if (timeout < 0.0) {
3531 if (!PyErr_Occurred())
3532 PyErr_SetString(PyExc_ValueError,
3533 "Timeout value out of range");
3534 return NULL;
3535 }
3536 }
3537
3538 defaulttimeout = timeout;
3539
3540 Py_INCREF(Py_None);
3541 return Py_None;
3542}
3543
3544PyDoc_STRVAR(setdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003545"setdefaulttimeout(timeout)\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00003546\n\
3547Set the default timeout in floating seconds for new socket objects.\n\
3548A value of None indicates that new socket objects have no timeout.\n\
3549When the socket module is first imported, the default is None.");
3550
3551
Guido van Rossum30a685f1991-06-27 15:51:29 +00003552/* List of functions exported by this module. */
3553
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003554static PyMethodDef socket_methods[] = {
3555 {"gethostbyname", socket_gethostbyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003556 METH_VARARGS, gethostbyname_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003557 {"gethostbyname_ex", socket_gethostbyname_ex,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003558 METH_VARARGS, ghbn_ex_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003559 {"gethostbyaddr", socket_gethostbyaddr,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003560 METH_VARARGS, gethostbyaddr_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003561 {"gethostname", socket_gethostname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003562 METH_VARARGS, gethostname_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003563 {"getservbyname", socket_getservbyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003564 METH_VARARGS, getservbyname_doc},
Barry Warsaw11b91a02004-06-28 00:50:43 +00003565 {"getservbyport", socket_getservbyport,
3566 METH_VARARGS, getservbyport_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003567 {"getprotobyname", socket_getprotobyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003568 METH_VARARGS,getprotobyname_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00003569#ifndef NO_DUP
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003570 {"fromfd", socket_fromfd,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003571 METH_VARARGS, fromfd_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00003572#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003573 {"ntohs", socket_ntohs,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003574 METH_VARARGS, ntohs_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003575 {"ntohl", socket_ntohl,
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003576 METH_O, ntohl_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003577 {"htons", socket_htons,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003578 METH_VARARGS, htons_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003579 {"htonl", socket_htonl,
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003580 METH_O, htonl_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003581 {"inet_aton", socket_inet_aton,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003582 METH_VARARGS, inet_aton_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003583 {"inet_ntoa", socket_inet_ntoa,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003584 METH_VARARGS, inet_ntoa_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003585#ifdef HAVE_INET_PTON
3586 {"inet_pton", socket_inet_pton,
3587 METH_VARARGS, inet_pton_doc},
3588 {"inet_ntop", socket_inet_ntop,
3589 METH_VARARGS, inet_ntop_doc},
3590#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003591 {"getaddrinfo", socket_getaddrinfo,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003592 METH_VARARGS, getaddrinfo_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003593 {"getnameinfo", socket_getnameinfo,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003594 METH_VARARGS, getnameinfo_doc},
Guido van Rossum1693ba82002-07-18 21:11:26 +00003595 {"getdefaulttimeout", (PyCFunction)socket_getdefaulttimeout,
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00003596 METH_NOARGS, getdefaulttimeout_doc},
3597 {"setdefaulttimeout", socket_setdefaulttimeout,
3598 METH_O, setdefaulttimeout_doc},
Guido van Rossum30a685f1991-06-27 15:51:29 +00003599 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003600};
3601
Guido van Rossum30a685f1991-06-27 15:51:29 +00003602
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003603#ifdef RISCOS
3604#define OS_INIT_DEFINED
Guido van Rossumbe32c891996-06-20 16:25:29 +00003605
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003606static int
3607os_init(void)
3608{
3609 _kernel_swi_regs r;
3610
3611 r.r[0] = 0;
3612 _kernel_swi(0x43380, &r, &r);
3613 taskwindow = r.r[0];
3614
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003615 return 1;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003616}
3617
3618#endif /* RISCOS */
3619
3620
3621#ifdef MS_WINDOWS
3622#define OS_INIT_DEFINED
3623
3624/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00003625
3626static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003627os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00003628{
3629 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00003630}
3631
3632static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003633os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00003634{
3635 WSADATA WSAData;
3636 int ret;
3637 char buf[100];
3638 ret = WSAStartup(0x0101, &WSAData);
3639 switch (ret) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003640 case 0: /* No error */
Mark Hammond14350ab2003-07-09 04:57:46 +00003641 Py_AtExit(os_cleanup);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003642 return 1; /* Success */
Guido van Rossumbe32c891996-06-20 16:25:29 +00003643 case WSASYSNOTREADY:
3644 PyErr_SetString(PyExc_ImportError,
3645 "WSAStartup failed: network not ready");
3646 break;
3647 case WSAVERNOTSUPPORTED:
3648 case WSAEINVAL:
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003649 PyErr_SetString(
3650 PyExc_ImportError,
3651 "WSAStartup failed: requested version not supported");
Guido van Rossumbe32c891996-06-20 16:25:29 +00003652 break;
3653 default:
Tim Peters885d4572001-11-28 20:27:42 +00003654 PyOS_snprintf(buf, sizeof(buf),
3655 "WSAStartup failed: error code %d", ret);
Guido van Rossumbe32c891996-06-20 16:25:29 +00003656 PyErr_SetString(PyExc_ImportError, buf);
3657 break;
3658 }
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003659 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00003660}
3661
Guido van Rossum8d665e61996-06-26 18:22:49 +00003662#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00003663
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003664
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003665#ifdef PYOS_OS2
3666#define OS_INIT_DEFINED
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003667
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003668/* Additional initialization for OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003669
3670static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003671os_init(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003672{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003673#ifndef PYCC_GCC
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003674 char reason[64];
3675 int rc = sock_init();
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003676
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003677 if (rc == 0) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003678 return 1; /* Success */
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003679 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003680
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003681 PyOS_snprintf(reason, sizeof(reason),
3682 "OS/2 TCP/IP Error# %d", sock_errno());
3683 PyErr_SetString(PyExc_ImportError, reason);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003684
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003685 return 0; /* Failure */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00003686#else
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003687 /* No need to initialise sockets with GCC/EMX */
3688 return 1; /* Success */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00003689#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003690}
3691
3692#endif /* PYOS_OS2 */
3693
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003694
3695#ifndef OS_INIT_DEFINED
3696static int
3697os_init(void)
3698{
3699 return 1; /* Success */
3700}
3701#endif
3702
3703
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00003704/* C API table - always add new things to the end for binary
3705 compatibility. */
3706static
3707PySocketModule_APIObject PySocketModuleAPI =
3708{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003709 &sock_type,
Brett Cannon06c34792004-03-23 23:16:54 +00003710 NULL
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00003711};
3712
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003713
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003714/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003715
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003716 This module is actually called "_socket", and there's a wrapper
3717 "socket.py" which implements some additional functionality. On some
3718 platforms (e.g. Windows and OS/2), socket.py also implements a
3719 wrapper for the socket type that provides missing functionality such
3720 as makefile(), dup() and fromfd(). The import of "_socket" may fail
3721 with an ImportError exception if os-specific initialization fails.
3722 On Windows, this does WINSOCK initialization. When WINSOCK is
3723 initialized succesfully, a call to WSACleanup() is scheduled to be
3724 made at exit time.
3725*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003726
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003727PyDoc_STRVAR(socket_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003728"Implementation module for socket operations.\n\
3729\n\
3730See the socket module for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003731
Mark Hammondfe51c6d2002-08-02 02:27:13 +00003732PyMODINIT_FUNC
Thomas Wouters1e0c2f42000-07-24 16:06:23 +00003733init_socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003734{
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003735 PyObject *m, *has_ipv6;
Fred Drake4baedc12002-04-01 14:53:37 +00003736
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003737 if (!os_init())
Guido van Rossum0cb96de1997-10-01 04:29:29 +00003738 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003739
3740 sock_type.ob_type = &PyType_Type;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003741 m = Py_InitModule3(PySocket_MODULE_NAME,
3742 socket_methods,
3743 socket_doc);
3744
3745 socket_error = PyErr_NewException("socket.error", NULL, NULL);
3746 if (socket_error == NULL)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003747 return;
Brett Cannon06c34792004-03-23 23:16:54 +00003748 PySocketModuleAPI.error = socket_error;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003749 Py_INCREF(socket_error);
3750 PyModule_AddObject(m, "error", socket_error);
3751 socket_herror = PyErr_NewException("socket.herror",
3752 socket_error, NULL);
3753 if (socket_herror == NULL)
3754 return;
3755 Py_INCREF(socket_herror);
3756 PyModule_AddObject(m, "herror", socket_herror);
3757 socket_gaierror = PyErr_NewException("socket.gaierror", socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003758 NULL);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003759 if (socket_gaierror == NULL)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003760 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003761 Py_INCREF(socket_gaierror);
3762 PyModule_AddObject(m, "gaierror", socket_gaierror);
Raymond Hettingeref7343c2003-06-29 03:08:05 +00003763 socket_timeout = PyErr_NewException("socket.timeout",
3764 socket_error, NULL);
3765 if (socket_timeout == NULL)
3766 return;
3767 Py_INCREF(socket_timeout);
3768 PyModule_AddObject(m, "timeout", socket_timeout);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003769 Py_INCREF((PyObject *)&sock_type);
Fred Drake4baedc12002-04-01 14:53:37 +00003770 if (PyModule_AddObject(m, "SocketType",
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003771 (PyObject *)&sock_type) != 0)
Guido van Rossum0cb96de1997-10-01 04:29:29 +00003772 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003773 Py_INCREF((PyObject *)&sock_type);
Fred Drake4baedc12002-04-01 14:53:37 +00003774 if (PyModule_AddObject(m, "socket",
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003775 (PyObject *)&sock_type) != 0)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003776 return;
Guido van Rossum09be4091999-08-09 14:40:40 +00003777
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003778#ifdef ENABLE_IPV6
3779 has_ipv6 = Py_True;
3780#else
3781 has_ipv6 = Py_False;
3782#endif
3783 Py_INCREF(has_ipv6);
3784 PyModule_AddObject(m, "has_ipv6", has_ipv6);
3785
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00003786 /* Export C API */
Fred Drake4baedc12002-04-01 14:53:37 +00003787 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00003788 PyCObject_FromVoidPtr((void *)&PySocketModuleAPI, NULL)
3789 ) != 0)
3790 return;
3791
Guido van Rossum09be4091999-08-09 14:40:40 +00003792 /* Address families (we only support AF_INET and AF_UNIX) */
3793#ifdef AF_UNSPEC
Fred Drake4baedc12002-04-01 14:53:37 +00003794 PyModule_AddIntConstant(m, "AF_UNSPEC", AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00003795#endif
Fred Drake4baedc12002-04-01 14:53:37 +00003796 PyModule_AddIntConstant(m, "AF_INET", AF_INET);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003797#ifdef AF_INET6
Fred Drake4baedc12002-04-01 14:53:37 +00003798 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003799#endif /* AF_INET6 */
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00003800#if defined(AF_UNIX)
Fred Drake4baedc12002-04-01 14:53:37 +00003801 PyModule_AddIntConstant(m, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00003802#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00003803#ifdef AF_AX25
Fred Drake4baedc12002-04-01 14:53:37 +00003804 /* Amateur Radio AX.25 */
3805 PyModule_AddIntConstant(m, "AF_AX25", AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00003806#endif
3807#ifdef AF_IPX
Fred Drake4baedc12002-04-01 14:53:37 +00003808 PyModule_AddIntConstant(m, "AF_IPX", AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00003809#endif
3810#ifdef AF_APPLETALK
Fred Drake4baedc12002-04-01 14:53:37 +00003811 /* Appletalk DDP */
3812 PyModule_AddIntConstant(m, "AF_APPLETALK", AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00003813#endif
3814#ifdef AF_NETROM
Fred Drake4baedc12002-04-01 14:53:37 +00003815 /* Amateur radio NetROM */
3816 PyModule_AddIntConstant(m, "AF_NETROM", AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00003817#endif
3818#ifdef AF_BRIDGE
Fred Drake4baedc12002-04-01 14:53:37 +00003819 /* Multiprotocol bridge */
3820 PyModule_AddIntConstant(m, "AF_BRIDGE", AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00003821#endif
3822#ifdef AF_AAL5
Fred Drake4baedc12002-04-01 14:53:37 +00003823 /* Reserved for Werner's ATM */
3824 PyModule_AddIntConstant(m, "AF_AAL5", AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00003825#endif
3826#ifdef AF_X25
Fred Drake4baedc12002-04-01 14:53:37 +00003827 /* Reserved for X.25 project */
3828 PyModule_AddIntConstant(m, "AF_X25", AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00003829#endif
3830#ifdef AF_INET6
Fred Drake4baedc12002-04-01 14:53:37 +00003831 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00003832#endif
3833#ifdef AF_ROSE
Fred Drake4baedc12002-04-01 14:53:37 +00003834 /* Amateur Radio X.25 PLP */
3835 PyModule_AddIntConstant(m, "AF_ROSE", AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00003836#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00003837
Hye-Shik Chang81268602004-02-02 06:05:24 +00003838#ifdef USE_BLUETOOTH
Martin v. Löwis12af0482004-01-31 12:34:17 +00003839 PyModule_AddIntConstant(m, "AF_BLUETOOTH", AF_BLUETOOTH);
3840 PyModule_AddIntConstant(m, "BTPROTO_L2CAP", BTPROTO_L2CAP);
Hye-Shik Chang81268602004-02-02 06:05:24 +00003841#if !defined(__FreeBSD__)
Martin v. Löwis12af0482004-01-31 12:34:17 +00003842 PyModule_AddIntConstant(m, "BTPROTO_SCO", BTPROTO_SCO);
Hye-Shik Chang81268602004-02-02 06:05:24 +00003843#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00003844 PyModule_AddIntConstant(m, "BTPROTO_RFCOMM", BTPROTO_RFCOMM);
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00003845 PyModule_AddObject(m, "BDADDR_ANY", Py_BuildValue("s", "00:00:00:00:00:00"));
3846 PyModule_AddObject(m, "BDADDR_LOCAL", Py_BuildValue("s", "00:00:00:FF:FF:FF"));
Martin v. Löwis12af0482004-01-31 12:34:17 +00003847#endif
3848
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00003849#ifdef HAVE_NETPACKET_PACKET_H
Fred Drake4baedc12002-04-01 14:53:37 +00003850 PyModule_AddIntConstant(m, "AF_PACKET", AF_PACKET);
3851 PyModule_AddIntConstant(m, "PF_PACKET", PF_PACKET);
3852 PyModule_AddIntConstant(m, "PACKET_HOST", PACKET_HOST);
3853 PyModule_AddIntConstant(m, "PACKET_BROADCAST", PACKET_BROADCAST);
3854 PyModule_AddIntConstant(m, "PACKET_MULTICAST", PACKET_MULTICAST);
3855 PyModule_AddIntConstant(m, "PACKET_OTHERHOST", PACKET_OTHERHOST);
3856 PyModule_AddIntConstant(m, "PACKET_OUTGOING", PACKET_OUTGOING);
3857 PyModule_AddIntConstant(m, "PACKET_LOOPBACK", PACKET_LOOPBACK);
3858 PyModule_AddIntConstant(m, "PACKET_FASTROUTE", PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00003859#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00003860
3861 /* Socket types */
Fred Drake4baedc12002-04-01 14:53:37 +00003862 PyModule_AddIntConstant(m, "SOCK_STREAM", SOCK_STREAM);
3863 PyModule_AddIntConstant(m, "SOCK_DGRAM", SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00003864#ifndef __BEOS__
3865/* We have incomplete socket support. */
Fred Drake4baedc12002-04-01 14:53:37 +00003866 PyModule_AddIntConstant(m, "SOCK_RAW", SOCK_RAW);
3867 PyModule_AddIntConstant(m, "SOCK_SEQPACKET", SOCK_SEQPACKET);
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00003868#if defined(SOCK_RDM)
Fred Drake4baedc12002-04-01 14:53:37 +00003869 PyModule_AddIntConstant(m, "SOCK_RDM", SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00003870#endif
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00003871#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003872
3873#ifdef SO_DEBUG
Fred Drake4baedc12002-04-01 14:53:37 +00003874 PyModule_AddIntConstant(m, "SO_DEBUG", SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003875#endif
3876#ifdef SO_ACCEPTCONN
Fred Drake4baedc12002-04-01 14:53:37 +00003877 PyModule_AddIntConstant(m, "SO_ACCEPTCONN", SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003878#endif
3879#ifdef SO_REUSEADDR
Fred Drake4baedc12002-04-01 14:53:37 +00003880 PyModule_AddIntConstant(m, "SO_REUSEADDR", SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003881#endif
3882#ifdef SO_KEEPALIVE
Fred Drake4baedc12002-04-01 14:53:37 +00003883 PyModule_AddIntConstant(m, "SO_KEEPALIVE", SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003884#endif
3885#ifdef SO_DONTROUTE
Fred Drake4baedc12002-04-01 14:53:37 +00003886 PyModule_AddIntConstant(m, "SO_DONTROUTE", SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003887#endif
3888#ifdef SO_BROADCAST
Fred Drake4baedc12002-04-01 14:53:37 +00003889 PyModule_AddIntConstant(m, "SO_BROADCAST", SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003890#endif
3891#ifdef SO_USELOOPBACK
Fred Drake4baedc12002-04-01 14:53:37 +00003892 PyModule_AddIntConstant(m, "SO_USELOOPBACK", SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003893#endif
3894#ifdef SO_LINGER
Fred Drake4baedc12002-04-01 14:53:37 +00003895 PyModule_AddIntConstant(m, "SO_LINGER", SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003896#endif
3897#ifdef SO_OOBINLINE
Fred Drake4baedc12002-04-01 14:53:37 +00003898 PyModule_AddIntConstant(m, "SO_OOBINLINE", SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003899#endif
3900#ifdef SO_REUSEPORT
Fred Drake4baedc12002-04-01 14:53:37 +00003901 PyModule_AddIntConstant(m, "SO_REUSEPORT", SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003902#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003903#ifdef SO_SNDBUF
Fred Drake4baedc12002-04-01 14:53:37 +00003904 PyModule_AddIntConstant(m, "SO_SNDBUF", SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003905#endif
3906#ifdef SO_RCVBUF
Fred Drake4baedc12002-04-01 14:53:37 +00003907 PyModule_AddIntConstant(m, "SO_RCVBUF", SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003908#endif
3909#ifdef SO_SNDLOWAT
Fred Drake4baedc12002-04-01 14:53:37 +00003910 PyModule_AddIntConstant(m, "SO_SNDLOWAT", SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003911#endif
3912#ifdef SO_RCVLOWAT
Fred Drake4baedc12002-04-01 14:53:37 +00003913 PyModule_AddIntConstant(m, "SO_RCVLOWAT", SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003914#endif
3915#ifdef SO_SNDTIMEO
Fred Drake4baedc12002-04-01 14:53:37 +00003916 PyModule_AddIntConstant(m, "SO_SNDTIMEO", SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003917#endif
3918#ifdef SO_RCVTIMEO
Fred Drake4baedc12002-04-01 14:53:37 +00003919 PyModule_AddIntConstant(m, "SO_RCVTIMEO", SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003920#endif
3921#ifdef SO_ERROR
Fred Drake4baedc12002-04-01 14:53:37 +00003922 PyModule_AddIntConstant(m, "SO_ERROR", SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003923#endif
3924#ifdef SO_TYPE
Fred Drake4baedc12002-04-01 14:53:37 +00003925 PyModule_AddIntConstant(m, "SO_TYPE", SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003926#endif
3927
3928 /* Maximum number of connections for "listen" */
3929#ifdef SOMAXCONN
Fred Drake4baedc12002-04-01 14:53:37 +00003930 PyModule_AddIntConstant(m, "SOMAXCONN", SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003931#else
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003932 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003933#endif
3934
3935 /* Flags for send, recv */
3936#ifdef MSG_OOB
Fred Drake4baedc12002-04-01 14:53:37 +00003937 PyModule_AddIntConstant(m, "MSG_OOB", MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003938#endif
3939#ifdef MSG_PEEK
Fred Drake4baedc12002-04-01 14:53:37 +00003940 PyModule_AddIntConstant(m, "MSG_PEEK", MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003941#endif
3942#ifdef MSG_DONTROUTE
Fred Drake4baedc12002-04-01 14:53:37 +00003943 PyModule_AddIntConstant(m, "MSG_DONTROUTE", MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003944#endif
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00003945#ifdef MSG_DONTWAIT
Fred Drake4baedc12002-04-01 14:53:37 +00003946 PyModule_AddIntConstant(m, "MSG_DONTWAIT", MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00003947#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003948#ifdef MSG_EOR
Fred Drake4baedc12002-04-01 14:53:37 +00003949 PyModule_AddIntConstant(m, "MSG_EOR", MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003950#endif
3951#ifdef MSG_TRUNC
Fred Drake4baedc12002-04-01 14:53:37 +00003952 PyModule_AddIntConstant(m, "MSG_TRUNC", MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003953#endif
3954#ifdef MSG_CTRUNC
Fred Drake4baedc12002-04-01 14:53:37 +00003955 PyModule_AddIntConstant(m, "MSG_CTRUNC", MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003956#endif
3957#ifdef MSG_WAITALL
Fred Drake4baedc12002-04-01 14:53:37 +00003958 PyModule_AddIntConstant(m, "MSG_WAITALL", MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003959#endif
3960#ifdef MSG_BTAG
Fred Drake4baedc12002-04-01 14:53:37 +00003961 PyModule_AddIntConstant(m, "MSG_BTAG", MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003962#endif
3963#ifdef MSG_ETAG
Fred Drake4baedc12002-04-01 14:53:37 +00003964 PyModule_AddIntConstant(m, "MSG_ETAG", MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003965#endif
3966
3967 /* Protocol level and numbers, usable for [gs]etsockopt */
3968#ifdef SOL_SOCKET
Fred Drake4baedc12002-04-01 14:53:37 +00003969 PyModule_AddIntConstant(m, "SOL_SOCKET", SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003970#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00003971#ifdef SOL_IP
Fred Drake4baedc12002-04-01 14:53:37 +00003972 PyModule_AddIntConstant(m, "SOL_IP", SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00003973#else
Fred Drake4baedc12002-04-01 14:53:37 +00003974 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00003975#endif
3976#ifdef SOL_IPX
Fred Drake4baedc12002-04-01 14:53:37 +00003977 PyModule_AddIntConstant(m, "SOL_IPX", SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00003978#endif
3979#ifdef SOL_AX25
Fred Drake4baedc12002-04-01 14:53:37 +00003980 PyModule_AddIntConstant(m, "SOL_AX25", SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00003981#endif
3982#ifdef SOL_ATALK
Fred Drake4baedc12002-04-01 14:53:37 +00003983 PyModule_AddIntConstant(m, "SOL_ATALK", SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00003984#endif
3985#ifdef SOL_NETROM
Fred Drake4baedc12002-04-01 14:53:37 +00003986 PyModule_AddIntConstant(m, "SOL_NETROM", SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00003987#endif
3988#ifdef SOL_ROSE
Fred Drake4baedc12002-04-01 14:53:37 +00003989 PyModule_AddIntConstant(m, "SOL_ROSE", SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00003990#endif
3991#ifdef SOL_TCP
Fred Drake4baedc12002-04-01 14:53:37 +00003992 PyModule_AddIntConstant(m, "SOL_TCP", SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00003993#else
Fred Drake4baedc12002-04-01 14:53:37 +00003994 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00003995#endif
3996#ifdef SOL_UDP
Fred Drake4baedc12002-04-01 14:53:37 +00003997 PyModule_AddIntConstant(m, "SOL_UDP", SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00003998#else
Fred Drake4baedc12002-04-01 14:53:37 +00003999 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00004000#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004001#ifdef IPPROTO_IP
Fred Drake4baedc12002-04-01 14:53:37 +00004002 PyModule_AddIntConstant(m, "IPPROTO_IP", IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00004003#else
Fred Drake4baedc12002-04-01 14:53:37 +00004004 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004005#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004006#ifdef IPPROTO_HOPOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00004007 PyModule_AddIntConstant(m, "IPPROTO_HOPOPTS", IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004008#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004009#ifdef IPPROTO_ICMP
Fred Drake4baedc12002-04-01 14:53:37 +00004010 PyModule_AddIntConstant(m, "IPPROTO_ICMP", IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00004011#else
Fred Drake4baedc12002-04-01 14:53:37 +00004012 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004013#endif
4014#ifdef IPPROTO_IGMP
Fred Drake4baedc12002-04-01 14:53:37 +00004015 PyModule_AddIntConstant(m, "IPPROTO_IGMP", IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004016#endif
4017#ifdef IPPROTO_GGP
Fred Drake4baedc12002-04-01 14:53:37 +00004018 PyModule_AddIntConstant(m, "IPPROTO_GGP", IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004019#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004020#ifdef IPPROTO_IPV4
Fred Drake4baedc12002-04-01 14:53:37 +00004021 PyModule_AddIntConstant(m, "IPPROTO_IPV4", IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004022#endif
Martin v. Löwisa0f17342003-10-03 13:56:20 +00004023#ifdef IPPROTO_IPV6
4024 PyModule_AddIntConstant(m, "IPPROTO_IPV6", IPPROTO_IPV6);
4025#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004026#ifdef IPPROTO_IPIP
Fred Drake4baedc12002-04-01 14:53:37 +00004027 PyModule_AddIntConstant(m, "IPPROTO_IPIP", IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004028#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004029#ifdef IPPROTO_TCP
Fred Drake4baedc12002-04-01 14:53:37 +00004030 PyModule_AddIntConstant(m, "IPPROTO_TCP", IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00004031#else
Fred Drake4baedc12002-04-01 14:53:37 +00004032 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004033#endif
4034#ifdef IPPROTO_EGP
Fred Drake4baedc12002-04-01 14:53:37 +00004035 PyModule_AddIntConstant(m, "IPPROTO_EGP", IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004036#endif
4037#ifdef IPPROTO_PUP
Fred Drake4baedc12002-04-01 14:53:37 +00004038 PyModule_AddIntConstant(m, "IPPROTO_PUP", IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004039#endif
4040#ifdef IPPROTO_UDP
Fred Drake4baedc12002-04-01 14:53:37 +00004041 PyModule_AddIntConstant(m, "IPPROTO_UDP", IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00004042#else
Fred Drake4baedc12002-04-01 14:53:37 +00004043 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004044#endif
4045#ifdef IPPROTO_IDP
Fred Drake4baedc12002-04-01 14:53:37 +00004046 PyModule_AddIntConstant(m, "IPPROTO_IDP", IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004047#endif
4048#ifdef IPPROTO_HELLO
Fred Drake4baedc12002-04-01 14:53:37 +00004049 PyModule_AddIntConstant(m, "IPPROTO_HELLO", IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004050#endif
4051#ifdef IPPROTO_ND
Fred Drake4baedc12002-04-01 14:53:37 +00004052 PyModule_AddIntConstant(m, "IPPROTO_ND", IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004053#endif
4054#ifdef IPPROTO_TP
Fred Drake4baedc12002-04-01 14:53:37 +00004055 PyModule_AddIntConstant(m, "IPPROTO_TP", IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004056#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004057#ifdef IPPROTO_IPV6
Fred Drake4baedc12002-04-01 14:53:37 +00004058 PyModule_AddIntConstant(m, "IPPROTO_IPV6", IPPROTO_IPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004059#endif
4060#ifdef IPPROTO_ROUTING
Fred Drake4baedc12002-04-01 14:53:37 +00004061 PyModule_AddIntConstant(m, "IPPROTO_ROUTING", IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004062#endif
4063#ifdef IPPROTO_FRAGMENT
Fred Drake4baedc12002-04-01 14:53:37 +00004064 PyModule_AddIntConstant(m, "IPPROTO_FRAGMENT", IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004065#endif
4066#ifdef IPPROTO_RSVP
Fred Drake4baedc12002-04-01 14:53:37 +00004067 PyModule_AddIntConstant(m, "IPPROTO_RSVP", IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004068#endif
4069#ifdef IPPROTO_GRE
Fred Drake4baedc12002-04-01 14:53:37 +00004070 PyModule_AddIntConstant(m, "IPPROTO_GRE", IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004071#endif
4072#ifdef IPPROTO_ESP
Fred Drake4baedc12002-04-01 14:53:37 +00004073 PyModule_AddIntConstant(m, "IPPROTO_ESP", IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004074#endif
4075#ifdef IPPROTO_AH
Fred Drake4baedc12002-04-01 14:53:37 +00004076 PyModule_AddIntConstant(m, "IPPROTO_AH", IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004077#endif
4078#ifdef IPPROTO_MOBILE
Fred Drake4baedc12002-04-01 14:53:37 +00004079 PyModule_AddIntConstant(m, "IPPROTO_MOBILE", IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004080#endif
4081#ifdef IPPROTO_ICMPV6
Fred Drake4baedc12002-04-01 14:53:37 +00004082 PyModule_AddIntConstant(m, "IPPROTO_ICMPV6", IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004083#endif
4084#ifdef IPPROTO_NONE
Fred Drake4baedc12002-04-01 14:53:37 +00004085 PyModule_AddIntConstant(m, "IPPROTO_NONE", IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004086#endif
4087#ifdef IPPROTO_DSTOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00004088 PyModule_AddIntConstant(m, "IPPROTO_DSTOPTS", IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004089#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004090#ifdef IPPROTO_XTP
Fred Drake4baedc12002-04-01 14:53:37 +00004091 PyModule_AddIntConstant(m, "IPPROTO_XTP", IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004092#endif
4093#ifdef IPPROTO_EON
Fred Drake4baedc12002-04-01 14:53:37 +00004094 PyModule_AddIntConstant(m, "IPPROTO_EON", IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004095#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004096#ifdef IPPROTO_PIM
Fred Drake4baedc12002-04-01 14:53:37 +00004097 PyModule_AddIntConstant(m, "IPPROTO_PIM", IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004098#endif
4099#ifdef IPPROTO_IPCOMP
Fred Drake4baedc12002-04-01 14:53:37 +00004100 PyModule_AddIntConstant(m, "IPPROTO_IPCOMP", IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004101#endif
4102#ifdef IPPROTO_VRRP
Fred Drake4baedc12002-04-01 14:53:37 +00004103 PyModule_AddIntConstant(m, "IPPROTO_VRRP", IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004104#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004105#ifdef IPPROTO_BIP
Fred Drake4baedc12002-04-01 14:53:37 +00004106 PyModule_AddIntConstant(m, "IPPROTO_BIP", IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004107#endif
4108/**/
4109#ifdef IPPROTO_RAW
Fred Drake4baedc12002-04-01 14:53:37 +00004110 PyModule_AddIntConstant(m, "IPPROTO_RAW", IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00004111#else
Fred Drake4baedc12002-04-01 14:53:37 +00004112 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004113#endif
4114#ifdef IPPROTO_MAX
Fred Drake4baedc12002-04-01 14:53:37 +00004115 PyModule_AddIntConstant(m, "IPPROTO_MAX", IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004116#endif
4117
4118 /* Some port configuration */
4119#ifdef IPPORT_RESERVED
Fred Drake4baedc12002-04-01 14:53:37 +00004120 PyModule_AddIntConstant(m, "IPPORT_RESERVED", IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004121#else
Fred Drake4baedc12002-04-01 14:53:37 +00004122 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004123#endif
4124#ifdef IPPORT_USERRESERVED
Fred Drake4baedc12002-04-01 14:53:37 +00004125 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004126#else
Fred Drake4baedc12002-04-01 14:53:37 +00004127 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004128#endif
4129
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004130 /* Some reserved IP v.4 addresses */
4131#ifdef INADDR_ANY
Fred Drake4baedc12002-04-01 14:53:37 +00004132 PyModule_AddIntConstant(m, "INADDR_ANY", INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004133#else
Fred Drake4baedc12002-04-01 14:53:37 +00004134 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004135#endif
4136#ifdef INADDR_BROADCAST
Fred Drake4baedc12002-04-01 14:53:37 +00004137 PyModule_AddIntConstant(m, "INADDR_BROADCAST", INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004138#else
Fred Drake4baedc12002-04-01 14:53:37 +00004139 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004140#endif
4141#ifdef INADDR_LOOPBACK
Fred Drake4baedc12002-04-01 14:53:37 +00004142 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004143#else
Fred Drake4baedc12002-04-01 14:53:37 +00004144 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004145#endif
4146#ifdef INADDR_UNSPEC_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00004147 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004148#else
Fred Drake4baedc12002-04-01 14:53:37 +00004149 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004150#endif
4151#ifdef INADDR_ALLHOSTS_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00004152 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
4153 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004154#else
Fred Drake4baedc12002-04-01 14:53:37 +00004155 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004156#endif
4157#ifdef INADDR_MAX_LOCAL_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00004158 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP",
4159 INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004160#else
Fred Drake4baedc12002-04-01 14:53:37 +00004161 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004162#endif
4163#ifdef INADDR_NONE
Fred Drake4baedc12002-04-01 14:53:37 +00004164 PyModule_AddIntConstant(m, "INADDR_NONE", INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004165#else
Fred Drake4baedc12002-04-01 14:53:37 +00004166 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004167#endif
4168
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004169 /* IPv4 [gs]etsockopt options */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004170#ifdef IP_OPTIONS
Fred Drake4baedc12002-04-01 14:53:37 +00004171 PyModule_AddIntConstant(m, "IP_OPTIONS", IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004172#endif
4173#ifdef IP_HDRINCL
Fred Drake4baedc12002-04-01 14:53:37 +00004174 PyModule_AddIntConstant(m, "IP_HDRINCL", IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004175#endif
4176#ifdef IP_TOS
Fred Drake4baedc12002-04-01 14:53:37 +00004177 PyModule_AddIntConstant(m, "IP_TOS", IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004178#endif
4179#ifdef IP_TTL
Fred Drake4baedc12002-04-01 14:53:37 +00004180 PyModule_AddIntConstant(m, "IP_TTL", IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004181#endif
4182#ifdef IP_RECVOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00004183 PyModule_AddIntConstant(m, "IP_RECVOPTS", IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004184#endif
4185#ifdef IP_RECVRETOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00004186 PyModule_AddIntConstant(m, "IP_RECVRETOPTS", IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004187#endif
4188#ifdef IP_RECVDSTADDR
Fred Drake4baedc12002-04-01 14:53:37 +00004189 PyModule_AddIntConstant(m, "IP_RECVDSTADDR", IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004190#endif
4191#ifdef IP_RETOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00004192 PyModule_AddIntConstant(m, "IP_RETOPTS", IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004193#endif
4194#ifdef IP_MULTICAST_IF
Fred Drake4baedc12002-04-01 14:53:37 +00004195 PyModule_AddIntConstant(m, "IP_MULTICAST_IF", IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004196#endif
4197#ifdef IP_MULTICAST_TTL
Fred Drake4baedc12002-04-01 14:53:37 +00004198 PyModule_AddIntConstant(m, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004199#endif
4200#ifdef IP_MULTICAST_LOOP
Fred Drake4baedc12002-04-01 14:53:37 +00004201 PyModule_AddIntConstant(m, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004202#endif
4203#ifdef IP_ADD_MEMBERSHIP
Fred Drake4baedc12002-04-01 14:53:37 +00004204 PyModule_AddIntConstant(m, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004205#endif
4206#ifdef IP_DROP_MEMBERSHIP
Fred Drake4baedc12002-04-01 14:53:37 +00004207 PyModule_AddIntConstant(m, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004208#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00004209#ifdef IP_DEFAULT_MULTICAST_TTL
Fred Drake4baedc12002-04-01 14:53:37 +00004210 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_TTL",
4211 IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00004212#endif
4213#ifdef IP_DEFAULT_MULTICAST_LOOP
Fred Drake4baedc12002-04-01 14:53:37 +00004214 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_LOOP",
4215 IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00004216#endif
4217#ifdef IP_MAX_MEMBERSHIPS
Fred Drake4baedc12002-04-01 14:53:37 +00004218 PyModule_AddIntConstant(m, "IP_MAX_MEMBERSHIPS", IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00004219#endif
4220
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004221 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
4222#ifdef IPV6_JOIN_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00004223 PyModule_AddIntConstant(m, "IPV6_JOIN_GROUP", IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004224#endif
4225#ifdef IPV6_LEAVE_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00004226 PyModule_AddIntConstant(m, "IPV6_LEAVE_GROUP", IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004227#endif
4228#ifdef IPV6_MULTICAST_HOPS
Fred Drake4baedc12002-04-01 14:53:37 +00004229 PyModule_AddIntConstant(m, "IPV6_MULTICAST_HOPS", IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004230#endif
4231#ifdef IPV6_MULTICAST_IF
Fred Drake4baedc12002-04-01 14:53:37 +00004232 PyModule_AddIntConstant(m, "IPV6_MULTICAST_IF", IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004233#endif
4234#ifdef IPV6_MULTICAST_LOOP
Fred Drake4baedc12002-04-01 14:53:37 +00004235 PyModule_AddIntConstant(m, "IPV6_MULTICAST_LOOP", IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004236#endif
4237#ifdef IPV6_UNICAST_HOPS
Fred Drake4baedc12002-04-01 14:53:37 +00004238 PyModule_AddIntConstant(m, "IPV6_UNICAST_HOPS", IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004239#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00004240 /* Additional IPV6 socket options, defined in RFC 3493 */
4241#ifdef IPV6_V6ONLY
4242 PyModule_AddIntConstant(m, "IPV6_V6ONLY", IPV6_V6ONLY);
4243#endif
4244 /* Advanced IPV6 socket options, from RFC 3542 */
4245#ifdef IPV6_CHECKSUM
4246 PyModule_AddIntConstant(m, "IPV6_CHECKSUM", IPV6_CHECKSUM);
4247#endif
4248#ifdef IPV6_DONTFRAG
4249 PyModule_AddIntConstant(m, "IPV6_DONTFRAG", IPV6_DONTFRAG);
4250#endif
4251#ifdef IPV6_DSTOPTS
4252 PyModule_AddIntConstant(m, "IPV6_DSTOPTS", IPV6_DSTOPTS);
4253#endif
4254#ifdef IPV6_HOPLIMIT
4255 PyModule_AddIntConstant(m, "IPV6_HOPLIMIT", IPV6_HOPLIMIT);
4256#endif
4257#ifdef IPV6_HOPOPTS
4258 PyModule_AddIntConstant(m, "IPV6_HOPOPTS", IPV6_HOPOPTS);
4259#endif
4260#ifdef IPV6_NEXTHOP
4261 PyModule_AddIntConstant(m, "IPV6_NEXTHOP", IPV6_NEXTHOP);
4262#endif
4263#ifdef IPV6_PATHMTU
4264 PyModule_AddIntConstant(m, "IPV6_PATHMTU", IPV6_PATHMTU);
4265#endif
4266#ifdef IPV6_PKTINFO
4267 PyModule_AddIntConstant(m, "IPV6_PKTINFO", IPV6_PKTINFO);
4268#endif
4269#ifdef IPV6_RECVDSTOPTS
4270 PyModule_AddIntConstant(m, "IPV6_RECVDSTOPTS", IPV6_RECVDSTOPTS);
4271#endif
4272#ifdef IPV6_RECVHOPLIMIT
4273 PyModule_AddIntConstant(m, "IPV6_RECVHOPLIMIT", IPV6_RECVHOPLIMIT);
4274#endif
4275#ifdef IPV6_RECVHOPOPTS
4276 PyModule_AddIntConstant(m, "IPV6_RECVHOPOPTS", IPV6_RECVHOPOPTS);
4277#endif
4278#ifdef IPV6_RECVPKTINFO
4279 PyModule_AddIntConstant(m, "IPV6_RECVPKTINFO", IPV6_RECVPKTINFO);
4280#endif
4281#ifdef IPV6_RECVRTHDR
4282 PyModule_AddIntConstant(m, "IPV6_RECVRTHDR", IPV6_RECVRTHDR);
4283#endif
4284#ifdef IPV6_RECVTCLASS
4285 PyModule_AddIntConstant(m, "IPV6_RECVTCLASS", IPV6_RECVTCLASS);
4286#endif
4287#ifdef IPV6_RTHDR
4288 PyModule_AddIntConstant(m, "IPV6_RTHDR", IPV6_RTHDR);
4289#endif
4290#ifdef IPV6_RTHDRDSTOPTS
4291 PyModule_AddIntConstant(m, "IPV6_RTHDRDSTOPTS", IPV6_RTHDRDSTOPTS);
4292#endif
4293#ifdef IPV6_RTHDR_TYPE_0
4294 PyModule_AddIntConstant(m, "IPV6_RTHDR_TYPE_0", IPV6_RTHDR_TYPE_0);
4295#endif
4296#ifdef IPV6_RECVPATHMTU
4297 PyModule_AddIntConstant(m, "IPV6_RECVPATHMTU", IPV6_RECVPATHMTU);
4298#endif
4299#ifdef IPV6_TCLASS
4300 PyModule_AddIntConstant(m, "IPV6_TCLASS", IPV6_TCLASS);
4301#endif
4302#ifdef IPV6_USE_MIN_MTU
4303 PyModule_AddIntConstant(m, "IPV6_USE_MIN_MTU", IPV6_USE_MIN_MTU);
4304#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004305
Guido van Rossum09be4091999-08-09 14:40:40 +00004306 /* TCP options */
4307#ifdef TCP_NODELAY
Fred Drake4baedc12002-04-01 14:53:37 +00004308 PyModule_AddIntConstant(m, "TCP_NODELAY", TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00004309#endif
4310#ifdef TCP_MAXSEG
Fred Drake4baedc12002-04-01 14:53:37 +00004311 PyModule_AddIntConstant(m, "TCP_MAXSEG", TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00004312#endif
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004313#ifdef TCP_CORK
Fred Drake4baedc12002-04-01 14:53:37 +00004314 PyModule_AddIntConstant(m, "TCP_CORK", TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004315#endif
4316#ifdef TCP_KEEPIDLE
Fred Drake4baedc12002-04-01 14:53:37 +00004317 PyModule_AddIntConstant(m, "TCP_KEEPIDLE", TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004318#endif
4319#ifdef TCP_KEEPINTVL
Fred Drake4baedc12002-04-01 14:53:37 +00004320 PyModule_AddIntConstant(m, "TCP_KEEPINTVL", TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004321#endif
4322#ifdef TCP_KEEPCNT
Fred Drake4baedc12002-04-01 14:53:37 +00004323 PyModule_AddIntConstant(m, "TCP_KEEPCNT", TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004324#endif
4325#ifdef TCP_SYNCNT
Fred Drake4baedc12002-04-01 14:53:37 +00004326 PyModule_AddIntConstant(m, "TCP_SYNCNT", TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004327#endif
4328#ifdef TCP_LINGER2
Fred Drake4baedc12002-04-01 14:53:37 +00004329 PyModule_AddIntConstant(m, "TCP_LINGER2", TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004330#endif
4331#ifdef TCP_DEFER_ACCEPT
Fred Drake4baedc12002-04-01 14:53:37 +00004332 PyModule_AddIntConstant(m, "TCP_DEFER_ACCEPT", TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004333#endif
4334#ifdef TCP_WINDOW_CLAMP
Fred Drake4baedc12002-04-01 14:53:37 +00004335 PyModule_AddIntConstant(m, "TCP_WINDOW_CLAMP", TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004336#endif
4337#ifdef TCP_INFO
Fred Drake4baedc12002-04-01 14:53:37 +00004338 PyModule_AddIntConstant(m, "TCP_INFO", TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004339#endif
4340#ifdef TCP_QUICKACK
Fred Drake4baedc12002-04-01 14:53:37 +00004341 PyModule_AddIntConstant(m, "TCP_QUICKACK", TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004342#endif
4343
Guido van Rossum09be4091999-08-09 14:40:40 +00004344
4345 /* IPX options */
4346#ifdef IPX_TYPE
Fred Drake4baedc12002-04-01 14:53:37 +00004347 PyModule_AddIntConstant(m, "IPX_TYPE", IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00004348#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004349
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004350 /* get{addr,name}info parameters */
4351#ifdef EAI_ADDRFAMILY
Fred Drake4baedc12002-04-01 14:53:37 +00004352 PyModule_AddIntConstant(m, "EAI_ADDRFAMILY", EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004353#endif
4354#ifdef EAI_AGAIN
Fred Drake4baedc12002-04-01 14:53:37 +00004355 PyModule_AddIntConstant(m, "EAI_AGAIN", EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004356#endif
4357#ifdef EAI_BADFLAGS
Fred Drake4baedc12002-04-01 14:53:37 +00004358 PyModule_AddIntConstant(m, "EAI_BADFLAGS", EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004359#endif
4360#ifdef EAI_FAIL
Fred Drake4baedc12002-04-01 14:53:37 +00004361 PyModule_AddIntConstant(m, "EAI_FAIL", EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004362#endif
4363#ifdef EAI_FAMILY
Fred Drake4baedc12002-04-01 14:53:37 +00004364 PyModule_AddIntConstant(m, "EAI_FAMILY", EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004365#endif
4366#ifdef EAI_MEMORY
Fred Drake4baedc12002-04-01 14:53:37 +00004367 PyModule_AddIntConstant(m, "EAI_MEMORY", EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004368#endif
4369#ifdef EAI_NODATA
Fred Drake4baedc12002-04-01 14:53:37 +00004370 PyModule_AddIntConstant(m, "EAI_NODATA", EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004371#endif
4372#ifdef EAI_NONAME
Fred Drake4baedc12002-04-01 14:53:37 +00004373 PyModule_AddIntConstant(m, "EAI_NONAME", EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004374#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00004375#ifdef EAI_OVERFLOW
4376 PyModule_AddIntConstant(m, "EAI_OVERFLOW", EAI_OVERFLOW);
4377#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004378#ifdef EAI_SERVICE
Fred Drake4baedc12002-04-01 14:53:37 +00004379 PyModule_AddIntConstant(m, "EAI_SERVICE", EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004380#endif
4381#ifdef EAI_SOCKTYPE
Fred Drake4baedc12002-04-01 14:53:37 +00004382 PyModule_AddIntConstant(m, "EAI_SOCKTYPE", EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004383#endif
4384#ifdef EAI_SYSTEM
Fred Drake4baedc12002-04-01 14:53:37 +00004385 PyModule_AddIntConstant(m, "EAI_SYSTEM", EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004386#endif
4387#ifdef EAI_BADHINTS
Fred Drake4baedc12002-04-01 14:53:37 +00004388 PyModule_AddIntConstant(m, "EAI_BADHINTS", EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004389#endif
4390#ifdef EAI_PROTOCOL
Fred Drake4baedc12002-04-01 14:53:37 +00004391 PyModule_AddIntConstant(m, "EAI_PROTOCOL", EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004392#endif
4393#ifdef EAI_MAX
Fred Drake4baedc12002-04-01 14:53:37 +00004394 PyModule_AddIntConstant(m, "EAI_MAX", EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004395#endif
4396#ifdef AI_PASSIVE
Fred Drake4baedc12002-04-01 14:53:37 +00004397 PyModule_AddIntConstant(m, "AI_PASSIVE", AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004398#endif
4399#ifdef AI_CANONNAME
Fred Drake4baedc12002-04-01 14:53:37 +00004400 PyModule_AddIntConstant(m, "AI_CANONNAME", AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004401#endif
4402#ifdef AI_NUMERICHOST
Fred Drake4baedc12002-04-01 14:53:37 +00004403 PyModule_AddIntConstant(m, "AI_NUMERICHOST", AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004404#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00004405#ifdef AI_NUMERICSERV
4406 PyModule_AddIntConstant(m, "AI_NUMERICSERV", AI_NUMERICSERV);
4407#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004408#ifdef AI_MASK
Fred Drake4baedc12002-04-01 14:53:37 +00004409 PyModule_AddIntConstant(m, "AI_MASK", AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004410#endif
4411#ifdef AI_ALL
Fred Drake4baedc12002-04-01 14:53:37 +00004412 PyModule_AddIntConstant(m, "AI_ALL", AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004413#endif
4414#ifdef AI_V4MAPPED_CFG
Fred Drake4baedc12002-04-01 14:53:37 +00004415 PyModule_AddIntConstant(m, "AI_V4MAPPED_CFG", AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004416#endif
4417#ifdef AI_ADDRCONFIG
Fred Drake4baedc12002-04-01 14:53:37 +00004418 PyModule_AddIntConstant(m, "AI_ADDRCONFIG", AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004419#endif
4420#ifdef AI_V4MAPPED
Fred Drake4baedc12002-04-01 14:53:37 +00004421 PyModule_AddIntConstant(m, "AI_V4MAPPED", AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004422#endif
4423#ifdef AI_DEFAULT
Fred Drake4baedc12002-04-01 14:53:37 +00004424 PyModule_AddIntConstant(m, "AI_DEFAULT", AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004425#endif
4426#ifdef NI_MAXHOST
Fred Drake4baedc12002-04-01 14:53:37 +00004427 PyModule_AddIntConstant(m, "NI_MAXHOST", NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004428#endif
4429#ifdef NI_MAXSERV
Fred Drake4baedc12002-04-01 14:53:37 +00004430 PyModule_AddIntConstant(m, "NI_MAXSERV", NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004431#endif
4432#ifdef NI_NOFQDN
Fred Drake4baedc12002-04-01 14:53:37 +00004433 PyModule_AddIntConstant(m, "NI_NOFQDN", NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004434#endif
4435#ifdef NI_NUMERICHOST
Fred Drake4baedc12002-04-01 14:53:37 +00004436 PyModule_AddIntConstant(m, "NI_NUMERICHOST", NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004437#endif
4438#ifdef NI_NAMEREQD
Fred Drake4baedc12002-04-01 14:53:37 +00004439 PyModule_AddIntConstant(m, "NI_NAMEREQD", NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004440#endif
4441#ifdef NI_NUMERICSERV
Fred Drake4baedc12002-04-01 14:53:37 +00004442 PyModule_AddIntConstant(m, "NI_NUMERICSERV", NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004443#endif
4444#ifdef NI_DGRAM
Fred Drake4baedc12002-04-01 14:53:37 +00004445 PyModule_AddIntConstant(m, "NI_DGRAM", NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004446#endif
4447
Martin v. Löwis94681fc2003-11-27 19:40:22 +00004448 /* shutdown() parameters */
4449#ifdef SHUT_RD
4450 PyModule_AddIntConstant(m, "SHUT_RD", SHUT_RD);
4451#elif defined(SD_RECEIVE)
4452 PyModule_AddIntConstant(m, "SHUT_RD", SD_RECEIVE);
4453#else
4454 PyModule_AddIntConstant(m, "SHUT_RD", 0);
4455#endif
4456#ifdef SHUT_WR
4457 PyModule_AddIntConstant(m, "SHUT_WR", SHUT_WR);
4458#elif defined(SD_SEND)
4459 PyModule_AddIntConstant(m, "SHUT_WR", SD_SEND);
4460#else
4461 PyModule_AddIntConstant(m, "SHUT_WR", 1);
4462#endif
4463#ifdef SHUT_RDWR
4464 PyModule_AddIntConstant(m, "SHUT_RDWR", SHUT_RDWR);
4465#elif defined(SD_BOTH)
4466 PyModule_AddIntConstant(m, "SHUT_RDWR", SD_BOTH);
4467#else
4468 PyModule_AddIntConstant(m, "SHUT_RDWR", 2);
4469#endif
4470
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004471 /* Initialize gethostbyname lock */
Just van Rossum1040d2c2003-05-09 07:53:18 +00004472#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
4473 netdb_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004474#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004475}
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004476
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004477
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004478#ifndef HAVE_INET_PTON
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004479
4480/* Simplistic emulation code for inet_pton that only works for IPv4 */
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004481/* These are not exposed because they do not set errno properly */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004482
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004483int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004484inet_pton(int af, const char *src, void *dst)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004485{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004486 if (af == AF_INET) {
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004487 long packed_addr;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004488 packed_addr = inet_addr(src);
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004489 if (packed_addr == INADDR_NONE)
4490 return 0;
4491 memcpy(dst, &packed_addr, 4);
4492 return 1;
4493 }
4494 /* Should set errno to EAFNOSUPPORT */
4495 return -1;
4496}
4497
Martin v. Löwisc925b1532001-07-21 09:42:15 +00004498const char *
4499inet_ntop(int af, const void *src, char *dst, socklen_t size)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004500{
4501 if (af == AF_INET) {
4502 struct in_addr packed_addr;
4503 if (size < 16)
4504 /* Should set errno to ENOSPC. */
4505 return NULL;
4506 memcpy(&packed_addr, src, sizeof(packed_addr));
4507 return strncpy(dst, inet_ntoa(packed_addr), size);
4508 }
4509 /* Should set errno to EAFNOSUPPORT */
4510 return NULL;
4511}
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004512
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004513#endif