blob: 6e2166cd71e217f9dc5f70dac3c2e73b42c73b6e [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
Andrew MacIntyre5a8b4592004-07-07 14:02:59 +0000282#if defined(PYOS_OS2) && defined(PYCC_GCC)
283#include "addrinfo.h"
284#endif
285
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000286#ifndef HAVE_INET_PTON
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000287int inet_pton(int af, const char *src, void *dst);
Martin v. Löwisc925b1532001-07-21 09:42:15 +0000288const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000289#endif
290
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000291#ifdef __APPLE__
292/* On OS X, getaddrinfo returns no error indication of lookup
293 failure, so we must use the emulation instead of the libinfo
294 implementation. Unfortunately, performing an autoconf test
295 for this bug would require DNS access for the machine performing
296 the configuration, which is not acceptable. Therefore, we
297 determine the bug just by checking for __APPLE__. If this bug
298 gets ever fixed, perhaps checking for sys/version.h would be
299 appropriate, which is 10/0 on the system with the bug. */
Jack Jansen84262fb2002-07-02 14:40:42 +0000300#ifndef HAVE_GETNAMEINFO
301/* This bug seems to be fixed in Jaguar. Ths easiest way I could
302 Find to check for Jaguar is that it has getnameinfo(), which
303 older releases don't have */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000304#undef HAVE_GETADDRINFO
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000305#endif
Jack Jansen84262fb2002-07-02 14:40:42 +0000306#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000307
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000308/* I know this is a bad practice, but it is the easiest... */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000309#if !defined(HAVE_GETADDRINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000310/* avoid clashes with the C library definition of the symbol. */
311#define getaddrinfo fake_getaddrinfo
312#define gai_strerror fake_gai_strerror
313#define freeaddrinfo fake_freeaddrinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000314#include "getaddrinfo.c"
315#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000316#if !defined(HAVE_GETNAMEINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000317#define getnameinfo fake_getnameinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000318#include "getnameinfo.c"
319#endif
320
Guido van Rossumbcc20741998-08-04 22:53:56 +0000321#if defined(MS_WINDOWS) || defined(__BEOS__)
322/* BeOS suffers from the same socket dichotomy as Win32... - [cjh] */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000323/* seem to be a few differences in the API */
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000324#define SOCKETCLOSE closesocket
Guido van Rossumbe32c891996-06-20 16:25:29 +0000325#define NO_DUP /* Actually it exists on NT 3.5, but what the heck... */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000326#endif
327
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000328#ifdef MS_WIN32
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000329#define EAFNOSUPPORT WSAEAFNOSUPPORT
330#define snprintf _snprintf
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000331#endif
Fred Drakea04eaad2000-06-30 02:46:07 +0000332
Andrew MacIntyreba43e872002-03-03 03:03:52 +0000333#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000334#define SOCKETCLOSE soclose
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000335#define NO_DUP /* Sockets are Not Actual File Handles under OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000336#endif
337
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000338#ifndef SOCKETCLOSE
339#define SOCKETCLOSE close
340#endif
341
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000342#ifdef __VMS
343/* TCP/IP Services for VMS uses a maximum send/revc buffer length of 65535 */
344#define SEGMENT_SIZE 65535
345#endif
346
Hye-Shik Chang81268602004-02-02 06:05:24 +0000347#if defined(HAVE_BLUETOOTH_H) || defined(HAVE_BLUETOOTH_BLUETOOTH_H)
348#define USE_BLUETOOTH 1
349#if defined(__FreeBSD__)
350#define BTPROTO_L2CAP BLUETOOTH_PROTO_L2CAP
351#define BTPROTO_RFCOMM BLUETOOTH_PROTO_RFCOMM
352#define sockaddr_l2 sockaddr_l2cap
353#define sockaddr_rc sockaddr_rfcomm
354#define _BT_SOCKADDR_MEMB(s, proto) &((s)->sock_addr)
355#define _BT_L2_MEMB(sa, memb) ((sa)->l2cap_##memb)
356#define _BT_RC_MEMB(sa, memb) ((sa)->rfcomm_##memb)
357#else
Anthony Baxter5d7c0672004-02-16 05:35:28 +0000358#define _BT_SOCKADDR_MEMB(s, proto) (&((s)->sock_addr).bt_##proto)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000359#define _BT_L2_MEMB(sa, memb) ((sa)->l2_##memb)
360#define _BT_RC_MEMB(sa, memb) ((sa)->rc_##memb)
361#define _BT_SCO_MEMB(sa, memb) ((sa)->sco_##memb)
362#endif
363#endif
364
Martin v. Löwise9416172003-05-03 10:12:45 +0000365/*
366 * Constants for getnameinfo()
367 */
368#if !defined(NI_MAXHOST)
369#define NI_MAXHOST 1025
370#endif
371#if !defined(NI_MAXSERV)
372#define NI_MAXSERV 32
373#endif
374
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000375/* XXX There's a problem here: *static* functions are not supposed to have
376 a Py prefix (or use CapitalizedWords). Later... */
377
Guido van Rossum30a685f1991-06-27 15:51:29 +0000378/* Global variable holding the exception type for errors detected
379 by this module (but not argument type or memory errors, etc.). */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000380static PyObject *socket_error;
381static PyObject *socket_herror;
382static PyObject *socket_gaierror;
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000383static PyObject *socket_timeout;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000384
Guido van Rossum48a680c2001-03-02 06:34:14 +0000385#ifdef RISCOS
386/* Global variable which is !=0 if Python is running in a RISC OS taskwindow */
387static int taskwindow;
388#endif
389
Tim Peters643a7fc2002-02-17 04:13:21 +0000390/* A forward reference to the socket type object.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000391 The sock_type variable contains pointers to various functions,
392 some of which call new_sockobject(), which uses sock_type, so
Tim Peters643a7fc2002-02-17 04:13:21 +0000393 there has to be a circular reference. */
Jeremy Hylton938ace62002-07-17 16:30:39 +0000394static PyTypeObject sock_type;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000395
Guido van Rossum30a685f1991-06-27 15:51:29 +0000396/* Convenience function to raise an error according to errno
397 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000398
Guido van Rossum73624e91994-10-10 17:59:00 +0000399static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000400set_error(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000401{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000402#ifdef MS_WINDOWS
Mark Hammond46a733d2000-07-24 01:45:11 +0000403 int err_no = WSAGetLastError();
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000404 static struct {
405 int no;
406 const char *msg;
407 } *msgp, msgs[] = {
408 {WSAEINTR, "Interrupted system call"},
409 {WSAEBADF, "Bad file descriptor"},
410 {WSAEACCES, "Permission denied"},
411 {WSAEFAULT, "Bad address"},
412 {WSAEINVAL, "Invalid argument"},
413 {WSAEMFILE, "Too many open files"},
414 {WSAEWOULDBLOCK,
415 "The socket operation could not complete "
416 "without blocking"},
417 {WSAEINPROGRESS, "Operation now in progress"},
418 {WSAEALREADY, "Operation already in progress"},
419 {WSAENOTSOCK, "Socket operation on non-socket"},
420 {WSAEDESTADDRREQ, "Destination address required"},
421 {WSAEMSGSIZE, "Message too long"},
422 {WSAEPROTOTYPE, "Protocol wrong type for socket"},
423 {WSAENOPROTOOPT, "Protocol not available"},
424 {WSAEPROTONOSUPPORT, "Protocol not supported"},
425 {WSAESOCKTNOSUPPORT, "Socket type not supported"},
426 {WSAEOPNOTSUPP, "Operation not supported"},
427 {WSAEPFNOSUPPORT, "Protocol family not supported"},
428 {WSAEAFNOSUPPORT, "Address family not supported"},
429 {WSAEADDRINUSE, "Address already in use"},
430 {WSAEADDRNOTAVAIL, "Can't assign requested address"},
431 {WSAENETDOWN, "Network is down"},
432 {WSAENETUNREACH, "Network is unreachable"},
433 {WSAENETRESET, "Network dropped connection on reset"},
434 {WSAECONNABORTED, "Software caused connection abort"},
435 {WSAECONNRESET, "Connection reset by peer"},
436 {WSAENOBUFS, "No buffer space available"},
437 {WSAEISCONN, "Socket is already connected"},
438 {WSAENOTCONN, "Socket is not connected"},
439 {WSAESHUTDOWN, "Can't send after socket shutdown"},
440 {WSAETOOMANYREFS, "Too many references: can't splice"},
441 {WSAETIMEDOUT, "Operation timed out"},
442 {WSAECONNREFUSED, "Connection refused"},
443 {WSAELOOP, "Too many levels of symbolic links"},
444 {WSAENAMETOOLONG, "File name too long"},
445 {WSAEHOSTDOWN, "Host is down"},
446 {WSAEHOSTUNREACH, "No route to host"},
447 {WSAENOTEMPTY, "Directory not empty"},
448 {WSAEPROCLIM, "Too many processes"},
449 {WSAEUSERS, "Too many users"},
450 {WSAEDQUOT, "Disc quota exceeded"},
451 {WSAESTALE, "Stale NFS file handle"},
452 {WSAEREMOTE, "Too many levels of remote in path"},
453 {WSASYSNOTREADY, "Network subsystem is unvailable"},
454 {WSAVERNOTSUPPORTED, "WinSock version is not supported"},
455 {WSANOTINITIALISED,
456 "Successful WSAStartup() not yet performed"},
457 {WSAEDISCON, "Graceful shutdown in progress"},
458 /* Resolver errors */
459 {WSAHOST_NOT_FOUND, "No such host is known"},
460 {WSATRY_AGAIN, "Host not found, or server failed"},
461 {WSANO_RECOVERY, "Unexpected server error encountered"},
462 {WSANO_DATA, "Valid name without requested data"},
463 {WSANO_ADDRESS, "No address, look for MX record"},
464 {0, NULL}
465 };
Mark Hammond46a733d2000-07-24 01:45:11 +0000466 if (err_no) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000467 PyObject *v;
Mark Hammond46a733d2000-07-24 01:45:11 +0000468 const char *msg = "winsock error";
Guido van Rossum48a680c2001-03-02 06:34:14 +0000469
Mark Hammond46a733d2000-07-24 01:45:11 +0000470 for (msgp = msgs; msgp->msg; msgp++) {
471 if (err_no == msgp->no) {
472 msg = msgp->msg;
473 break;
474 }
475 }
476
477 v = Py_BuildValue("(is)", err_no, msg);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000478 if (v != NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000479 PyErr_SetObject(socket_error, v);
Guido van Rossum73624e91994-10-10 17:59:00 +0000480 Py_DECREF(v);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000481 }
482 return NULL;
483 }
484 else
485#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000486
Andrew MacIntyreba43e872002-03-03 03:03:52 +0000487#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000488 if (sock_errno() != NO_ERROR) {
489 APIRET rc;
490 ULONG msglen;
491 char outbuf[100];
492 int myerrorcode = sock_errno();
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000493
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000494 /* Retrieve socket-related error message from MPTN.MSG file */
495 rc = DosGetMessage(NULL, 0, outbuf, sizeof(outbuf),
496 myerrorcode - SOCBASEERR + 26,
497 "mptn.msg",
498 &msglen);
499 if (rc == NO_ERROR) {
500 PyObject *v;
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000501
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000502 /* OS/2 doesn't guarantee a terminator */
503 outbuf[msglen] = '\0';
504 if (strlen(outbuf) > 0) {
505 /* If non-empty msg, trim CRLF */
506 char *lastc = &outbuf[ strlen(outbuf)-1 ];
507 while (lastc > outbuf && isspace(*lastc)) {
508 /* Trim trailing whitespace (CRLF) */
509 *lastc-- = '\0';
510 }
511 }
512 v = Py_BuildValue("(is)", myerrorcode, outbuf);
513 if (v != NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000514 PyErr_SetObject(socket_error, v);
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000515 Py_DECREF(v);
516 }
517 return NULL;
518 }
519 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000520#endif
521
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000522#if defined(RISCOS)
523 if (_inet_error.errnum != NULL) {
524 PyObject *v;
525 v = Py_BuildValue("(is)", errno, _inet_err());
526 if (v != NULL) {
527 PyErr_SetObject(socket_error, v);
528 Py_DECREF(v);
529 }
530 return NULL;
531 }
532#endif
533
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000534 return PyErr_SetFromErrno(socket_error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000535}
536
Guido van Rossum30a685f1991-06-27 15:51:29 +0000537
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000538static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000539set_herror(int h_error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000540{
541 PyObject *v;
542
543#ifdef HAVE_HSTRERROR
544 v = Py_BuildValue("(is)", h_error, (char *)hstrerror(h_error));
545#else
546 v = Py_BuildValue("(is)", h_error, "host not found");
547#endif
548 if (v != NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000549 PyErr_SetObject(socket_herror, v);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000550 Py_DECREF(v);
551 }
552
553 return NULL;
554}
555
556
557static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000558set_gaierror(int error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000559{
560 PyObject *v;
561
Martin v. Löwis272cb402002-03-01 08:31:07 +0000562#ifdef EAI_SYSTEM
563 /* EAI_SYSTEM is not available on Windows XP. */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000564 if (error == EAI_SYSTEM)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000565 return set_error();
Martin v. Löwis272cb402002-03-01 08:31:07 +0000566#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000567
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000568#ifdef HAVE_GAI_STRERROR
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000569 v = Py_BuildValue("(is)", error, gai_strerror(error));
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000570#else
571 v = Py_BuildValue("(is)", error, "getaddrinfo failed");
572#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000573 if (v != NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000574 PyErr_SetObject(socket_gaierror, v);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000575 Py_DECREF(v);
576 }
577
578 return NULL;
579}
580
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000581/* Function to perform the setting of socket blocking mode
582 internally. block = (1 | 0). */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000583static int
584internal_setblocking(PySocketSockObject *s, int block)
585{
586#ifndef RISCOS
587#ifndef MS_WINDOWS
588 int delay_flag;
589#endif
590#endif
591
592 Py_BEGIN_ALLOW_THREADS
593#ifdef __BEOS__
594 block = !block;
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000595 setsockopt(s->sock_fd, SOL_SOCKET, SO_NONBLOCK,
596 (void *)(&block), sizeof(int));
Guido van Rossum67f7a382002-06-06 21:08:16 +0000597#else
598#ifndef RISCOS
599#ifndef MS_WINDOWS
600#if defined(PYOS_OS2) && !defined(PYCC_GCC)
601 block = !block;
602 ioctl(s->sock_fd, FIONBIO, (caddr_t)&block, sizeof(block));
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000603#elif defined(__VMS)
604 block = !block;
605 ioctl(s->sock_fd, FIONBIO, (char *)&block);
606#else /* !PYOS_OS2 && !_VMS */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000607 delay_flag = fcntl(s->sock_fd, F_GETFL, 0);
608 if (block)
Neal Norwitz39d22e52002-11-02 19:55:21 +0000609 delay_flag &= (~O_NONBLOCK);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000610 else
Neal Norwitz39d22e52002-11-02 19:55:21 +0000611 delay_flag |= O_NONBLOCK;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000612 fcntl(s->sock_fd, F_SETFL, delay_flag);
613#endif /* !PYOS_OS2 */
614#else /* MS_WINDOWS */
615 block = !block;
616 ioctlsocket(s->sock_fd, FIONBIO, (u_long*)&block);
617#endif /* MS_WINDOWS */
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000618#else /* RISCOS */
619 block = !block;
620 socketioctl(s->sock_fd, FIONBIO, (u_long*)&block);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000621#endif /* RISCOS */
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000622#endif /* __BEOS__ */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000623 Py_END_ALLOW_THREADS
624
625 /* Since these don't return anything */
626 return 1;
627}
628
Guido van Rossum11ba0942002-06-13 15:07:44 +0000629/* Do a select() on the socket, if necessary (sock_timeout > 0).
630 The argument writing indicates the direction.
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000631 This does not raise an exception; we'll let our caller do that
632 after they've reacquired the interpreter lock.
633 Returns 1 on timeout, 0 otherwise. */
634static int
Guido van Rossumb9e916a2002-06-07 01:42:47 +0000635internal_select(PySocketSockObject *s, int writing)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000636{
637 fd_set fds;
638 struct timeval tv;
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000639 int n;
Guido van Rossum11ba0942002-06-13 15:07:44 +0000640
Guido van Rossumad654902002-07-19 12:44:59 +0000641 /* Nothing to do unless we're in timeout mode (not non-blocking) */
Guido van Rossum11ba0942002-06-13 15:07:44 +0000642 if (s->sock_timeout <= 0.0)
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000643 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000644
Guido van Rossumad654902002-07-19 12:44:59 +0000645 /* Guard against closed socket */
646 if (s->sock_fd < 0)
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000647 return 0;
Guido van Rossumad654902002-07-19 12:44:59 +0000648
Guido van Rossum67f7a382002-06-06 21:08:16 +0000649 /* Construct the arguments to select */
650 tv.tv_sec = (int)s->sock_timeout;
Guido van Rossumb9e916a2002-06-07 01:42:47 +0000651 tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000652 FD_ZERO(&fds);
653 FD_SET(s->sock_fd, &fds);
654
655 /* See if the socket is ready */
Guido van Rossumb9e916a2002-06-07 01:42:47 +0000656 if (writing)
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000657 n = select(s->sock_fd+1, NULL, &fds, NULL, &tv);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000658 else
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000659 n = select(s->sock_fd+1, &fds, NULL, NULL, &tv);
660 if (n == 0)
661 return 1;
662 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000663}
664
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000665/* Initialize a new socket object. */
666
Tim Petersa12b4cf2002-07-18 22:38:44 +0000667static double defaulttimeout = -1.0; /* Default timeout for new sockets */
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000668
Mark Hammond62b1ab12002-07-23 06:31:15 +0000669PyMODINIT_FUNC
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000670init_sockobject(PySocketSockObject *s,
671 SOCKET_T fd, int family, int type, int proto)
672{
673#ifdef RISCOS
674 int block = 1;
675#endif
676 s->sock_fd = fd;
677 s->sock_family = family;
678 s->sock_type = type;
679 s->sock_proto = proto;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000680 s->sock_timeout = defaulttimeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000681
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000682 s->errorhandler = &set_error;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000683
684 if (defaulttimeout >= 0.0)
685 internal_setblocking(s, 0);
686
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000687#ifdef RISCOS
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000688 if (taskwindow)
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000689 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000690#endif
691}
692
693
Guido van Rossum30a685f1991-06-27 15:51:29 +0000694/* Create a new socket object.
695 This just creates the object and initializes it.
696 If the creation fails, return NULL and set an exception (implicit
697 in NEWOBJ()). */
698
Guido van Rossum73624e91994-10-10 17:59:00 +0000699static PySocketSockObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000700new_sockobject(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000701{
Guido van Rossum73624e91994-10-10 17:59:00 +0000702 PySocketSockObject *s;
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000703 s = (PySocketSockObject *)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000704 PyType_GenericNew(&sock_type, NULL, NULL);
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000705 if (s != NULL)
706 init_sockobject(s, fd, family, type, proto);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000707 return s;
708}
709
Guido van Rossum30a685f1991-06-27 15:51:29 +0000710
Guido van Rossum48a680c2001-03-02 06:34:14 +0000711/* Lock to allow python interpreter to continue, but only allow one
Just van Rossum1040d2c2003-05-09 07:53:18 +0000712 thread to be in gethostbyname or getaddrinfo */
713#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
714PyThread_type_lock netdb_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000715#endif
716
717
Guido van Rossum30a685f1991-06-27 15:51:29 +0000718/* Convert a string specifying a host name or one of a few symbolic
719 names to a numeric IP address. This usually calls gethostbyname()
720 to do the work; the names "" and "<broadcast>" are special.
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000721 Return the length (IPv4 should be 4 bytes), or negative if
Guido van Rossum30a685f1991-06-27 15:51:29 +0000722 an error occurred; then an exception is raised. */
723
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000724static int
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000725setipaddr(char *name, struct sockaddr *addr_ret, size_t addr_ret_size, int af)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000726{
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000727 struct addrinfo hints, *res;
728 int error;
Anthony Baxter0e85f9d2003-05-02 15:40:46 +0000729 int d1, d2, d3, d4;
730 char ch;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000731
Guido van Rossuma376cc51996-12-05 23:43:35 +0000732 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
Guido van Rossum30a685f1991-06-27 15:51:29 +0000733 if (name[0] == '\0') {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000734 int siz;
735 memset(&hints, 0, sizeof(hints));
736 hints.ai_family = af;
737 hints.ai_socktype = SOCK_DGRAM; /*dummy*/
738 hints.ai_flags = AI_PASSIVE;
Just van Rossum1040d2c2003-05-09 07:53:18 +0000739 Py_BEGIN_ALLOW_THREADS
740 ACQUIRE_GETADDRINFO_LOCK
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000741 error = getaddrinfo(NULL, "0", &hints, &res);
Just van Rossum1040d2c2003-05-09 07:53:18 +0000742 Py_END_ALLOW_THREADS
743 /* We assume that those thread-unsafe getaddrinfo() versions
744 *are* safe regarding their return value, ie. that a
745 subsequent call to getaddrinfo() does not destroy the
746 outcome of the first call. */
747 RELEASE_GETADDRINFO_LOCK
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000748 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000749 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000750 return -1;
751 }
752 switch (res->ai_family) {
753 case AF_INET:
754 siz = 4;
755 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000756#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000757 case AF_INET6:
758 siz = 16;
759 break;
760#endif
761 default:
762 freeaddrinfo(res);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000763 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000764 "unsupported address family");
765 return -1;
766 }
767 if (res->ai_next) {
Martin v. Löwisf0b11d22001-11-07 08:31:03 +0000768 freeaddrinfo(res);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000769 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000770 "wildcard resolved to multiple address");
771 return -1;
772 }
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000773 if (res->ai_addrlen < addr_ret_size)
774 addr_ret_size = res->ai_addrlen;
775 memcpy(addr_ret, res->ai_addr, addr_ret_size);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000776 freeaddrinfo(res);
777 return siz;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000778 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000779 if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000780 struct sockaddr_in *sin;
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +0000781 if (af != AF_INET && af != AF_UNSPEC) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000782 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000783 "address family mismatched");
784 return -1;
785 }
786 sin = (struct sockaddr_in *)addr_ret;
787 memset((void *) sin, '\0', sizeof(*sin));
788 sin->sin_family = AF_INET;
789#ifdef HAVE_SOCKADDR_SA_LEN
790 sin->sin_len = sizeof(*sin);
791#endif
792 sin->sin_addr.s_addr = INADDR_BROADCAST;
793 return sizeof(sin->sin_addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000794 }
Anthony Baxter0e85f9d2003-05-02 15:40:46 +0000795 if (sscanf(name, "%d.%d.%d.%d%c", &d1, &d2, &d3, &d4, &ch) == 4 &&
796 0 <= d1 && d1 <= 255 && 0 <= d2 && d2 <= 255 &&
797 0 <= d3 && d3 <= 255 && 0 <= d4 && d4 <= 255) {
798 struct sockaddr_in *sin;
799 sin = (struct sockaddr_in *)addr_ret;
800 sin->sin_addr.s_addr = htonl(
801 ((long) d1 << 24) | ((long) d2 << 16) |
802 ((long) d3 << 8) | ((long) d4 << 0));
803 sin->sin_family = AF_INET;
804#ifdef HAVE_SOCKADDR_SA_LEN
805 sin->sin_len = sizeof(*sin);
806#endif
807 return 4;
808 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000809 memset(&hints, 0, sizeof(hints));
810 hints.ai_family = af;
Just van Rossum1040d2c2003-05-09 07:53:18 +0000811 Py_BEGIN_ALLOW_THREADS
812 ACQUIRE_GETADDRINFO_LOCK
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000813 error = getaddrinfo(name, NULL, &hints, &res);
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000814#if defined(__digital__) && defined(__unix__)
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000815 if (error == EAI_NONAME && af == AF_UNSPEC) {
816 /* On Tru64 V5.1, numeric-to-addr conversion fails
817 if no address family is given. Assume IPv4 for now.*/
818 hints.ai_family = AF_INET;
819 error = getaddrinfo(name, NULL, &hints, &res);
820 }
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000821#endif
Just van Rossum1040d2c2003-05-09 07:53:18 +0000822 Py_END_ALLOW_THREADS
823 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000824 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000825 set_gaierror(error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000826 return -1;
827 }
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000828 if (res->ai_addrlen < addr_ret_size)
829 addr_ret_size = res->ai_addrlen;
830 memcpy((char *) addr_ret, res->ai_addr, addr_ret_size);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000831 freeaddrinfo(res);
832 switch (addr_ret->sa_family) {
833 case AF_INET:
834 return 4;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000835#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000836 case AF_INET6:
837 return 16;
Guido van Rossum955becc1999-03-22 20:14:53 +0000838#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000839 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000840 PyErr_SetString(socket_error, "unknown address family");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000841 return -1;
842 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000843}
844
Guido van Rossum30a685f1991-06-27 15:51:29 +0000845
Guido van Rossum30a685f1991-06-27 15:51:29 +0000846/* Create a string object representing an IP address.
847 This is always a string of the form 'dd.dd.dd.dd' (with variable
848 size numbers). */
849
Guido van Rossum73624e91994-10-10 17:59:00 +0000850static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000851makeipaddr(struct sockaddr *addr, int addrlen)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000852{
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000853 char buf[NI_MAXHOST];
854 int error;
855
856 error = getnameinfo(addr, addrlen, buf, sizeof(buf), NULL, 0,
857 NI_NUMERICHOST);
858 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000859 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000860 return NULL;
861 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000862 return PyString_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000863}
864
865
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000866#ifdef USE_BLUETOOTH
867/* Convert a string representation of a Bluetooth address into a numeric
868 address. Returns the length (6), or raises an exception and returns -1 if
869 an error occurred. */
870
871static int
872setbdaddr(char *name, bdaddr_t *bdaddr)
873{
874 unsigned int b0, b1, b2, b3, b4, b5;
875 char ch;
876 int n;
877
878 n = sscanf(name, "%X:%X:%X:%X:%X:%X%c",
879 &b5, &b4, &b3, &b2, &b1, &b0, &ch);
880 if (n == 6 && (b0 | b1 | b2 | b3 | b4 | b5) < 256) {
881 bdaddr->b[0] = b0;
882 bdaddr->b[1] = b1;
883 bdaddr->b[2] = b2;
884 bdaddr->b[3] = b3;
885 bdaddr->b[4] = b4;
886 bdaddr->b[5] = b5;
887 return 6;
888 } else {
889 PyErr_SetString(socket_error, "bad bluetooth address");
890 return -1;
891 }
892}
893
894/* Create a string representation of the Bluetooth address. This is always a
895 string of the form 'XX:XX:XX:XX:XX:XX' where XX is a two digit hexadecimal
896 value (zero padded if necessary). */
897
898static PyObject *
899makebdaddr(bdaddr_t *bdaddr)
900{
901 char buf[(6 * 2) + 5 + 1];
902
903 sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X",
904 bdaddr->b[5], bdaddr->b[4], bdaddr->b[3],
905 bdaddr->b[2], bdaddr->b[1], bdaddr->b[0]);
906 return PyString_FromString(buf);
907}
908#endif
909
910
Guido van Rossum30a685f1991-06-27 15:51:29 +0000911/* Create an object representing the given socket address,
912 suitable for passing it back to bind(), connect() etc.
913 The family field of the sockaddr structure is inspected
914 to determine what kind of address it really is. */
915
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000916/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000917static PyObject *
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000918makesockaddr(int sockfd, struct sockaddr *addr, int addrlen, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000919{
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000920 if (addrlen == 0) {
921 /* No address -- may be recvfrom() from known socket */
Guido van Rossum73624e91994-10-10 17:59:00 +0000922 Py_INCREF(Py_None);
923 return Py_None;
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000924 }
925
Guido van Rossumbcc20741998-08-04 22:53:56 +0000926#ifdef __BEOS__
Guido van Rossum2c8bcb82000-04-25 21:34:53 +0000927 /* XXX: BeOS version of accept() doesn't set family correctly */
Guido van Rossumbcc20741998-08-04 22:53:56 +0000928 addr->sa_family = AF_INET;
929#endif
930
Guido van Rossum30a685f1991-06-27 15:51:29 +0000931 switch (addr->sa_family) {
932
933 case AF_INET:
934 {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000935 struct sockaddr_in *a;
936 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
Barry Warsaw752300b1997-01-03 17:18:10 +0000937 PyObject *ret = NULL;
938 if (addrobj) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000939 a = (struct sockaddr_in *)addr;
Barry Warsaw752300b1997-01-03 17:18:10 +0000940 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
941 Py_DECREF(addrobj);
942 }
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000943 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000944 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000945
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +0000946#if defined(AF_UNIX)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000947 case AF_UNIX:
948 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000949 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000950 return PyString_FromString(a->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000951 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000952#endif /* AF_UNIX */
953
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000954#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000955 case AF_INET6:
956 {
957 struct sockaddr_in6 *a;
958 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
959 PyObject *ret = NULL;
960 if (addrobj) {
961 a = (struct sockaddr_in6 *)addr;
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000962 ret = Py_BuildValue("Oiii",
963 addrobj,
964 ntohs(a->sin6_port),
965 a->sin6_flowinfo,
966 a->sin6_scope_id);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000967 Py_DECREF(addrobj);
968 }
969 return ret;
970 }
Jeremy Hylton22308652001-02-02 03:23:09 +0000971#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +0000972
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000973#ifdef USE_BLUETOOTH
974 case AF_BLUETOOTH:
975 switch (proto) {
976
977 case BTPROTO_L2CAP:
978 {
979 struct sockaddr_l2 *a = (struct sockaddr_l2 *) addr;
980 PyObject *addrobj = makebdaddr(&_BT_L2_MEMB(a, bdaddr));
981 PyObject *ret = NULL;
982 if (addrobj) {
983 ret = Py_BuildValue("Oi",
984 addrobj,
985 _BT_L2_MEMB(a, psm));
986 Py_DECREF(addrobj);
987 }
988 return ret;
989 }
990
991 case BTPROTO_RFCOMM:
992 {
993 struct sockaddr_rc *a = (struct sockaddr_rc *) addr;
994 PyObject *addrobj = makebdaddr(&_BT_RC_MEMB(a, bdaddr));
995 PyObject *ret = NULL;
996 if (addrobj) {
997 ret = Py_BuildValue("Oi",
998 addrobj,
999 _BT_RC_MEMB(a, channel));
1000 Py_DECREF(addrobj);
1001 }
1002 return ret;
1003 }
1004
1005#if !defined(__FreeBSD__)
1006 case BTPROTO_SCO:
1007 {
1008 struct sockaddr_sco *a = (struct sockaddr_sco *) addr;
1009 return makebdaddr(&_BT_SCO_MEMB(a, bdaddr));
1010 }
1011#endif
1012
1013 }
1014#endif
1015
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00001016#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +00001017 case AF_PACKET:
1018 {
1019 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
1020 char *ifname = "";
1021 struct ifreq ifr;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001022 /* need to look up interface name give index */
1023 if (a->sll_ifindex) {
Jeremy Hylton22308652001-02-02 03:23:09 +00001024 ifr.ifr_ifindex = a->sll_ifindex;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001025 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
Jeremy Hylton22308652001-02-02 03:23:09 +00001026 ifname = ifr.ifr_name;
Jeremy Hylton22308652001-02-02 03:23:09 +00001027 }
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001028 return Py_BuildValue("shbhs#",
1029 ifname,
1030 ntohs(a->sll_protocol),
1031 a->sll_pkttype,
1032 a->sll_hatype,
1033 a->sll_addr,
1034 a->sll_halen);
Jeremy Hylton22308652001-02-02 03:23:09 +00001035 }
1036#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001037
Guido van Rossum30a685f1991-06-27 15:51:29 +00001038 /* More cases here... */
1039
1040 default:
Guido van Rossumaa948df1997-05-07 17:41:48 +00001041 /* If we don't know the address family, don't raise an
1042 exception -- return it as a tuple. */
1043 return Py_BuildValue("is#",
1044 addr->sa_family,
1045 addr->sa_data,
1046 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001047
Guido van Rossum30a685f1991-06-27 15:51:29 +00001048 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001049}
1050
Guido van Rossum30a685f1991-06-27 15:51:29 +00001051
1052/* Parse a socket address argument according to the socket object's
1053 address family. Return 1 if the address was in the proper format,
1054 0 of not. The address is returned through addr_ret, its length
1055 through len_ret. */
1056
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001057static int
Guido van Rossum48a680c2001-03-02 06:34:14 +00001058getsockaddrarg(PySocketSockObject *s, PyObject *args,
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001059 struct sockaddr **addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001060{
Guido van Rossum30a685f1991-06-27 15:51:29 +00001061 switch (s->sock_family) {
1062
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001063#if defined(AF_UNIX)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001064 case AF_UNIX:
1065 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001066 struct sockaddr_un* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001067 char *path;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001068 int len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001069 addr = (struct sockaddr_un*)&(s->sock_addr).un;
Guido van Rossum7e488981998-10-08 02:25:24 +00001070 if (!PyArg_Parse(args, "t#", &path, &len))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001071 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001072 if (len > sizeof addr->sun_path) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001073 PyErr_SetString(socket_error,
Barry Warsaw752300b1997-01-03 17:18:10 +00001074 "AF_UNIX path too long");
Guido van Rossum30a685f1991-06-27 15:51:29 +00001075 return 0;
1076 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001077 addr->sun_family = s->sock_family;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001078 memcpy(addr->sun_path, path, len);
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001079 addr->sun_path[len] = 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001080 *addr_ret = (struct sockaddr *) addr;
Andrew MacIntyredaedf212004-04-11 12:03:57 +00001081#if defined(PYOS_OS2)
1082 *len_ret = sizeof(*addr);
1083#else
Guido van Rossum65af28a1996-06-11 18:36:33 +00001084 *len_ret = len + sizeof(*addr) - sizeof(addr->sun_path);
Andrew MacIntyredaedf212004-04-11 12:03:57 +00001085#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001086 return 1;
1087 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001088#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001089
Guido van Rossum30a685f1991-06-27 15:51:29 +00001090 case AF_INET:
1091 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001092 struct sockaddr_in* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001093 char *host;
Martin v. Löwis5db099a2003-08-07 11:55:15 +00001094 int port, result;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001095 addr=(struct sockaddr_in*)&(s->sock_addr).in;
Guido van Rossume4dad902000-12-01 13:13:11 +00001096 if (!PyTuple_Check(args)) {
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001097 PyErr_Format(
1098 PyExc_TypeError,
1099 "getsockaddrarg: "
1100 "AF_INET address must be tuple, not %.500s",
1101 args->ob_type->tp_name);
Guido van Rossume4dad902000-12-01 13:13:11 +00001102 return 0;
1103 }
Martin v. Löwis2548c732003-04-18 10:39:54 +00001104 if (!PyArg_ParseTuple(args, "eti:getsockaddrarg",
1105 "idna", &host, &port))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001106 return 0;
Martin v. Löwis5db099a2003-08-07 11:55:15 +00001107 result = setipaddr(host, (struct sockaddr *)addr,
1108 sizeof(*addr), AF_INET);
1109 PyMem_Free(host);
1110 if (result < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001111 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001112 addr->sin_family = AF_INET;
Guido van Rossum644a12b1997-04-09 19:24:53 +00001113 addr->sin_port = htons((short)port);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001114 *addr_ret = (struct sockaddr *) addr;
1115 *len_ret = sizeof *addr;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001116 return 1;
1117 }
1118
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001119#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001120 case AF_INET6:
1121 {
1122 struct sockaddr_in6* addr;
1123 char *host;
Martin v. Löwis5db099a2003-08-07 11:55:15 +00001124 int port, flowinfo, scope_id, result;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001125 addr = (struct sockaddr_in6*)&(s->sock_addr).in6;
1126 flowinfo = scope_id = 0;
Martin v. Löwis2548c732003-04-18 10:39:54 +00001127 if (!PyArg_ParseTuple(args, "eti|ii",
1128 "idna", &host, &port, &flowinfo,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001129 &scope_id)) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001130 return 0;
1131 }
Martin v. Löwis5db099a2003-08-07 11:55:15 +00001132 result = setipaddr(host, (struct sockaddr *)addr,
1133 sizeof(*addr), AF_INET6);
1134 PyMem_Free(host);
1135 if (result < 0)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001136 return 0;
1137 addr->sin6_family = s->sock_family;
1138 addr->sin6_port = htons((short)port);
1139 addr->sin6_flowinfo = flowinfo;
1140 addr->sin6_scope_id = scope_id;
1141 *addr_ret = (struct sockaddr *) addr;
1142 *len_ret = sizeof *addr;
1143 return 1;
1144 }
1145#endif
1146
Hye-Shik Chang81268602004-02-02 06:05:24 +00001147#ifdef USE_BLUETOOTH
Martin v. Löwis12af0482004-01-31 12:34:17 +00001148 case AF_BLUETOOTH:
1149 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001150 switch (s->sock_proto) {
1151 case BTPROTO_L2CAP:
Martin v. Löwis12af0482004-01-31 12:34:17 +00001152 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001153 struct sockaddr_l2 *addr = (struct sockaddr_l2 *) _BT_SOCKADDR_MEMB(s, l2);
1154 char *straddr;
Martin v. Löwis12af0482004-01-31 12:34:17 +00001155
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001156 _BT_L2_MEMB(addr, family) = AF_BLUETOOTH;
1157 if (!PyArg_ParseTuple(args, "si", &straddr,
1158 &_BT_L2_MEMB(addr, psm))) {
1159 PyErr_SetString(socket_error, "getsockaddrarg: "
1160 "wrong format");
Martin v. Löwis12af0482004-01-31 12:34:17 +00001161 return 0;
1162 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001163 if (setbdaddr(straddr, &_BT_L2_MEMB(addr, bdaddr)) < 0)
1164 return 0;
1165
1166 *addr_ret = (struct sockaddr *) addr;
1167 *len_ret = sizeof *addr;
1168 return 1;
1169 }
1170 case BTPROTO_RFCOMM:
1171 {
1172 struct sockaddr_rc *addr = (struct sockaddr_rc *) _BT_SOCKADDR_MEMB(s, rc);
1173 char *straddr;
1174
1175 _BT_RC_MEMB(addr, family) = AF_BLUETOOTH;
1176 if (!PyArg_ParseTuple(args, "si", &straddr,
1177 &_BT_RC_MEMB(addr, channel))) {
1178 PyErr_SetString(socket_error, "getsockaddrarg: "
1179 "wrong format");
1180 return 0;
1181 }
1182 if (setbdaddr(straddr, &_BT_RC_MEMB(addr, bdaddr)) < 0)
1183 return 0;
1184
1185 *addr_ret = (struct sockaddr *) addr;
1186 *len_ret = sizeof *addr;
1187 return 1;
1188 }
1189#if !defined(__FreeBSD__)
1190 case BTPROTO_SCO:
1191 {
1192 struct sockaddr_sco *addr = (struct sockaddr_sco *) _BT_SOCKADDR_MEMB(s, sco);
1193 char *straddr;
1194
1195 _BT_SCO_MEMB(addr, family) = AF_BLUETOOTH;
1196 straddr = PyString_AsString(args);
1197 if (straddr == NULL) {
1198 PyErr_SetString(socket_error, "getsockaddrarg: "
1199 "wrong format");
1200 return 0;
1201 }
1202 if (setbdaddr(straddr, &_BT_SCO_MEMB(addr, bdaddr)) < 0)
1203 return 0;
1204
1205 *addr_ret = (struct sockaddr *) addr;
1206 *len_ret = sizeof *addr;
1207 return 1;
1208 }
1209#endif
1210 default:
1211 PyErr_SetString(socket_error, "getsockaddrarg: unknown Bluetooth protocol");
1212 return 0;
Martin v. Löwis12af0482004-01-31 12:34:17 +00001213 }
1214 }
1215#endif
1216
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00001217#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +00001218 case AF_PACKET:
1219 {
1220 struct sockaddr_ll* addr;
1221 struct ifreq ifr;
1222 char *interfaceName;
1223 int protoNumber;
1224 int hatype = 0;
1225 int pkttype = 0;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001226 char *haddr;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001227
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001228 if (!PyArg_ParseTuple(args, "si|iis", &interfaceName,
1229 &protoNumber, &pkttype, &hatype, &haddr))
Jeremy Hylton22308652001-02-02 03:23:09 +00001230 return 0;
1231 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
1232 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001233 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001234 s->errorhandler();
Jeremy Hylton22308652001-02-02 03:23:09 +00001235 return 0;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001236 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001237 addr = &(s->sock_addr.ll);
1238 addr->sll_family = AF_PACKET;
1239 addr->sll_protocol = htons((short)protoNumber);
1240 addr->sll_ifindex = ifr.ifr_ifindex;
1241 addr->sll_pkttype = pkttype;
1242 addr->sll_hatype = hatype;
1243 *addr_ret = (struct sockaddr *) addr;
1244 *len_ret = sizeof *addr;
1245 return 1;
1246 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00001247#endif
1248
Guido van Rossum30a685f1991-06-27 15:51:29 +00001249 /* More cases here... */
1250
1251 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001252 PyErr_SetString(socket_error, "getsockaddrarg: bad family");
Guido van Rossum30a685f1991-06-27 15:51:29 +00001253 return 0;
1254
1255 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001256}
1257
Guido van Rossum30a685f1991-06-27 15:51:29 +00001258
Guido van Rossum48a680c2001-03-02 06:34:14 +00001259/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +00001260 Return 1 if the family is known, 0 otherwise. The length is returned
1261 through len_ret. */
1262
1263static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +00001264getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +00001265{
1266 switch (s->sock_family) {
1267
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001268#if defined(AF_UNIX)
Guido van Rossum710e1df1992-06-12 10:39:36 +00001269 case AF_UNIX:
1270 {
1271 *len_ret = sizeof (struct sockaddr_un);
1272 return 1;
1273 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001274#endif /* AF_UNIX */
Guido van Rossum710e1df1992-06-12 10:39:36 +00001275
1276 case AF_INET:
1277 {
1278 *len_ret = sizeof (struct sockaddr_in);
1279 return 1;
1280 }
1281
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001282#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001283 case AF_INET6:
1284 {
1285 *len_ret = sizeof (struct sockaddr_in6);
1286 return 1;
1287 }
1288#endif
1289
Hye-Shik Chang81268602004-02-02 06:05:24 +00001290#ifdef USE_BLUETOOTH
Martin v. Löwis12af0482004-01-31 12:34:17 +00001291 case AF_BLUETOOTH:
1292 {
1293 switch(s->sock_proto)
1294 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001295
1296 case BTPROTO_L2CAP:
1297 *len_ret = sizeof (struct sockaddr_l2);
1298 return 1;
1299 case BTPROTO_RFCOMM:
1300 *len_ret = sizeof (struct sockaddr_rc);
1301 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00001302#if !defined(__FreeBSD__)
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001303 case BTPROTO_SCO:
1304 *len_ret = sizeof (struct sockaddr_sco);
1305 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00001306#endif
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001307 default:
1308 PyErr_SetString(socket_error, "getsockaddrlen: "
1309 "unknown BT protocol");
1310 return 0;
1311
Martin v. Löwis12af0482004-01-31 12:34:17 +00001312 }
1313 }
1314#endif
1315
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00001316#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +00001317 case AF_PACKET:
1318 {
1319 *len_ret = sizeof (struct sockaddr_ll);
1320 return 1;
1321 }
1322#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001323
Guido van Rossum710e1df1992-06-12 10:39:36 +00001324 /* More cases here... */
1325
1326 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001327 PyErr_SetString(socket_error, "getsockaddrlen: bad family");
Guido van Rossum710e1df1992-06-12 10:39:36 +00001328 return 0;
1329
1330 }
1331}
1332
1333
Guido van Rossum30a685f1991-06-27 15:51:29 +00001334/* s.accept() method */
1335
Guido van Rossum73624e91994-10-10 17:59:00 +00001336static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001337sock_accept(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001338{
1339 char addrbuf[256];
Fred Drakea04eaad2000-06-30 02:46:07 +00001340 SOCKET_T newfd;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001341 socklen_t addrlen;
Barry Warsaw752300b1997-01-03 17:18:10 +00001342 PyObject *sock = NULL;
1343 PyObject *addr = NULL;
1344 PyObject *res = NULL;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001345 int timeout;
Barry Warsaw752300b1997-01-03 17:18:10 +00001346
Guido van Rossum710e1df1992-06-12 10:39:36 +00001347 if (!getsockaddrlen(s, &addrlen))
1348 return NULL;
Fred Drakefd168342001-05-09 19:11:33 +00001349 memset(addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001350
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001351#ifdef MS_WINDOWS
1352 newfd = INVALID_SOCKET;
1353#else
1354 newfd = -1;
1355#endif
1356
Guido van Rossum73624e91994-10-10 17:59:00 +00001357 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001358 timeout = internal_select(s, 0);
1359 if (!timeout)
1360 newfd = accept(s->sock_fd, (struct sockaddr *) addrbuf,
1361 &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001362 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001363
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001364 if (timeout) {
1365 PyErr_SetString(socket_timeout, "timed out");
1366 return NULL;
1367 }
1368
Fred Drakea04eaad2000-06-30 02:46:07 +00001369#ifdef MS_WINDOWS
1370 if (newfd == INVALID_SOCKET)
1371#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001372 if (newfd < 0)
Fred Drakea04eaad2000-06-30 02:46:07 +00001373#endif
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001374 return s->errorhandler();
Barry Warsaw752300b1997-01-03 17:18:10 +00001375
Guido van Rossum30a685f1991-06-27 15:51:29 +00001376 /* Create the new object with unspecified family,
1377 to avoid calls to bind() etc. on it. */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001378 sock = (PyObject *) new_sockobject(newfd,
1379 s->sock_family,
1380 s->sock_type,
1381 s->sock_proto);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001382
Barry Warsaw752300b1997-01-03 17:18:10 +00001383 if (sock == NULL) {
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001384 SOCKETCLOSE(newfd);
Barry Warsaw752300b1997-01-03 17:18:10 +00001385 goto finally;
1386 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00001387 addr = makesockaddr(s->sock_fd, (struct sockaddr *)addrbuf,
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001388 addrlen, s->sock_proto);
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001389 if (addr == NULL)
Barry Warsaw752300b1997-01-03 17:18:10 +00001390 goto finally;
1391
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001392 res = PyTuple_Pack(2, sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00001393
Guido van Rossum67f7a382002-06-06 21:08:16 +00001394finally:
Guido van Rossum73624e91994-10-10 17:59:00 +00001395 Py_XDECREF(sock);
1396 Py_XDECREF(addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001397 return res;
1398}
1399
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001400PyDoc_STRVAR(accept_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001401"accept() -> (socket object, address info)\n\
1402\n\
1403Wait for an incoming connection. Return a new socket representing the\n\
1404connection, and the address of the client. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001405info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001406
Guido van Rossum11ba0942002-06-13 15:07:44 +00001407/* s.setblocking(flag) method. Argument:
1408 False -- non-blocking mode; same as settimeout(0)
1409 True -- blocking mode; same as settimeout(None)
1410*/
Guido van Rossume4485b01994-09-07 14:32:49 +00001411
Guido van Rossum73624e91994-10-10 17:59:00 +00001412static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001413sock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00001414{
1415 int block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001416
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001417 block = PyInt_AsLong(arg);
1418 if (block == -1 && PyErr_Occurred())
Guido van Rossume4485b01994-09-07 14:32:49 +00001419 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001420
Guido van Rossum11ba0942002-06-13 15:07:44 +00001421 s->sock_timeout = block ? -1.0 : 0.0;
Guido van Rossume8008f02002-06-07 03:36:20 +00001422 internal_setblocking(s, block);
Guido van Rossume4485b01994-09-07 14:32:49 +00001423
Guido van Rossum73624e91994-10-10 17:59:00 +00001424 Py_INCREF(Py_None);
1425 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +00001426}
Guido van Rossume4485b01994-09-07 14:32:49 +00001427
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001428PyDoc_STRVAR(setblocking_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001429"setblocking(flag)\n\
1430\n\
1431Set the socket to blocking (flag is true) or non-blocking (false).\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00001432setblocking(True) is equivalent to settimeout(None);\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001433setblocking(False) is equivalent to settimeout(0.0).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001434
Guido van Rossum11ba0942002-06-13 15:07:44 +00001435/* s.settimeout(timeout) method. Argument:
1436 None -- no timeout, blocking mode; same as setblocking(True)
1437 0.0 -- non-blocking mode; same as setblocking(False)
1438 > 0 -- timeout mode; operations time out after timeout seconds
1439 < 0 -- illegal; raises an exception
1440*/
Guido van Rossum67f7a382002-06-06 21:08:16 +00001441static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001442sock_settimeout(PySocketSockObject *s, PyObject *arg)
Guido van Rossum67f7a382002-06-06 21:08:16 +00001443{
Guido van Rossum11ba0942002-06-13 15:07:44 +00001444 double timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001445
1446 if (arg == Py_None)
Guido van Rossum11ba0942002-06-13 15:07:44 +00001447 timeout = -1.0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001448 else {
Guido van Rossum11ba0942002-06-13 15:07:44 +00001449 timeout = PyFloat_AsDouble(arg);
1450 if (timeout < 0.0) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00001451 if (!PyErr_Occurred())
1452 PyErr_SetString(PyExc_ValueError,
Guido van Rossum11ba0942002-06-13 15:07:44 +00001453 "Timeout value out of range");
Guido van Rossum67f7a382002-06-06 21:08:16 +00001454 return NULL;
1455 }
1456 }
1457
Guido van Rossum11ba0942002-06-13 15:07:44 +00001458 s->sock_timeout = timeout;
1459 internal_setblocking(s, timeout < 0.0);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001460
1461 Py_INCREF(Py_None);
1462 return Py_None;
1463}
1464
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001465PyDoc_STRVAR(settimeout_doc,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001466"settimeout(timeout)\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00001467\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00001468Set a timeout on socket operations. 'timeout' can be a float,\n\
1469giving in seconds, or None. Setting a timeout of None disables\n\
1470the timeout feature and is equivalent to setblocking(1).\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001471Setting a timeout of zero is the same as setblocking(0).");
Guido van Rossum67f7a382002-06-06 21:08:16 +00001472
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001473/* s.gettimeout() method.
1474 Returns the timeout associated with a socket. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00001475static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001476sock_gettimeout(PySocketSockObject *s)
Guido van Rossum67f7a382002-06-06 21:08:16 +00001477{
1478 if (s->sock_timeout < 0.0) {
1479 Py_INCREF(Py_None);
1480 return Py_None;
1481 }
1482 else
1483 return PyFloat_FromDouble(s->sock_timeout);
1484}
1485
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001486PyDoc_STRVAR(gettimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00001487"gettimeout() -> timeout\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00001488\n\
1489Returns the timeout in floating seconds associated with socket \n\
1490operations. A timeout of None indicates that timeouts on socket \n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001491operations are disabled.");
Guido van Rossume4485b01994-09-07 14:32:49 +00001492
Guido van Rossum48a680c2001-03-02 06:34:14 +00001493#ifdef RISCOS
1494/* s.sleeptaskw(1 | 0) method */
1495
1496static PyObject *
Martin v. Löwisa94568a2003-05-10 07:36:56 +00001497sock_sleeptaskw(PySocketSockObject *s,PyObject *arg)
Guido van Rossum48a680c2001-03-02 06:34:14 +00001498{
Guido van Rossum67f7a382002-06-06 21:08:16 +00001499 int block;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00001500 block = PyInt_AsLong(arg);
1501 if (block == -1 && PyErr_Occurred())
Guido van Rossum67f7a382002-06-06 21:08:16 +00001502 return NULL;
1503 Py_BEGIN_ALLOW_THREADS
1504 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
1505 Py_END_ALLOW_THREADS
Guido van Rossum48a680c2001-03-02 06:34:14 +00001506
Guido van Rossum67f7a382002-06-06 21:08:16 +00001507 Py_INCREF(Py_None);
1508 return Py_None;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001509}
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001510PyDoc_STRVAR(sleeptaskw_doc,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001511"sleeptaskw(flag)\n\
1512\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001513Allow sleeps in taskwindows.");
Guido van Rossum48a680c2001-03-02 06:34:14 +00001514#endif
1515
1516
Guido van Rossumaee08791992-09-08 09:05:33 +00001517/* s.setsockopt() method.
1518 With an integer third argument, sets an integer option.
1519 With a string third argument, sets an option from a buffer;
1520 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001521
Guido van Rossum73624e91994-10-10 17:59:00 +00001522static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001523sock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001524{
1525 int level;
1526 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001527 int res;
Guido van Rossumaee08791992-09-08 09:05:33 +00001528 char *buf;
1529 int buflen;
1530 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001531
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001532 if (PyArg_ParseTuple(args, "iii:setsockopt",
1533 &level, &optname, &flag)) {
Guido van Rossumaee08791992-09-08 09:05:33 +00001534 buf = (char *) &flag;
1535 buflen = sizeof flag;
1536 }
1537 else {
Guido van Rossum73624e91994-10-10 17:59:00 +00001538 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001539 if (!PyArg_ParseTuple(args, "iis#:setsockopt",
1540 &level, &optname, &buf, &buflen))
Guido van Rossumaee08791992-09-08 09:05:33 +00001541 return NULL;
1542 }
Thomas Wouters334fb892000-07-25 12:56:38 +00001543 res = setsockopt(s->sock_fd, level, optname, (void *)buf, buflen);
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001544 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001545 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001546 Py_INCREF(Py_None);
1547 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001548}
1549
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001550PyDoc_STRVAR(setsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001551"setsockopt(level, option, value)\n\
1552\n\
1553Set a socket option. See the Unix manual for level and option.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001554The value argument can either be an integer or a string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001555
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001556
Guido van Rossumaee08791992-09-08 09:05:33 +00001557/* s.getsockopt() method.
1558 With two arguments, retrieves an integer option.
1559 With a third integer argument, retrieves a string buffer of that size;
1560 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001561
Guido van Rossum73624e91994-10-10 17:59:00 +00001562static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001563sock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001564{
1565 int level;
1566 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001567 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +00001568 PyObject *buf;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001569 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001570
Guido van Rossumbcc20741998-08-04 22:53:56 +00001571#ifdef __BEOS__
Fred Drake564a6cc2001-05-11 20:12:26 +00001572 /* We have incomplete socket support. */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001573 PyErr_SetString(socket_error, "getsockopt not supported");
Guido van Rossumbcc20741998-08-04 22:53:56 +00001574 return NULL;
1575#else
1576
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001577 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
1578 &level, &optname, &buflen))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001579 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001580
Guido van Rossumbe32c891996-06-20 16:25:29 +00001581 if (buflen == 0) {
Guido van Rossumaee08791992-09-08 09:05:33 +00001582 int flag = 0;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001583 socklen_t flagsize = sizeof flag;
Guido van Rossumb376a4a1993-11-23 17:53:17 +00001584 res = getsockopt(s->sock_fd, level, optname,
Thomas Wouters334fb892000-07-25 12:56:38 +00001585 (void *)&flag, &flagsize);
Guido van Rossumaee08791992-09-08 09:05:33 +00001586 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001587 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001588 return PyInt_FromLong(flag);
Guido van Rossumaee08791992-09-08 09:05:33 +00001589 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001590#ifdef __VMS
1591 if (buflen > 1024) {
1592#else
Guido van Rossumaee08791992-09-08 09:05:33 +00001593 if (buflen <= 0 || buflen > 1024) {
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001594#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001595 PyErr_SetString(socket_error,
Barry Warsaw752300b1997-01-03 17:18:10 +00001596 "getsockopt buflen out of range");
Guido van Rossumaee08791992-09-08 09:05:33 +00001597 return NULL;
1598 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001599 buf = PyString_FromStringAndSize((char *)NULL, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001600 if (buf == NULL)
1601 return NULL;
Guido van Rossumb376a4a1993-11-23 17:53:17 +00001602 res = getsockopt(s->sock_fd, level, optname,
Fred Drake564a6cc2001-05-11 20:12:26 +00001603 (void *)PyString_AS_STRING(buf), &buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001604 if (res < 0) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001605 Py_DECREF(buf);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001606 return s->errorhandler();
Guido van Rossumaee08791992-09-08 09:05:33 +00001607 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001608 _PyString_Resize(&buf, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001609 return buf;
Guido van Rossumbcc20741998-08-04 22:53:56 +00001610#endif /* __BEOS__ */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001611}
1612
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001613PyDoc_STRVAR(getsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001614"getsockopt(level, option[, buffersize]) -> value\n\
1615\n\
1616Get a socket option. See the Unix manual for level and option.\n\
1617If a nonzero buffersize argument is given, the return value is a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001618string of that length; otherwise it is an integer.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001619
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001620
Fred Drake728819a2000-07-01 03:40:12 +00001621/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001622
Guido van Rossum73624e91994-10-10 17:59:00 +00001623static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001624sock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001625{
1626 struct sockaddr *addr;
1627 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001628 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001629
Fred Drake728819a2000-07-01 03:40:12 +00001630 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001631 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001632 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001633 res = bind(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001634 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001635 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001636 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001637 Py_INCREF(Py_None);
1638 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001639}
1640
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001641PyDoc_STRVAR(bind_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001642"bind(address)\n\
1643\n\
1644Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00001645pair (host, port); the host must refer to the local host. For raw packet\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001646sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001647
Guido van Rossum30a685f1991-06-27 15:51:29 +00001648
1649/* s.close() method.
1650 Set the file descriptor to -1 so operations tried subsequently
1651 will surely fail. */
1652
Guido van Rossum73624e91994-10-10 17:59:00 +00001653static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001654sock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001655{
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001656 SOCKET_T fd;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001657
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001658 if ((fd = s->sock_fd) != -1) {
1659 s->sock_fd = -1;
Guido van Rossum08481461996-10-12 14:07:22 +00001660 Py_BEGIN_ALLOW_THREADS
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001661 (void) SOCKETCLOSE(fd);
Guido van Rossum08481461996-10-12 14:07:22 +00001662 Py_END_ALLOW_THREADS
1663 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001664 Py_INCREF(Py_None);
1665 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001666}
1667
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001668PyDoc_STRVAR(close_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001669"close()\n\
1670\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001671Close the socket. It cannot be used after this call.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001672
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001673static int
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001674internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen,
1675 int *timeoutp)
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001676{
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001677 int res, timeout;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001678
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001679 timeout = 0;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001680 res = connect(s->sock_fd, addr, addrlen);
1681
1682#ifdef MS_WINDOWS
1683
1684 if (s->sock_timeout > 0.0) {
1685 if (res < 0 && WSAGetLastError() == WSAEWOULDBLOCK) {
Guido van Rossumb76bdf82003-02-19 17:50:16 +00001686 /* This is a mess. Best solution: trust select */
1687 fd_set fds;
1688 struct timeval tv;
1689 tv.tv_sec = (int)s->sock_timeout;
1690 tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6);
1691 FD_ZERO(&fds);
1692 FD_SET(s->sock_fd, &fds);
1693 res = select(s->sock_fd+1, NULL, &fds, NULL, &tv);
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001694 if (res == 0) {
Guido van Rossumb76bdf82003-02-19 17:50:16 +00001695 res = WSAEWOULDBLOCK;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001696 timeout = 1;
1697 } else if (res > 0)
Guido van Rossumb76bdf82003-02-19 17:50:16 +00001698 res = 0;
1699 /* else if (res < 0) an error occurred */
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001700 }
1701 }
1702
1703 if (res < 0)
1704 res = WSAGetLastError();
1705
1706#else
1707
1708 if (s->sock_timeout > 0.0) {
1709 if (res < 0 && errno == EINPROGRESS) {
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001710 timeout = internal_select(s, 1);
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001711 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum12e3c712002-08-08 20:39:30 +00001712 if (res < 0 && errno == EISCONN)
1713 res = 0;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001714 }
1715 }
1716
1717 if (res < 0)
1718 res = errno;
1719
1720#endif
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001721 *timeoutp = timeout;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001722
1723 return res;
1724}
Guido van Rossum30a685f1991-06-27 15:51:29 +00001725
Fred Drake728819a2000-07-01 03:40:12 +00001726/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001727
Guido van Rossum73624e91994-10-10 17:59:00 +00001728static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001729sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001730{
1731 struct sockaddr *addr;
1732 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001733 int res;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001734 int timeout;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001735
Fred Drake728819a2000-07-01 03:40:12 +00001736 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001737 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001738
Guido van Rossum73624e91994-10-10 17:59:00 +00001739 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001740 res = internal_connect(s, addr, addrlen, &timeout);
Guido van Rossum11ba0942002-06-13 15:07:44 +00001741 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001742
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001743 if (timeout) {
1744 PyErr_SetString(socket_timeout, "timed out");
1745 return NULL;
1746 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001747 if (res != 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001748 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001749 Py_INCREF(Py_None);
1750 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001751}
1752
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001753PyDoc_STRVAR(connect_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001754"connect(address)\n\
1755\n\
1756Connect the socket to a remote address. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001757is a pair (host, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001758
Guido van Rossum30a685f1991-06-27 15:51:29 +00001759
Fred Drake728819a2000-07-01 03:40:12 +00001760/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001761
1762static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001763sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001764{
1765 struct sockaddr *addr;
1766 int addrlen;
1767 int res;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001768 int timeout;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001769
Fred Drake728819a2000-07-01 03:40:12 +00001770 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001771 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001772
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001773 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001774 res = internal_connect(s, addr, addrlen, &timeout);
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001775 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001776
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001777 return PyInt_FromLong((long) res);
1778}
1779
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001780PyDoc_STRVAR(connect_ex_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00001781"connect_ex(address) -> errno\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00001782\n\
1783This is like connect(address), but returns an error code (the errno value)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001784instead of raising an exception when an error occurs.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001785
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001786
Guido van Rossumed233a51992-06-23 09:07:03 +00001787/* s.fileno() method */
1788
Guido van Rossum73624e91994-10-10 17:59:00 +00001789static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001790sock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00001791{
Fred Drakea04eaad2000-06-30 02:46:07 +00001792#if SIZEOF_SOCKET_T <= SIZEOF_LONG
Guido van Rossum73624e91994-10-10 17:59:00 +00001793 return PyInt_FromLong((long) s->sock_fd);
Fred Drakea04eaad2000-06-30 02:46:07 +00001794#else
Martin v. Löwisb9a0f912003-03-29 10:06:18 +00001795 return PyLong_FromLongLong((PY_LONG_LONG)s->sock_fd);
Fred Drakea04eaad2000-06-30 02:46:07 +00001796#endif
Guido van Rossumed233a51992-06-23 09:07:03 +00001797}
1798
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001799PyDoc_STRVAR(fileno_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001800"fileno() -> integer\n\
1801\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001802Return the integer file descriptor of the socket.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001803
Guido van Rossumed233a51992-06-23 09:07:03 +00001804
Guido van Rossumbe32c891996-06-20 16:25:29 +00001805#ifndef NO_DUP
1806/* s.dup() method */
1807
1808static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001809sock_dup(PySocketSockObject *s)
Guido van Rossumbe32c891996-06-20 16:25:29 +00001810{
Fred Drakea04eaad2000-06-30 02:46:07 +00001811 SOCKET_T newfd;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001812 PyObject *sock;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001813
Guido van Rossumbe32c891996-06-20 16:25:29 +00001814 newfd = dup(s->sock_fd);
1815 if (newfd < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001816 return s->errorhandler();
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001817 sock = (PyObject *) new_sockobject(newfd,
1818 s->sock_family,
1819 s->sock_type,
1820 s->sock_proto);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001821 if (sock == NULL)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001822 SOCKETCLOSE(newfd);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001823 return sock;
1824}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001825
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001826PyDoc_STRVAR(dup_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001827"dup() -> socket object\n\
1828\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001829Return a new socket object connected to the same system resource.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001830
Guido van Rossumbe32c891996-06-20 16:25:29 +00001831#endif
1832
1833
Guido van Rossumc89705d1992-11-26 08:54:07 +00001834/* s.getsockname() method */
1835
Guido van Rossum73624e91994-10-10 17:59:00 +00001836static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001837sock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001838{
1839 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001840 int res;
1841 socklen_t addrlen;
1842
Guido van Rossumc89705d1992-11-26 08:54:07 +00001843 if (!getsockaddrlen(s, &addrlen))
1844 return NULL;
Guido van Rossumca42b161996-01-12 01:36:05 +00001845 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001846 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001847 res = getsockname(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001848 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001849 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001850 return s->errorhandler();
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001851 return makesockaddr(s->sock_fd, (struct sockaddr *) addrbuf, addrlen,
1852 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001853}
1854
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001855PyDoc_STRVAR(getsockname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001856"getsockname() -> address info\n\
1857\n\
1858Return the address of the local endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001859info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001860
Guido van Rossumc89705d1992-11-26 08:54:07 +00001861
Guido van Rossumb6775db1994-08-01 11:34:53 +00001862#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001863/* s.getpeername() method */
1864
Guido van Rossum73624e91994-10-10 17:59:00 +00001865static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001866sock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001867{
1868 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001869 int res;
1870 socklen_t addrlen;
1871
Guido van Rossumc89705d1992-11-26 08:54:07 +00001872 if (!getsockaddrlen(s, &addrlen))
1873 return NULL;
Fred Drakefd168342001-05-09 19:11:33 +00001874 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001875 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001876 res = getpeername(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001877 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001878 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001879 return s->errorhandler();
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001880 return makesockaddr(s->sock_fd, (struct sockaddr *) addrbuf, addrlen,
1881 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001882}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001883
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001884PyDoc_STRVAR(getpeername_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001885"getpeername() -> address info\n\
1886\n\
1887Return the address of the remote endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001888info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001889
Guido van Rossumb6775db1994-08-01 11:34:53 +00001890#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001891
1892
Guido van Rossum30a685f1991-06-27 15:51:29 +00001893/* s.listen(n) method */
1894
Guido van Rossum73624e91994-10-10 17:59:00 +00001895static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001896sock_listen(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001897{
1898 int backlog;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001899 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001900
1901 backlog = PyInt_AsLong(arg);
1902 if (backlog == -1 && PyErr_Occurred())
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001903 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001904 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +00001905 if (backlog < 1)
1906 backlog = 1;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001907 res = listen(s->sock_fd, backlog);
Guido van Rossum73624e91994-10-10 17:59:00 +00001908 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001909 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001910 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001911 Py_INCREF(Py_None);
1912 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001913}
1914
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001915PyDoc_STRVAR(listen_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001916"listen(backlog)\n\
1917\n\
1918Enable a server to accept connections. The backlog argument must be at\n\
1919least 1; it specifies the number of unaccepted connection that the system\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001920will allow before refusing new connections.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001921
1922
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001923#ifndef NO_DUP
Guido van Rossum30a685f1991-06-27 15:51:29 +00001924/* s.makefile(mode) method.
1925 Create a new open file object referring to a dupped version of
1926 the socket's file descriptor. (The dup() call is necessary so
1927 that the open file and socket objects may be closed independent
1928 of each other.)
1929 The mode argument specifies 'r' or 'w' passed to fdopen(). */
1930
Guido van Rossum73624e91994-10-10 17:59:00 +00001931static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001932sock_makefile(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001933{
Tim Petersdbd9ba62000-07-09 03:09:57 +00001934 extern int fclose(FILE *);
Guido van Rossum6b144911995-03-14 15:05:13 +00001935 char *mode = "r";
1936 int bufsize = -1;
Fred Drakea04eaad2000-06-30 02:46:07 +00001937#ifdef MS_WIN32
Tim Peters79248aa2001-08-29 21:37:10 +00001938 Py_intptr_t fd;
Fred Drakea04eaad2000-06-30 02:46:07 +00001939#else
Guido van Rossum30a685f1991-06-27 15:51:29 +00001940 int fd;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001941#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001942 FILE *fp;
Guido van Rossum6b144911995-03-14 15:05:13 +00001943 PyObject *f;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001944#ifdef __VMS
1945 char *mode_r = "r";
1946 char *mode_w = "w";
1947#endif
Guido van Rossum6b144911995-03-14 15:05:13 +00001948
Guido van Rossum43713e52000-02-29 13:59:29 +00001949 if (!PyArg_ParseTuple(args, "|si:makefile", &mode, &bufsize))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001950 return NULL;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001951#ifdef __VMS
1952 if (strcmp(mode,"rb") == 0) {
1953 mode = mode_r;
1954 }
1955 else {
1956 if (strcmp(mode,"wb") == 0) {
1957 mode = mode_w;
1958 }
1959 }
1960#endif
Guido van Rossum8d665e61996-06-26 18:22:49 +00001961#ifdef MS_WIN32
Guido van Rossum82a5c661998-07-07 20:45:43 +00001962 if (((fd = _open_osfhandle(s->sock_fd, _O_BINARY)) < 0) ||
1963 ((fd = dup(fd)) < 0) || ((fp = fdopen(fd, mode)) == NULL))
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001964#else
Guido van Rossum82a5c661998-07-07 20:45:43 +00001965 if ((fd = dup(s->sock_fd)) < 0 || (fp = fdopen(fd, mode)) == NULL)
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001966#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001967 {
Guido van Rossum6b144911995-03-14 15:05:13 +00001968 if (fd >= 0)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001969 SOCKETCLOSE(fd);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001970 return s->errorhandler();
Guido van Rossum6b144911995-03-14 15:05:13 +00001971 }
1972 f = PyFile_FromFile(fp, "<socket>", mode, fclose);
1973 if (f != NULL)
1974 PyFile_SetBufSize(f, bufsize);
1975 return f;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001976}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001977
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001978PyDoc_STRVAR(makefile_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001979"makefile([mode[, buffersize]]) -> file object\n\
1980\n\
1981Return a regular file object corresponding to the socket.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001982The mode and buffersize arguments are as for the built-in open() function.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001983
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001984#endif /* NO_DUP */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001985
Guido van Rossum48a680c2001-03-02 06:34:14 +00001986
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001987/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001988
Guido van Rossum73624e91994-10-10 17:59:00 +00001989static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001990sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001991{
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001992 int len, n = 0, flags = 0, timeout;
Guido van Rossum73624e91994-10-10 17:59:00 +00001993 PyObject *buf;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001994#ifdef __VMS
1995 int read_length;
1996 char *read_buf;
1997#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00001998
Guido van Rossum43713e52000-02-29 13:59:29 +00001999 if (!PyArg_ParseTuple(args, "i|i:recv", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00002000 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002001
2002 if (len < 0) {
Martin v. Löwisfba64e12001-11-19 10:41:26 +00002003 PyErr_SetString(PyExc_ValueError,
Guido van Rossum11ba0942002-06-13 15:07:44 +00002004 "negative buffersize in recv");
Martin v. Löwisfba64e12001-11-19 10:41:26 +00002005 return NULL;
2006 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002007
Guido van Rossum73624e91994-10-10 17:59:00 +00002008 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002009 if (buf == NULL)
2010 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002011
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002012#ifndef __VMS
Guido van Rossum73624e91994-10-10 17:59:00 +00002013 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002014 timeout = internal_select(s, 0);
2015 if (!timeout)
2016 n = recv(s->sock_fd, PyString_AS_STRING(buf), len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00002017 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002018
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002019 if (timeout) {
2020 Py_DECREF(buf);
2021 PyErr_SetString(socket_timeout, "timed out");
2022 return NULL;
2023 }
Guido van Rossum7c53b771995-09-13 18:39:47 +00002024 if (n < 0) {
2025 Py_DECREF(buf);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002026 return s->errorhandler();
Guido van Rossum7c53b771995-09-13 18:39:47 +00002027 }
Tim Peters5de98422002-04-27 18:44:32 +00002028 if (n != len)
2029 _PyString_Resize(&buf, n);
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002030#else
2031 read_buf = PyString_AsString(buf);
2032 read_length = len;
2033 while (read_length != 0) {
2034 unsigned int segment;
2035
2036 segment = read_length /SEGMENT_SIZE;
2037 if (segment != 0) {
2038 segment = SEGMENT_SIZE;
2039 }
2040 else {
2041 segment = read_length;
2042 }
2043
2044 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002045 timeout = internal_select(s, 0);
2046 if (!timeout)
2047 n = recv(s->sock_fd, read_buf, segment, flags);
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002048 Py_END_ALLOW_THREADS
2049
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002050 if (timeout) {
2051 Py_DECREF(buf);
2052 PyErr_SetString(socket_timeout, "timed out");
2053 return NULL;
2054 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002055 if (n < 0) {
2056 Py_DECREF(buf);
2057 return s->errorhandler();
2058 }
2059 if (n != read_length) {
2060 read_buf += n;
2061 break;
2062 }
2063
2064 read_length -= segment;
2065 read_buf += segment;
2066 }
2067 if (_PyString_Resize(&buf, (read_buf - PyString_AsString(buf))) < 0)
2068 {
2069 return NULL;
2070 }
2071#endif /* !__VMS */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002072 return buf;
2073}
2074
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002075PyDoc_STRVAR(recv_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002076"recv(buffersize[, flags]) -> data\n\
2077\n\
2078Receive up to buffersize bytes from the socket. For the optional flags\n\
2079argument, see the Unix manual. When no data is available, block until\n\
2080at least one byte is available or until the remote end is closed. When\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002081the remote end is closed and all data is read, return the empty string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002082
Guido van Rossum30a685f1991-06-27 15:51:29 +00002083
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002084/* s.recvfrom(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002085
Guido van Rossum73624e91994-10-10 17:59:00 +00002086static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002087sock_recvfrom(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002088{
2089 char addrbuf[256];
Barry Warsaw752300b1997-01-03 17:18:10 +00002090 PyObject *buf = NULL;
2091 PyObject *addr = NULL;
2092 PyObject *ret = NULL;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002093 int len, n = 0, flags = 0, timeout;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002094 socklen_t addrlen;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002095
Guido van Rossum43713e52000-02-29 13:59:29 +00002096 if (!PyArg_ParseTuple(args, "i|i:recvfrom", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00002097 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002098
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00002099 if (!getsockaddrlen(s, &addrlen))
2100 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00002101 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00002102 if (buf == NULL)
2103 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002104
Guido van Rossum73624e91994-10-10 17:59:00 +00002105 Py_BEGIN_ALLOW_THREADS
Fred Drakefd168342001-05-09 19:11:33 +00002106 memset(addrbuf, 0, addrlen);
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002107 timeout = internal_select(s, 0);
2108 if (!timeout)
2109 n = recvfrom(s->sock_fd, PyString_AS_STRING(buf), len, flags,
Guido van Rossum8d665e61996-06-26 18:22:49 +00002110#ifndef MS_WINDOWS
Andrew MacIntyreba43e872002-03-03 03:03:52 +00002111#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002112 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00002113#else
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002114 (void *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00002115#endif
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002116#else
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002117 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002118#endif
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002119 );
Guido van Rossum73624e91994-10-10 17:59:00 +00002120 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002121
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002122 if (timeout) {
2123 Py_DECREF(buf);
2124 PyErr_SetString(socket_timeout, "timed out");
2125 return NULL;
2126 }
Guido van Rossum7c53b771995-09-13 18:39:47 +00002127 if (n < 0) {
2128 Py_DECREF(buf);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002129 return s->errorhandler();
Guido van Rossum7c53b771995-09-13 18:39:47 +00002130 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002131
Guido van Rossum53a9bf81996-06-11 18:35:24 +00002132 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002133 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002134
Guido van Rossum67f7a382002-06-06 21:08:16 +00002135 if (!(addr = makesockaddr(s->sock_fd, (struct sockaddr *)addrbuf,
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00002136 addrlen, s->sock_proto)))
Barry Warsaw752300b1997-01-03 17:18:10 +00002137 goto finally;
2138
Raymond Hettinger8ae46892003-10-12 19:09:37 +00002139 ret = PyTuple_Pack(2, buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002140
2141finally:
Guido van Rossum73624e91994-10-10 17:59:00 +00002142 Py_XDECREF(addr);
2143 Py_XDECREF(buf);
Guido van Rossum6f5afc91993-02-05 09:46:15 +00002144 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002145}
2146
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002147PyDoc_STRVAR(recvfrom_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002148"recvfrom(buffersize[, flags]) -> (data, address info)\n\
2149\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002150Like recv(buffersize, flags) but also return the sender's address info.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002151
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002152/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002153
Guido van Rossum73624e91994-10-10 17:59:00 +00002154static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002155sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002156{
Guido van Rossumff4949e1992-08-05 19:58:53 +00002157 char *buf;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002158 int len, n = 0, flags = 0, timeout;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002159#ifdef __VMS
2160 int send_length;
2161#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00002162
Guido van Rossum43713e52000-02-29 13:59:29 +00002163 if (!PyArg_ParseTuple(args, "s#|i:send", &buf, &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00002164 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002165
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002166#ifndef __VMS
Guido van Rossum73624e91994-10-10 17:59:00 +00002167 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002168 timeout = internal_select(s, 1);
2169 if (!timeout)
2170 n = send(s->sock_fd, buf, len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00002171 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002172
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002173 if (timeout) {
2174 PyErr_SetString(socket_timeout, "timed out");
2175 return NULL;
2176 }
Guido van Rossum30a685f1991-06-27 15:51:29 +00002177 if (n < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002178 return s->errorhandler();
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002179#else
2180 /* Divide packet into smaller segments for */
2181 /* TCP/IP Services for OpenVMS */
2182 send_length = len;
2183 while (send_length != 0) {
2184 unsigned int segment;
2185
2186 segment = send_length / SEGMENT_SIZE;
2187 if (segment != 0) {
2188 segment = SEGMENT_SIZE;
2189 }
2190 else {
2191 segment = send_length;
2192 }
2193 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002194 timeout = internal_select(s, 1);
2195 if (!timeout)
2196 n = send(s->sock_fd, buf, segment, flags);
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002197 Py_END_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002198 if (timeout) {
2199 PyErr_SetString(socket_timeout, "timed out");
2200 return NULL;
2201 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002202 if (n < 0) {
2203 return s->errorhandler();
2204 }
2205 send_length -= segment;
2206 buf += segment;
2207 } /* end while */
2208#endif /* !__VMS */
Guido van Rossum73624e91994-10-10 17:59:00 +00002209 return PyInt_FromLong((long)n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00002210}
2211
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002212PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002213"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002214\n\
2215Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002216argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002217sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002218
2219
2220/* s.sendall(data [,flags]) method */
2221
2222static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002223sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002224{
2225 char *buf;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002226 int len, n = 0, flags = 0, timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002227
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002228 if (!PyArg_ParseTuple(args, "s#|i:sendall", &buf, &len, &flags))
2229 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002230
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002231 Py_BEGIN_ALLOW_THREADS
2232 do {
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002233 timeout = internal_select(s, 1);
2234 if (timeout)
2235 break;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002236 n = send(s->sock_fd, buf, len, flags);
2237 if (n < 0)
2238 break;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002239 buf += n;
2240 len -= n;
2241 } while (len > 0);
2242 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002243
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002244 if (timeout) {
2245 PyErr_SetString(socket_timeout, "timed out");
2246 return NULL;
2247 }
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002248 if (n < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002249 return s->errorhandler();
Guido van Rossum67f7a382002-06-06 21:08:16 +00002250
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002251 Py_INCREF(Py_None);
2252 return Py_None;
2253}
2254
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002255PyDoc_STRVAR(sendall_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002256"sendall(data[, flags])\n\
2257\n\
2258Send a data string to the socket. For the optional flags\n\
2259argument, see the Unix manual. This calls send() repeatedly\n\
2260until all data is sent. If an error occurs, it's impossible\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002261to tell how much data has been sent.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002262
Guido van Rossum30a685f1991-06-27 15:51:29 +00002263
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002264/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002265
Guido van Rossum73624e91994-10-10 17:59:00 +00002266static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002267sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002268{
Guido van Rossum73624e91994-10-10 17:59:00 +00002269 PyObject *addro;
Guido van Rossumff4949e1992-08-05 19:58:53 +00002270 char *buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002271 struct sockaddr *addr;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002272 int addrlen, len, n = 0, flags, timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002273
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002274 flags = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002275 if (!PyArg_ParseTuple(args, "s#O:sendto", &buf, &len, &addro)) {
Guido van Rossum73624e91994-10-10 17:59:00 +00002276 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002277 if (!PyArg_ParseTuple(args, "s#iO:sendto",
2278 &buf, &len, &flags, &addro))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002279 return NULL;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002280 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002281
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002282 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002283 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002284
Guido van Rossum73624e91994-10-10 17:59:00 +00002285 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002286 timeout = internal_select(s, 1);
2287 if (!timeout)
2288 n = sendto(s->sock_fd, buf, len, flags, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00002289 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002290
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002291 if (timeout) {
2292 PyErr_SetString(socket_timeout, "timed out");
2293 return NULL;
2294 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002295 if (n < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002296 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00002297 return PyInt_FromLong((long)n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002298}
2299
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002300PyDoc_STRVAR(sendto_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002301"sendto(data[, flags], address) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002302\n\
2303Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002304For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002305
Guido van Rossum30a685f1991-06-27 15:51:29 +00002306
2307/* s.shutdown(how) method */
2308
Guido van Rossum73624e91994-10-10 17:59:00 +00002309static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002310sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002311{
2312 int how;
Guido van Rossumff4949e1992-08-05 19:58:53 +00002313 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002314
2315 how = PyInt_AsLong(arg);
2316 if (how == -1 && PyErr_Occurred())
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002317 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00002318 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002319 res = shutdown(s->sock_fd, how);
Guido van Rossum73624e91994-10-10 17:59:00 +00002320 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002321 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002322 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00002323 Py_INCREF(Py_None);
2324 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002325}
2326
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002327PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002328"shutdown(flag)\n\
2329\n\
Martin v. Löwis94681fc2003-11-27 19:40:22 +00002330Shut down the reading side of the socket (flag == SHUT_RD), the writing side\n\
2331of the socket (flag == SHUT_WR), or both ends (flag == SHUT_RDWR).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002332
Guido van Rossum30a685f1991-06-27 15:51:29 +00002333
2334/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002335
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002336static PyMethodDef sock_methods[] = {
2337 {"accept", (PyCFunction)sock_accept, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002338 accept_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002339 {"bind", (PyCFunction)sock_bind, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002340 bind_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002341 {"close", (PyCFunction)sock_close, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002342 close_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002343 {"connect", (PyCFunction)sock_connect, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002344 connect_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002345 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002346 connect_ex_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00002347#ifndef NO_DUP
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002348 {"dup", (PyCFunction)sock_dup, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002349 dup_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00002350#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002351 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002352 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00002353#ifdef HAVE_GETPEERNAME
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002354 {"getpeername", (PyCFunction)sock_getpeername,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002355 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00002356#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002357 {"getsockname", (PyCFunction)sock_getsockname,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002358 METH_NOARGS, getsockname_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002359 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002360 getsockopt_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002361 {"listen", (PyCFunction)sock_listen, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002362 listen_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002363#ifndef NO_DUP
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002364 {"makefile", (PyCFunction)sock_makefile, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002365 makefile_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002366#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002367 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002368 recv_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002369 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002370 recvfrom_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002371 {"send", (PyCFunction)sock_send, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002372 send_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002373 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002374 sendall_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002375 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002376 sendto_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002377 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002378 setblocking_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002379 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
Guido van Rossum67f7a382002-06-06 21:08:16 +00002380 settimeout_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002381 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
Guido van Rossum67f7a382002-06-06 21:08:16 +00002382 gettimeout_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002383 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002384 setsockopt_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002385 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002386 shutdown_doc},
2387#ifdef RISCOS
Martin v. Löwisa94568a2003-05-10 07:36:56 +00002388 {"sleeptaskw", (PyCFunction)sock_sleeptaskw, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002389 sleeptaskw_doc},
2390#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +00002391 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002392};
2393
Guido van Rossum30a685f1991-06-27 15:51:29 +00002394
Guido van Rossum73624e91994-10-10 17:59:00 +00002395/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00002396 First close the file description. */
2397
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002398static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002399sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002400{
Guido van Rossumfa972c92000-04-10 12:45:45 +00002401 if (s->sock_fd != -1)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00002402 (void) SOCKETCLOSE(s->sock_fd);
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002403 s->ob_type->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002404}
2405
Guido van Rossum30a685f1991-06-27 15:51:29 +00002406
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002407static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002408sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002409{
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002410 char buf[512];
Fred Drakea04eaad2000-06-30 02:46:07 +00002411#if SIZEOF_SOCKET_T > SIZEOF_LONG
2412 if (s->sock_fd > LONG_MAX) {
2413 /* this can occur on Win64, and actually there is a special
2414 ugly printf formatter for decimal pointer length integer
2415 printing, only bother if necessary*/
2416 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002417 "no printf formatter to display "
2418 "the socket descriptor in decimal");
Fred Drakea04eaad2000-06-30 02:46:07 +00002419 return NULL;
2420 }
2421#endif
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002422 PyOS_snprintf(
2423 buf, sizeof(buf),
2424 "<socket object, fd=%ld, family=%d, type=%d, protocol=%d>",
2425 (long)s->sock_fd, s->sock_family,
2426 s->sock_type,
2427 s->sock_proto);
Guido van Rossumdc1c64a1996-02-27 15:21:19 +00002428 return PyString_FromString(buf);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002429}
2430
2431
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002432/* Create a new, uninitialized socket object. */
2433
2434static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002435sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002436{
2437 PyObject *new;
2438
2439 new = type->tp_alloc(type, 0);
Guido van Rossume1c478f2002-06-06 20:08:25 +00002440 if (new != NULL) {
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002441 ((PySocketSockObject *)new)->sock_fd = -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002442 ((PySocketSockObject *)new)->sock_timeout = -1.0;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002443 ((PySocketSockObject *)new)->errorhandler = &set_error;
Guido van Rossume1c478f2002-06-06 20:08:25 +00002444 }
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002445 return new;
2446}
2447
2448
2449/* Initialize a new socket object. */
2450
2451/*ARGSUSED*/
2452static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00002453sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002454{
2455 PySocketSockObject *s = (PySocketSockObject *)self;
2456 SOCKET_T fd;
2457 int family = AF_INET, type = SOCK_STREAM, proto = 0;
2458 static char *keywords[] = {"family", "type", "proto", 0};
2459
2460 if (!PyArg_ParseTupleAndKeywords(args, kwds,
2461 "|iii:socket", keywords,
2462 &family, &type, &proto))
2463 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002464
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002465 Py_BEGIN_ALLOW_THREADS
2466 fd = socket(family, type, proto);
2467 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002468
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002469#ifdef MS_WINDOWS
2470 if (fd == INVALID_SOCKET)
2471#else
2472 if (fd < 0)
2473#endif
2474 {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002475 set_error();
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002476 return -1;
2477 }
2478 init_sockobject(s, fd, family, type, proto);
2479 /* From now on, ignore SIGPIPE and let the error checking
2480 do the work. */
2481#ifdef SIGPIPE
2482 (void) signal(SIGPIPE, SIG_IGN);
2483#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00002484
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002485 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002486
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002487}
2488
2489
Guido van Rossumb6775db1994-08-01 11:34:53 +00002490/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002491
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002492static PyTypeObject sock_type = {
Guido van Rossum55558541996-05-23 22:54:50 +00002493 PyObject_HEAD_INIT(0) /* Must fill in type value later */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002494 0, /* ob_size */
Guido van Rossumca6dfa52001-10-28 12:31:33 +00002495 "_socket.socket", /* tp_name */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002496 sizeof(PySocketSockObject), /* tp_basicsize */
2497 0, /* tp_itemsize */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002498 (destructor)sock_dealloc, /* tp_dealloc */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002499 0, /* tp_print */
2500 0, /* tp_getattr */
2501 0, /* tp_setattr */
2502 0, /* tp_compare */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002503 (reprfunc)sock_repr, /* tp_repr */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002504 0, /* tp_as_number */
2505 0, /* tp_as_sequence */
2506 0, /* tp_as_mapping */
2507 0, /* tp_hash */
2508 0, /* tp_call */
2509 0, /* tp_str */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002510 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002511 0, /* tp_setattro */
2512 0, /* tp_as_buffer */
2513 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002514 sock_doc, /* tp_doc */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002515 0, /* tp_traverse */
2516 0, /* tp_clear */
2517 0, /* tp_richcompare */
2518 0, /* tp_weaklistoffset */
2519 0, /* tp_iter */
2520 0, /* tp_iternext */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002521 sock_methods, /* tp_methods */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002522 0, /* tp_members */
2523 0, /* tp_getset */
2524 0, /* tp_base */
2525 0, /* tp_dict */
2526 0, /* tp_descr_get */
2527 0, /* tp_descr_set */
2528 0, /* tp_dictoffset */
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00002529 sock_initobj, /* tp_init */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002530 PyType_GenericAlloc, /* tp_alloc */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002531 sock_new, /* tp_new */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002532 PyObject_Del, /* tp_free */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002533};
2534
Guido van Rossum30a685f1991-06-27 15:51:29 +00002535
Guido van Rossum81194471991-07-27 21:42:02 +00002536/* Python interface to gethostname(). */
2537
2538/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002539static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002540socket_gethostname(PyObject *self, PyObject *args)
Guido van Rossum81194471991-07-27 21:42:02 +00002541{
2542 char buf[1024];
Guido van Rossumff4949e1992-08-05 19:58:53 +00002543 int res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002544 if (!PyArg_ParseTuple(args, ":gethostname"))
Guido van Rossum81194471991-07-27 21:42:02 +00002545 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00002546 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002547 res = gethostname(buf, (int) sizeof buf - 1);
Guido van Rossum73624e91994-10-10 17:59:00 +00002548 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002549 if (res < 0)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002550 return set_error();
Guido van Rossum81194471991-07-27 21:42:02 +00002551 buf[sizeof buf - 1] = '\0';
Guido van Rossum73624e91994-10-10 17:59:00 +00002552 return PyString_FromString(buf);
Guido van Rossum81194471991-07-27 21:42:02 +00002553}
Guido van Rossumff4949e1992-08-05 19:58:53 +00002554
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002555PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002556"gethostname() -> string\n\
2557\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002558Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002559
Guido van Rossumff4949e1992-08-05 19:58:53 +00002560
Guido van Rossum30a685f1991-06-27 15:51:29 +00002561/* Python interface to gethostbyname(name). */
2562
2563/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002564static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002565socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002566{
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002567 char *name;
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00002568#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002569 struct sockaddr_storage addrbuf;
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00002570#else
2571 struct sockaddr_in addrbuf;
2572#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002573
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002574 if (!PyArg_ParseTuple(args, "s:gethostbyname", &name))
Guido van Rossum30a685f1991-06-27 15:51:29 +00002575 return NULL;
Martin v. Löwisddc6f472002-07-28 16:10:31 +00002576 if (setipaddr(name, (struct sockaddr *)&addrbuf, sizeof(addrbuf), AF_INET) < 0)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002577 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002578 return makeipaddr((struct sockaddr *)&addrbuf,
2579 sizeof(struct sockaddr_in));
Guido van Rossum30a685f1991-06-27 15:51:29 +00002580}
2581
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002582PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002583"gethostbyname(host) -> address\n\
2584\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002585Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002586
2587
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002588/* Convenience function common to gethostbyname_ex and gethostbyaddr */
2589
2590static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002591gethost_common(struct hostent *h, struct sockaddr *addr, int alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002592{
2593 char **pch;
2594 PyObject *rtn_tuple = (PyObject *)NULL;
2595 PyObject *name_list = (PyObject *)NULL;
2596 PyObject *addr_list = (PyObject *)NULL;
2597 PyObject *tmp;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002598
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002599 if (h == NULL) {
Guido van Rossum48a680c2001-03-02 06:34:14 +00002600 /* Let's get real error message to return */
Guido van Rossume2ae77b2001-10-24 20:42:55 +00002601#ifndef RISCOS
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002602 set_herror(h_errno);
Guido van Rossume2ae77b2001-10-24 20:42:55 +00002603#else
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002604 PyErr_SetString(socket_error, "host not found");
Guido van Rossume2ae77b2001-10-24 20:42:55 +00002605#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002606 return NULL;
2607 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002608
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002609 if (h->h_addrtype != af) {
2610#ifdef HAVE_STRERROR
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002611 /* Let's get real error message to return */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002612 PyErr_SetString(socket_error,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002613 (char *)strerror(EAFNOSUPPORT));
2614#else
2615 PyErr_SetString(
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002616 socket_error,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002617 "Address family not supported by protocol family");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002618#endif
2619 return NULL;
2620 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002621
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002622 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00002623
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002624 case AF_INET:
2625 if (alen < sizeof(struct sockaddr_in))
2626 return NULL;
2627 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002628
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002629#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002630 case AF_INET6:
2631 if (alen < sizeof(struct sockaddr_in6))
2632 return NULL;
2633 break;
2634#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00002635
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002636 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002637
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002638 if ((name_list = PyList_New(0)) == NULL)
2639 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002640
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002641 if ((addr_list = PyList_New(0)) == NULL)
2642 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002643
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002644 for (pch = h->h_aliases; *pch != NULL; pch++) {
2645 int status;
2646 tmp = PyString_FromString(*pch);
2647 if (tmp == NULL)
2648 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002649
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002650 status = PyList_Append(name_list, tmp);
2651 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002652
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002653 if (status)
2654 goto err;
2655 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002656
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002657 for (pch = h->h_addr_list; *pch != NULL; pch++) {
2658 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002659
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002660 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00002661
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002662 case AF_INET:
2663 {
2664 struct sockaddr_in sin;
2665 memset(&sin, 0, sizeof(sin));
2666 sin.sin_family = af;
2667#ifdef HAVE_SOCKADDR_SA_LEN
2668 sin.sin_len = sizeof(sin);
2669#endif
2670 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
2671 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
Guido van Rossum67f7a382002-06-06 21:08:16 +00002672
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002673 if (pch == h->h_addr_list && alen >= sizeof(sin))
2674 memcpy((char *) addr, &sin, sizeof(sin));
2675 break;
2676 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002677
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002678#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002679 case AF_INET6:
2680 {
2681 struct sockaddr_in6 sin6;
2682 memset(&sin6, 0, sizeof(sin6));
2683 sin6.sin6_family = af;
2684#ifdef HAVE_SOCKADDR_SA_LEN
2685 sin6.sin6_len = sizeof(sin6);
2686#endif
2687 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
2688 tmp = makeipaddr((struct sockaddr *)&sin6,
2689 sizeof(sin6));
Guido van Rossum67f7a382002-06-06 21:08:16 +00002690
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002691 if (pch == h->h_addr_list && alen >= sizeof(sin6))
2692 memcpy((char *) addr, &sin6, sizeof(sin6));
2693 break;
2694 }
2695#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00002696
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002697 default: /* can't happen */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002698 PyErr_SetString(socket_error,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002699 "unsupported address family");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002700 return NULL;
2701 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002702
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002703 if (tmp == NULL)
2704 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002705
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002706 status = PyList_Append(addr_list, tmp);
2707 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002708
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002709 if (status)
2710 goto err;
2711 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002712
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002713 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002714
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002715 err:
2716 Py_XDECREF(name_list);
2717 Py_XDECREF(addr_list);
2718 return rtn_tuple;
2719}
2720
2721
2722/* Python interface to gethostbyname_ex(name). */
2723
2724/*ARGSUSED*/
2725static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002726socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002727{
2728 char *name;
2729 struct hostent *h;
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00002730#ifdef ENABLE_IPV6
2731 struct sockaddr_storage addr;
2732#else
2733 struct sockaddr_in addr;
2734#endif
Martin v. Löwis9db2f572001-07-23 01:30:10 +00002735 struct sockaddr *sa;
Guido van Rossum955becc1999-03-22 20:14:53 +00002736 PyObject *ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002737#ifdef HAVE_GETHOSTBYNAME_R
2738 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002739#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
2740 struct hostent_data data;
2741#else
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002742 char buf[16384];
2743 int buf_len = (sizeof buf) - 1;
2744 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002745#endif
2746#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002747 int result;
2748#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002749#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002750
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002751 if (!PyArg_ParseTuple(args, "s:gethostbyname_ex", &name))
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002752 return NULL;
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00002753 if (setipaddr(name, (struct sockaddr *)&addr, sizeof(addr), AF_INET) < 0)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002754 return NULL;
2755 Py_BEGIN_ALLOW_THREADS
2756#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002757#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002758 result = gethostbyname_r(name, &hp_allocated, buf, buf_len,
2759 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002760#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002761 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002762#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00002763 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002764 result = gethostbyname_r(name, &hp_allocated, &data);
2765 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002766#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002767#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00002768#ifdef USE_GETHOSTBYNAME_LOCK
Just van Rossum1040d2c2003-05-09 07:53:18 +00002769 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002770#endif
2771 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002772#endif /* HAVE_GETHOSTBYNAME_R */
2773 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002774 /* Some C libraries would require addr.__ss_family instead of
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002775 addr.ss_family.
2776 Therefore, we cast the sockaddr_storage into sockaddr to
2777 access sa_family. */
Martin v. Löwis9db2f572001-07-23 01:30:10 +00002778 sa = (struct sockaddr*)&addr;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002779 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr),
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002780 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00002781#ifdef USE_GETHOSTBYNAME_LOCK
Just van Rossum1040d2c2003-05-09 07:53:18 +00002782 PyThread_release_lock(netdb_lock);
Guido van Rossum955becc1999-03-22 20:14:53 +00002783#endif
2784 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002785}
2786
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002787PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002788"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
2789\n\
2790Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002791for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002792
2793
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002794/* Python interface to gethostbyaddr(IP). */
2795
2796/*ARGSUSED*/
2797static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002798socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002799{
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002800#ifdef ENABLE_IPV6
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002801 struct sockaddr_storage addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002802#else
Guido van Rossum48a680c2001-03-02 06:34:14 +00002803 struct sockaddr_in addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002804#endif
2805 struct sockaddr *sa = (struct sockaddr *)&addr;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002806 char *ip_num;
2807 struct hostent *h;
Guido van Rossum3baaa131999-03-22 21:44:51 +00002808 PyObject *ret;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002809#ifdef HAVE_GETHOSTBYNAME_R
2810 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002811#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
2812 struct hostent_data data;
2813#else
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002814 char buf[16384];
2815 int buf_len = (sizeof buf) - 1;
2816 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002817#endif
2818#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002819 int result;
2820#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002821#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002822 char *ap;
2823 int al;
2824 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002825
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002826 if (!PyArg_ParseTuple(args, "s:gethostbyaddr", &ip_num))
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002827 return NULL;
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00002828 af = AF_UNSPEC;
Martin v. Löwisddc6f472002-07-28 16:10:31 +00002829 if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002830 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002831 af = sa->sa_family;
2832 ap = NULL;
2833 al = 0;
2834 switch (af) {
2835 case AF_INET:
2836 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
2837 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
2838 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002839#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002840 case AF_INET6:
2841 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
2842 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
2843 break;
2844#endif
2845 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002846 PyErr_SetString(socket_error, "unsupported address family");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002847 return NULL;
2848 }
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002849 Py_BEGIN_ALLOW_THREADS
2850#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002851#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002852 result = gethostbyaddr_r(ap, al, af,
2853 &hp_allocated, buf, buf_len,
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002854 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002855#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002856 h = gethostbyaddr_r(ap, al, af,
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002857 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002858#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00002859 memset((void *) &data, '\0', sizeof(data));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002860 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002861 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002862#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002863#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00002864#ifdef USE_GETHOSTBYNAME_LOCK
Just van Rossum1040d2c2003-05-09 07:53:18 +00002865 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002866#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002867 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002868#endif /* HAVE_GETHOSTBYNAME_R */
2869 Py_END_ALLOW_THREADS
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002870 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00002871#ifdef USE_GETHOSTBYNAME_LOCK
Just van Rossum1040d2c2003-05-09 07:53:18 +00002872 PyThread_release_lock(netdb_lock);
Guido van Rossum3baaa131999-03-22 21:44:51 +00002873#endif
2874 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002875}
2876
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002877PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002878"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
2879\n\
2880Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002881for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002882
Guido van Rossum30a685f1991-06-27 15:51:29 +00002883
2884/* Python interface to getservbyname(name).
2885 This only returns the port number, since the other info is already
2886 known or not useful (like the list of aliases). */
2887
2888/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002889static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002890socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002891{
Barry Warsaw11b91a02004-06-28 00:50:43 +00002892 char *name, *proto=NULL;
Guido van Rossum30a685f1991-06-27 15:51:29 +00002893 struct servent *sp;
Barry Warsaw11b91a02004-06-28 00:50:43 +00002894 if (!PyArg_ParseTuple(args, "s|s:getservbyname", &name, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +00002895 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00002896 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002897 sp = getservbyname(name, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00002898 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00002899 if (sp == NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002900 PyErr_SetString(socket_error, "service/proto not found");
Guido van Rossum30a685f1991-06-27 15:51:29 +00002901 return NULL;
2902 }
Guido van Rossum73624e91994-10-10 17:59:00 +00002903 return PyInt_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00002904}
2905
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002906PyDoc_STRVAR(getservbyname_doc,
Barry Warsaw11b91a02004-06-28 00:50:43 +00002907"getservbyname(servicename[, protocolname]) -> integer\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002908\n\
2909Return a port number from a service name and protocol name.\n\
Barry Warsaw11b91a02004-06-28 00:50:43 +00002910The optional protocol name, if given, should be 'tcp' or 'udp',\n\
2911otherwise any protocol will match.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002912
Guido van Rossum30a685f1991-06-27 15:51:29 +00002913
Barry Warsaw11b91a02004-06-28 00:50:43 +00002914/* Python interface to getservbyport(port).
2915 This only returns the service name, since the other info is already
2916 known or not useful (like the list of aliases). */
2917
2918/*ARGSUSED*/
2919static PyObject *
2920socket_getservbyport(PyObject *self, PyObject *args)
2921{
2922 int port;
2923 char *proto=NULL;
2924 struct servent *sp;
2925 if (!PyArg_ParseTuple(args, "i|s:getservbyport", &port, &proto))
2926 return NULL;
2927 Py_BEGIN_ALLOW_THREADS
2928 sp = getservbyport(htons(port), proto);
2929 Py_END_ALLOW_THREADS
2930 if (sp == NULL) {
2931 PyErr_SetString(socket_error, "port/proto not found");
2932 return NULL;
2933 }
2934 return PyString_FromString(sp->s_name);
2935}
2936
2937PyDoc_STRVAR(getservbyport_doc,
2938"getservbyport(port[, protocolname]) -> string\n\
2939\n\
2940Return the service name from a port number and protocol name.\n\
2941The optional protocol name, if given, should be 'tcp' or 'udp',\n\
2942otherwise any protocol will match.");
2943
Guido van Rossum3901d851996-12-19 16:35:04 +00002944/* Python interface to getprotobyname(name).
2945 This only returns the protocol number, since the other info is
2946 already known or not useful (like the list of aliases). */
2947
2948/*ARGSUSED*/
2949static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002950socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00002951{
2952 char *name;
2953 struct protoent *sp;
Guido van Rossumbcc20741998-08-04 22:53:56 +00002954#ifdef __BEOS__
2955/* Not available in BeOS yet. - [cjh] */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002956 PyErr_SetString(socket_error, "getprotobyname not supported");
Guido van Rossumbcc20741998-08-04 22:53:56 +00002957 return NULL;
2958#else
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002959 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
Guido van Rossum3901d851996-12-19 16:35:04 +00002960 return NULL;
2961 Py_BEGIN_ALLOW_THREADS
2962 sp = getprotobyname(name);
2963 Py_END_ALLOW_THREADS
2964 if (sp == NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002965 PyErr_SetString(socket_error, "protocol not found");
Guido van Rossum3901d851996-12-19 16:35:04 +00002966 return NULL;
2967 }
2968 return PyInt_FromLong((long) sp->p_proto);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002969#endif
Guido van Rossum3901d851996-12-19 16:35:04 +00002970}
2971
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002972PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002973"getprotobyname(name) -> integer\n\
2974\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002975Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002976
Guido van Rossum3901d851996-12-19 16:35:04 +00002977
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002978#ifndef NO_DUP
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002979/* Create a socket object from a numeric file description.
2980 Useful e.g. if stdin is a socket.
2981 Additional arguments as for socket(). */
2982
2983/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002984static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002985socket_fromfd(PyObject *self, PyObject *args)
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002986{
Guido van Rossum73624e91994-10-10 17:59:00 +00002987 PySocketSockObject *s;
Fred Drakea04eaad2000-06-30 02:46:07 +00002988 SOCKET_T fd;
2989 int family, type, proto = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002990 if (!PyArg_ParseTuple(args, "iii|i:fromfd",
2991 &fd, &family, &type, &proto))
Guido van Rossumbe32c891996-06-20 16:25:29 +00002992 return NULL;
Guido van Rossum5f59d601992-12-14 16:59:51 +00002993 /* Dup the fd so it and the socket can be closed independently */
2994 fd = dup(fd);
2995 if (fd < 0)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002996 return set_error();
2997 s = new_sockobject(fd, family, type, proto);
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002998 /* From now on, ignore SIGPIPE and let the error checking
2999 do the work. */
Guido van Rossum48a680c2001-03-02 06:34:14 +00003000#ifdef SIGPIPE
Guido van Rossum2a7178e1992-12-08 13:38:24 +00003001 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum48a680c2001-03-02 06:34:14 +00003002#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00003003 return (PyObject *) s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00003004}
Guido van Rossum82a5c661998-07-07 20:45:43 +00003005
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003006PyDoc_STRVAR(fromfd_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003007"fromfd(fd, family, type[, proto]) -> socket object\n\
3008\n\
3009Create a socket object from the given file descriptor.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003010The remaining arguments are the same as for socket().");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003011
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00003012#endif /* NO_DUP */
Guido van Rossum2a7178e1992-12-08 13:38:24 +00003013
Guido van Rossum82a5c661998-07-07 20:45:43 +00003014
Guido van Rossum006bf911996-06-12 04:04:55 +00003015static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003016socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00003017{
3018 int x1, x2;
3019
Guido van Rossum27fc3c02000-03-24 20:56:56 +00003020 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00003021 return NULL;
3022 }
3023 x2 = (int)ntohs((short)x1);
3024 return PyInt_FromLong(x2);
3025}
3026
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003027PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003028"ntohs(integer) -> integer\n\
3029\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003030Convert a 16-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003031
3032
Guido van Rossum006bf911996-06-12 04:04:55 +00003033static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003034socket_ntohl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00003035{
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003036 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00003037
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003038 if (PyInt_Check(arg)) {
3039 x = PyInt_AS_LONG(arg);
Jeremy Hylton825e47b2002-07-25 16:37:51 +00003040 if (x == (unsigned long) -1 && PyErr_Occurred())
3041 return NULL;
Guido van Rossum006bf911996-06-12 04:04:55 +00003042 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003043 else if (PyLong_Check(arg)) {
3044 x = PyLong_AsUnsignedLong(arg);
Jeremy Hylton825e47b2002-07-25 16:37:51 +00003045 if (x == (unsigned long) -1 && PyErr_Occurred())
3046 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003047#if SIZEOF_LONG > 4
3048 {
3049 unsigned long y;
3050 /* only want the trailing 32 bits */
3051 y = x & 0xFFFFFFFFUL;
3052 if (y ^ x)
3053 return PyErr_Format(PyExc_OverflowError,
3054 "long int larger than 32 bits");
3055 x = y;
Tim Peters58141872002-08-06 22:25:02 +00003056 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003057#endif
3058 }
3059 else
Tim Peters58141872002-08-06 22:25:02 +00003060 return PyErr_Format(PyExc_TypeError,
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003061 "expected int/long, %s found",
3062 arg->ob_type->tp_name);
3063 if (x == (unsigned long) -1 && PyErr_Occurred())
3064 return NULL;
3065 return PyInt_FromLong(ntohl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00003066}
3067
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003068PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003069"ntohl(integer) -> integer\n\
3070\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003071Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003072
3073
Guido van Rossum006bf911996-06-12 04:04:55 +00003074static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003075socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00003076{
Hye-Shik Changa7b673f2003-12-17 09:40:23 +00003077 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00003078
Guido van Rossum27fc3c02000-03-24 20:56:56 +00003079 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00003080 return NULL;
3081 }
3082 x2 = (int)htons((short)x1);
3083 return PyInt_FromLong(x2);
3084}
3085
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003086PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003087"htons(integer) -> integer\n\
3088\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003089Convert a 16-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003090
3091
Guido van Rossum006bf911996-06-12 04:04:55 +00003092static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003093socket_htonl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00003094{
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003095 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00003096
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003097 if (PyInt_Check(arg)) {
3098 x = PyInt_AS_LONG(arg);
Jeremy Hylton825e47b2002-07-25 16:37:51 +00003099 if (x == (unsigned long) -1 && PyErr_Occurred())
3100 return NULL;
Guido van Rossum006bf911996-06-12 04:04:55 +00003101 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003102 else if (PyLong_Check(arg)) {
3103 x = PyLong_AsUnsignedLong(arg);
Jeremy Hylton825e47b2002-07-25 16:37:51 +00003104 if (x == (unsigned long) -1 && PyErr_Occurred())
3105 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003106#if SIZEOF_LONG > 4
3107 {
3108 unsigned long y;
3109 /* only want the trailing 32 bits */
3110 y = x & 0xFFFFFFFFUL;
3111 if (y ^ x)
3112 return PyErr_Format(PyExc_OverflowError,
3113 "long int larger than 32 bits");
3114 x = y;
Tim Peters58141872002-08-06 22:25:02 +00003115 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003116#endif
3117 }
3118 else
Tim Peters58141872002-08-06 22:25:02 +00003119 return PyErr_Format(PyExc_TypeError,
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003120 "expected int/long, %s found",
3121 arg->ob_type->tp_name);
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003122 return PyInt_FromLong(htonl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00003123}
3124
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003125PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003126"htonl(integer) -> integer\n\
3127\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003128Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003129
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003130/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003131
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003132PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003133"inet_aton(string) -> packed 32-bit IP representation\n\
3134\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003135Convert 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 +00003136binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003137
3138static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003139socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003140{
Guido van Rossuma2e48551999-09-09 15:42:59 +00003141#ifndef INADDR_NONE
3142#define INADDR_NONE (-1)
3143#endif
Neal Norwitz88f115b2003-02-13 02:15:42 +00003144#ifdef HAVE_INET_ATON
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003145 struct in_addr buf;
Tim Peters1df9fdd2003-02-13 03:13:40 +00003146#else
3147 /* Have to use inet_addr() instead */
3148 unsigned long packed_addr;
3149#endif
3150 char *ip_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003151
Tim Peters1df9fdd2003-02-13 03:13:40 +00003152 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003153 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003154
Tim Peters1df9fdd2003-02-13 03:13:40 +00003155
3156#ifdef HAVE_INET_ATON
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003157 if (inet_aton(ip_addr, &buf))
3158 return PyString_FromStringAndSize((char *)(&buf),
3159 sizeof(buf));
3160
3161 PyErr_SetString(socket_error,
3162 "illegal IP address string passed to inet_aton");
3163 return NULL;
3164
Tim Peters1df9fdd2003-02-13 03:13:40 +00003165#else /* ! HAVE_INET_ATON */
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003166 /* XXX Problem here: inet_aton('255.255.255.255') raises
3167 an exception while it should be a valid address. */
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003168 packed_addr = inet_addr(ip_addr);
3169
3170 if (packed_addr == INADDR_NONE) { /* invalid address */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003171 PyErr_SetString(socket_error,
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003172 "illegal IP address string passed to inet_aton");
3173 return NULL;
3174 }
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003175 return PyString_FromStringAndSize((char *) &packed_addr,
3176 sizeof(packed_addr));
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003177#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003178}
3179
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003180PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00003181"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003182\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003183Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003184
3185static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003186socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003187{
3188 char *packed_str;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003189 int addr_len;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003190 struct in_addr packed_addr;
3191
Guido van Rossum27fc3c02000-03-24 20:56:56 +00003192 if (!PyArg_ParseTuple(args, "s#:inet_ntoa", &packed_str, &addr_len)) {
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003193 return NULL;
3194 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00003195
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003196 if (addr_len != sizeof(packed_addr)) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003197 PyErr_SetString(socket_error,
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003198 "packed IP wrong length for inet_ntoa");
3199 return NULL;
3200 }
3201
3202 memcpy(&packed_addr, packed_str, addr_len);
3203
3204 return PyString_FromString(inet_ntoa(packed_addr));
3205}
Guido van Rossum82a5c661998-07-07 20:45:43 +00003206
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003207#ifdef HAVE_INET_PTON
3208
3209PyDoc_STRVAR(inet_pton_doc,
3210"inet_pton(af, ip) -> packed IP address string\n\
3211\n\
3212Convert an IP address from string format to a packed string suitable\n\
3213for use with low-level network functions.");
3214
3215static PyObject *
3216socket_inet_pton(PyObject *self, PyObject *args)
3217{
3218 int af;
3219 char* ip;
3220 int retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003221#ifdef ENABLE_IPV6
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003222 char packed[MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003223#else
3224 char packed[sizeof(struct in_addr)];
3225#endif
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003226 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
3227 return NULL;
3228 }
3229
Martin v. Löwis04697e82004-06-02 12:35:29 +00003230#if !defined(ENABLE_IPV6) && defined(AF_INET6)
Martin v. Löwis10649092003-08-05 06:25:06 +00003231 if(af == AF_INET6) {
3232 PyErr_SetString(socket_error,
3233 "can't use AF_INET6, IPv6 is disabled");
3234 return NULL;
3235 }
3236#endif
3237
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003238 retval = inet_pton(af, ip, packed);
3239 if (retval < 0) {
3240 PyErr_SetFromErrno(socket_error);
3241 return NULL;
3242 } else if (retval == 0) {
3243 PyErr_SetString(socket_error,
3244 "illegal IP address string passed to inet_pton");
3245 return NULL;
3246 } else if (af == AF_INET) {
3247 return PyString_FromStringAndSize(packed,
3248 sizeof(struct in_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003249#ifdef ENABLE_IPV6
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003250 } else if (af == AF_INET6) {
3251 return PyString_FromStringAndSize(packed,
3252 sizeof(struct in6_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003253#endif
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003254 } else {
3255 PyErr_SetString(socket_error, "unknown address family");
3256 return NULL;
3257 }
3258}
3259
3260PyDoc_STRVAR(inet_ntop_doc,
3261"inet_ntop(af, packed_ip) -> string formatted IP address\n\
3262\n\
3263Convert a packed IP address of the given family to string format.");
3264
3265static PyObject *
3266socket_inet_ntop(PyObject *self, PyObject *args)
3267{
3268 int af;
3269 char* packed;
3270 int len;
3271 const char* retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003272#ifdef ENABLE_IPV6
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003273 char ip[MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003274#else
3275 char ip[INET_ADDRSTRLEN + 1];
3276#endif
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003277
3278 /* Guarantee NUL-termination for PyString_FromString() below */
3279 memset((void *) &ip[0], '\0', sizeof(ip) + 1);
3280
3281 if (!PyArg_ParseTuple(args, "is#:inet_ntop", &af, &packed, &len)) {
3282 return NULL;
3283 }
3284
3285 if (af == AF_INET) {
3286 if (len != sizeof(struct in_addr)) {
3287 PyErr_SetString(PyExc_ValueError,
3288 "invalid length of packed IP address string");
3289 return NULL;
3290 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003291#ifdef ENABLE_IPV6
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003292 } else if (af == AF_INET6) {
3293 if (len != sizeof(struct in6_addr)) {
3294 PyErr_SetString(PyExc_ValueError,
3295 "invalid length of packed IP address string");
3296 return NULL;
3297 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003298#endif
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003299 } else {
3300 PyErr_Format(PyExc_ValueError,
3301 "unknown address family %d", af);
3302 return NULL;
3303 }
3304
3305 retval = inet_ntop(af, packed, ip, sizeof(ip));
3306 if (!retval) {
3307 PyErr_SetFromErrno(socket_error);
3308 return NULL;
3309 } else {
3310 return PyString_FromString(retval);
3311 }
3312
3313 /* NOTREACHED */
3314 PyErr_SetString(PyExc_RuntimeError, "invalid handling of inet_ntop");
3315 return NULL;
3316}
3317
3318#endif /* HAVE_INET_PTON */
3319
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003320/* Python interface to getaddrinfo(host, port). */
3321
3322/*ARGSUSED*/
3323static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003324socket_getaddrinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003325{
Martin v. Löwisf0b11d22001-11-07 08:31:03 +00003326 struct addrinfo hints, *res;
3327 struct addrinfo *res0 = NULL;
Martin v. Löwis2548c732003-04-18 10:39:54 +00003328 PyObject *hobj = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003329 PyObject *pobj = (PyObject *)NULL;
Martin v. Löwisf65b1a12001-08-12 09:28:40 +00003330 char pbuf[30];
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003331 char *hptr, *pptr;
3332 int family, socktype, protocol, flags;
3333 int error;
3334 PyObject *all = (PyObject *)NULL;
3335 PyObject *single = (PyObject *)NULL;
Martin v. Löwis2548c732003-04-18 10:39:54 +00003336 PyObject *idna = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003337
3338 family = socktype = protocol = flags = 0;
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00003339 family = AF_UNSPEC;
Martin v. Löwis2548c732003-04-18 10:39:54 +00003340 if (!PyArg_ParseTuple(args, "OO|iiii:getaddrinfo",
3341 &hobj, &pobj, &family, &socktype,
3342 &protocol, &flags)) {
3343 return NULL;
3344 }
3345 if (hobj == Py_None) {
3346 hptr = NULL;
3347 } else if (PyUnicode_Check(hobj)) {
3348 idna = PyObject_CallMethod(hobj, "encode", "s", "idna");
3349 if (!idna)
3350 return NULL;
3351 hptr = PyString_AsString(idna);
3352 } else if (PyString_Check(hobj)) {
3353 hptr = PyString_AsString(hobj);
3354 } else {
3355 PyErr_SetString(PyExc_TypeError,
3356 "getaddrinfo() argument 1 must be string or None");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003357 return NULL;
3358 }
3359 if (PyInt_Check(pobj)) {
Marc-André Lemburg03d1b182001-07-31 18:05:33 +00003360 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", PyInt_AsLong(pobj));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003361 pptr = pbuf;
3362 } else if (PyString_Check(pobj)) {
3363 pptr = PyString_AsString(pobj);
3364 } else if (pobj == Py_None) {
3365 pptr = (char *)NULL;
3366 } else {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003367 PyErr_SetString(socket_error, "Int or String expected");
Martin v. Löwis5db099a2003-08-07 11:55:15 +00003368 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003369 }
3370 memset(&hints, 0, sizeof(hints));
3371 hints.ai_family = family;
3372 hints.ai_socktype = socktype;
3373 hints.ai_protocol = protocol;
3374 hints.ai_flags = flags;
Just van Rossum1040d2c2003-05-09 07:53:18 +00003375 Py_BEGIN_ALLOW_THREADS
3376 ACQUIRE_GETADDRINFO_LOCK
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003377 error = getaddrinfo(hptr, pptr, &hints, &res0);
Just van Rossum1040d2c2003-05-09 07:53:18 +00003378 Py_END_ALLOW_THREADS
3379 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003380 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003381 set_gaierror(error);
Martin v. Löwis5db099a2003-08-07 11:55:15 +00003382 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003383 }
3384
3385 if ((all = PyList_New(0)) == NULL)
3386 goto err;
3387 for (res = res0; res; res = res->ai_next) {
Guido van Rossum716aac02001-10-12 18:59:27 +00003388 PyObject *addr =
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00003389 makesockaddr(-1, res->ai_addr, res->ai_addrlen, protocol);
Guido van Rossum716aac02001-10-12 18:59:27 +00003390 if (addr == NULL)
3391 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003392 single = Py_BuildValue("iiisO", res->ai_family,
3393 res->ai_socktype, res->ai_protocol,
3394 res->ai_canonname ? res->ai_canonname : "",
Guido van Rossum716aac02001-10-12 18:59:27 +00003395 addr);
3396 Py_DECREF(addr);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003397 if (single == NULL)
3398 goto err;
3399
3400 if (PyList_Append(all, single))
3401 goto err;
3402 Py_XDECREF(single);
3403 }
Martin v. Löwis2548c732003-04-18 10:39:54 +00003404 Py_XDECREF(idna);
Neal Norwitz90128ba2002-08-09 03:37:42 +00003405 if (res0)
3406 freeaddrinfo(res0);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003407 return all;
3408 err:
3409 Py_XDECREF(single);
3410 Py_XDECREF(all);
Martin v. Löwis2548c732003-04-18 10:39:54 +00003411 Py_XDECREF(idna);
Martin v. Löwisf0b11d22001-11-07 08:31:03 +00003412 if (res0)
3413 freeaddrinfo(res0);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003414 return (PyObject *)NULL;
3415}
3416
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003417PyDoc_STRVAR(getaddrinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003418"getaddrinfo(host, port [, family, socktype, proto, flags])\n\
3419 -> list of (family, socktype, proto, canonname, sockaddr)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003420\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003421Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003422
3423/* Python interface to getnameinfo(sa, flags). */
3424
3425/*ARGSUSED*/
3426static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003427socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003428{
3429 PyObject *sa = (PyObject *)NULL;
3430 int flags;
3431 char *hostp;
Martin v. Löwis06b1d212001-11-02 23:34:52 +00003432 int port, flowinfo, scope_id;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003433 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
3434 struct addrinfo hints, *res = NULL;
3435 int error;
3436 PyObject *ret = (PyObject *)NULL;
3437
3438 flags = flowinfo = scope_id = 0;
Martin v. Löwis06b1d212001-11-02 23:34:52 +00003439 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003440 return NULL;
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003441 if (!PyArg_ParseTuple(sa, "si|ii",
3442 &hostp, &port, &flowinfo, &scope_id))
Martin v. Löwis06b1d212001-11-02 23:34:52 +00003443 return NULL;
Marc-André Lemburg03d1b182001-07-31 18:05:33 +00003444 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003445 memset(&hints, 0, sizeof(hints));
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00003446 hints.ai_family = AF_UNSPEC;
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003447 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Just van Rossum1040d2c2003-05-09 07:53:18 +00003448 Py_BEGIN_ALLOW_THREADS
3449 ACQUIRE_GETADDRINFO_LOCK
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003450 error = getaddrinfo(hostp, pbuf, &hints, &res);
Just van Rossum1040d2c2003-05-09 07:53:18 +00003451 Py_END_ALLOW_THREADS
3452 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003453 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003454 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003455 goto fail;
3456 }
3457 if (res->ai_next) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003458 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003459 "sockaddr resolved to multiple addresses");
3460 goto fail;
3461 }
3462 switch (res->ai_family) {
3463 case AF_INET:
3464 {
3465 char *t1;
3466 int t2;
3467 if (PyArg_ParseTuple(sa, "si", &t1, &t2) == 0) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003468 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003469 "IPv4 sockaddr must be 2 tuple");
3470 goto fail;
3471 }
3472 break;
3473 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00003474#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003475 case AF_INET6:
3476 {
3477 struct sockaddr_in6 *sin6;
3478 sin6 = (struct sockaddr_in6 *)res->ai_addr;
3479 sin6->sin6_flowinfo = flowinfo;
3480 sin6->sin6_scope_id = scope_id;
3481 break;
3482 }
3483#endif
3484 }
3485 error = getnameinfo(res->ai_addr, res->ai_addrlen,
3486 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
3487 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003488 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003489 goto fail;
3490 }
3491 ret = Py_BuildValue("ss", hbuf, pbuf);
3492
3493fail:
3494 if (res)
3495 freeaddrinfo(res);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003496 return ret;
3497}
3498
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003499PyDoc_STRVAR(getnameinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003500"getnameinfo(sockaddr, flags) --> (host, port)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003501\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003502Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003503
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00003504
3505/* Python API to getting and setting the default timeout value. */
3506
3507static PyObject *
3508socket_getdefaulttimeout(PyObject *self)
3509{
3510 if (defaulttimeout < 0.0) {
3511 Py_INCREF(Py_None);
3512 return Py_None;
3513 }
3514 else
3515 return PyFloat_FromDouble(defaulttimeout);
3516}
3517
3518PyDoc_STRVAR(getdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003519"getdefaulttimeout() -> timeout\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00003520\n\
3521Returns the default timeout in floating seconds for new socket objects.\n\
3522A value of None indicates that new socket objects have no timeout.\n\
3523When the socket module is first imported, the default is None.");
3524
3525static PyObject *
3526socket_setdefaulttimeout(PyObject *self, PyObject *arg)
3527{
3528 double timeout;
3529
3530 if (arg == Py_None)
3531 timeout = -1.0;
3532 else {
3533 timeout = PyFloat_AsDouble(arg);
3534 if (timeout < 0.0) {
3535 if (!PyErr_Occurred())
3536 PyErr_SetString(PyExc_ValueError,
3537 "Timeout value out of range");
3538 return NULL;
3539 }
3540 }
3541
3542 defaulttimeout = timeout;
3543
3544 Py_INCREF(Py_None);
3545 return Py_None;
3546}
3547
3548PyDoc_STRVAR(setdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003549"setdefaulttimeout(timeout)\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00003550\n\
3551Set the default timeout in floating seconds for new socket objects.\n\
3552A value of None indicates that new socket objects have no timeout.\n\
3553When the socket module is first imported, the default is None.");
3554
3555
Guido van Rossum30a685f1991-06-27 15:51:29 +00003556/* List of functions exported by this module. */
3557
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003558static PyMethodDef socket_methods[] = {
3559 {"gethostbyname", socket_gethostbyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003560 METH_VARARGS, gethostbyname_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003561 {"gethostbyname_ex", socket_gethostbyname_ex,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003562 METH_VARARGS, ghbn_ex_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003563 {"gethostbyaddr", socket_gethostbyaddr,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003564 METH_VARARGS, gethostbyaddr_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003565 {"gethostname", socket_gethostname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003566 METH_VARARGS, gethostname_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003567 {"getservbyname", socket_getservbyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003568 METH_VARARGS, getservbyname_doc},
Barry Warsaw11b91a02004-06-28 00:50:43 +00003569 {"getservbyport", socket_getservbyport,
3570 METH_VARARGS, getservbyport_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003571 {"getprotobyname", socket_getprotobyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003572 METH_VARARGS,getprotobyname_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00003573#ifndef NO_DUP
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003574 {"fromfd", socket_fromfd,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003575 METH_VARARGS, fromfd_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00003576#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003577 {"ntohs", socket_ntohs,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003578 METH_VARARGS, ntohs_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003579 {"ntohl", socket_ntohl,
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003580 METH_O, ntohl_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003581 {"htons", socket_htons,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003582 METH_VARARGS, htons_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003583 {"htonl", socket_htonl,
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003584 METH_O, htonl_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003585 {"inet_aton", socket_inet_aton,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003586 METH_VARARGS, inet_aton_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003587 {"inet_ntoa", socket_inet_ntoa,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003588 METH_VARARGS, inet_ntoa_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003589#ifdef HAVE_INET_PTON
3590 {"inet_pton", socket_inet_pton,
3591 METH_VARARGS, inet_pton_doc},
3592 {"inet_ntop", socket_inet_ntop,
3593 METH_VARARGS, inet_ntop_doc},
3594#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003595 {"getaddrinfo", socket_getaddrinfo,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003596 METH_VARARGS, getaddrinfo_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003597 {"getnameinfo", socket_getnameinfo,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003598 METH_VARARGS, getnameinfo_doc},
Guido van Rossum1693ba82002-07-18 21:11:26 +00003599 {"getdefaulttimeout", (PyCFunction)socket_getdefaulttimeout,
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00003600 METH_NOARGS, getdefaulttimeout_doc},
3601 {"setdefaulttimeout", socket_setdefaulttimeout,
3602 METH_O, setdefaulttimeout_doc},
Guido van Rossum30a685f1991-06-27 15:51:29 +00003603 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003604};
3605
Guido van Rossum30a685f1991-06-27 15:51:29 +00003606
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003607#ifdef RISCOS
3608#define OS_INIT_DEFINED
Guido van Rossumbe32c891996-06-20 16:25:29 +00003609
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003610static int
3611os_init(void)
3612{
3613 _kernel_swi_regs r;
3614
3615 r.r[0] = 0;
3616 _kernel_swi(0x43380, &r, &r);
3617 taskwindow = r.r[0];
3618
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003619 return 1;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003620}
3621
3622#endif /* RISCOS */
3623
3624
3625#ifdef MS_WINDOWS
3626#define OS_INIT_DEFINED
3627
3628/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00003629
3630static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003631os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00003632{
3633 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00003634}
3635
3636static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003637os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00003638{
3639 WSADATA WSAData;
3640 int ret;
3641 char buf[100];
3642 ret = WSAStartup(0x0101, &WSAData);
3643 switch (ret) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003644 case 0: /* No error */
Mark Hammond14350ab2003-07-09 04:57:46 +00003645 Py_AtExit(os_cleanup);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003646 return 1; /* Success */
Guido van Rossumbe32c891996-06-20 16:25:29 +00003647 case WSASYSNOTREADY:
3648 PyErr_SetString(PyExc_ImportError,
3649 "WSAStartup failed: network not ready");
3650 break;
3651 case WSAVERNOTSUPPORTED:
3652 case WSAEINVAL:
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003653 PyErr_SetString(
3654 PyExc_ImportError,
3655 "WSAStartup failed: requested version not supported");
Guido van Rossumbe32c891996-06-20 16:25:29 +00003656 break;
3657 default:
Tim Peters885d4572001-11-28 20:27:42 +00003658 PyOS_snprintf(buf, sizeof(buf),
3659 "WSAStartup failed: error code %d", ret);
Guido van Rossumbe32c891996-06-20 16:25:29 +00003660 PyErr_SetString(PyExc_ImportError, buf);
3661 break;
3662 }
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003663 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00003664}
3665
Guido van Rossum8d665e61996-06-26 18:22:49 +00003666#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00003667
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003668
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003669#ifdef PYOS_OS2
3670#define OS_INIT_DEFINED
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003671
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003672/* Additional initialization for OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003673
3674static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003675os_init(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003676{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003677#ifndef PYCC_GCC
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003678 char reason[64];
3679 int rc = sock_init();
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003680
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003681 if (rc == 0) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003682 return 1; /* Success */
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003683 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003684
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003685 PyOS_snprintf(reason, sizeof(reason),
3686 "OS/2 TCP/IP Error# %d", sock_errno());
3687 PyErr_SetString(PyExc_ImportError, reason);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003688
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003689 return 0; /* Failure */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00003690#else
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003691 /* No need to initialise sockets with GCC/EMX */
3692 return 1; /* Success */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00003693#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003694}
3695
3696#endif /* PYOS_OS2 */
3697
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003698
3699#ifndef OS_INIT_DEFINED
3700static int
3701os_init(void)
3702{
3703 return 1; /* Success */
3704}
3705#endif
3706
3707
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00003708/* C API table - always add new things to the end for binary
3709 compatibility. */
3710static
3711PySocketModule_APIObject PySocketModuleAPI =
3712{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003713 &sock_type,
Brett Cannon06c34792004-03-23 23:16:54 +00003714 NULL
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00003715};
3716
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003717
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003718/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003719
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003720 This module is actually called "_socket", and there's a wrapper
3721 "socket.py" which implements some additional functionality. On some
3722 platforms (e.g. Windows and OS/2), socket.py also implements a
3723 wrapper for the socket type that provides missing functionality such
3724 as makefile(), dup() and fromfd(). The import of "_socket" may fail
3725 with an ImportError exception if os-specific initialization fails.
3726 On Windows, this does WINSOCK initialization. When WINSOCK is
3727 initialized succesfully, a call to WSACleanup() is scheduled to be
3728 made at exit time.
3729*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003730
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003731PyDoc_STRVAR(socket_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003732"Implementation module for socket operations.\n\
3733\n\
3734See the socket module for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003735
Mark Hammondfe51c6d2002-08-02 02:27:13 +00003736PyMODINIT_FUNC
Thomas Wouters1e0c2f42000-07-24 16:06:23 +00003737init_socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003738{
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003739 PyObject *m, *has_ipv6;
Fred Drake4baedc12002-04-01 14:53:37 +00003740
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003741 if (!os_init())
Guido van Rossum0cb96de1997-10-01 04:29:29 +00003742 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003743
3744 sock_type.ob_type = &PyType_Type;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003745 m = Py_InitModule3(PySocket_MODULE_NAME,
3746 socket_methods,
3747 socket_doc);
3748
3749 socket_error = PyErr_NewException("socket.error", NULL, NULL);
3750 if (socket_error == NULL)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003751 return;
Brett Cannon06c34792004-03-23 23:16:54 +00003752 PySocketModuleAPI.error = socket_error;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003753 Py_INCREF(socket_error);
3754 PyModule_AddObject(m, "error", socket_error);
3755 socket_herror = PyErr_NewException("socket.herror",
3756 socket_error, NULL);
3757 if (socket_herror == NULL)
3758 return;
3759 Py_INCREF(socket_herror);
3760 PyModule_AddObject(m, "herror", socket_herror);
3761 socket_gaierror = PyErr_NewException("socket.gaierror", socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003762 NULL);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003763 if (socket_gaierror == NULL)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003764 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003765 Py_INCREF(socket_gaierror);
3766 PyModule_AddObject(m, "gaierror", socket_gaierror);
Raymond Hettingeref7343c2003-06-29 03:08:05 +00003767 socket_timeout = PyErr_NewException("socket.timeout",
3768 socket_error, NULL);
3769 if (socket_timeout == NULL)
3770 return;
3771 Py_INCREF(socket_timeout);
3772 PyModule_AddObject(m, "timeout", socket_timeout);
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, "SocketType",
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003775 (PyObject *)&sock_type) != 0)
Guido van Rossum0cb96de1997-10-01 04:29:29 +00003776 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003777 Py_INCREF((PyObject *)&sock_type);
Fred Drake4baedc12002-04-01 14:53:37 +00003778 if (PyModule_AddObject(m, "socket",
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003779 (PyObject *)&sock_type) != 0)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003780 return;
Guido van Rossum09be4091999-08-09 14:40:40 +00003781
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003782#ifdef ENABLE_IPV6
3783 has_ipv6 = Py_True;
3784#else
3785 has_ipv6 = Py_False;
3786#endif
3787 Py_INCREF(has_ipv6);
3788 PyModule_AddObject(m, "has_ipv6", has_ipv6);
3789
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00003790 /* Export C API */
Fred Drake4baedc12002-04-01 14:53:37 +00003791 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00003792 PyCObject_FromVoidPtr((void *)&PySocketModuleAPI, NULL)
3793 ) != 0)
3794 return;
3795
Guido van Rossum09be4091999-08-09 14:40:40 +00003796 /* Address families (we only support AF_INET and AF_UNIX) */
3797#ifdef AF_UNSPEC
Fred Drake4baedc12002-04-01 14:53:37 +00003798 PyModule_AddIntConstant(m, "AF_UNSPEC", AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00003799#endif
Fred Drake4baedc12002-04-01 14:53:37 +00003800 PyModule_AddIntConstant(m, "AF_INET", AF_INET);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003801#ifdef AF_INET6
Fred Drake4baedc12002-04-01 14:53:37 +00003802 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003803#endif /* AF_INET6 */
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00003804#if defined(AF_UNIX)
Fred Drake4baedc12002-04-01 14:53:37 +00003805 PyModule_AddIntConstant(m, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00003806#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00003807#ifdef AF_AX25
Fred Drake4baedc12002-04-01 14:53:37 +00003808 /* Amateur Radio AX.25 */
3809 PyModule_AddIntConstant(m, "AF_AX25", AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00003810#endif
3811#ifdef AF_IPX
Fred Drake4baedc12002-04-01 14:53:37 +00003812 PyModule_AddIntConstant(m, "AF_IPX", AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00003813#endif
3814#ifdef AF_APPLETALK
Fred Drake4baedc12002-04-01 14:53:37 +00003815 /* Appletalk DDP */
3816 PyModule_AddIntConstant(m, "AF_APPLETALK", AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00003817#endif
3818#ifdef AF_NETROM
Fred Drake4baedc12002-04-01 14:53:37 +00003819 /* Amateur radio NetROM */
3820 PyModule_AddIntConstant(m, "AF_NETROM", AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00003821#endif
3822#ifdef AF_BRIDGE
Fred Drake4baedc12002-04-01 14:53:37 +00003823 /* Multiprotocol bridge */
3824 PyModule_AddIntConstant(m, "AF_BRIDGE", AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00003825#endif
3826#ifdef AF_AAL5
Fred Drake4baedc12002-04-01 14:53:37 +00003827 /* Reserved for Werner's ATM */
3828 PyModule_AddIntConstant(m, "AF_AAL5", AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00003829#endif
3830#ifdef AF_X25
Fred Drake4baedc12002-04-01 14:53:37 +00003831 /* Reserved for X.25 project */
3832 PyModule_AddIntConstant(m, "AF_X25", AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00003833#endif
3834#ifdef AF_INET6
Fred Drake4baedc12002-04-01 14:53:37 +00003835 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00003836#endif
3837#ifdef AF_ROSE
Fred Drake4baedc12002-04-01 14:53:37 +00003838 /* Amateur Radio X.25 PLP */
3839 PyModule_AddIntConstant(m, "AF_ROSE", AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00003840#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00003841
Hye-Shik Chang81268602004-02-02 06:05:24 +00003842#ifdef USE_BLUETOOTH
Martin v. Löwis12af0482004-01-31 12:34:17 +00003843 PyModule_AddIntConstant(m, "AF_BLUETOOTH", AF_BLUETOOTH);
3844 PyModule_AddIntConstant(m, "BTPROTO_L2CAP", BTPROTO_L2CAP);
Hye-Shik Chang81268602004-02-02 06:05:24 +00003845#if !defined(__FreeBSD__)
Martin v. Löwis12af0482004-01-31 12:34:17 +00003846 PyModule_AddIntConstant(m, "BTPROTO_SCO", BTPROTO_SCO);
Hye-Shik Chang81268602004-02-02 06:05:24 +00003847#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00003848 PyModule_AddIntConstant(m, "BTPROTO_RFCOMM", BTPROTO_RFCOMM);
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00003849 PyModule_AddObject(m, "BDADDR_ANY", Py_BuildValue("s", "00:00:00:00:00:00"));
3850 PyModule_AddObject(m, "BDADDR_LOCAL", Py_BuildValue("s", "00:00:00:FF:FF:FF"));
Martin v. Löwis12af0482004-01-31 12:34:17 +00003851#endif
3852
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00003853#ifdef HAVE_NETPACKET_PACKET_H
Fred Drake4baedc12002-04-01 14:53:37 +00003854 PyModule_AddIntConstant(m, "AF_PACKET", AF_PACKET);
3855 PyModule_AddIntConstant(m, "PF_PACKET", PF_PACKET);
3856 PyModule_AddIntConstant(m, "PACKET_HOST", PACKET_HOST);
3857 PyModule_AddIntConstant(m, "PACKET_BROADCAST", PACKET_BROADCAST);
3858 PyModule_AddIntConstant(m, "PACKET_MULTICAST", PACKET_MULTICAST);
3859 PyModule_AddIntConstant(m, "PACKET_OTHERHOST", PACKET_OTHERHOST);
3860 PyModule_AddIntConstant(m, "PACKET_OUTGOING", PACKET_OUTGOING);
3861 PyModule_AddIntConstant(m, "PACKET_LOOPBACK", PACKET_LOOPBACK);
3862 PyModule_AddIntConstant(m, "PACKET_FASTROUTE", PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00003863#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00003864
3865 /* Socket types */
Fred Drake4baedc12002-04-01 14:53:37 +00003866 PyModule_AddIntConstant(m, "SOCK_STREAM", SOCK_STREAM);
3867 PyModule_AddIntConstant(m, "SOCK_DGRAM", SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00003868#ifndef __BEOS__
3869/* We have incomplete socket support. */
Fred Drake4baedc12002-04-01 14:53:37 +00003870 PyModule_AddIntConstant(m, "SOCK_RAW", SOCK_RAW);
3871 PyModule_AddIntConstant(m, "SOCK_SEQPACKET", SOCK_SEQPACKET);
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00003872#if defined(SOCK_RDM)
Fred Drake4baedc12002-04-01 14:53:37 +00003873 PyModule_AddIntConstant(m, "SOCK_RDM", SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00003874#endif
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00003875#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003876
3877#ifdef SO_DEBUG
Fred Drake4baedc12002-04-01 14:53:37 +00003878 PyModule_AddIntConstant(m, "SO_DEBUG", SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003879#endif
3880#ifdef SO_ACCEPTCONN
Fred Drake4baedc12002-04-01 14:53:37 +00003881 PyModule_AddIntConstant(m, "SO_ACCEPTCONN", SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003882#endif
3883#ifdef SO_REUSEADDR
Fred Drake4baedc12002-04-01 14:53:37 +00003884 PyModule_AddIntConstant(m, "SO_REUSEADDR", SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003885#endif
3886#ifdef SO_KEEPALIVE
Fred Drake4baedc12002-04-01 14:53:37 +00003887 PyModule_AddIntConstant(m, "SO_KEEPALIVE", SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003888#endif
3889#ifdef SO_DONTROUTE
Fred Drake4baedc12002-04-01 14:53:37 +00003890 PyModule_AddIntConstant(m, "SO_DONTROUTE", SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003891#endif
3892#ifdef SO_BROADCAST
Fred Drake4baedc12002-04-01 14:53:37 +00003893 PyModule_AddIntConstant(m, "SO_BROADCAST", SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003894#endif
3895#ifdef SO_USELOOPBACK
Fred Drake4baedc12002-04-01 14:53:37 +00003896 PyModule_AddIntConstant(m, "SO_USELOOPBACK", SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003897#endif
3898#ifdef SO_LINGER
Fred Drake4baedc12002-04-01 14:53:37 +00003899 PyModule_AddIntConstant(m, "SO_LINGER", SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003900#endif
3901#ifdef SO_OOBINLINE
Fred Drake4baedc12002-04-01 14:53:37 +00003902 PyModule_AddIntConstant(m, "SO_OOBINLINE", SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003903#endif
3904#ifdef SO_REUSEPORT
Fred Drake4baedc12002-04-01 14:53:37 +00003905 PyModule_AddIntConstant(m, "SO_REUSEPORT", SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003906#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003907#ifdef SO_SNDBUF
Fred Drake4baedc12002-04-01 14:53:37 +00003908 PyModule_AddIntConstant(m, "SO_SNDBUF", SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003909#endif
3910#ifdef SO_RCVBUF
Fred Drake4baedc12002-04-01 14:53:37 +00003911 PyModule_AddIntConstant(m, "SO_RCVBUF", SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003912#endif
3913#ifdef SO_SNDLOWAT
Fred Drake4baedc12002-04-01 14:53:37 +00003914 PyModule_AddIntConstant(m, "SO_SNDLOWAT", SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003915#endif
3916#ifdef SO_RCVLOWAT
Fred Drake4baedc12002-04-01 14:53:37 +00003917 PyModule_AddIntConstant(m, "SO_RCVLOWAT", SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003918#endif
3919#ifdef SO_SNDTIMEO
Fred Drake4baedc12002-04-01 14:53:37 +00003920 PyModule_AddIntConstant(m, "SO_SNDTIMEO", SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003921#endif
3922#ifdef SO_RCVTIMEO
Fred Drake4baedc12002-04-01 14:53:37 +00003923 PyModule_AddIntConstant(m, "SO_RCVTIMEO", SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003924#endif
3925#ifdef SO_ERROR
Fred Drake4baedc12002-04-01 14:53:37 +00003926 PyModule_AddIntConstant(m, "SO_ERROR", SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003927#endif
3928#ifdef SO_TYPE
Fred Drake4baedc12002-04-01 14:53:37 +00003929 PyModule_AddIntConstant(m, "SO_TYPE", SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003930#endif
3931
3932 /* Maximum number of connections for "listen" */
3933#ifdef SOMAXCONN
Fred Drake4baedc12002-04-01 14:53:37 +00003934 PyModule_AddIntConstant(m, "SOMAXCONN", SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003935#else
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003936 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003937#endif
3938
3939 /* Flags for send, recv */
3940#ifdef MSG_OOB
Fred Drake4baedc12002-04-01 14:53:37 +00003941 PyModule_AddIntConstant(m, "MSG_OOB", MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003942#endif
3943#ifdef MSG_PEEK
Fred Drake4baedc12002-04-01 14:53:37 +00003944 PyModule_AddIntConstant(m, "MSG_PEEK", MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003945#endif
3946#ifdef MSG_DONTROUTE
Fred Drake4baedc12002-04-01 14:53:37 +00003947 PyModule_AddIntConstant(m, "MSG_DONTROUTE", MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003948#endif
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00003949#ifdef MSG_DONTWAIT
Fred Drake4baedc12002-04-01 14:53:37 +00003950 PyModule_AddIntConstant(m, "MSG_DONTWAIT", MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00003951#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003952#ifdef MSG_EOR
Fred Drake4baedc12002-04-01 14:53:37 +00003953 PyModule_AddIntConstant(m, "MSG_EOR", MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003954#endif
3955#ifdef MSG_TRUNC
Fred Drake4baedc12002-04-01 14:53:37 +00003956 PyModule_AddIntConstant(m, "MSG_TRUNC", MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003957#endif
3958#ifdef MSG_CTRUNC
Fred Drake4baedc12002-04-01 14:53:37 +00003959 PyModule_AddIntConstant(m, "MSG_CTRUNC", MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003960#endif
3961#ifdef MSG_WAITALL
Fred Drake4baedc12002-04-01 14:53:37 +00003962 PyModule_AddIntConstant(m, "MSG_WAITALL", MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003963#endif
3964#ifdef MSG_BTAG
Fred Drake4baedc12002-04-01 14:53:37 +00003965 PyModule_AddIntConstant(m, "MSG_BTAG", MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003966#endif
3967#ifdef MSG_ETAG
Fred Drake4baedc12002-04-01 14:53:37 +00003968 PyModule_AddIntConstant(m, "MSG_ETAG", MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003969#endif
3970
3971 /* Protocol level and numbers, usable for [gs]etsockopt */
3972#ifdef SOL_SOCKET
Fred Drake4baedc12002-04-01 14:53:37 +00003973 PyModule_AddIntConstant(m, "SOL_SOCKET", SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003974#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00003975#ifdef SOL_IP
Fred Drake4baedc12002-04-01 14:53:37 +00003976 PyModule_AddIntConstant(m, "SOL_IP", SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00003977#else
Fred Drake4baedc12002-04-01 14:53:37 +00003978 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00003979#endif
3980#ifdef SOL_IPX
Fred Drake4baedc12002-04-01 14:53:37 +00003981 PyModule_AddIntConstant(m, "SOL_IPX", SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00003982#endif
3983#ifdef SOL_AX25
Fred Drake4baedc12002-04-01 14:53:37 +00003984 PyModule_AddIntConstant(m, "SOL_AX25", SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00003985#endif
3986#ifdef SOL_ATALK
Fred Drake4baedc12002-04-01 14:53:37 +00003987 PyModule_AddIntConstant(m, "SOL_ATALK", SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00003988#endif
3989#ifdef SOL_NETROM
Fred Drake4baedc12002-04-01 14:53:37 +00003990 PyModule_AddIntConstant(m, "SOL_NETROM", SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00003991#endif
3992#ifdef SOL_ROSE
Fred Drake4baedc12002-04-01 14:53:37 +00003993 PyModule_AddIntConstant(m, "SOL_ROSE", SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00003994#endif
3995#ifdef SOL_TCP
Fred Drake4baedc12002-04-01 14:53:37 +00003996 PyModule_AddIntConstant(m, "SOL_TCP", SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00003997#else
Fred Drake4baedc12002-04-01 14:53:37 +00003998 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00003999#endif
4000#ifdef SOL_UDP
Fred Drake4baedc12002-04-01 14:53:37 +00004001 PyModule_AddIntConstant(m, "SOL_UDP", SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00004002#else
Fred Drake4baedc12002-04-01 14:53:37 +00004003 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00004004#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004005#ifdef IPPROTO_IP
Fred Drake4baedc12002-04-01 14:53:37 +00004006 PyModule_AddIntConstant(m, "IPPROTO_IP", IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00004007#else
Fred Drake4baedc12002-04-01 14:53:37 +00004008 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004009#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004010#ifdef IPPROTO_HOPOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00004011 PyModule_AddIntConstant(m, "IPPROTO_HOPOPTS", IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004012#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004013#ifdef IPPROTO_ICMP
Fred Drake4baedc12002-04-01 14:53:37 +00004014 PyModule_AddIntConstant(m, "IPPROTO_ICMP", IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00004015#else
Fred Drake4baedc12002-04-01 14:53:37 +00004016 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004017#endif
4018#ifdef IPPROTO_IGMP
Fred Drake4baedc12002-04-01 14:53:37 +00004019 PyModule_AddIntConstant(m, "IPPROTO_IGMP", IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004020#endif
4021#ifdef IPPROTO_GGP
Fred Drake4baedc12002-04-01 14:53:37 +00004022 PyModule_AddIntConstant(m, "IPPROTO_GGP", IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004023#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004024#ifdef IPPROTO_IPV4
Fred Drake4baedc12002-04-01 14:53:37 +00004025 PyModule_AddIntConstant(m, "IPPROTO_IPV4", IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004026#endif
Martin v. Löwisa0f17342003-10-03 13:56:20 +00004027#ifdef IPPROTO_IPV6
4028 PyModule_AddIntConstant(m, "IPPROTO_IPV6", IPPROTO_IPV6);
4029#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004030#ifdef IPPROTO_IPIP
Fred Drake4baedc12002-04-01 14:53:37 +00004031 PyModule_AddIntConstant(m, "IPPROTO_IPIP", IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004032#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004033#ifdef IPPROTO_TCP
Fred Drake4baedc12002-04-01 14:53:37 +00004034 PyModule_AddIntConstant(m, "IPPROTO_TCP", IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00004035#else
Fred Drake4baedc12002-04-01 14:53:37 +00004036 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004037#endif
4038#ifdef IPPROTO_EGP
Fred Drake4baedc12002-04-01 14:53:37 +00004039 PyModule_AddIntConstant(m, "IPPROTO_EGP", IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004040#endif
4041#ifdef IPPROTO_PUP
Fred Drake4baedc12002-04-01 14:53:37 +00004042 PyModule_AddIntConstant(m, "IPPROTO_PUP", IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004043#endif
4044#ifdef IPPROTO_UDP
Fred Drake4baedc12002-04-01 14:53:37 +00004045 PyModule_AddIntConstant(m, "IPPROTO_UDP", IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00004046#else
Fred Drake4baedc12002-04-01 14:53:37 +00004047 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004048#endif
4049#ifdef IPPROTO_IDP
Fred Drake4baedc12002-04-01 14:53:37 +00004050 PyModule_AddIntConstant(m, "IPPROTO_IDP", IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004051#endif
4052#ifdef IPPROTO_HELLO
Fred Drake4baedc12002-04-01 14:53:37 +00004053 PyModule_AddIntConstant(m, "IPPROTO_HELLO", IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004054#endif
4055#ifdef IPPROTO_ND
Fred Drake4baedc12002-04-01 14:53:37 +00004056 PyModule_AddIntConstant(m, "IPPROTO_ND", IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004057#endif
4058#ifdef IPPROTO_TP
Fred Drake4baedc12002-04-01 14:53:37 +00004059 PyModule_AddIntConstant(m, "IPPROTO_TP", IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004060#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004061#ifdef IPPROTO_IPV6
Fred Drake4baedc12002-04-01 14:53:37 +00004062 PyModule_AddIntConstant(m, "IPPROTO_IPV6", IPPROTO_IPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004063#endif
4064#ifdef IPPROTO_ROUTING
Fred Drake4baedc12002-04-01 14:53:37 +00004065 PyModule_AddIntConstant(m, "IPPROTO_ROUTING", IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004066#endif
4067#ifdef IPPROTO_FRAGMENT
Fred Drake4baedc12002-04-01 14:53:37 +00004068 PyModule_AddIntConstant(m, "IPPROTO_FRAGMENT", IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004069#endif
4070#ifdef IPPROTO_RSVP
Fred Drake4baedc12002-04-01 14:53:37 +00004071 PyModule_AddIntConstant(m, "IPPROTO_RSVP", IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004072#endif
4073#ifdef IPPROTO_GRE
Fred Drake4baedc12002-04-01 14:53:37 +00004074 PyModule_AddIntConstant(m, "IPPROTO_GRE", IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004075#endif
4076#ifdef IPPROTO_ESP
Fred Drake4baedc12002-04-01 14:53:37 +00004077 PyModule_AddIntConstant(m, "IPPROTO_ESP", IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004078#endif
4079#ifdef IPPROTO_AH
Fred Drake4baedc12002-04-01 14:53:37 +00004080 PyModule_AddIntConstant(m, "IPPROTO_AH", IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004081#endif
4082#ifdef IPPROTO_MOBILE
Fred Drake4baedc12002-04-01 14:53:37 +00004083 PyModule_AddIntConstant(m, "IPPROTO_MOBILE", IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004084#endif
4085#ifdef IPPROTO_ICMPV6
Fred Drake4baedc12002-04-01 14:53:37 +00004086 PyModule_AddIntConstant(m, "IPPROTO_ICMPV6", IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004087#endif
4088#ifdef IPPROTO_NONE
Fred Drake4baedc12002-04-01 14:53:37 +00004089 PyModule_AddIntConstant(m, "IPPROTO_NONE", IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004090#endif
4091#ifdef IPPROTO_DSTOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00004092 PyModule_AddIntConstant(m, "IPPROTO_DSTOPTS", IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004093#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004094#ifdef IPPROTO_XTP
Fred Drake4baedc12002-04-01 14:53:37 +00004095 PyModule_AddIntConstant(m, "IPPROTO_XTP", IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004096#endif
4097#ifdef IPPROTO_EON
Fred Drake4baedc12002-04-01 14:53:37 +00004098 PyModule_AddIntConstant(m, "IPPROTO_EON", IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004099#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004100#ifdef IPPROTO_PIM
Fred Drake4baedc12002-04-01 14:53:37 +00004101 PyModule_AddIntConstant(m, "IPPROTO_PIM", IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004102#endif
4103#ifdef IPPROTO_IPCOMP
Fred Drake4baedc12002-04-01 14:53:37 +00004104 PyModule_AddIntConstant(m, "IPPROTO_IPCOMP", IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004105#endif
4106#ifdef IPPROTO_VRRP
Fred Drake4baedc12002-04-01 14:53:37 +00004107 PyModule_AddIntConstant(m, "IPPROTO_VRRP", IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004108#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004109#ifdef IPPROTO_BIP
Fred Drake4baedc12002-04-01 14:53:37 +00004110 PyModule_AddIntConstant(m, "IPPROTO_BIP", IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004111#endif
4112/**/
4113#ifdef IPPROTO_RAW
Fred Drake4baedc12002-04-01 14:53:37 +00004114 PyModule_AddIntConstant(m, "IPPROTO_RAW", IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00004115#else
Fred Drake4baedc12002-04-01 14:53:37 +00004116 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004117#endif
4118#ifdef IPPROTO_MAX
Fred Drake4baedc12002-04-01 14:53:37 +00004119 PyModule_AddIntConstant(m, "IPPROTO_MAX", IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004120#endif
4121
4122 /* Some port configuration */
4123#ifdef IPPORT_RESERVED
Fred Drake4baedc12002-04-01 14:53:37 +00004124 PyModule_AddIntConstant(m, "IPPORT_RESERVED", IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004125#else
Fred Drake4baedc12002-04-01 14:53:37 +00004126 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004127#endif
4128#ifdef IPPORT_USERRESERVED
Fred Drake4baedc12002-04-01 14:53:37 +00004129 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004130#else
Fred Drake4baedc12002-04-01 14:53:37 +00004131 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004132#endif
4133
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004134 /* Some reserved IP v.4 addresses */
4135#ifdef INADDR_ANY
Fred Drake4baedc12002-04-01 14:53:37 +00004136 PyModule_AddIntConstant(m, "INADDR_ANY", INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004137#else
Fred Drake4baedc12002-04-01 14:53:37 +00004138 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004139#endif
4140#ifdef INADDR_BROADCAST
Fred Drake4baedc12002-04-01 14:53:37 +00004141 PyModule_AddIntConstant(m, "INADDR_BROADCAST", INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004142#else
Fred Drake4baedc12002-04-01 14:53:37 +00004143 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004144#endif
4145#ifdef INADDR_LOOPBACK
Fred Drake4baedc12002-04-01 14:53:37 +00004146 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004147#else
Fred Drake4baedc12002-04-01 14:53:37 +00004148 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004149#endif
4150#ifdef INADDR_UNSPEC_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00004151 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004152#else
Fred Drake4baedc12002-04-01 14:53:37 +00004153 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004154#endif
4155#ifdef INADDR_ALLHOSTS_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00004156 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
4157 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004158#else
Fred Drake4baedc12002-04-01 14:53:37 +00004159 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004160#endif
4161#ifdef INADDR_MAX_LOCAL_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00004162 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP",
4163 INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004164#else
Fred Drake4baedc12002-04-01 14:53:37 +00004165 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004166#endif
4167#ifdef INADDR_NONE
Fred Drake4baedc12002-04-01 14:53:37 +00004168 PyModule_AddIntConstant(m, "INADDR_NONE", INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004169#else
Fred Drake4baedc12002-04-01 14:53:37 +00004170 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004171#endif
4172
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004173 /* IPv4 [gs]etsockopt options */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004174#ifdef IP_OPTIONS
Fred Drake4baedc12002-04-01 14:53:37 +00004175 PyModule_AddIntConstant(m, "IP_OPTIONS", IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004176#endif
4177#ifdef IP_HDRINCL
Fred Drake4baedc12002-04-01 14:53:37 +00004178 PyModule_AddIntConstant(m, "IP_HDRINCL", IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004179#endif
4180#ifdef IP_TOS
Fred Drake4baedc12002-04-01 14:53:37 +00004181 PyModule_AddIntConstant(m, "IP_TOS", IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004182#endif
4183#ifdef IP_TTL
Fred Drake4baedc12002-04-01 14:53:37 +00004184 PyModule_AddIntConstant(m, "IP_TTL", IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004185#endif
4186#ifdef IP_RECVOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00004187 PyModule_AddIntConstant(m, "IP_RECVOPTS", IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004188#endif
4189#ifdef IP_RECVRETOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00004190 PyModule_AddIntConstant(m, "IP_RECVRETOPTS", IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004191#endif
4192#ifdef IP_RECVDSTADDR
Fred Drake4baedc12002-04-01 14:53:37 +00004193 PyModule_AddIntConstant(m, "IP_RECVDSTADDR", IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004194#endif
4195#ifdef IP_RETOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00004196 PyModule_AddIntConstant(m, "IP_RETOPTS", IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004197#endif
4198#ifdef IP_MULTICAST_IF
Fred Drake4baedc12002-04-01 14:53:37 +00004199 PyModule_AddIntConstant(m, "IP_MULTICAST_IF", IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004200#endif
4201#ifdef IP_MULTICAST_TTL
Fred Drake4baedc12002-04-01 14:53:37 +00004202 PyModule_AddIntConstant(m, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004203#endif
4204#ifdef IP_MULTICAST_LOOP
Fred Drake4baedc12002-04-01 14:53:37 +00004205 PyModule_AddIntConstant(m, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004206#endif
4207#ifdef IP_ADD_MEMBERSHIP
Fred Drake4baedc12002-04-01 14:53:37 +00004208 PyModule_AddIntConstant(m, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004209#endif
4210#ifdef IP_DROP_MEMBERSHIP
Fred Drake4baedc12002-04-01 14:53:37 +00004211 PyModule_AddIntConstant(m, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004212#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00004213#ifdef IP_DEFAULT_MULTICAST_TTL
Fred Drake4baedc12002-04-01 14:53:37 +00004214 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_TTL",
4215 IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00004216#endif
4217#ifdef IP_DEFAULT_MULTICAST_LOOP
Fred Drake4baedc12002-04-01 14:53:37 +00004218 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_LOOP",
4219 IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00004220#endif
4221#ifdef IP_MAX_MEMBERSHIPS
Fred Drake4baedc12002-04-01 14:53:37 +00004222 PyModule_AddIntConstant(m, "IP_MAX_MEMBERSHIPS", IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00004223#endif
4224
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004225 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
4226#ifdef IPV6_JOIN_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00004227 PyModule_AddIntConstant(m, "IPV6_JOIN_GROUP", IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004228#endif
4229#ifdef IPV6_LEAVE_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00004230 PyModule_AddIntConstant(m, "IPV6_LEAVE_GROUP", IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004231#endif
4232#ifdef IPV6_MULTICAST_HOPS
Fred Drake4baedc12002-04-01 14:53:37 +00004233 PyModule_AddIntConstant(m, "IPV6_MULTICAST_HOPS", IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004234#endif
4235#ifdef IPV6_MULTICAST_IF
Fred Drake4baedc12002-04-01 14:53:37 +00004236 PyModule_AddIntConstant(m, "IPV6_MULTICAST_IF", IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004237#endif
4238#ifdef IPV6_MULTICAST_LOOP
Fred Drake4baedc12002-04-01 14:53:37 +00004239 PyModule_AddIntConstant(m, "IPV6_MULTICAST_LOOP", IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004240#endif
4241#ifdef IPV6_UNICAST_HOPS
Fred Drake4baedc12002-04-01 14:53:37 +00004242 PyModule_AddIntConstant(m, "IPV6_UNICAST_HOPS", IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004243#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00004244 /* Additional IPV6 socket options, defined in RFC 3493 */
4245#ifdef IPV6_V6ONLY
4246 PyModule_AddIntConstant(m, "IPV6_V6ONLY", IPV6_V6ONLY);
4247#endif
4248 /* Advanced IPV6 socket options, from RFC 3542 */
4249#ifdef IPV6_CHECKSUM
4250 PyModule_AddIntConstant(m, "IPV6_CHECKSUM", IPV6_CHECKSUM);
4251#endif
4252#ifdef IPV6_DONTFRAG
4253 PyModule_AddIntConstant(m, "IPV6_DONTFRAG", IPV6_DONTFRAG);
4254#endif
4255#ifdef IPV6_DSTOPTS
4256 PyModule_AddIntConstant(m, "IPV6_DSTOPTS", IPV6_DSTOPTS);
4257#endif
4258#ifdef IPV6_HOPLIMIT
4259 PyModule_AddIntConstant(m, "IPV6_HOPLIMIT", IPV6_HOPLIMIT);
4260#endif
4261#ifdef IPV6_HOPOPTS
4262 PyModule_AddIntConstant(m, "IPV6_HOPOPTS", IPV6_HOPOPTS);
4263#endif
4264#ifdef IPV6_NEXTHOP
4265 PyModule_AddIntConstant(m, "IPV6_NEXTHOP", IPV6_NEXTHOP);
4266#endif
4267#ifdef IPV6_PATHMTU
4268 PyModule_AddIntConstant(m, "IPV6_PATHMTU", IPV6_PATHMTU);
4269#endif
4270#ifdef IPV6_PKTINFO
4271 PyModule_AddIntConstant(m, "IPV6_PKTINFO", IPV6_PKTINFO);
4272#endif
4273#ifdef IPV6_RECVDSTOPTS
4274 PyModule_AddIntConstant(m, "IPV6_RECVDSTOPTS", IPV6_RECVDSTOPTS);
4275#endif
4276#ifdef IPV6_RECVHOPLIMIT
4277 PyModule_AddIntConstant(m, "IPV6_RECVHOPLIMIT", IPV6_RECVHOPLIMIT);
4278#endif
4279#ifdef IPV6_RECVHOPOPTS
4280 PyModule_AddIntConstant(m, "IPV6_RECVHOPOPTS", IPV6_RECVHOPOPTS);
4281#endif
4282#ifdef IPV6_RECVPKTINFO
4283 PyModule_AddIntConstant(m, "IPV6_RECVPKTINFO", IPV6_RECVPKTINFO);
4284#endif
4285#ifdef IPV6_RECVRTHDR
4286 PyModule_AddIntConstant(m, "IPV6_RECVRTHDR", IPV6_RECVRTHDR);
4287#endif
4288#ifdef IPV6_RECVTCLASS
4289 PyModule_AddIntConstant(m, "IPV6_RECVTCLASS", IPV6_RECVTCLASS);
4290#endif
4291#ifdef IPV6_RTHDR
4292 PyModule_AddIntConstant(m, "IPV6_RTHDR", IPV6_RTHDR);
4293#endif
4294#ifdef IPV6_RTHDRDSTOPTS
4295 PyModule_AddIntConstant(m, "IPV6_RTHDRDSTOPTS", IPV6_RTHDRDSTOPTS);
4296#endif
4297#ifdef IPV6_RTHDR_TYPE_0
4298 PyModule_AddIntConstant(m, "IPV6_RTHDR_TYPE_0", IPV6_RTHDR_TYPE_0);
4299#endif
4300#ifdef IPV6_RECVPATHMTU
4301 PyModule_AddIntConstant(m, "IPV6_RECVPATHMTU", IPV6_RECVPATHMTU);
4302#endif
4303#ifdef IPV6_TCLASS
4304 PyModule_AddIntConstant(m, "IPV6_TCLASS", IPV6_TCLASS);
4305#endif
4306#ifdef IPV6_USE_MIN_MTU
4307 PyModule_AddIntConstant(m, "IPV6_USE_MIN_MTU", IPV6_USE_MIN_MTU);
4308#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004309
Guido van Rossum09be4091999-08-09 14:40:40 +00004310 /* TCP options */
4311#ifdef TCP_NODELAY
Fred Drake4baedc12002-04-01 14:53:37 +00004312 PyModule_AddIntConstant(m, "TCP_NODELAY", TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00004313#endif
4314#ifdef TCP_MAXSEG
Fred Drake4baedc12002-04-01 14:53:37 +00004315 PyModule_AddIntConstant(m, "TCP_MAXSEG", TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00004316#endif
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004317#ifdef TCP_CORK
Fred Drake4baedc12002-04-01 14:53:37 +00004318 PyModule_AddIntConstant(m, "TCP_CORK", TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004319#endif
4320#ifdef TCP_KEEPIDLE
Fred Drake4baedc12002-04-01 14:53:37 +00004321 PyModule_AddIntConstant(m, "TCP_KEEPIDLE", TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004322#endif
4323#ifdef TCP_KEEPINTVL
Fred Drake4baedc12002-04-01 14:53:37 +00004324 PyModule_AddIntConstant(m, "TCP_KEEPINTVL", TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004325#endif
4326#ifdef TCP_KEEPCNT
Fred Drake4baedc12002-04-01 14:53:37 +00004327 PyModule_AddIntConstant(m, "TCP_KEEPCNT", TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004328#endif
4329#ifdef TCP_SYNCNT
Fred Drake4baedc12002-04-01 14:53:37 +00004330 PyModule_AddIntConstant(m, "TCP_SYNCNT", TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004331#endif
4332#ifdef TCP_LINGER2
Fred Drake4baedc12002-04-01 14:53:37 +00004333 PyModule_AddIntConstant(m, "TCP_LINGER2", TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004334#endif
4335#ifdef TCP_DEFER_ACCEPT
Fred Drake4baedc12002-04-01 14:53:37 +00004336 PyModule_AddIntConstant(m, "TCP_DEFER_ACCEPT", TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004337#endif
4338#ifdef TCP_WINDOW_CLAMP
Fred Drake4baedc12002-04-01 14:53:37 +00004339 PyModule_AddIntConstant(m, "TCP_WINDOW_CLAMP", TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004340#endif
4341#ifdef TCP_INFO
Fred Drake4baedc12002-04-01 14:53:37 +00004342 PyModule_AddIntConstant(m, "TCP_INFO", TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004343#endif
4344#ifdef TCP_QUICKACK
Fred Drake4baedc12002-04-01 14:53:37 +00004345 PyModule_AddIntConstant(m, "TCP_QUICKACK", TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004346#endif
4347
Guido van Rossum09be4091999-08-09 14:40:40 +00004348
4349 /* IPX options */
4350#ifdef IPX_TYPE
Fred Drake4baedc12002-04-01 14:53:37 +00004351 PyModule_AddIntConstant(m, "IPX_TYPE", IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00004352#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004353
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004354 /* get{addr,name}info parameters */
4355#ifdef EAI_ADDRFAMILY
Fred Drake4baedc12002-04-01 14:53:37 +00004356 PyModule_AddIntConstant(m, "EAI_ADDRFAMILY", EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004357#endif
4358#ifdef EAI_AGAIN
Fred Drake4baedc12002-04-01 14:53:37 +00004359 PyModule_AddIntConstant(m, "EAI_AGAIN", EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004360#endif
4361#ifdef EAI_BADFLAGS
Fred Drake4baedc12002-04-01 14:53:37 +00004362 PyModule_AddIntConstant(m, "EAI_BADFLAGS", EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004363#endif
4364#ifdef EAI_FAIL
Fred Drake4baedc12002-04-01 14:53:37 +00004365 PyModule_AddIntConstant(m, "EAI_FAIL", EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004366#endif
4367#ifdef EAI_FAMILY
Fred Drake4baedc12002-04-01 14:53:37 +00004368 PyModule_AddIntConstant(m, "EAI_FAMILY", EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004369#endif
4370#ifdef EAI_MEMORY
Fred Drake4baedc12002-04-01 14:53:37 +00004371 PyModule_AddIntConstant(m, "EAI_MEMORY", EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004372#endif
4373#ifdef EAI_NODATA
Fred Drake4baedc12002-04-01 14:53:37 +00004374 PyModule_AddIntConstant(m, "EAI_NODATA", EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004375#endif
4376#ifdef EAI_NONAME
Fred Drake4baedc12002-04-01 14:53:37 +00004377 PyModule_AddIntConstant(m, "EAI_NONAME", EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004378#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00004379#ifdef EAI_OVERFLOW
4380 PyModule_AddIntConstant(m, "EAI_OVERFLOW", EAI_OVERFLOW);
4381#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004382#ifdef EAI_SERVICE
Fred Drake4baedc12002-04-01 14:53:37 +00004383 PyModule_AddIntConstant(m, "EAI_SERVICE", EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004384#endif
4385#ifdef EAI_SOCKTYPE
Fred Drake4baedc12002-04-01 14:53:37 +00004386 PyModule_AddIntConstant(m, "EAI_SOCKTYPE", EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004387#endif
4388#ifdef EAI_SYSTEM
Fred Drake4baedc12002-04-01 14:53:37 +00004389 PyModule_AddIntConstant(m, "EAI_SYSTEM", EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004390#endif
4391#ifdef EAI_BADHINTS
Fred Drake4baedc12002-04-01 14:53:37 +00004392 PyModule_AddIntConstant(m, "EAI_BADHINTS", EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004393#endif
4394#ifdef EAI_PROTOCOL
Fred Drake4baedc12002-04-01 14:53:37 +00004395 PyModule_AddIntConstant(m, "EAI_PROTOCOL", EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004396#endif
4397#ifdef EAI_MAX
Fred Drake4baedc12002-04-01 14:53:37 +00004398 PyModule_AddIntConstant(m, "EAI_MAX", EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004399#endif
4400#ifdef AI_PASSIVE
Fred Drake4baedc12002-04-01 14:53:37 +00004401 PyModule_AddIntConstant(m, "AI_PASSIVE", AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004402#endif
4403#ifdef AI_CANONNAME
Fred Drake4baedc12002-04-01 14:53:37 +00004404 PyModule_AddIntConstant(m, "AI_CANONNAME", AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004405#endif
4406#ifdef AI_NUMERICHOST
Fred Drake4baedc12002-04-01 14:53:37 +00004407 PyModule_AddIntConstant(m, "AI_NUMERICHOST", AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004408#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00004409#ifdef AI_NUMERICSERV
4410 PyModule_AddIntConstant(m, "AI_NUMERICSERV", AI_NUMERICSERV);
4411#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004412#ifdef AI_MASK
Fred Drake4baedc12002-04-01 14:53:37 +00004413 PyModule_AddIntConstant(m, "AI_MASK", AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004414#endif
4415#ifdef AI_ALL
Fred Drake4baedc12002-04-01 14:53:37 +00004416 PyModule_AddIntConstant(m, "AI_ALL", AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004417#endif
4418#ifdef AI_V4MAPPED_CFG
Fred Drake4baedc12002-04-01 14:53:37 +00004419 PyModule_AddIntConstant(m, "AI_V4MAPPED_CFG", AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004420#endif
4421#ifdef AI_ADDRCONFIG
Fred Drake4baedc12002-04-01 14:53:37 +00004422 PyModule_AddIntConstant(m, "AI_ADDRCONFIG", AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004423#endif
4424#ifdef AI_V4MAPPED
Fred Drake4baedc12002-04-01 14:53:37 +00004425 PyModule_AddIntConstant(m, "AI_V4MAPPED", AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004426#endif
4427#ifdef AI_DEFAULT
Fred Drake4baedc12002-04-01 14:53:37 +00004428 PyModule_AddIntConstant(m, "AI_DEFAULT", AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004429#endif
4430#ifdef NI_MAXHOST
Fred Drake4baedc12002-04-01 14:53:37 +00004431 PyModule_AddIntConstant(m, "NI_MAXHOST", NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004432#endif
4433#ifdef NI_MAXSERV
Fred Drake4baedc12002-04-01 14:53:37 +00004434 PyModule_AddIntConstant(m, "NI_MAXSERV", NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004435#endif
4436#ifdef NI_NOFQDN
Fred Drake4baedc12002-04-01 14:53:37 +00004437 PyModule_AddIntConstant(m, "NI_NOFQDN", NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004438#endif
4439#ifdef NI_NUMERICHOST
Fred Drake4baedc12002-04-01 14:53:37 +00004440 PyModule_AddIntConstant(m, "NI_NUMERICHOST", NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004441#endif
4442#ifdef NI_NAMEREQD
Fred Drake4baedc12002-04-01 14:53:37 +00004443 PyModule_AddIntConstant(m, "NI_NAMEREQD", NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004444#endif
4445#ifdef NI_NUMERICSERV
Fred Drake4baedc12002-04-01 14:53:37 +00004446 PyModule_AddIntConstant(m, "NI_NUMERICSERV", NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004447#endif
4448#ifdef NI_DGRAM
Fred Drake4baedc12002-04-01 14:53:37 +00004449 PyModule_AddIntConstant(m, "NI_DGRAM", NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004450#endif
4451
Martin v. Löwis94681fc2003-11-27 19:40:22 +00004452 /* shutdown() parameters */
4453#ifdef SHUT_RD
4454 PyModule_AddIntConstant(m, "SHUT_RD", SHUT_RD);
4455#elif defined(SD_RECEIVE)
4456 PyModule_AddIntConstant(m, "SHUT_RD", SD_RECEIVE);
4457#else
4458 PyModule_AddIntConstant(m, "SHUT_RD", 0);
4459#endif
4460#ifdef SHUT_WR
4461 PyModule_AddIntConstant(m, "SHUT_WR", SHUT_WR);
4462#elif defined(SD_SEND)
4463 PyModule_AddIntConstant(m, "SHUT_WR", SD_SEND);
4464#else
4465 PyModule_AddIntConstant(m, "SHUT_WR", 1);
4466#endif
4467#ifdef SHUT_RDWR
4468 PyModule_AddIntConstant(m, "SHUT_RDWR", SHUT_RDWR);
4469#elif defined(SD_BOTH)
4470 PyModule_AddIntConstant(m, "SHUT_RDWR", SD_BOTH);
4471#else
4472 PyModule_AddIntConstant(m, "SHUT_RDWR", 2);
4473#endif
4474
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004475 /* Initialize gethostbyname lock */
Just van Rossum1040d2c2003-05-09 07:53:18 +00004476#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
4477 netdb_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004478#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004479}
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004480
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004481
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004482#ifndef HAVE_INET_PTON
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004483
4484/* Simplistic emulation code for inet_pton that only works for IPv4 */
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004485/* These are not exposed because they do not set errno properly */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004486
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004487int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004488inet_pton(int af, const char *src, void *dst)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004489{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004490 if (af == AF_INET) {
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004491 long packed_addr;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004492 packed_addr = inet_addr(src);
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004493 if (packed_addr == INADDR_NONE)
4494 return 0;
4495 memcpy(dst, &packed_addr, 4);
4496 return 1;
4497 }
4498 /* Should set errno to EAFNOSUPPORT */
4499 return -1;
4500}
4501
Martin v. Löwisc925b1532001-07-21 09:42:15 +00004502const char *
4503inet_ntop(int af, const void *src, char *dst, socklen_t size)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004504{
4505 if (af == AF_INET) {
4506 struct in_addr packed_addr;
4507 if (size < 16)
4508 /* Should set errno to ENOSPC. */
4509 return NULL;
4510 memcpy(&packed_addr, src, sizeof(packed_addr));
4511 return strncpy(dst, inet_ntoa(packed_addr), size);
4512 }
4513 /* Should set errno to EAFNOSUPPORT */
4514 return NULL;
4515}
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004516
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004517#endif