blob: e6db05bf25d990b084db1760776dee91a1662536 [file] [log] [blame]
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001/* Socket module */
2
3/*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005This module provides an interface to Berkeley socket IPC.
6
7Limitations:
8
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00009- Only AF_INET, AF_INET6 and AF_UNIX address families are supported in a
Jeremy Hylton22308652001-02-02 03:23:09 +000010 portable manner, though AF_PACKET is supported under Linux.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000011- No read/write operations (use sendall/recv or makefile instead).
12- Additional restrictions apply on some non-Unix platforms (compensated
13 for by socket.py).
Guido van Rossum6574b3e1991-06-25 21:36:08 +000014
Guido van Rossum27e177d1995-03-16 15:43:47 +000015Module interface:
Guido van Rossum6574b3e1991-06-25 21:36:08 +000016
Guido van Rossum27e177d1995-03-16 15:43:47 +000017- socket.error: exception raised for socket specific errors
Martin v. Löwis2d8d4272001-07-21 18:05:31 +000018- socket.gaierror: exception raised for getaddrinfo/getnameinfo errors,
19 a subclass of socket.error
20- socket.herror: exception raised for gethostby* errors,
21 a subclass of socket.error
Guido van Rossum83a072d2002-09-03 19:10:18 +000022- socket.fromfd(fd, family, type[, proto]) --> new socket object (created
23 from an existing file descriptor)
Guido van Rossum30a685f1991-06-27 15:51:29 +000024- socket.gethostbyname(hostname) --> host IP address (string: 'dd.dd.dd.dd')
Guido van Rossum3bbc62e1995-01-02 19:30:30 +000025- socket.gethostbyaddr(IP address) --> (hostname, [alias, ...], [IP addr, ...])
Guido van Rossum27e177d1995-03-16 15:43:47 +000026- socket.gethostname() --> host name (string: 'spam' or 'spam.domain.com')
Guido van Rossum25405c71996-12-19 16:42:52 +000027- socket.getprotobyname(protocolname) --> protocol number
Barry Warsaw11b91a02004-06-28 00:50:43 +000028- socket.getservbyname(servicename[, protocolname]) --> port number
29- socket.getservbyport(portnumber[, protocolname]) --> service name
Guido van Rossum83a072d2002-09-03 19:10:18 +000030- socket.socket([family[, type [, proto]]]) --> new socket object
Dave Cole331708b2004-08-09 04:51:41 +000031- socket.socketpair([family[, type [, proto]]]) --> (socket, socket)
Guido van Rossum006bf911996-06-12 04:04:55 +000032- socket.ntohs(16 bit value) --> new int object
33- socket.ntohl(32 bit value) --> new int object
34- socket.htons(16 bit value) --> new int object
35- socket.htonl(32 bit value) --> new int object
Martin v. Löwis2d8d4272001-07-21 18:05:31 +000036- socket.getaddrinfo(host, port [, family, socktype, proto, flags])
37 --> List of (family, socktype, proto, canonname, sockaddr)
38- socket.getnameinfo(sockaddr, flags) --> (host, port)
Guido van Rossum27e177d1995-03-16 15:43:47 +000039- socket.AF_INET, socket.SOCK_STREAM, etc.: constants from <socket.h>
Guido van Rossum47dfa4a2003-04-25 05:48:32 +000040- socket.has_ipv6: boolean value indicating if IPv6 is supported
Guido van Rossum5c9eb211999-08-20 18:21:51 +000041- socket.inet_aton(IP address) -> 32-bit packed IP representation
42- socket.inet_ntoa(packed IP) -> IP address string
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +000043- socket.getdefaulttimeout() -> None | float
44- socket.setdefaulttimeout(None | float)
Guido van Rossum6574b3e1991-06-25 21:36:08 +000045- an Internet socket address is a pair (hostname, port)
46 where hostname can be anything recognized by gethostbyname()
47 (including the dd.dd.dd.dd notation) and port is in host byte order
48- where a hostname is returned, the dd.dd.dd.dd notation is used
Guido van Rossum27e177d1995-03-16 15:43:47 +000049- a UNIX domain socket address is a string specifying the pathname
Jeremy Hylton22308652001-02-02 03:23:09 +000050- an AF_PACKET socket address is a tuple containing a string
51 specifying the ethernet interface and an integer specifying
52 the Ethernet protocol number to be received. For example:
Jeremy Hyltondbfb6622001-02-02 19:55:17 +000053 ("eth0",0x1234). Optional 3rd,4th,5th elements in the tuple
Andrew M. Kuchlingb8e17172004-07-10 23:39:35 +000054 specify packet-type and ha-type/addr.
Guido van Rossum6574b3e1991-06-25 21:36:08 +000055
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000056Local naming conventions:
Guido van Rossum6574b3e1991-06-25 21:36:08 +000057
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000058- names starting with sock_ are socket object methods
59- names starting with socket_ are module-level functions
60- names starting with PySocket are exported through socketmodule.h
Guido van Rossum30a685f1991-06-27 15:51:29 +000061
Guido van Rossum6574b3e1991-06-25 21:36:08 +000062*/
63
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000064#include "Python.h"
65
Guido van Rossum47dfa4a2003-04-25 05:48:32 +000066#undef MAX
67#define MAX(x, y) ((x) < (y) ? (y) : (x))
68
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000069/* Socket object documentation */
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000070PyDoc_STRVAR(sock_doc,
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000071"socket([family[, type[, proto]]]) -> socket object\n\
72\n\
73Open a socket of the given type. The family argument specifies the\n\
74address family; it defaults to AF_INET. The type argument specifies\n\
75whether this is a stream (SOCK_STREAM, this is the default)\n\
76or datagram (SOCK_DGRAM) socket. The protocol argument defaults to 0,\n\
77specifying the default protocol. Keyword arguments are accepted.\n\
78\n\
79A socket object represents one endpoint of a network connection.\n\
80\n\
81Methods of socket objects (keyword arguments not allowed):\n\
82\n\
83accept() -- accept a connection, returning new socket and client address\n\
84bind(addr) -- bind the socket to a local address\n\
85close() -- close the socket\n\
86connect(addr) -- connect the socket to a remote address\n\
87connect_ex(addr) -- connect, return an error code instead of an exception\n\
88dup() -- return a new socket object identical to the current one [*]\n\
89fileno() -- return underlying file descriptor\n\
90getpeername() -- return remote address [*]\n\
91getsockname() -- return local address\n\
92getsockopt(level, optname[, buflen]) -- get socket options\n\
93gettimeout() -- return timeout or None\n\
94listen(n) -- start listening for incoming connections\n\
95makefile([mode, [bufsize]]) -- return a file object for the socket [*]\n\
96recv(buflen[, flags]) -- receive data\n\
97recvfrom(buflen[, flags]) -- receive data and sender's address\n\
98sendall(data[, flags]) -- send all data\n\
99send(data[, flags]) -- send data, may not send all of it\n\
100sendto(data[, flags], addr) -- send data to a given address\n\
101setblocking(0 | 1) -- set or clear the blocking I/O flag\n\
102setsockopt(level, optname, value) -- set socket options\n\
103settimeout(None | float) -- set or clear the timeout\n\
104shutdown(how) -- shut down traffic in one or both directions\n\
105\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000106 [*] not available on all platforms!");
Guido van Rossum3baaa131999-03-22 21:44:51 +0000107
Walter Dörwaldf0dfc7a2003-10-20 14:01:56 +0000108/* XXX This is a terrible mess of platform-dependent preprocessor hacks.
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000109 I hope some day someone can clean this up please... */
110
Guido van Rossum9376b741999-09-15 22:01:40 +0000111/* Hacks for gethostbyname_r(). On some non-Linux platforms, the configure
112 script doesn't get this right, so we hardcode some platform checks below.
113 On the other hand, not all Linux versions agree, so there the settings
114 computed by the configure script are needed! */
115
116#ifndef linux
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000117# undef HAVE_GETHOSTBYNAME_R_3_ARG
118# undef HAVE_GETHOSTBYNAME_R_5_ARG
119# undef HAVE_GETHOSTBYNAME_R_6_ARG
Guido van Rossum9376b741999-09-15 22:01:40 +0000120#endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000121
Guido van Rossum7a122991999-04-13 04:07:32 +0000122#ifndef WITH_THREAD
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000123# undef HAVE_GETHOSTBYNAME_R
Guido van Rossum7a122991999-04-13 04:07:32 +0000124#endif
125
Guido van Rossume7de2061999-03-24 17:24:33 +0000126#ifdef HAVE_GETHOSTBYNAME_R
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000127# if defined(_AIX) || defined(__osf__)
128# define HAVE_GETHOSTBYNAME_R_3_ARG
129# elif defined(__sun) || defined(__sgi)
130# define HAVE_GETHOSTBYNAME_R_5_ARG
131# elif defined(linux)
Guido van Rossum9376b741999-09-15 22:01:40 +0000132/* Rely on the configure script */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000133# else
134# undef HAVE_GETHOSTBYNAME_R
135# endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000136#endif
137
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000138#if !defined(HAVE_GETHOSTBYNAME_R) && defined(WITH_THREAD) && \
139 !defined(MS_WINDOWS)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000140# define USE_GETHOSTBYNAME_LOCK
Guido van Rossum3baaa131999-03-22 21:44:51 +0000141#endif
142
Just van Rossum1040d2c2003-05-09 07:53:18 +0000143/* On systems on which getaddrinfo() is believed to not be thread-safe,
Just van Rossum09aecd72003-05-09 08:03:44 +0000144 (this includes the getaddrinfo emulation) protect access with a lock. */
Just van Rossum16e426b2003-05-09 08:12:00 +0000145#if defined(WITH_THREAD) && (defined(__APPLE__) || defined(__FreeBSD__) || \
146 defined(__OpenBSD__) || defined(__NetBSD__) || !defined(HAVE_GETADDRINFO))
Just van Rossum1040d2c2003-05-09 07:53:18 +0000147#define USE_GETADDRINFO_LOCK
148#endif
149
150#ifdef USE_GETADDRINFO_LOCK
151#define ACQUIRE_GETADDRINFO_LOCK PyThread_acquire_lock(netdb_lock, 1);
152#define RELEASE_GETADDRINFO_LOCK PyThread_release_lock(netdb_lock);
153#else
154#define ACQUIRE_GETADDRINFO_LOCK
155#define RELEASE_GETADDRINFO_LOCK
156#endif
157
158#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000159# include "pythread.h"
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000160#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000161
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000162#if defined(PYCC_VACPP)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000163# include <types.h>
164# include <io.h>
165# include <sys/ioctl.h>
166# include <utils.h>
167# include <ctype.h>
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000168#endif
169
Martin v. Löwis9e437302002-12-06 12:57:26 +0000170#if defined(__VMS)
171#if ! defined(_SOCKADDR_LEN)
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000172# ifdef getaddrinfo
173# undef getaddrinfo
174# endif
175# include "TCPIP_IOCTL_ROUTINE"
176#else
177# include <ioctl.h>
178#endif
Martin v. Löwis9e437302002-12-06 12:57:26 +0000179#endif
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000180
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000181#if defined(PYOS_OS2)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000182# define INCL_DOS
183# define INCL_DOSERRORS
184# define INCL_NOPMAPI
185# include <os2.h>
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000186#endif
187
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000188#if defined(__sgi) && _COMPILER_VERSION>700 && !_SGIAPI
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000189/* make sure that the reentrant (gethostbyaddr_r etc)
190 functions are declared correctly if compiling with
191 MIPSPro 7.x in ANSI C mode (default) */
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000192
193/* XXX Using _SGIAPI is the wrong thing,
194 but I don't know what the right thing is. */
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000195#define _SGIAPI 1
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000196
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000197#define HAVE_INET_PTON
198#include <netdb.h>
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000199#endif
200
Anthony Baxterbab23cf2003-10-04 08:00:49 +0000201/* Irix 6.5 fails to define this variable at all. This is needed
202 for both GCC and SGI's compiler. I'd say that the SGI headers
203 are just busted. */
204#if defined(__sgi) && !defined(INET_ADDRSTRLEN)
205#define INET_ADDRSTRLEN 16
206#endif
207
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000208/* Generic includes */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000209#include <sys/types.h>
Guido van Rossum81194471991-07-27 21:42:02 +0000210#include <signal.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000211
Marc-André Lemburg976ade62002-02-16 18:47:07 +0000212/* Generic socket object definitions and includes */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000213#define PySocket_BUILDING_SOCKET
Marc-André Lemburgbb8b78b2002-02-16 18:44:52 +0000214#include "socketmodule.h"
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000215
216/* Addressing includes */
217
Guido van Rossum6f489d91996-06-28 20:15:15 +0000218#ifndef MS_WINDOWS
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000219
220/* Non-MS WINDOWS includes */
221# include <netdb.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000222
Guido van Rossum9376b741999-09-15 22:01:40 +0000223/* Headers needed for inet_ntoa() and inet_addr() */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000224# ifdef __BEOS__
225# include <net/netdb.h>
226# elif defined(PYOS_OS2) && defined(PYCC_VACPP)
227# include <netdb.h>
Tim Peters603c6832001-11-05 02:45:59 +0000228typedef size_t socklen_t;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000229# else
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000230# include <arpa/inet.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000231# endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000232
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000233# ifndef RISCOS
234# include <fcntl.h>
235# else
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000236# include <sys/ioctl.h>
237# include <socklib.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000238# define NO_DUP
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000239int h_errno; /* not used */
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000240# define INET_ADDRSTRLEN 16
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000241# endif
242
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000243#else
Guido van Rossum48a680c2001-03-02 06:34:14 +0000244
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000245/* MS_WINDOWS includes */
246# include <fcntl.h>
Guido van Rossum48a680c2001-03-02 06:34:14 +0000247
Jeremy Hylton22308652001-02-02 03:23:09 +0000248#endif
249
Skip Montanaro7befb992004-02-10 16:50:21 +0000250#include <stddef.h>
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000251
252#ifndef offsetof
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000253# define offsetof(type, member) ((size_t)(&((type *)0)->member))
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000254#endif
255
Neal Norwitz39d22e52002-11-02 19:55:21 +0000256#ifndef O_NONBLOCK
257# define O_NONBLOCK O_NDELAY
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000258#endif
259
Trent Micka708d6e2004-09-07 17:48:26 +0000260/* include Python's addrinfo.h unless it causes trouble */
261#if defined(__sgi) && _COMPILER_VERSION>700 && defined(_SS_ALIGNSIZE)
262 /* Do not include addinfo.h on some newer IRIX versions.
263 * _SS_ALIGNSIZE is defined in sys/socket.h by 6.5.21,
264 * for example, but not by 6.5.10.
265 */
266#elif defined(_MSC_VER) && _MSC_VER>1200
267 /* Do not include addrinfo.h for MSVC7 or greater. 'addrinfo' and
268 * EAI_* constants are defined in (the already included) ws2tcpip.h.
269 */
270#else
271# include "addrinfo.h"
272#endif
Jason Tishlerc246cb72004-08-09 13:25:59 +0000273
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000274#ifndef HAVE_INET_PTON
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000275int inet_pton(int af, const char *src, void *dst);
Martin v. Löwisc925b1532001-07-21 09:42:15 +0000276const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000277#endif
278
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000279#ifdef __APPLE__
280/* On OS X, getaddrinfo returns no error indication of lookup
281 failure, so we must use the emulation instead of the libinfo
282 implementation. Unfortunately, performing an autoconf test
283 for this bug would require DNS access for the machine performing
284 the configuration, which is not acceptable. Therefore, we
285 determine the bug just by checking for __APPLE__. If this bug
286 gets ever fixed, perhaps checking for sys/version.h would be
287 appropriate, which is 10/0 on the system with the bug. */
Jack Jansen84262fb2002-07-02 14:40:42 +0000288#ifndef HAVE_GETNAMEINFO
289/* This bug seems to be fixed in Jaguar. Ths easiest way I could
290 Find to check for Jaguar is that it has getnameinfo(), which
291 older releases don't have */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000292#undef HAVE_GETADDRINFO
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000293#endif
Jack Jansen84262fb2002-07-02 14:40:42 +0000294#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000295
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000296/* I know this is a bad practice, but it is the easiest... */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000297#if !defined(HAVE_GETADDRINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000298/* avoid clashes with the C library definition of the symbol. */
299#define getaddrinfo fake_getaddrinfo
300#define gai_strerror fake_gai_strerror
301#define freeaddrinfo fake_freeaddrinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000302#include "getaddrinfo.c"
303#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000304#if !defined(HAVE_GETNAMEINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000305#define getnameinfo fake_getnameinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000306#include "getnameinfo.c"
307#endif
308
Guido van Rossumbcc20741998-08-04 22:53:56 +0000309#if defined(MS_WINDOWS) || defined(__BEOS__)
310/* BeOS suffers from the same socket dichotomy as Win32... - [cjh] */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000311/* seem to be a few differences in the API */
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000312#define SOCKETCLOSE closesocket
Guido van Rossumbe32c891996-06-20 16:25:29 +0000313#define NO_DUP /* Actually it exists on NT 3.5, but what the heck... */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000314#endif
315
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000316#ifdef MS_WIN32
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000317#define EAFNOSUPPORT WSAEAFNOSUPPORT
318#define snprintf _snprintf
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000319#endif
Fred Drakea04eaad2000-06-30 02:46:07 +0000320
Andrew MacIntyreba43e872002-03-03 03:03:52 +0000321#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000322#define SOCKETCLOSE soclose
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000323#define NO_DUP /* Sockets are Not Actual File Handles under OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000324#endif
325
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000326#ifndef SOCKETCLOSE
327#define SOCKETCLOSE close
328#endif
329
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000330#ifdef __VMS
331/* TCP/IP Services for VMS uses a maximum send/revc buffer length of 65535 */
332#define SEGMENT_SIZE 65535
333#endif
334
Hye-Shik Chang81268602004-02-02 06:05:24 +0000335#if defined(HAVE_BLUETOOTH_H) || defined(HAVE_BLUETOOTH_BLUETOOTH_H)
336#define USE_BLUETOOTH 1
337#if defined(__FreeBSD__)
338#define BTPROTO_L2CAP BLUETOOTH_PROTO_L2CAP
339#define BTPROTO_RFCOMM BLUETOOTH_PROTO_RFCOMM
340#define sockaddr_l2 sockaddr_l2cap
341#define sockaddr_rc sockaddr_rfcomm
342#define _BT_SOCKADDR_MEMB(s, proto) &((s)->sock_addr)
343#define _BT_L2_MEMB(sa, memb) ((sa)->l2cap_##memb)
344#define _BT_RC_MEMB(sa, memb) ((sa)->rfcomm_##memb)
345#else
Anthony Baxter5d7c0672004-02-16 05:35:28 +0000346#define _BT_SOCKADDR_MEMB(s, proto) (&((s)->sock_addr).bt_##proto)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000347#define _BT_L2_MEMB(sa, memb) ((sa)->l2_##memb)
348#define _BT_RC_MEMB(sa, memb) ((sa)->rc_##memb)
349#define _BT_SCO_MEMB(sa, memb) ((sa)->sco_##memb)
350#endif
351#endif
352
Martin v. Löwise9416172003-05-03 10:12:45 +0000353/*
354 * Constants for getnameinfo()
355 */
356#if !defined(NI_MAXHOST)
357#define NI_MAXHOST 1025
358#endif
359#if !defined(NI_MAXSERV)
360#define NI_MAXSERV 32
361#endif
362
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000363/* XXX There's a problem here: *static* functions are not supposed to have
364 a Py prefix (or use CapitalizedWords). Later... */
365
Guido van Rossum30a685f1991-06-27 15:51:29 +0000366/* Global variable holding the exception type for errors detected
367 by this module (but not argument type or memory errors, etc.). */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000368static PyObject *socket_error;
369static PyObject *socket_herror;
370static PyObject *socket_gaierror;
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000371static PyObject *socket_timeout;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000372
Guido van Rossum48a680c2001-03-02 06:34:14 +0000373#ifdef RISCOS
374/* Global variable which is !=0 if Python is running in a RISC OS taskwindow */
375static int taskwindow;
376#endif
377
Tim Peters643a7fc2002-02-17 04:13:21 +0000378/* A forward reference to the socket type object.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000379 The sock_type variable contains pointers to various functions,
380 some of which call new_sockobject(), which uses sock_type, so
Tim Peters643a7fc2002-02-17 04:13:21 +0000381 there has to be a circular reference. */
Jeremy Hylton938ace62002-07-17 16:30:39 +0000382static PyTypeObject sock_type;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000383
Guido van Rossum30a685f1991-06-27 15:51:29 +0000384/* Convenience function to raise an error according to errno
385 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000386
Guido van Rossum73624e91994-10-10 17:59:00 +0000387static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000388set_error(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000389{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000390#ifdef MS_WINDOWS
Mark Hammond46a733d2000-07-24 01:45:11 +0000391 int err_no = WSAGetLastError();
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000392 static struct {
393 int no;
394 const char *msg;
395 } *msgp, msgs[] = {
396 {WSAEINTR, "Interrupted system call"},
397 {WSAEBADF, "Bad file descriptor"},
398 {WSAEACCES, "Permission denied"},
399 {WSAEFAULT, "Bad address"},
400 {WSAEINVAL, "Invalid argument"},
401 {WSAEMFILE, "Too many open files"},
402 {WSAEWOULDBLOCK,
403 "The socket operation could not complete "
404 "without blocking"},
405 {WSAEINPROGRESS, "Operation now in progress"},
406 {WSAEALREADY, "Operation already in progress"},
407 {WSAENOTSOCK, "Socket operation on non-socket"},
408 {WSAEDESTADDRREQ, "Destination address required"},
409 {WSAEMSGSIZE, "Message too long"},
410 {WSAEPROTOTYPE, "Protocol wrong type for socket"},
411 {WSAENOPROTOOPT, "Protocol not available"},
412 {WSAEPROTONOSUPPORT, "Protocol not supported"},
413 {WSAESOCKTNOSUPPORT, "Socket type not supported"},
414 {WSAEOPNOTSUPP, "Operation not supported"},
415 {WSAEPFNOSUPPORT, "Protocol family not supported"},
416 {WSAEAFNOSUPPORT, "Address family not supported"},
417 {WSAEADDRINUSE, "Address already in use"},
418 {WSAEADDRNOTAVAIL, "Can't assign requested address"},
419 {WSAENETDOWN, "Network is down"},
420 {WSAENETUNREACH, "Network is unreachable"},
421 {WSAENETRESET, "Network dropped connection on reset"},
422 {WSAECONNABORTED, "Software caused connection abort"},
423 {WSAECONNRESET, "Connection reset by peer"},
424 {WSAENOBUFS, "No buffer space available"},
425 {WSAEISCONN, "Socket is already connected"},
426 {WSAENOTCONN, "Socket is not connected"},
427 {WSAESHUTDOWN, "Can't send after socket shutdown"},
428 {WSAETOOMANYREFS, "Too many references: can't splice"},
429 {WSAETIMEDOUT, "Operation timed out"},
430 {WSAECONNREFUSED, "Connection refused"},
431 {WSAELOOP, "Too many levels of symbolic links"},
432 {WSAENAMETOOLONG, "File name too long"},
433 {WSAEHOSTDOWN, "Host is down"},
434 {WSAEHOSTUNREACH, "No route to host"},
435 {WSAENOTEMPTY, "Directory not empty"},
436 {WSAEPROCLIM, "Too many processes"},
437 {WSAEUSERS, "Too many users"},
438 {WSAEDQUOT, "Disc quota exceeded"},
439 {WSAESTALE, "Stale NFS file handle"},
440 {WSAEREMOTE, "Too many levels of remote in path"},
441 {WSASYSNOTREADY, "Network subsystem is unvailable"},
442 {WSAVERNOTSUPPORTED, "WinSock version is not supported"},
443 {WSANOTINITIALISED,
444 "Successful WSAStartup() not yet performed"},
445 {WSAEDISCON, "Graceful shutdown in progress"},
446 /* Resolver errors */
447 {WSAHOST_NOT_FOUND, "No such host is known"},
448 {WSATRY_AGAIN, "Host not found, or server failed"},
449 {WSANO_RECOVERY, "Unexpected server error encountered"},
450 {WSANO_DATA, "Valid name without requested data"},
451 {WSANO_ADDRESS, "No address, look for MX record"},
452 {0, NULL}
453 };
Mark Hammond46a733d2000-07-24 01:45:11 +0000454 if (err_no) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000455 PyObject *v;
Mark Hammond46a733d2000-07-24 01:45:11 +0000456 const char *msg = "winsock error";
Guido van Rossum48a680c2001-03-02 06:34:14 +0000457
Mark Hammond46a733d2000-07-24 01:45:11 +0000458 for (msgp = msgs; msgp->msg; msgp++) {
459 if (err_no == msgp->no) {
460 msg = msgp->msg;
461 break;
462 }
463 }
464
465 v = Py_BuildValue("(is)", err_no, msg);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000466 if (v != NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000467 PyErr_SetObject(socket_error, v);
Guido van Rossum73624e91994-10-10 17:59:00 +0000468 Py_DECREF(v);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000469 }
470 return NULL;
471 }
472 else
473#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000474
Andrew MacIntyreba43e872002-03-03 03:03:52 +0000475#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000476 if (sock_errno() != NO_ERROR) {
477 APIRET rc;
478 ULONG msglen;
479 char outbuf[100];
480 int myerrorcode = sock_errno();
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000481
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000482 /* Retrieve socket-related error message from MPTN.MSG file */
483 rc = DosGetMessage(NULL, 0, outbuf, sizeof(outbuf),
484 myerrorcode - SOCBASEERR + 26,
485 "mptn.msg",
486 &msglen);
487 if (rc == NO_ERROR) {
488 PyObject *v;
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000489
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000490 /* OS/2 doesn't guarantee a terminator */
491 outbuf[msglen] = '\0';
492 if (strlen(outbuf) > 0) {
493 /* If non-empty msg, trim CRLF */
494 char *lastc = &outbuf[ strlen(outbuf)-1 ];
495 while (lastc > outbuf && isspace(*lastc)) {
496 /* Trim trailing whitespace (CRLF) */
497 *lastc-- = '\0';
498 }
499 }
500 v = Py_BuildValue("(is)", myerrorcode, outbuf);
501 if (v != NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000502 PyErr_SetObject(socket_error, v);
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000503 Py_DECREF(v);
504 }
505 return NULL;
506 }
507 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000508#endif
509
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000510#if defined(RISCOS)
511 if (_inet_error.errnum != NULL) {
512 PyObject *v;
513 v = Py_BuildValue("(is)", errno, _inet_err());
514 if (v != NULL) {
515 PyErr_SetObject(socket_error, v);
516 Py_DECREF(v);
517 }
518 return NULL;
519 }
520#endif
521
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000522 return PyErr_SetFromErrno(socket_error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000523}
524
Guido van Rossum30a685f1991-06-27 15:51:29 +0000525
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000526static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000527set_herror(int h_error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000528{
529 PyObject *v;
530
531#ifdef HAVE_HSTRERROR
532 v = Py_BuildValue("(is)", h_error, (char *)hstrerror(h_error));
533#else
534 v = Py_BuildValue("(is)", h_error, "host not found");
535#endif
536 if (v != NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000537 PyErr_SetObject(socket_herror, v);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000538 Py_DECREF(v);
539 }
540
541 return NULL;
542}
543
544
545static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000546set_gaierror(int error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000547{
548 PyObject *v;
549
Martin v. Löwis272cb402002-03-01 08:31:07 +0000550#ifdef EAI_SYSTEM
551 /* EAI_SYSTEM is not available on Windows XP. */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000552 if (error == EAI_SYSTEM)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000553 return set_error();
Martin v. Löwis272cb402002-03-01 08:31:07 +0000554#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000555
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000556#ifdef HAVE_GAI_STRERROR
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000557 v = Py_BuildValue("(is)", error, gai_strerror(error));
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000558#else
559 v = Py_BuildValue("(is)", error, "getaddrinfo failed");
560#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000561 if (v != NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000562 PyErr_SetObject(socket_gaierror, v);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000563 Py_DECREF(v);
564 }
565
566 return NULL;
567}
568
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000569/* Function to perform the setting of socket blocking mode
570 internally. block = (1 | 0). */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000571static int
572internal_setblocking(PySocketSockObject *s, int block)
573{
574#ifndef RISCOS
575#ifndef MS_WINDOWS
576 int delay_flag;
577#endif
578#endif
579
580 Py_BEGIN_ALLOW_THREADS
581#ifdef __BEOS__
582 block = !block;
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000583 setsockopt(s->sock_fd, SOL_SOCKET, SO_NONBLOCK,
584 (void *)(&block), sizeof(int));
Guido van Rossum67f7a382002-06-06 21:08:16 +0000585#else
586#ifndef RISCOS
587#ifndef MS_WINDOWS
588#if defined(PYOS_OS2) && !defined(PYCC_GCC)
589 block = !block;
590 ioctl(s->sock_fd, FIONBIO, (caddr_t)&block, sizeof(block));
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000591#elif defined(__VMS)
592 block = !block;
593 ioctl(s->sock_fd, FIONBIO, (char *)&block);
594#else /* !PYOS_OS2 && !_VMS */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000595 delay_flag = fcntl(s->sock_fd, F_GETFL, 0);
596 if (block)
Neal Norwitz39d22e52002-11-02 19:55:21 +0000597 delay_flag &= (~O_NONBLOCK);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000598 else
Neal Norwitz39d22e52002-11-02 19:55:21 +0000599 delay_flag |= O_NONBLOCK;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000600 fcntl(s->sock_fd, F_SETFL, delay_flag);
601#endif /* !PYOS_OS2 */
602#else /* MS_WINDOWS */
603 block = !block;
604 ioctlsocket(s->sock_fd, FIONBIO, (u_long*)&block);
605#endif /* MS_WINDOWS */
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000606#else /* RISCOS */
607 block = !block;
608 socketioctl(s->sock_fd, FIONBIO, (u_long*)&block);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000609#endif /* RISCOS */
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000610#endif /* __BEOS__ */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000611 Py_END_ALLOW_THREADS
612
613 /* Since these don't return anything */
614 return 1;
615}
616
Guido van Rossum11ba0942002-06-13 15:07:44 +0000617/* Do a select() on the socket, if necessary (sock_timeout > 0).
618 The argument writing indicates the direction.
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000619 This does not raise an exception; we'll let our caller do that
620 after they've reacquired the interpreter lock.
621 Returns 1 on timeout, 0 otherwise. */
622static int
Guido van Rossumb9e916a2002-06-07 01:42:47 +0000623internal_select(PySocketSockObject *s, int writing)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000624{
625 fd_set fds;
626 struct timeval tv;
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000627 int n;
Guido van Rossum11ba0942002-06-13 15:07:44 +0000628
Guido van Rossumad654902002-07-19 12:44:59 +0000629 /* Nothing to do unless we're in timeout mode (not non-blocking) */
Guido van Rossum11ba0942002-06-13 15:07:44 +0000630 if (s->sock_timeout <= 0.0)
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000631 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000632
Guido van Rossumad654902002-07-19 12:44:59 +0000633 /* Guard against closed socket */
634 if (s->sock_fd < 0)
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000635 return 0;
Guido van Rossumad654902002-07-19 12:44:59 +0000636
Guido van Rossum67f7a382002-06-06 21:08:16 +0000637 /* Construct the arguments to select */
638 tv.tv_sec = (int)s->sock_timeout;
Guido van Rossumb9e916a2002-06-07 01:42:47 +0000639 tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000640 FD_ZERO(&fds);
641 FD_SET(s->sock_fd, &fds);
642
643 /* See if the socket is ready */
Guido van Rossumb9e916a2002-06-07 01:42:47 +0000644 if (writing)
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000645 n = select(s->sock_fd+1, NULL, &fds, NULL, &tv);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000646 else
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000647 n = select(s->sock_fd+1, &fds, NULL, NULL, &tv);
648 if (n == 0)
649 return 1;
650 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000651}
652
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000653/* Initialize a new socket object. */
654
Tim Petersa12b4cf2002-07-18 22:38:44 +0000655static double defaulttimeout = -1.0; /* Default timeout for new sockets */
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000656
Mark Hammond62b1ab12002-07-23 06:31:15 +0000657PyMODINIT_FUNC
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000658init_sockobject(PySocketSockObject *s,
659 SOCKET_T fd, int family, int type, int proto)
660{
661#ifdef RISCOS
662 int block = 1;
663#endif
664 s->sock_fd = fd;
665 s->sock_family = family;
666 s->sock_type = type;
667 s->sock_proto = proto;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000668 s->sock_timeout = defaulttimeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000669
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000670 s->errorhandler = &set_error;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000671
672 if (defaulttimeout >= 0.0)
673 internal_setblocking(s, 0);
674
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000675#ifdef RISCOS
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000676 if (taskwindow)
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000677 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000678#endif
679}
680
681
Guido van Rossum30a685f1991-06-27 15:51:29 +0000682/* Create a new socket object.
683 This just creates the object and initializes it.
684 If the creation fails, return NULL and set an exception (implicit
685 in NEWOBJ()). */
686
Guido van Rossum73624e91994-10-10 17:59:00 +0000687static PySocketSockObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000688new_sockobject(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000689{
Guido van Rossum73624e91994-10-10 17:59:00 +0000690 PySocketSockObject *s;
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000691 s = (PySocketSockObject *)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000692 PyType_GenericNew(&sock_type, NULL, NULL);
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000693 if (s != NULL)
694 init_sockobject(s, fd, family, type, proto);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000695 return s;
696}
697
Guido van Rossum30a685f1991-06-27 15:51:29 +0000698
Guido van Rossum48a680c2001-03-02 06:34:14 +0000699/* Lock to allow python interpreter to continue, but only allow one
Just van Rossum1040d2c2003-05-09 07:53:18 +0000700 thread to be in gethostbyname or getaddrinfo */
701#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
702PyThread_type_lock netdb_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000703#endif
704
705
Guido van Rossum30a685f1991-06-27 15:51:29 +0000706/* Convert a string specifying a host name or one of a few symbolic
707 names to a numeric IP address. This usually calls gethostbyname()
708 to do the work; the names "" and "<broadcast>" are special.
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000709 Return the length (IPv4 should be 4 bytes), or negative if
Guido van Rossum30a685f1991-06-27 15:51:29 +0000710 an error occurred; then an exception is raised. */
711
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000712static int
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000713setipaddr(char *name, struct sockaddr *addr_ret, size_t addr_ret_size, int af)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000714{
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000715 struct addrinfo hints, *res;
716 int error;
Anthony Baxter0e85f9d2003-05-02 15:40:46 +0000717 int d1, d2, d3, d4;
718 char ch;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000719
Guido van Rossuma376cc51996-12-05 23:43:35 +0000720 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
Guido van Rossum30a685f1991-06-27 15:51:29 +0000721 if (name[0] == '\0') {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000722 int siz;
723 memset(&hints, 0, sizeof(hints));
724 hints.ai_family = af;
725 hints.ai_socktype = SOCK_DGRAM; /*dummy*/
726 hints.ai_flags = AI_PASSIVE;
Just van Rossum1040d2c2003-05-09 07:53:18 +0000727 Py_BEGIN_ALLOW_THREADS
728 ACQUIRE_GETADDRINFO_LOCK
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000729 error = getaddrinfo(NULL, "0", &hints, &res);
Just van Rossum1040d2c2003-05-09 07:53:18 +0000730 Py_END_ALLOW_THREADS
731 /* We assume that those thread-unsafe getaddrinfo() versions
732 *are* safe regarding their return value, ie. that a
733 subsequent call to getaddrinfo() does not destroy the
734 outcome of the first call. */
735 RELEASE_GETADDRINFO_LOCK
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000736 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000737 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000738 return -1;
739 }
740 switch (res->ai_family) {
741 case AF_INET:
742 siz = 4;
743 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000744#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000745 case AF_INET6:
746 siz = 16;
747 break;
748#endif
749 default:
750 freeaddrinfo(res);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000751 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000752 "unsupported address family");
753 return -1;
754 }
755 if (res->ai_next) {
Martin v. Löwisf0b11d22001-11-07 08:31:03 +0000756 freeaddrinfo(res);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000757 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000758 "wildcard resolved to multiple address");
759 return -1;
760 }
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000761 if (res->ai_addrlen < addr_ret_size)
762 addr_ret_size = res->ai_addrlen;
763 memcpy(addr_ret, res->ai_addr, addr_ret_size);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000764 freeaddrinfo(res);
765 return siz;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000766 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000767 if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000768 struct sockaddr_in *sin;
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +0000769 if (af != AF_INET && af != AF_UNSPEC) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000770 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000771 "address family mismatched");
772 return -1;
773 }
774 sin = (struct sockaddr_in *)addr_ret;
775 memset((void *) sin, '\0', sizeof(*sin));
776 sin->sin_family = AF_INET;
777#ifdef HAVE_SOCKADDR_SA_LEN
778 sin->sin_len = sizeof(*sin);
779#endif
780 sin->sin_addr.s_addr = INADDR_BROADCAST;
781 return sizeof(sin->sin_addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000782 }
Anthony Baxter0e85f9d2003-05-02 15:40:46 +0000783 if (sscanf(name, "%d.%d.%d.%d%c", &d1, &d2, &d3, &d4, &ch) == 4 &&
784 0 <= d1 && d1 <= 255 && 0 <= d2 && d2 <= 255 &&
785 0 <= d3 && d3 <= 255 && 0 <= d4 && d4 <= 255) {
786 struct sockaddr_in *sin;
787 sin = (struct sockaddr_in *)addr_ret;
788 sin->sin_addr.s_addr = htonl(
789 ((long) d1 << 24) | ((long) d2 << 16) |
790 ((long) d3 << 8) | ((long) d4 << 0));
791 sin->sin_family = AF_INET;
792#ifdef HAVE_SOCKADDR_SA_LEN
793 sin->sin_len = sizeof(*sin);
794#endif
795 return 4;
796 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000797 memset(&hints, 0, sizeof(hints));
798 hints.ai_family = af;
Just van Rossum1040d2c2003-05-09 07:53:18 +0000799 Py_BEGIN_ALLOW_THREADS
800 ACQUIRE_GETADDRINFO_LOCK
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000801 error = getaddrinfo(name, NULL, &hints, &res);
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000802#if defined(__digital__) && defined(__unix__)
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000803 if (error == EAI_NONAME && af == AF_UNSPEC) {
804 /* On Tru64 V5.1, numeric-to-addr conversion fails
805 if no address family is given. Assume IPv4 for now.*/
806 hints.ai_family = AF_INET;
807 error = getaddrinfo(name, NULL, &hints, &res);
808 }
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000809#endif
Just van Rossum1040d2c2003-05-09 07:53:18 +0000810 Py_END_ALLOW_THREADS
811 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000812 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000813 set_gaierror(error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000814 return -1;
815 }
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000816 if (res->ai_addrlen < addr_ret_size)
817 addr_ret_size = res->ai_addrlen;
818 memcpy((char *) addr_ret, res->ai_addr, addr_ret_size);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000819 freeaddrinfo(res);
820 switch (addr_ret->sa_family) {
821 case AF_INET:
822 return 4;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000823#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000824 case AF_INET6:
825 return 16;
Guido van Rossum955becc1999-03-22 20:14:53 +0000826#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000827 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000828 PyErr_SetString(socket_error, "unknown address family");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000829 return -1;
830 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000831}
832
Guido van Rossum30a685f1991-06-27 15:51:29 +0000833
Guido van Rossum30a685f1991-06-27 15:51:29 +0000834/* Create a string object representing an IP address.
835 This is always a string of the form 'dd.dd.dd.dd' (with variable
836 size numbers). */
837
Guido van Rossum73624e91994-10-10 17:59:00 +0000838static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000839makeipaddr(struct sockaddr *addr, int addrlen)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000840{
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000841 char buf[NI_MAXHOST];
842 int error;
843
844 error = getnameinfo(addr, addrlen, buf, sizeof(buf), NULL, 0,
845 NI_NUMERICHOST);
846 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000847 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000848 return NULL;
849 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000850 return PyString_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000851}
852
853
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000854#ifdef USE_BLUETOOTH
855/* Convert a string representation of a Bluetooth address into a numeric
856 address. Returns the length (6), or raises an exception and returns -1 if
857 an error occurred. */
858
859static int
860setbdaddr(char *name, bdaddr_t *bdaddr)
861{
862 unsigned int b0, b1, b2, b3, b4, b5;
863 char ch;
864 int n;
865
866 n = sscanf(name, "%X:%X:%X:%X:%X:%X%c",
867 &b5, &b4, &b3, &b2, &b1, &b0, &ch);
868 if (n == 6 && (b0 | b1 | b2 | b3 | b4 | b5) < 256) {
869 bdaddr->b[0] = b0;
870 bdaddr->b[1] = b1;
871 bdaddr->b[2] = b2;
872 bdaddr->b[3] = b3;
873 bdaddr->b[4] = b4;
874 bdaddr->b[5] = b5;
875 return 6;
876 } else {
877 PyErr_SetString(socket_error, "bad bluetooth address");
878 return -1;
879 }
880}
881
882/* Create a string representation of the Bluetooth address. This is always a
883 string of the form 'XX:XX:XX:XX:XX:XX' where XX is a two digit hexadecimal
884 value (zero padded if necessary). */
885
886static PyObject *
887makebdaddr(bdaddr_t *bdaddr)
888{
889 char buf[(6 * 2) + 5 + 1];
890
891 sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X",
892 bdaddr->b[5], bdaddr->b[4], bdaddr->b[3],
893 bdaddr->b[2], bdaddr->b[1], bdaddr->b[0]);
894 return PyString_FromString(buf);
895}
896#endif
897
898
Guido van Rossum30a685f1991-06-27 15:51:29 +0000899/* Create an object representing the given socket address,
900 suitable for passing it back to bind(), connect() etc.
901 The family field of the sockaddr structure is inspected
902 to determine what kind of address it really is. */
903
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000904/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000905static PyObject *
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000906makesockaddr(int sockfd, struct sockaddr *addr, int addrlen, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000907{
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000908 if (addrlen == 0) {
909 /* No address -- may be recvfrom() from known socket */
Guido van Rossum73624e91994-10-10 17:59:00 +0000910 Py_INCREF(Py_None);
911 return Py_None;
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000912 }
913
Guido van Rossumbcc20741998-08-04 22:53:56 +0000914#ifdef __BEOS__
Guido van Rossum2c8bcb82000-04-25 21:34:53 +0000915 /* XXX: BeOS version of accept() doesn't set family correctly */
Guido van Rossumbcc20741998-08-04 22:53:56 +0000916 addr->sa_family = AF_INET;
917#endif
918
Guido van Rossum30a685f1991-06-27 15:51:29 +0000919 switch (addr->sa_family) {
920
921 case AF_INET:
922 {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000923 struct sockaddr_in *a;
924 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
Barry Warsaw752300b1997-01-03 17:18:10 +0000925 PyObject *ret = NULL;
926 if (addrobj) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000927 a = (struct sockaddr_in *)addr;
Barry Warsaw752300b1997-01-03 17:18:10 +0000928 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
929 Py_DECREF(addrobj);
930 }
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000931 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000932 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000933
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +0000934#if defined(AF_UNIX)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000935 case AF_UNIX:
936 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000937 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000938 return PyString_FromString(a->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000939 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000940#endif /* AF_UNIX */
941
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000942#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000943 case AF_INET6:
944 {
945 struct sockaddr_in6 *a;
946 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
947 PyObject *ret = NULL;
948 if (addrobj) {
949 a = (struct sockaddr_in6 *)addr;
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000950 ret = Py_BuildValue("Oiii",
951 addrobj,
952 ntohs(a->sin6_port),
953 a->sin6_flowinfo,
954 a->sin6_scope_id);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000955 Py_DECREF(addrobj);
956 }
957 return ret;
958 }
Jeremy Hylton22308652001-02-02 03:23:09 +0000959#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +0000960
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000961#ifdef USE_BLUETOOTH
962 case AF_BLUETOOTH:
963 switch (proto) {
964
965 case BTPROTO_L2CAP:
966 {
967 struct sockaddr_l2 *a = (struct sockaddr_l2 *) addr;
968 PyObject *addrobj = makebdaddr(&_BT_L2_MEMB(a, bdaddr));
969 PyObject *ret = NULL;
970 if (addrobj) {
971 ret = Py_BuildValue("Oi",
972 addrobj,
973 _BT_L2_MEMB(a, psm));
974 Py_DECREF(addrobj);
975 }
976 return ret;
977 }
978
979 case BTPROTO_RFCOMM:
980 {
981 struct sockaddr_rc *a = (struct sockaddr_rc *) addr;
982 PyObject *addrobj = makebdaddr(&_BT_RC_MEMB(a, bdaddr));
983 PyObject *ret = NULL;
984 if (addrobj) {
985 ret = Py_BuildValue("Oi",
986 addrobj,
987 _BT_RC_MEMB(a, channel));
988 Py_DECREF(addrobj);
989 }
990 return ret;
991 }
992
993#if !defined(__FreeBSD__)
994 case BTPROTO_SCO:
995 {
996 struct sockaddr_sco *a = (struct sockaddr_sco *) addr;
997 return makebdaddr(&_BT_SCO_MEMB(a, bdaddr));
998 }
999#endif
1000
1001 }
1002#endif
1003
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00001004#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +00001005 case AF_PACKET:
1006 {
1007 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
1008 char *ifname = "";
1009 struct ifreq ifr;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001010 /* need to look up interface name give index */
1011 if (a->sll_ifindex) {
Jeremy Hylton22308652001-02-02 03:23:09 +00001012 ifr.ifr_ifindex = a->sll_ifindex;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001013 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
Jeremy Hylton22308652001-02-02 03:23:09 +00001014 ifname = ifr.ifr_name;
Jeremy Hylton22308652001-02-02 03:23:09 +00001015 }
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001016 return Py_BuildValue("shbhs#",
1017 ifname,
1018 ntohs(a->sll_protocol),
1019 a->sll_pkttype,
1020 a->sll_hatype,
1021 a->sll_addr,
1022 a->sll_halen);
Jeremy Hylton22308652001-02-02 03:23:09 +00001023 }
1024#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001025
Guido van Rossum30a685f1991-06-27 15:51:29 +00001026 /* More cases here... */
1027
1028 default:
Guido van Rossumaa948df1997-05-07 17:41:48 +00001029 /* If we don't know the address family, don't raise an
1030 exception -- return it as a tuple. */
1031 return Py_BuildValue("is#",
1032 addr->sa_family,
1033 addr->sa_data,
1034 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001035
Guido van Rossum30a685f1991-06-27 15:51:29 +00001036 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001037}
1038
Guido van Rossum30a685f1991-06-27 15:51:29 +00001039
1040/* Parse a socket address argument according to the socket object's
1041 address family. Return 1 if the address was in the proper format,
1042 0 of not. The address is returned through addr_ret, its length
1043 through len_ret. */
1044
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001045static int
Guido van Rossum48a680c2001-03-02 06:34:14 +00001046getsockaddrarg(PySocketSockObject *s, PyObject *args,
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001047 struct sockaddr **addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001048{
Guido van Rossum30a685f1991-06-27 15:51:29 +00001049 switch (s->sock_family) {
1050
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001051#if defined(AF_UNIX)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001052 case AF_UNIX:
1053 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001054 struct sockaddr_un* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001055 char *path;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001056 int len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001057 addr = (struct sockaddr_un*)&(s->sock_addr).un;
Guido van Rossum7e488981998-10-08 02:25:24 +00001058 if (!PyArg_Parse(args, "t#", &path, &len))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001059 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001060 if (len > sizeof addr->sun_path) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001061 PyErr_SetString(socket_error,
Barry Warsaw752300b1997-01-03 17:18:10 +00001062 "AF_UNIX path too long");
Guido van Rossum30a685f1991-06-27 15:51:29 +00001063 return 0;
1064 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001065 addr->sun_family = s->sock_family;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001066 memcpy(addr->sun_path, path, len);
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001067 addr->sun_path[len] = 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001068 *addr_ret = (struct sockaddr *) addr;
Andrew MacIntyredaedf212004-04-11 12:03:57 +00001069#if defined(PYOS_OS2)
1070 *len_ret = sizeof(*addr);
1071#else
Guido van Rossum65af28a1996-06-11 18:36:33 +00001072 *len_ret = len + sizeof(*addr) - sizeof(addr->sun_path);
Andrew MacIntyredaedf212004-04-11 12:03:57 +00001073#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001074 return 1;
1075 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001076#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001077
Guido van Rossum30a685f1991-06-27 15:51:29 +00001078 case AF_INET:
1079 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001080 struct sockaddr_in* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001081 char *host;
Martin v. Löwis5db099a2003-08-07 11:55:15 +00001082 int port, result;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001083 addr=(struct sockaddr_in*)&(s->sock_addr).in;
Guido van Rossume4dad902000-12-01 13:13:11 +00001084 if (!PyTuple_Check(args)) {
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001085 PyErr_Format(
1086 PyExc_TypeError,
1087 "getsockaddrarg: "
1088 "AF_INET address must be tuple, not %.500s",
1089 args->ob_type->tp_name);
Guido van Rossume4dad902000-12-01 13:13:11 +00001090 return 0;
1091 }
Martin v. Löwis2548c732003-04-18 10:39:54 +00001092 if (!PyArg_ParseTuple(args, "eti:getsockaddrarg",
1093 "idna", &host, &port))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001094 return 0;
Martin v. Löwis5db099a2003-08-07 11:55:15 +00001095 result = setipaddr(host, (struct sockaddr *)addr,
1096 sizeof(*addr), AF_INET);
1097 PyMem_Free(host);
1098 if (result < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001099 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001100 addr->sin_family = AF_INET;
Guido van Rossum644a12b1997-04-09 19:24:53 +00001101 addr->sin_port = htons((short)port);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001102 *addr_ret = (struct sockaddr *) addr;
1103 *len_ret = sizeof *addr;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001104 return 1;
1105 }
1106
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001107#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001108 case AF_INET6:
1109 {
1110 struct sockaddr_in6* addr;
1111 char *host;
Martin v. Löwis5db099a2003-08-07 11:55:15 +00001112 int port, flowinfo, scope_id, result;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001113 addr = (struct sockaddr_in6*)&(s->sock_addr).in6;
1114 flowinfo = scope_id = 0;
Martin v. Löwis2548c732003-04-18 10:39:54 +00001115 if (!PyArg_ParseTuple(args, "eti|ii",
1116 "idna", &host, &port, &flowinfo,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001117 &scope_id)) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001118 return 0;
1119 }
Martin v. Löwis5db099a2003-08-07 11:55:15 +00001120 result = setipaddr(host, (struct sockaddr *)addr,
1121 sizeof(*addr), AF_INET6);
1122 PyMem_Free(host);
1123 if (result < 0)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001124 return 0;
1125 addr->sin6_family = s->sock_family;
1126 addr->sin6_port = htons((short)port);
1127 addr->sin6_flowinfo = flowinfo;
1128 addr->sin6_scope_id = scope_id;
1129 *addr_ret = (struct sockaddr *) addr;
1130 *len_ret = sizeof *addr;
1131 return 1;
1132 }
1133#endif
1134
Hye-Shik Chang81268602004-02-02 06:05:24 +00001135#ifdef USE_BLUETOOTH
Martin v. Löwis12af0482004-01-31 12:34:17 +00001136 case AF_BLUETOOTH:
1137 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001138 switch (s->sock_proto) {
1139 case BTPROTO_L2CAP:
Martin v. Löwis12af0482004-01-31 12:34:17 +00001140 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001141 struct sockaddr_l2 *addr = (struct sockaddr_l2 *) _BT_SOCKADDR_MEMB(s, l2);
1142 char *straddr;
Martin v. Löwis12af0482004-01-31 12:34:17 +00001143
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001144 _BT_L2_MEMB(addr, family) = AF_BLUETOOTH;
1145 if (!PyArg_ParseTuple(args, "si", &straddr,
1146 &_BT_L2_MEMB(addr, psm))) {
1147 PyErr_SetString(socket_error, "getsockaddrarg: "
1148 "wrong format");
Martin v. Löwis12af0482004-01-31 12:34:17 +00001149 return 0;
1150 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001151 if (setbdaddr(straddr, &_BT_L2_MEMB(addr, bdaddr)) < 0)
1152 return 0;
1153
1154 *addr_ret = (struct sockaddr *) addr;
1155 *len_ret = sizeof *addr;
1156 return 1;
1157 }
1158 case BTPROTO_RFCOMM:
1159 {
1160 struct sockaddr_rc *addr = (struct sockaddr_rc *) _BT_SOCKADDR_MEMB(s, rc);
1161 char *straddr;
1162
1163 _BT_RC_MEMB(addr, family) = AF_BLUETOOTH;
1164 if (!PyArg_ParseTuple(args, "si", &straddr,
1165 &_BT_RC_MEMB(addr, channel))) {
1166 PyErr_SetString(socket_error, "getsockaddrarg: "
1167 "wrong format");
1168 return 0;
1169 }
1170 if (setbdaddr(straddr, &_BT_RC_MEMB(addr, bdaddr)) < 0)
1171 return 0;
1172
1173 *addr_ret = (struct sockaddr *) addr;
1174 *len_ret = sizeof *addr;
1175 return 1;
1176 }
1177#if !defined(__FreeBSD__)
1178 case BTPROTO_SCO:
1179 {
1180 struct sockaddr_sco *addr = (struct sockaddr_sco *) _BT_SOCKADDR_MEMB(s, sco);
1181 char *straddr;
1182
1183 _BT_SCO_MEMB(addr, family) = AF_BLUETOOTH;
1184 straddr = PyString_AsString(args);
1185 if (straddr == NULL) {
1186 PyErr_SetString(socket_error, "getsockaddrarg: "
1187 "wrong format");
1188 return 0;
1189 }
1190 if (setbdaddr(straddr, &_BT_SCO_MEMB(addr, bdaddr)) < 0)
1191 return 0;
1192
1193 *addr_ret = (struct sockaddr *) addr;
1194 *len_ret = sizeof *addr;
1195 return 1;
1196 }
1197#endif
1198 default:
1199 PyErr_SetString(socket_error, "getsockaddrarg: unknown Bluetooth protocol");
1200 return 0;
Martin v. Löwis12af0482004-01-31 12:34:17 +00001201 }
1202 }
1203#endif
1204
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00001205#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +00001206 case AF_PACKET:
1207 {
1208 struct sockaddr_ll* addr;
1209 struct ifreq ifr;
1210 char *interfaceName;
1211 int protoNumber;
1212 int hatype = 0;
1213 int pkttype = 0;
Andrew M. Kuchlingb8e17172004-07-10 23:39:35 +00001214 char *haddr = NULL;
1215 unsigned int halen = 0;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001216
Andrew M. Kuchlingb8e17172004-07-10 23:39:35 +00001217 if (!PyArg_ParseTuple(args, "si|iis#", &interfaceName,
1218 &protoNumber, &pkttype, &hatype,
1219 &haddr, &halen))
Jeremy Hylton22308652001-02-02 03:23:09 +00001220 return 0;
1221 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
1222 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001223 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001224 s->errorhandler();
Jeremy Hylton22308652001-02-02 03:23:09 +00001225 return 0;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001226 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001227 addr = &(s->sock_addr.ll);
1228 addr->sll_family = AF_PACKET;
1229 addr->sll_protocol = htons((short)protoNumber);
1230 addr->sll_ifindex = ifr.ifr_ifindex;
1231 addr->sll_pkttype = pkttype;
1232 addr->sll_hatype = hatype;
Andrew M. Kuchlingb8e17172004-07-10 23:39:35 +00001233 if (halen > 8) {
1234 PyErr_SetString(PyExc_ValueError,
1235 "Hardware address must be 8 bytes or less");
1236 return 0;
1237 }
1238 if (halen != 0) {
1239 memcpy(&addr->sll_addr, haddr, halen);
1240 }
1241 addr->sll_halen = halen;
Jeremy Hylton22308652001-02-02 03:23:09 +00001242 *addr_ret = (struct sockaddr *) addr;
1243 *len_ret = sizeof *addr;
1244 return 1;
1245 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00001246#endif
1247
Guido van Rossum30a685f1991-06-27 15:51:29 +00001248 /* More cases here... */
1249
1250 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001251 PyErr_SetString(socket_error, "getsockaddrarg: bad family");
Guido van Rossum30a685f1991-06-27 15:51:29 +00001252 return 0;
1253
1254 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001255}
1256
Guido van Rossum30a685f1991-06-27 15:51:29 +00001257
Guido van Rossum48a680c2001-03-02 06:34:14 +00001258/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +00001259 Return 1 if the family is known, 0 otherwise. The length is returned
1260 through len_ret. */
1261
1262static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +00001263getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +00001264{
1265 switch (s->sock_family) {
1266
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001267#if defined(AF_UNIX)
Guido van Rossum710e1df1992-06-12 10:39:36 +00001268 case AF_UNIX:
1269 {
1270 *len_ret = sizeof (struct sockaddr_un);
1271 return 1;
1272 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001273#endif /* AF_UNIX */
Guido van Rossum710e1df1992-06-12 10:39:36 +00001274
1275 case AF_INET:
1276 {
1277 *len_ret = sizeof (struct sockaddr_in);
1278 return 1;
1279 }
1280
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001281#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001282 case AF_INET6:
1283 {
1284 *len_ret = sizeof (struct sockaddr_in6);
1285 return 1;
1286 }
1287#endif
1288
Hye-Shik Chang81268602004-02-02 06:05:24 +00001289#ifdef USE_BLUETOOTH
Martin v. Löwis12af0482004-01-31 12:34:17 +00001290 case AF_BLUETOOTH:
1291 {
1292 switch(s->sock_proto)
1293 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001294
1295 case BTPROTO_L2CAP:
1296 *len_ret = sizeof (struct sockaddr_l2);
1297 return 1;
1298 case BTPROTO_RFCOMM:
1299 *len_ret = sizeof (struct sockaddr_rc);
1300 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00001301#if !defined(__FreeBSD__)
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001302 case BTPROTO_SCO:
1303 *len_ret = sizeof (struct sockaddr_sco);
1304 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00001305#endif
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001306 default:
1307 PyErr_SetString(socket_error, "getsockaddrlen: "
1308 "unknown BT protocol");
1309 return 0;
1310
Martin v. Löwis12af0482004-01-31 12:34:17 +00001311 }
1312 }
1313#endif
1314
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00001315#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +00001316 case AF_PACKET:
1317 {
1318 *len_ret = sizeof (struct sockaddr_ll);
1319 return 1;
1320 }
1321#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001322
Guido van Rossum710e1df1992-06-12 10:39:36 +00001323 /* More cases here... */
1324
1325 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001326 PyErr_SetString(socket_error, "getsockaddrlen: bad family");
Guido van Rossum710e1df1992-06-12 10:39:36 +00001327 return 0;
1328
1329 }
1330}
1331
1332
Guido van Rossum30a685f1991-06-27 15:51:29 +00001333/* s.accept() method */
1334
Guido van Rossum73624e91994-10-10 17:59:00 +00001335static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001336sock_accept(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001337{
1338 char addrbuf[256];
Fred Drakea04eaad2000-06-30 02:46:07 +00001339 SOCKET_T newfd;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001340 socklen_t addrlen;
Barry Warsaw752300b1997-01-03 17:18:10 +00001341 PyObject *sock = NULL;
1342 PyObject *addr = NULL;
1343 PyObject *res = NULL;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001344 int timeout;
Barry Warsaw752300b1997-01-03 17:18:10 +00001345
Guido van Rossum710e1df1992-06-12 10:39:36 +00001346 if (!getsockaddrlen(s, &addrlen))
1347 return NULL;
Fred Drakefd168342001-05-09 19:11:33 +00001348 memset(addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001349
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001350#ifdef MS_WINDOWS
1351 newfd = INVALID_SOCKET;
1352#else
1353 newfd = -1;
1354#endif
1355
Guido van Rossum73624e91994-10-10 17:59:00 +00001356 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001357 timeout = internal_select(s, 0);
1358 if (!timeout)
1359 newfd = accept(s->sock_fd, (struct sockaddr *) addrbuf,
1360 &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001361 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001362
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001363 if (timeout) {
1364 PyErr_SetString(socket_timeout, "timed out");
1365 return NULL;
1366 }
1367
Fred Drakea04eaad2000-06-30 02:46:07 +00001368#ifdef MS_WINDOWS
1369 if (newfd == INVALID_SOCKET)
1370#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001371 if (newfd < 0)
Fred Drakea04eaad2000-06-30 02:46:07 +00001372#endif
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001373 return s->errorhandler();
Barry Warsaw752300b1997-01-03 17:18:10 +00001374
Guido van Rossum30a685f1991-06-27 15:51:29 +00001375 /* Create the new object with unspecified family,
1376 to avoid calls to bind() etc. on it. */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001377 sock = (PyObject *) new_sockobject(newfd,
1378 s->sock_family,
1379 s->sock_type,
1380 s->sock_proto);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001381
Barry Warsaw752300b1997-01-03 17:18:10 +00001382 if (sock == NULL) {
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001383 SOCKETCLOSE(newfd);
Barry Warsaw752300b1997-01-03 17:18:10 +00001384 goto finally;
1385 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00001386 addr = makesockaddr(s->sock_fd, (struct sockaddr *)addrbuf,
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001387 addrlen, s->sock_proto);
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001388 if (addr == NULL)
Barry Warsaw752300b1997-01-03 17:18:10 +00001389 goto finally;
1390
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001391 res = PyTuple_Pack(2, sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00001392
Guido van Rossum67f7a382002-06-06 21:08:16 +00001393finally:
Guido van Rossum73624e91994-10-10 17:59:00 +00001394 Py_XDECREF(sock);
1395 Py_XDECREF(addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001396 return res;
1397}
1398
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001399PyDoc_STRVAR(accept_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001400"accept() -> (socket object, address info)\n\
1401\n\
1402Wait for an incoming connection. Return a new socket representing the\n\
1403connection, and the address of the client. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001404info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001405
Guido van Rossum11ba0942002-06-13 15:07:44 +00001406/* s.setblocking(flag) method. Argument:
1407 False -- non-blocking mode; same as settimeout(0)
1408 True -- blocking mode; same as settimeout(None)
1409*/
Guido van Rossume4485b01994-09-07 14:32:49 +00001410
Guido van Rossum73624e91994-10-10 17:59:00 +00001411static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001412sock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00001413{
1414 int block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001415
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001416 block = PyInt_AsLong(arg);
1417 if (block == -1 && PyErr_Occurred())
Guido van Rossume4485b01994-09-07 14:32:49 +00001418 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001419
Guido van Rossum11ba0942002-06-13 15:07:44 +00001420 s->sock_timeout = block ? -1.0 : 0.0;
Guido van Rossume8008f02002-06-07 03:36:20 +00001421 internal_setblocking(s, block);
Guido van Rossume4485b01994-09-07 14:32:49 +00001422
Guido van Rossum73624e91994-10-10 17:59:00 +00001423 Py_INCREF(Py_None);
1424 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +00001425}
Guido van Rossume4485b01994-09-07 14:32:49 +00001426
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001427PyDoc_STRVAR(setblocking_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001428"setblocking(flag)\n\
1429\n\
1430Set the socket to blocking (flag is true) or non-blocking (false).\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00001431setblocking(True) is equivalent to settimeout(None);\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001432setblocking(False) is equivalent to settimeout(0.0).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001433
Guido van Rossum11ba0942002-06-13 15:07:44 +00001434/* s.settimeout(timeout) method. Argument:
1435 None -- no timeout, blocking mode; same as setblocking(True)
1436 0.0 -- non-blocking mode; same as setblocking(False)
1437 > 0 -- timeout mode; operations time out after timeout seconds
1438 < 0 -- illegal; raises an exception
1439*/
Guido van Rossum67f7a382002-06-06 21:08:16 +00001440static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001441sock_settimeout(PySocketSockObject *s, PyObject *arg)
Guido van Rossum67f7a382002-06-06 21:08:16 +00001442{
Guido van Rossum11ba0942002-06-13 15:07:44 +00001443 double timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001444
1445 if (arg == Py_None)
Guido van Rossum11ba0942002-06-13 15:07:44 +00001446 timeout = -1.0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001447 else {
Guido van Rossum11ba0942002-06-13 15:07:44 +00001448 timeout = PyFloat_AsDouble(arg);
1449 if (timeout < 0.0) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00001450 if (!PyErr_Occurred())
1451 PyErr_SetString(PyExc_ValueError,
Guido van Rossum11ba0942002-06-13 15:07:44 +00001452 "Timeout value out of range");
Guido van Rossum67f7a382002-06-06 21:08:16 +00001453 return NULL;
1454 }
1455 }
1456
Guido van Rossum11ba0942002-06-13 15:07:44 +00001457 s->sock_timeout = timeout;
1458 internal_setblocking(s, timeout < 0.0);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001459
1460 Py_INCREF(Py_None);
1461 return Py_None;
1462}
1463
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001464PyDoc_STRVAR(settimeout_doc,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001465"settimeout(timeout)\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00001466\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00001467Set a timeout on socket operations. 'timeout' can be a float,\n\
1468giving in seconds, or None. Setting a timeout of None disables\n\
1469the timeout feature and is equivalent to setblocking(1).\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001470Setting a timeout of zero is the same as setblocking(0).");
Guido van Rossum67f7a382002-06-06 21:08:16 +00001471
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001472/* s.gettimeout() method.
1473 Returns the timeout associated with a socket. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00001474static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001475sock_gettimeout(PySocketSockObject *s)
Guido van Rossum67f7a382002-06-06 21:08:16 +00001476{
1477 if (s->sock_timeout < 0.0) {
1478 Py_INCREF(Py_None);
1479 return Py_None;
1480 }
1481 else
1482 return PyFloat_FromDouble(s->sock_timeout);
1483}
1484
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001485PyDoc_STRVAR(gettimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00001486"gettimeout() -> timeout\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00001487\n\
1488Returns the timeout in floating seconds associated with socket \n\
1489operations. A timeout of None indicates that timeouts on socket \n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001490operations are disabled.");
Guido van Rossume4485b01994-09-07 14:32:49 +00001491
Guido van Rossum48a680c2001-03-02 06:34:14 +00001492#ifdef RISCOS
1493/* s.sleeptaskw(1 | 0) method */
1494
1495static PyObject *
Martin v. Löwisa94568a2003-05-10 07:36:56 +00001496sock_sleeptaskw(PySocketSockObject *s,PyObject *arg)
Guido van Rossum48a680c2001-03-02 06:34:14 +00001497{
Guido van Rossum67f7a382002-06-06 21:08:16 +00001498 int block;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00001499 block = PyInt_AsLong(arg);
1500 if (block == -1 && PyErr_Occurred())
Guido van Rossum67f7a382002-06-06 21:08:16 +00001501 return NULL;
1502 Py_BEGIN_ALLOW_THREADS
1503 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
1504 Py_END_ALLOW_THREADS
Guido van Rossum48a680c2001-03-02 06:34:14 +00001505
Guido van Rossum67f7a382002-06-06 21:08:16 +00001506 Py_INCREF(Py_None);
1507 return Py_None;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001508}
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001509PyDoc_STRVAR(sleeptaskw_doc,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001510"sleeptaskw(flag)\n\
1511\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001512Allow sleeps in taskwindows.");
Guido van Rossum48a680c2001-03-02 06:34:14 +00001513#endif
1514
1515
Guido van Rossumaee08791992-09-08 09:05:33 +00001516/* s.setsockopt() method.
1517 With an integer third argument, sets an integer option.
1518 With a string third argument, sets an option from a buffer;
1519 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001520
Guido van Rossum73624e91994-10-10 17:59:00 +00001521static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001522sock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001523{
1524 int level;
1525 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001526 int res;
Guido van Rossumaee08791992-09-08 09:05:33 +00001527 char *buf;
1528 int buflen;
1529 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001530
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001531 if (PyArg_ParseTuple(args, "iii:setsockopt",
1532 &level, &optname, &flag)) {
Guido van Rossumaee08791992-09-08 09:05:33 +00001533 buf = (char *) &flag;
1534 buflen = sizeof flag;
1535 }
1536 else {
Guido van Rossum73624e91994-10-10 17:59:00 +00001537 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001538 if (!PyArg_ParseTuple(args, "iis#:setsockopt",
1539 &level, &optname, &buf, &buflen))
Guido van Rossumaee08791992-09-08 09:05:33 +00001540 return NULL;
1541 }
Thomas Wouters334fb892000-07-25 12:56:38 +00001542 res = setsockopt(s->sock_fd, level, optname, (void *)buf, buflen);
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001543 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001544 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001545 Py_INCREF(Py_None);
1546 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001547}
1548
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001549PyDoc_STRVAR(setsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001550"setsockopt(level, option, value)\n\
1551\n\
1552Set a socket option. See the Unix manual for level and option.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001553The value argument can either be an integer or a string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001554
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001555
Guido van Rossumaee08791992-09-08 09:05:33 +00001556/* s.getsockopt() method.
1557 With two arguments, retrieves an integer option.
1558 With a third integer argument, retrieves a string buffer of that size;
1559 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001560
Guido van Rossum73624e91994-10-10 17:59:00 +00001561static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001562sock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001563{
1564 int level;
1565 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001566 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +00001567 PyObject *buf;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001568 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001569
Guido van Rossumbcc20741998-08-04 22:53:56 +00001570#ifdef __BEOS__
Fred Drake564a6cc2001-05-11 20:12:26 +00001571 /* We have incomplete socket support. */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001572 PyErr_SetString(socket_error, "getsockopt not supported");
Guido van Rossumbcc20741998-08-04 22:53:56 +00001573 return NULL;
1574#else
1575
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001576 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
1577 &level, &optname, &buflen))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001578 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001579
Guido van Rossumbe32c891996-06-20 16:25:29 +00001580 if (buflen == 0) {
Guido van Rossumaee08791992-09-08 09:05:33 +00001581 int flag = 0;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001582 socklen_t flagsize = sizeof flag;
Guido van Rossumb376a4a1993-11-23 17:53:17 +00001583 res = getsockopt(s->sock_fd, level, optname,
Thomas Wouters334fb892000-07-25 12:56:38 +00001584 (void *)&flag, &flagsize);
Guido van Rossumaee08791992-09-08 09:05:33 +00001585 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001586 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001587 return PyInt_FromLong(flag);
Guido van Rossumaee08791992-09-08 09:05:33 +00001588 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001589#ifdef __VMS
1590 if (buflen > 1024) {
1591#else
Guido van Rossumaee08791992-09-08 09:05:33 +00001592 if (buflen <= 0 || buflen > 1024) {
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001593#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001594 PyErr_SetString(socket_error,
Barry Warsaw752300b1997-01-03 17:18:10 +00001595 "getsockopt buflen out of range");
Guido van Rossumaee08791992-09-08 09:05:33 +00001596 return NULL;
1597 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001598 buf = PyString_FromStringAndSize((char *)NULL, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001599 if (buf == NULL)
1600 return NULL;
Guido van Rossumb376a4a1993-11-23 17:53:17 +00001601 res = getsockopt(s->sock_fd, level, optname,
Fred Drake564a6cc2001-05-11 20:12:26 +00001602 (void *)PyString_AS_STRING(buf), &buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001603 if (res < 0) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001604 Py_DECREF(buf);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001605 return s->errorhandler();
Guido van Rossumaee08791992-09-08 09:05:33 +00001606 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001607 _PyString_Resize(&buf, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001608 return buf;
Guido van Rossumbcc20741998-08-04 22:53:56 +00001609#endif /* __BEOS__ */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001610}
1611
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001612PyDoc_STRVAR(getsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001613"getsockopt(level, option[, buffersize]) -> value\n\
1614\n\
1615Get a socket option. See the Unix manual for level and option.\n\
1616If a nonzero buffersize argument is given, the return value is a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001617string of that length; otherwise it is an integer.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001618
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001619
Fred Drake728819a2000-07-01 03:40:12 +00001620/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001621
Guido van Rossum73624e91994-10-10 17:59:00 +00001622static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001623sock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001624{
1625 struct sockaddr *addr;
1626 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001627 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001628
Fred Drake728819a2000-07-01 03:40:12 +00001629 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001630 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001631 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001632 res = bind(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001633 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001634 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001635 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001636 Py_INCREF(Py_None);
1637 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001638}
1639
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001640PyDoc_STRVAR(bind_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001641"bind(address)\n\
1642\n\
1643Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00001644pair (host, port); the host must refer to the local host. For raw packet\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001645sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001646
Guido van Rossum30a685f1991-06-27 15:51:29 +00001647
1648/* s.close() method.
1649 Set the file descriptor to -1 so operations tried subsequently
1650 will surely fail. */
1651
Guido van Rossum73624e91994-10-10 17:59:00 +00001652static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001653sock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001654{
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001655 SOCKET_T fd;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001656
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001657 if ((fd = s->sock_fd) != -1) {
1658 s->sock_fd = -1;
Guido van Rossum08481461996-10-12 14:07:22 +00001659 Py_BEGIN_ALLOW_THREADS
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001660 (void) SOCKETCLOSE(fd);
Guido van Rossum08481461996-10-12 14:07:22 +00001661 Py_END_ALLOW_THREADS
1662 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001663 Py_INCREF(Py_None);
1664 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001665}
1666
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001667PyDoc_STRVAR(close_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001668"close()\n\
1669\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001670Close the socket. It cannot be used after this call.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001671
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001672static int
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001673internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen,
1674 int *timeoutp)
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001675{
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001676 int res, timeout;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001677
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001678 timeout = 0;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001679 res = connect(s->sock_fd, addr, addrlen);
1680
1681#ifdef MS_WINDOWS
1682
1683 if (s->sock_timeout > 0.0) {
1684 if (res < 0 && WSAGetLastError() == WSAEWOULDBLOCK) {
Guido van Rossumb76bdf82003-02-19 17:50:16 +00001685 /* This is a mess. Best solution: trust select */
1686 fd_set fds;
Mark Hammonda57ec932004-08-03 05:06:26 +00001687 fd_set fds_exc;
Guido van Rossumb76bdf82003-02-19 17:50:16 +00001688 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);
Mark Hammonda57ec932004-08-03 05:06:26 +00001693 FD_ZERO(&fds_exc);
1694 FD_SET(s->sock_fd, &fds_exc);
1695 res = select(s->sock_fd+1, NULL, &fds, &fds_exc, &tv);
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001696 if (res == 0) {
Guido van Rossumb76bdf82003-02-19 17:50:16 +00001697 res = WSAEWOULDBLOCK;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001698 timeout = 1;
Mark Hammonda57ec932004-08-03 05:06:26 +00001699 } else if (res > 0) {
1700 if (FD_ISSET(s->sock_fd, &fds))
1701 /* The socket is in the writeable set - this
1702 means connected */
1703 res = 0;
1704 else {
1705 /* As per MS docs, we need to call getsockopt()
1706 to get the underlying error */
1707 int res_size = sizeof res;
1708 /* It must be in the exception set */
1709 assert(FD_ISSET(s->sock_fd, &fds_exc));
1710 if (0 == getsockopt(s->sock_fd, SOL_SOCKET, SO_ERROR,
1711 (char *)&res, &res_size))
1712 /* getsockopt also clears WSAGetLastError,
1713 so reset it back. */
1714 WSASetLastError(res);
1715 else
1716 res = WSAGetLastError();
1717 }
1718 }
Guido van Rossumb76bdf82003-02-19 17:50:16 +00001719 /* else if (res < 0) an error occurred */
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001720 }
1721 }
1722
1723 if (res < 0)
1724 res = WSAGetLastError();
1725
1726#else
1727
1728 if (s->sock_timeout > 0.0) {
1729 if (res < 0 && errno == EINPROGRESS) {
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001730 timeout = internal_select(s, 1);
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001731 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum12e3c712002-08-08 20:39:30 +00001732 if (res < 0 && errno == EISCONN)
1733 res = 0;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001734 }
1735 }
1736
1737 if (res < 0)
1738 res = errno;
1739
1740#endif
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001741 *timeoutp = timeout;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001742
1743 return res;
1744}
Guido van Rossum30a685f1991-06-27 15:51:29 +00001745
Fred Drake728819a2000-07-01 03:40:12 +00001746/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001747
Guido van Rossum73624e91994-10-10 17:59:00 +00001748static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001749sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001750{
1751 struct sockaddr *addr;
1752 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001753 int res;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001754 int timeout;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001755
Fred Drake728819a2000-07-01 03:40:12 +00001756 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001757 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001758
Guido van Rossum73624e91994-10-10 17:59:00 +00001759 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001760 res = internal_connect(s, addr, addrlen, &timeout);
Guido van Rossum11ba0942002-06-13 15:07:44 +00001761 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001762
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001763 if (timeout) {
1764 PyErr_SetString(socket_timeout, "timed out");
1765 return NULL;
1766 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001767 if (res != 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001768 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001769 Py_INCREF(Py_None);
1770 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001771}
1772
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001773PyDoc_STRVAR(connect_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001774"connect(address)\n\
1775\n\
1776Connect the socket to a remote address. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001777is a pair (host, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001778
Guido van Rossum30a685f1991-06-27 15:51:29 +00001779
Fred Drake728819a2000-07-01 03:40:12 +00001780/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001781
1782static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001783sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001784{
1785 struct sockaddr *addr;
1786 int addrlen;
1787 int res;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001788 int timeout;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001789
Fred Drake728819a2000-07-01 03:40:12 +00001790 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001791 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001792
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001793 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001794 res = internal_connect(s, addr, addrlen, &timeout);
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001795 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001796
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001797 return PyInt_FromLong((long) res);
1798}
1799
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001800PyDoc_STRVAR(connect_ex_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00001801"connect_ex(address) -> errno\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00001802\n\
1803This is like connect(address), but returns an error code (the errno value)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001804instead of raising an exception when an error occurs.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001805
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001806
Guido van Rossumed233a51992-06-23 09:07:03 +00001807/* s.fileno() method */
1808
Guido van Rossum73624e91994-10-10 17:59:00 +00001809static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001810sock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00001811{
Fred Drakea04eaad2000-06-30 02:46:07 +00001812#if SIZEOF_SOCKET_T <= SIZEOF_LONG
Guido van Rossum73624e91994-10-10 17:59:00 +00001813 return PyInt_FromLong((long) s->sock_fd);
Fred Drakea04eaad2000-06-30 02:46:07 +00001814#else
Martin v. Löwisb9a0f912003-03-29 10:06:18 +00001815 return PyLong_FromLongLong((PY_LONG_LONG)s->sock_fd);
Fred Drakea04eaad2000-06-30 02:46:07 +00001816#endif
Guido van Rossumed233a51992-06-23 09:07:03 +00001817}
1818
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001819PyDoc_STRVAR(fileno_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001820"fileno() -> integer\n\
1821\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001822Return the integer file descriptor of the socket.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001823
Guido van Rossumed233a51992-06-23 09:07:03 +00001824
Guido van Rossumbe32c891996-06-20 16:25:29 +00001825#ifndef NO_DUP
1826/* s.dup() method */
1827
1828static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001829sock_dup(PySocketSockObject *s)
Guido van Rossumbe32c891996-06-20 16:25:29 +00001830{
Fred Drakea04eaad2000-06-30 02:46:07 +00001831 SOCKET_T newfd;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001832 PyObject *sock;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001833
Guido van Rossumbe32c891996-06-20 16:25:29 +00001834 newfd = dup(s->sock_fd);
1835 if (newfd < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001836 return s->errorhandler();
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001837 sock = (PyObject *) new_sockobject(newfd,
1838 s->sock_family,
1839 s->sock_type,
1840 s->sock_proto);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001841 if (sock == NULL)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001842 SOCKETCLOSE(newfd);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001843 return sock;
1844}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001845
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001846PyDoc_STRVAR(dup_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001847"dup() -> socket object\n\
1848\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001849Return a new socket object connected to the same system resource.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001850
Guido van Rossumbe32c891996-06-20 16:25:29 +00001851#endif
1852
1853
Guido van Rossumc89705d1992-11-26 08:54:07 +00001854/* s.getsockname() method */
1855
Guido van Rossum73624e91994-10-10 17:59:00 +00001856static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001857sock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001858{
1859 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001860 int res;
1861 socklen_t addrlen;
1862
Guido van Rossumc89705d1992-11-26 08:54:07 +00001863 if (!getsockaddrlen(s, &addrlen))
1864 return NULL;
Guido van Rossumca42b161996-01-12 01:36:05 +00001865 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001866 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001867 res = getsockname(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001868 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001869 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001870 return s->errorhandler();
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001871 return makesockaddr(s->sock_fd, (struct sockaddr *) addrbuf, addrlen,
1872 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001873}
1874
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001875PyDoc_STRVAR(getsockname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001876"getsockname() -> address info\n\
1877\n\
1878Return the address of the local endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001879info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001880
Guido van Rossumc89705d1992-11-26 08:54:07 +00001881
Guido van Rossumb6775db1994-08-01 11:34:53 +00001882#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001883/* s.getpeername() method */
1884
Guido van Rossum73624e91994-10-10 17:59:00 +00001885static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001886sock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001887{
1888 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001889 int res;
1890 socklen_t addrlen;
1891
Guido van Rossumc89705d1992-11-26 08:54:07 +00001892 if (!getsockaddrlen(s, &addrlen))
1893 return NULL;
Fred Drakefd168342001-05-09 19:11:33 +00001894 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001895 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001896 res = getpeername(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001897 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001898 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001899 return s->errorhandler();
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001900 return makesockaddr(s->sock_fd, (struct sockaddr *) addrbuf, addrlen,
1901 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001902}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001903
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001904PyDoc_STRVAR(getpeername_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001905"getpeername() -> address info\n\
1906\n\
1907Return the address of the remote endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001908info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001909
Guido van Rossumb6775db1994-08-01 11:34:53 +00001910#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001911
1912
Guido van Rossum30a685f1991-06-27 15:51:29 +00001913/* s.listen(n) method */
1914
Guido van Rossum73624e91994-10-10 17:59:00 +00001915static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001916sock_listen(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001917{
1918 int backlog;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001919 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001920
1921 backlog = PyInt_AsLong(arg);
1922 if (backlog == -1 && PyErr_Occurred())
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001923 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001924 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +00001925 if (backlog < 1)
1926 backlog = 1;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001927 res = listen(s->sock_fd, backlog);
Guido van Rossum73624e91994-10-10 17:59:00 +00001928 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001929 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001930 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001931 Py_INCREF(Py_None);
1932 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001933}
1934
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001935PyDoc_STRVAR(listen_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001936"listen(backlog)\n\
1937\n\
1938Enable a server to accept connections. The backlog argument must be at\n\
1939least 1; it specifies the number of unaccepted connection that the system\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001940will allow before refusing new connections.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001941
1942
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001943#ifndef NO_DUP
Guido van Rossum30a685f1991-06-27 15:51:29 +00001944/* s.makefile(mode) method.
1945 Create a new open file object referring to a dupped version of
1946 the socket's file descriptor. (The dup() call is necessary so
1947 that the open file and socket objects may be closed independent
1948 of each other.)
1949 The mode argument specifies 'r' or 'w' passed to fdopen(). */
1950
Guido van Rossum73624e91994-10-10 17:59:00 +00001951static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001952sock_makefile(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001953{
Tim Petersdbd9ba62000-07-09 03:09:57 +00001954 extern int fclose(FILE *);
Guido van Rossum6b144911995-03-14 15:05:13 +00001955 char *mode = "r";
1956 int bufsize = -1;
Fred Drakea04eaad2000-06-30 02:46:07 +00001957#ifdef MS_WIN32
Tim Peters79248aa2001-08-29 21:37:10 +00001958 Py_intptr_t fd;
Fred Drakea04eaad2000-06-30 02:46:07 +00001959#else
Guido van Rossum30a685f1991-06-27 15:51:29 +00001960 int fd;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001961#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001962 FILE *fp;
Guido van Rossum6b144911995-03-14 15:05:13 +00001963 PyObject *f;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001964#ifdef __VMS
1965 char *mode_r = "r";
1966 char *mode_w = "w";
1967#endif
Guido van Rossum6b144911995-03-14 15:05:13 +00001968
Guido van Rossum43713e52000-02-29 13:59:29 +00001969 if (!PyArg_ParseTuple(args, "|si:makefile", &mode, &bufsize))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001970 return NULL;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001971#ifdef __VMS
1972 if (strcmp(mode,"rb") == 0) {
1973 mode = mode_r;
1974 }
1975 else {
1976 if (strcmp(mode,"wb") == 0) {
1977 mode = mode_w;
1978 }
1979 }
1980#endif
Guido van Rossum8d665e61996-06-26 18:22:49 +00001981#ifdef MS_WIN32
Guido van Rossum82a5c661998-07-07 20:45:43 +00001982 if (((fd = _open_osfhandle(s->sock_fd, _O_BINARY)) < 0) ||
1983 ((fd = dup(fd)) < 0) || ((fp = fdopen(fd, mode)) == NULL))
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001984#else
Guido van Rossum82a5c661998-07-07 20:45:43 +00001985 if ((fd = dup(s->sock_fd)) < 0 || (fp = fdopen(fd, mode)) == NULL)
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001986#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001987 {
Guido van Rossum6b144911995-03-14 15:05:13 +00001988 if (fd >= 0)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001989 SOCKETCLOSE(fd);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001990 return s->errorhandler();
Guido van Rossum6b144911995-03-14 15:05:13 +00001991 }
1992 f = PyFile_FromFile(fp, "<socket>", mode, fclose);
1993 if (f != NULL)
1994 PyFile_SetBufSize(f, bufsize);
1995 return f;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001996}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001997
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001998PyDoc_STRVAR(makefile_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001999"makefile([mode[, buffersize]]) -> file object\n\
2000\n\
2001Return a regular file object corresponding to the socket.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002002The mode and buffersize arguments are as for the built-in open() function.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002003
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002004#endif /* NO_DUP */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002005
Guido van Rossum48a680c2001-03-02 06:34:14 +00002006
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002007/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002008
Guido van Rossum73624e91994-10-10 17:59:00 +00002009static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002010sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002011{
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002012 int len, n = 0, flags = 0, timeout;
Guido van Rossum73624e91994-10-10 17:59:00 +00002013 PyObject *buf;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002014#ifdef __VMS
2015 int read_length;
2016 char *read_buf;
2017#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00002018
Guido van Rossum43713e52000-02-29 13:59:29 +00002019 if (!PyArg_ParseTuple(args, "i|i:recv", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00002020 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002021
2022 if (len < 0) {
Martin v. Löwisfba64e12001-11-19 10:41:26 +00002023 PyErr_SetString(PyExc_ValueError,
Guido van Rossum11ba0942002-06-13 15:07:44 +00002024 "negative buffersize in recv");
Martin v. Löwisfba64e12001-11-19 10:41:26 +00002025 return NULL;
2026 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002027
Guido van Rossum73624e91994-10-10 17:59:00 +00002028 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002029 if (buf == NULL)
2030 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002031
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002032#ifndef __VMS
Guido van Rossum73624e91994-10-10 17:59:00 +00002033 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002034 timeout = internal_select(s, 0);
2035 if (!timeout)
2036 n = recv(s->sock_fd, PyString_AS_STRING(buf), len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00002037 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002038
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002039 if (timeout) {
2040 Py_DECREF(buf);
2041 PyErr_SetString(socket_timeout, "timed out");
2042 return NULL;
2043 }
Guido van Rossum7c53b771995-09-13 18:39:47 +00002044 if (n < 0) {
2045 Py_DECREF(buf);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002046 return s->errorhandler();
Guido van Rossum7c53b771995-09-13 18:39:47 +00002047 }
Tim Peters5de98422002-04-27 18:44:32 +00002048 if (n != len)
2049 _PyString_Resize(&buf, n);
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002050#else
2051 read_buf = PyString_AsString(buf);
2052 read_length = len;
2053 while (read_length != 0) {
2054 unsigned int segment;
2055
2056 segment = read_length /SEGMENT_SIZE;
2057 if (segment != 0) {
2058 segment = SEGMENT_SIZE;
2059 }
2060 else {
2061 segment = read_length;
2062 }
2063
2064 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002065 timeout = internal_select(s, 0);
2066 if (!timeout)
2067 n = recv(s->sock_fd, read_buf, segment, flags);
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002068 Py_END_ALLOW_THREADS
2069
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002070 if (timeout) {
2071 Py_DECREF(buf);
2072 PyErr_SetString(socket_timeout, "timed out");
2073 return NULL;
2074 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002075 if (n < 0) {
2076 Py_DECREF(buf);
2077 return s->errorhandler();
2078 }
2079 if (n != read_length) {
2080 read_buf += n;
2081 break;
2082 }
2083
2084 read_length -= segment;
2085 read_buf += segment;
2086 }
2087 if (_PyString_Resize(&buf, (read_buf - PyString_AsString(buf))) < 0)
2088 {
2089 return NULL;
2090 }
2091#endif /* !__VMS */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002092 return buf;
2093}
2094
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002095PyDoc_STRVAR(recv_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002096"recv(buffersize[, flags]) -> data\n\
2097\n\
2098Receive up to buffersize bytes from the socket. For the optional flags\n\
2099argument, see the Unix manual. When no data is available, block until\n\
2100at least one byte is available or until the remote end is closed. When\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002101the remote end is closed and all data is read, return the empty string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002102
Guido van Rossum30a685f1991-06-27 15:51:29 +00002103
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002104/* s.recvfrom(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002105
Guido van Rossum73624e91994-10-10 17:59:00 +00002106static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002107sock_recvfrom(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002108{
2109 char addrbuf[256];
Barry Warsaw752300b1997-01-03 17:18:10 +00002110 PyObject *buf = NULL;
2111 PyObject *addr = NULL;
2112 PyObject *ret = NULL;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002113 int len, n = 0, flags = 0, timeout;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002114 socklen_t addrlen;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002115
Guido van Rossum43713e52000-02-29 13:59:29 +00002116 if (!PyArg_ParseTuple(args, "i|i:recvfrom", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00002117 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002118
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00002119 if (!getsockaddrlen(s, &addrlen))
2120 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00002121 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00002122 if (buf == NULL)
2123 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002124
Guido van Rossum73624e91994-10-10 17:59:00 +00002125 Py_BEGIN_ALLOW_THREADS
Fred Drakefd168342001-05-09 19:11:33 +00002126 memset(addrbuf, 0, addrlen);
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002127 timeout = internal_select(s, 0);
2128 if (!timeout)
2129 n = recvfrom(s->sock_fd, PyString_AS_STRING(buf), len, flags,
Guido van Rossum8d665e61996-06-26 18:22:49 +00002130#ifndef MS_WINDOWS
Andrew MacIntyreba43e872002-03-03 03:03:52 +00002131#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002132 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00002133#else
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002134 (void *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00002135#endif
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002136#else
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002137 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002138#endif
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002139 );
Guido van Rossum73624e91994-10-10 17:59:00 +00002140 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002141
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002142 if (timeout) {
2143 Py_DECREF(buf);
2144 PyErr_SetString(socket_timeout, "timed out");
2145 return NULL;
2146 }
Guido van Rossum7c53b771995-09-13 18:39:47 +00002147 if (n < 0) {
2148 Py_DECREF(buf);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002149 return s->errorhandler();
Guido van Rossum7c53b771995-09-13 18:39:47 +00002150 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002151
Guido van Rossum53a9bf81996-06-11 18:35:24 +00002152 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002153 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002154
Guido van Rossum67f7a382002-06-06 21:08:16 +00002155 if (!(addr = makesockaddr(s->sock_fd, (struct sockaddr *)addrbuf,
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00002156 addrlen, s->sock_proto)))
Barry Warsaw752300b1997-01-03 17:18:10 +00002157 goto finally;
2158
Raymond Hettinger8ae46892003-10-12 19:09:37 +00002159 ret = PyTuple_Pack(2, buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002160
2161finally:
Guido van Rossum73624e91994-10-10 17:59:00 +00002162 Py_XDECREF(addr);
2163 Py_XDECREF(buf);
Guido van Rossum6f5afc91993-02-05 09:46:15 +00002164 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002165}
2166
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002167PyDoc_STRVAR(recvfrom_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002168"recvfrom(buffersize[, flags]) -> (data, address info)\n\
2169\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002170Like recv(buffersize, flags) but also return the sender's address info.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002171
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002172/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002173
Guido van Rossum73624e91994-10-10 17:59:00 +00002174static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002175sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002176{
Guido van Rossumff4949e1992-08-05 19:58:53 +00002177 char *buf;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002178 int len, n = 0, flags = 0, timeout;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002179#ifdef __VMS
2180 int send_length;
2181#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00002182
Guido van Rossum43713e52000-02-29 13:59:29 +00002183 if (!PyArg_ParseTuple(args, "s#|i:send", &buf, &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00002184 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002185
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002186#ifndef __VMS
Guido van Rossum73624e91994-10-10 17:59:00 +00002187 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002188 timeout = internal_select(s, 1);
2189 if (!timeout)
2190 n = send(s->sock_fd, buf, len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00002191 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002192
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002193 if (timeout) {
2194 PyErr_SetString(socket_timeout, "timed out");
2195 return NULL;
2196 }
Guido van Rossum30a685f1991-06-27 15:51:29 +00002197 if (n < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002198 return s->errorhandler();
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002199#else
2200 /* Divide packet into smaller segments for */
2201 /* TCP/IP Services for OpenVMS */
2202 send_length = len;
2203 while (send_length != 0) {
2204 unsigned int segment;
2205
2206 segment = send_length / SEGMENT_SIZE;
2207 if (segment != 0) {
2208 segment = SEGMENT_SIZE;
2209 }
2210 else {
2211 segment = send_length;
2212 }
2213 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002214 timeout = internal_select(s, 1);
2215 if (!timeout)
2216 n = send(s->sock_fd, buf, segment, flags);
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002217 Py_END_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002218 if (timeout) {
2219 PyErr_SetString(socket_timeout, "timed out");
2220 return NULL;
2221 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002222 if (n < 0) {
2223 return s->errorhandler();
2224 }
2225 send_length -= segment;
2226 buf += segment;
2227 } /* end while */
2228#endif /* !__VMS */
Guido van Rossum73624e91994-10-10 17:59:00 +00002229 return PyInt_FromLong((long)n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00002230}
2231
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002232PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002233"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002234\n\
2235Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002236argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002237sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002238
2239
2240/* s.sendall(data [,flags]) method */
2241
2242static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002243sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002244{
2245 char *buf;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002246 int len, n = 0, flags = 0, timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002247
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002248 if (!PyArg_ParseTuple(args, "s#|i:sendall", &buf, &len, &flags))
2249 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002250
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002251 Py_BEGIN_ALLOW_THREADS
2252 do {
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002253 timeout = internal_select(s, 1);
2254 if (timeout)
2255 break;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002256 n = send(s->sock_fd, buf, len, flags);
2257 if (n < 0)
2258 break;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002259 buf += n;
2260 len -= n;
2261 } while (len > 0);
2262 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002263
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002264 if (timeout) {
2265 PyErr_SetString(socket_timeout, "timed out");
2266 return NULL;
2267 }
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002268 if (n < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002269 return s->errorhandler();
Guido van Rossum67f7a382002-06-06 21:08:16 +00002270
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002271 Py_INCREF(Py_None);
2272 return Py_None;
2273}
2274
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002275PyDoc_STRVAR(sendall_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002276"sendall(data[, flags])\n\
2277\n\
2278Send a data string to the socket. For the optional flags\n\
2279argument, see the Unix manual. This calls send() repeatedly\n\
2280until all data is sent. If an error occurs, it's impossible\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002281to tell how much data has been sent.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002282
Guido van Rossum30a685f1991-06-27 15:51:29 +00002283
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002284/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002285
Guido van Rossum73624e91994-10-10 17:59:00 +00002286static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002287sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002288{
Guido van Rossum73624e91994-10-10 17:59:00 +00002289 PyObject *addro;
Guido van Rossumff4949e1992-08-05 19:58:53 +00002290 char *buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002291 struct sockaddr *addr;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002292 int addrlen, len, n = 0, flags, timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002293
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002294 flags = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002295 if (!PyArg_ParseTuple(args, "s#O:sendto", &buf, &len, &addro)) {
Guido van Rossum73624e91994-10-10 17:59:00 +00002296 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002297 if (!PyArg_ParseTuple(args, "s#iO:sendto",
2298 &buf, &len, &flags, &addro))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002299 return NULL;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002300 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002301
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002302 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002303 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002304
Guido van Rossum73624e91994-10-10 17:59:00 +00002305 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002306 timeout = internal_select(s, 1);
2307 if (!timeout)
2308 n = sendto(s->sock_fd, buf, len, flags, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00002309 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002310
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002311 if (timeout) {
2312 PyErr_SetString(socket_timeout, "timed out");
2313 return NULL;
2314 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002315 if (n < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002316 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00002317 return PyInt_FromLong((long)n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002318}
2319
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002320PyDoc_STRVAR(sendto_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002321"sendto(data[, flags], address) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002322\n\
2323Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002324For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002325
Guido van Rossum30a685f1991-06-27 15:51:29 +00002326
2327/* s.shutdown(how) method */
2328
Guido van Rossum73624e91994-10-10 17:59:00 +00002329static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002330sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002331{
2332 int how;
Guido van Rossumff4949e1992-08-05 19:58:53 +00002333 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002334
2335 how = PyInt_AsLong(arg);
2336 if (how == -1 && PyErr_Occurred())
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002337 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00002338 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002339 res = shutdown(s->sock_fd, how);
Guido van Rossum73624e91994-10-10 17:59:00 +00002340 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002341 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002342 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00002343 Py_INCREF(Py_None);
2344 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002345}
2346
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002347PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002348"shutdown(flag)\n\
2349\n\
Martin v. Löwis94681fc2003-11-27 19:40:22 +00002350Shut down the reading side of the socket (flag == SHUT_RD), the writing side\n\
2351of the socket (flag == SHUT_WR), or both ends (flag == SHUT_RDWR).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002352
Guido van Rossum30a685f1991-06-27 15:51:29 +00002353
2354/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002355
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002356static PyMethodDef sock_methods[] = {
2357 {"accept", (PyCFunction)sock_accept, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002358 accept_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002359 {"bind", (PyCFunction)sock_bind, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002360 bind_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002361 {"close", (PyCFunction)sock_close, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002362 close_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002363 {"connect", (PyCFunction)sock_connect, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002364 connect_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002365 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002366 connect_ex_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00002367#ifndef NO_DUP
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002368 {"dup", (PyCFunction)sock_dup, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002369 dup_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00002370#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002371 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002372 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00002373#ifdef HAVE_GETPEERNAME
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002374 {"getpeername", (PyCFunction)sock_getpeername,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002375 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00002376#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002377 {"getsockname", (PyCFunction)sock_getsockname,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002378 METH_NOARGS, getsockname_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002379 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002380 getsockopt_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002381 {"listen", (PyCFunction)sock_listen, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002382 listen_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002383#ifndef NO_DUP
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002384 {"makefile", (PyCFunction)sock_makefile, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002385 makefile_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002386#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002387 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002388 recv_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002389 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002390 recvfrom_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002391 {"send", (PyCFunction)sock_send, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002392 send_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002393 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002394 sendall_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002395 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002396 sendto_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002397 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002398 setblocking_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002399 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
Guido van Rossum67f7a382002-06-06 21:08:16 +00002400 settimeout_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002401 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
Guido van Rossum67f7a382002-06-06 21:08:16 +00002402 gettimeout_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002403 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002404 setsockopt_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002405 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002406 shutdown_doc},
2407#ifdef RISCOS
Martin v. Löwisa94568a2003-05-10 07:36:56 +00002408 {"sleeptaskw", (PyCFunction)sock_sleeptaskw, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002409 sleeptaskw_doc},
2410#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +00002411 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002412};
2413
Guido van Rossum30a685f1991-06-27 15:51:29 +00002414
Guido van Rossum73624e91994-10-10 17:59:00 +00002415/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00002416 First close the file description. */
2417
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002418static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002419sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002420{
Guido van Rossumfa972c92000-04-10 12:45:45 +00002421 if (s->sock_fd != -1)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00002422 (void) SOCKETCLOSE(s->sock_fd);
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002423 s->ob_type->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002424}
2425
Guido van Rossum30a685f1991-06-27 15:51:29 +00002426
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002427static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002428sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002429{
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002430 char buf[512];
Fred Drakea04eaad2000-06-30 02:46:07 +00002431#if SIZEOF_SOCKET_T > SIZEOF_LONG
2432 if (s->sock_fd > LONG_MAX) {
2433 /* this can occur on Win64, and actually there is a special
2434 ugly printf formatter for decimal pointer length integer
2435 printing, only bother if necessary*/
2436 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002437 "no printf formatter to display "
2438 "the socket descriptor in decimal");
Fred Drakea04eaad2000-06-30 02:46:07 +00002439 return NULL;
2440 }
2441#endif
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002442 PyOS_snprintf(
2443 buf, sizeof(buf),
2444 "<socket object, fd=%ld, family=%d, type=%d, protocol=%d>",
2445 (long)s->sock_fd, s->sock_family,
2446 s->sock_type,
2447 s->sock_proto);
Guido van Rossumdc1c64a1996-02-27 15:21:19 +00002448 return PyString_FromString(buf);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002449}
2450
2451
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002452/* Create a new, uninitialized socket object. */
2453
2454static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002455sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002456{
2457 PyObject *new;
2458
2459 new = type->tp_alloc(type, 0);
Guido van Rossume1c478f2002-06-06 20:08:25 +00002460 if (new != NULL) {
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002461 ((PySocketSockObject *)new)->sock_fd = -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002462 ((PySocketSockObject *)new)->sock_timeout = -1.0;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002463 ((PySocketSockObject *)new)->errorhandler = &set_error;
Guido van Rossume1c478f2002-06-06 20:08:25 +00002464 }
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002465 return new;
2466}
2467
2468
2469/* Initialize a new socket object. */
2470
2471/*ARGSUSED*/
2472static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00002473sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002474{
2475 PySocketSockObject *s = (PySocketSockObject *)self;
2476 SOCKET_T fd;
2477 int family = AF_INET, type = SOCK_STREAM, proto = 0;
2478 static char *keywords[] = {"family", "type", "proto", 0};
2479
2480 if (!PyArg_ParseTupleAndKeywords(args, kwds,
2481 "|iii:socket", keywords,
2482 &family, &type, &proto))
2483 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002484
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002485 Py_BEGIN_ALLOW_THREADS
2486 fd = socket(family, type, proto);
2487 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002488
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002489#ifdef MS_WINDOWS
2490 if (fd == INVALID_SOCKET)
2491#else
2492 if (fd < 0)
2493#endif
2494 {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002495 set_error();
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002496 return -1;
2497 }
2498 init_sockobject(s, fd, family, type, proto);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002499
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002500 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002501
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002502}
2503
2504
Guido van Rossumb6775db1994-08-01 11:34:53 +00002505/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002506
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002507static PyTypeObject sock_type = {
Guido van Rossum55558541996-05-23 22:54:50 +00002508 PyObject_HEAD_INIT(0) /* Must fill in type value later */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002509 0, /* ob_size */
Guido van Rossumca6dfa52001-10-28 12:31:33 +00002510 "_socket.socket", /* tp_name */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002511 sizeof(PySocketSockObject), /* tp_basicsize */
2512 0, /* tp_itemsize */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002513 (destructor)sock_dealloc, /* tp_dealloc */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002514 0, /* tp_print */
2515 0, /* tp_getattr */
2516 0, /* tp_setattr */
2517 0, /* tp_compare */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002518 (reprfunc)sock_repr, /* tp_repr */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002519 0, /* tp_as_number */
2520 0, /* tp_as_sequence */
2521 0, /* tp_as_mapping */
2522 0, /* tp_hash */
2523 0, /* tp_call */
2524 0, /* tp_str */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002525 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002526 0, /* tp_setattro */
2527 0, /* tp_as_buffer */
2528 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002529 sock_doc, /* tp_doc */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002530 0, /* tp_traverse */
2531 0, /* tp_clear */
2532 0, /* tp_richcompare */
2533 0, /* tp_weaklistoffset */
2534 0, /* tp_iter */
2535 0, /* tp_iternext */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002536 sock_methods, /* tp_methods */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002537 0, /* tp_members */
2538 0, /* tp_getset */
2539 0, /* tp_base */
2540 0, /* tp_dict */
2541 0, /* tp_descr_get */
2542 0, /* tp_descr_set */
2543 0, /* tp_dictoffset */
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00002544 sock_initobj, /* tp_init */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002545 PyType_GenericAlloc, /* tp_alloc */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002546 sock_new, /* tp_new */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002547 PyObject_Del, /* tp_free */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002548};
2549
Guido van Rossum30a685f1991-06-27 15:51:29 +00002550
Guido van Rossum81194471991-07-27 21:42:02 +00002551/* Python interface to gethostname(). */
2552
2553/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002554static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002555socket_gethostname(PyObject *self, PyObject *args)
Guido van Rossum81194471991-07-27 21:42:02 +00002556{
2557 char buf[1024];
Guido van Rossumff4949e1992-08-05 19:58:53 +00002558 int res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002559 if (!PyArg_ParseTuple(args, ":gethostname"))
Guido van Rossum81194471991-07-27 21:42:02 +00002560 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00002561 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002562 res = gethostname(buf, (int) sizeof buf - 1);
Guido van Rossum73624e91994-10-10 17:59:00 +00002563 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002564 if (res < 0)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002565 return set_error();
Guido van Rossum81194471991-07-27 21:42:02 +00002566 buf[sizeof buf - 1] = '\0';
Guido van Rossum73624e91994-10-10 17:59:00 +00002567 return PyString_FromString(buf);
Guido van Rossum81194471991-07-27 21:42:02 +00002568}
Guido van Rossumff4949e1992-08-05 19:58:53 +00002569
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002570PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002571"gethostname() -> string\n\
2572\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002573Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002574
Guido van Rossumff4949e1992-08-05 19:58:53 +00002575
Guido van Rossum30a685f1991-06-27 15:51:29 +00002576/* Python interface to gethostbyname(name). */
2577
2578/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002579static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002580socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002581{
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002582 char *name;
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00002583#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002584 struct sockaddr_storage addrbuf;
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00002585#else
2586 struct sockaddr_in addrbuf;
2587#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002588
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002589 if (!PyArg_ParseTuple(args, "s:gethostbyname", &name))
Guido van Rossum30a685f1991-06-27 15:51:29 +00002590 return NULL;
Martin v. Löwisddc6f472002-07-28 16:10:31 +00002591 if (setipaddr(name, (struct sockaddr *)&addrbuf, sizeof(addrbuf), AF_INET) < 0)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002592 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002593 return makeipaddr((struct sockaddr *)&addrbuf,
2594 sizeof(struct sockaddr_in));
Guido van Rossum30a685f1991-06-27 15:51:29 +00002595}
2596
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002597PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002598"gethostbyname(host) -> address\n\
2599\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002600Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002601
2602
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002603/* Convenience function common to gethostbyname_ex and gethostbyaddr */
2604
2605static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002606gethost_common(struct hostent *h, struct sockaddr *addr, int alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002607{
2608 char **pch;
2609 PyObject *rtn_tuple = (PyObject *)NULL;
2610 PyObject *name_list = (PyObject *)NULL;
2611 PyObject *addr_list = (PyObject *)NULL;
2612 PyObject *tmp;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002613
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002614 if (h == NULL) {
Guido van Rossum48a680c2001-03-02 06:34:14 +00002615 /* Let's get real error message to return */
Guido van Rossume2ae77b2001-10-24 20:42:55 +00002616#ifndef RISCOS
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002617 set_herror(h_errno);
Guido van Rossume2ae77b2001-10-24 20:42:55 +00002618#else
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002619 PyErr_SetString(socket_error, "host not found");
Guido van Rossume2ae77b2001-10-24 20:42:55 +00002620#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002621 return NULL;
2622 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002623
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002624 if (h->h_addrtype != af) {
2625#ifdef HAVE_STRERROR
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002626 /* Let's get real error message to return */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002627 PyErr_SetString(socket_error,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002628 (char *)strerror(EAFNOSUPPORT));
2629#else
2630 PyErr_SetString(
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002631 socket_error,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002632 "Address family not supported by protocol family");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002633#endif
2634 return NULL;
2635 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002636
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002637 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00002638
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002639 case AF_INET:
2640 if (alen < sizeof(struct sockaddr_in))
2641 return NULL;
2642 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002643
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002644#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002645 case AF_INET6:
2646 if (alen < sizeof(struct sockaddr_in6))
2647 return NULL;
2648 break;
2649#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00002650
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002651 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002652
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002653 if ((name_list = PyList_New(0)) == NULL)
2654 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002655
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002656 if ((addr_list = PyList_New(0)) == NULL)
2657 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002658
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002659 for (pch = h->h_aliases; *pch != NULL; pch++) {
2660 int status;
2661 tmp = PyString_FromString(*pch);
2662 if (tmp == NULL)
2663 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002664
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002665 status = PyList_Append(name_list, tmp);
2666 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002667
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002668 if (status)
2669 goto err;
2670 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002671
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002672 for (pch = h->h_addr_list; *pch != NULL; pch++) {
2673 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002674
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002675 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00002676
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002677 case AF_INET:
2678 {
2679 struct sockaddr_in sin;
2680 memset(&sin, 0, sizeof(sin));
2681 sin.sin_family = af;
2682#ifdef HAVE_SOCKADDR_SA_LEN
2683 sin.sin_len = sizeof(sin);
2684#endif
2685 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
2686 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
Guido van Rossum67f7a382002-06-06 21:08:16 +00002687
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002688 if (pch == h->h_addr_list && alen >= sizeof(sin))
2689 memcpy((char *) addr, &sin, sizeof(sin));
2690 break;
2691 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002692
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002693#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002694 case AF_INET6:
2695 {
2696 struct sockaddr_in6 sin6;
2697 memset(&sin6, 0, sizeof(sin6));
2698 sin6.sin6_family = af;
2699#ifdef HAVE_SOCKADDR_SA_LEN
2700 sin6.sin6_len = sizeof(sin6);
2701#endif
2702 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
2703 tmp = makeipaddr((struct sockaddr *)&sin6,
2704 sizeof(sin6));
Guido van Rossum67f7a382002-06-06 21:08:16 +00002705
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002706 if (pch == h->h_addr_list && alen >= sizeof(sin6))
2707 memcpy((char *) addr, &sin6, sizeof(sin6));
2708 break;
2709 }
2710#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00002711
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002712 default: /* can't happen */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002713 PyErr_SetString(socket_error,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002714 "unsupported address family");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002715 return NULL;
2716 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002717
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002718 if (tmp == NULL)
2719 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002720
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002721 status = PyList_Append(addr_list, tmp);
2722 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002723
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002724 if (status)
2725 goto err;
2726 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002727
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002728 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002729
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002730 err:
2731 Py_XDECREF(name_list);
2732 Py_XDECREF(addr_list);
2733 return rtn_tuple;
2734}
2735
2736
2737/* Python interface to gethostbyname_ex(name). */
2738
2739/*ARGSUSED*/
2740static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002741socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002742{
2743 char *name;
2744 struct hostent *h;
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00002745#ifdef ENABLE_IPV6
2746 struct sockaddr_storage addr;
2747#else
2748 struct sockaddr_in addr;
2749#endif
Martin v. Löwis9db2f572001-07-23 01:30:10 +00002750 struct sockaddr *sa;
Guido van Rossum955becc1999-03-22 20:14:53 +00002751 PyObject *ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002752#ifdef HAVE_GETHOSTBYNAME_R
2753 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002754#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
2755 struct hostent_data data;
2756#else
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002757 char buf[16384];
2758 int buf_len = (sizeof buf) - 1;
2759 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002760#endif
2761#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002762 int result;
2763#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002764#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002765
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002766 if (!PyArg_ParseTuple(args, "s:gethostbyname_ex", &name))
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002767 return NULL;
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00002768 if (setipaddr(name, (struct sockaddr *)&addr, sizeof(addr), AF_INET) < 0)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002769 return NULL;
2770 Py_BEGIN_ALLOW_THREADS
2771#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002772#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002773 result = gethostbyname_r(name, &hp_allocated, buf, buf_len,
2774 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002775#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002776 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002777#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00002778 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002779 result = gethostbyname_r(name, &hp_allocated, &data);
2780 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002781#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002782#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00002783#ifdef USE_GETHOSTBYNAME_LOCK
Just van Rossum1040d2c2003-05-09 07:53:18 +00002784 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002785#endif
2786 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002787#endif /* HAVE_GETHOSTBYNAME_R */
2788 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002789 /* Some C libraries would require addr.__ss_family instead of
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002790 addr.ss_family.
2791 Therefore, we cast the sockaddr_storage into sockaddr to
2792 access sa_family. */
Martin v. Löwis9db2f572001-07-23 01:30:10 +00002793 sa = (struct sockaddr*)&addr;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002794 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr),
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002795 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00002796#ifdef USE_GETHOSTBYNAME_LOCK
Just van Rossum1040d2c2003-05-09 07:53:18 +00002797 PyThread_release_lock(netdb_lock);
Guido van Rossum955becc1999-03-22 20:14:53 +00002798#endif
2799 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002800}
2801
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002802PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002803"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
2804\n\
2805Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002806for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002807
2808
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002809/* Python interface to gethostbyaddr(IP). */
2810
2811/*ARGSUSED*/
2812static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002813socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002814{
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002815#ifdef ENABLE_IPV6
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002816 struct sockaddr_storage addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002817#else
Guido van Rossum48a680c2001-03-02 06:34:14 +00002818 struct sockaddr_in addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002819#endif
2820 struct sockaddr *sa = (struct sockaddr *)&addr;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002821 char *ip_num;
2822 struct hostent *h;
Guido van Rossum3baaa131999-03-22 21:44:51 +00002823 PyObject *ret;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002824#ifdef HAVE_GETHOSTBYNAME_R
2825 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002826#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
2827 struct hostent_data data;
2828#else
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002829 char buf[16384];
2830 int buf_len = (sizeof buf) - 1;
2831 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002832#endif
2833#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002834 int result;
2835#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002836#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002837 char *ap;
2838 int al;
2839 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002840
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002841 if (!PyArg_ParseTuple(args, "s:gethostbyaddr", &ip_num))
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002842 return NULL;
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00002843 af = AF_UNSPEC;
Martin v. Löwisddc6f472002-07-28 16:10:31 +00002844 if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002845 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002846 af = sa->sa_family;
2847 ap = NULL;
2848 al = 0;
2849 switch (af) {
2850 case AF_INET:
2851 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
2852 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
2853 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002854#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002855 case AF_INET6:
2856 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
2857 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
2858 break;
2859#endif
2860 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002861 PyErr_SetString(socket_error, "unsupported address family");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002862 return NULL;
2863 }
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002864 Py_BEGIN_ALLOW_THREADS
2865#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002866#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002867 result = gethostbyaddr_r(ap, al, af,
2868 &hp_allocated, buf, buf_len,
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002869 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002870#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002871 h = gethostbyaddr_r(ap, al, af,
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002872 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002873#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00002874 memset((void *) &data, '\0', sizeof(data));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002875 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002876 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002877#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002878#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00002879#ifdef USE_GETHOSTBYNAME_LOCK
Just van Rossum1040d2c2003-05-09 07:53:18 +00002880 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002881#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002882 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002883#endif /* HAVE_GETHOSTBYNAME_R */
2884 Py_END_ALLOW_THREADS
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002885 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00002886#ifdef USE_GETHOSTBYNAME_LOCK
Just van Rossum1040d2c2003-05-09 07:53:18 +00002887 PyThread_release_lock(netdb_lock);
Guido van Rossum3baaa131999-03-22 21:44:51 +00002888#endif
2889 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002890}
2891
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002892PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002893"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
2894\n\
2895Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002896for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002897
Guido van Rossum30a685f1991-06-27 15:51:29 +00002898
2899/* Python interface to getservbyname(name).
2900 This only returns the port number, since the other info is already
2901 known or not useful (like the list of aliases). */
2902
2903/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002904static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002905socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002906{
Barry Warsaw11b91a02004-06-28 00:50:43 +00002907 char *name, *proto=NULL;
Guido van Rossum30a685f1991-06-27 15:51:29 +00002908 struct servent *sp;
Barry Warsaw11b91a02004-06-28 00:50:43 +00002909 if (!PyArg_ParseTuple(args, "s|s:getservbyname", &name, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +00002910 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00002911 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002912 sp = getservbyname(name, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00002913 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00002914 if (sp == NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002915 PyErr_SetString(socket_error, "service/proto not found");
Guido van Rossum30a685f1991-06-27 15:51:29 +00002916 return NULL;
2917 }
Guido van Rossum73624e91994-10-10 17:59:00 +00002918 return PyInt_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00002919}
2920
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002921PyDoc_STRVAR(getservbyname_doc,
Barry Warsaw11b91a02004-06-28 00:50:43 +00002922"getservbyname(servicename[, protocolname]) -> integer\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002923\n\
2924Return a port number from a service name and protocol name.\n\
Barry Warsaw11b91a02004-06-28 00:50:43 +00002925The optional protocol name, if given, should be 'tcp' or 'udp',\n\
2926otherwise any protocol will match.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002927
Guido van Rossum30a685f1991-06-27 15:51:29 +00002928
Barry Warsaw11b91a02004-06-28 00:50:43 +00002929/* Python interface to getservbyport(port).
2930 This only returns the service name, since the other info is already
2931 known or not useful (like the list of aliases). */
2932
2933/*ARGSUSED*/
2934static PyObject *
2935socket_getservbyport(PyObject *self, PyObject *args)
2936{
2937 int port;
2938 char *proto=NULL;
2939 struct servent *sp;
2940 if (!PyArg_ParseTuple(args, "i|s:getservbyport", &port, &proto))
2941 return NULL;
2942 Py_BEGIN_ALLOW_THREADS
2943 sp = getservbyport(htons(port), proto);
2944 Py_END_ALLOW_THREADS
2945 if (sp == NULL) {
2946 PyErr_SetString(socket_error, "port/proto not found");
2947 return NULL;
2948 }
2949 return PyString_FromString(sp->s_name);
2950}
2951
2952PyDoc_STRVAR(getservbyport_doc,
2953"getservbyport(port[, protocolname]) -> string\n\
2954\n\
2955Return the service name from a port number and protocol name.\n\
2956The optional protocol name, if given, should be 'tcp' or 'udp',\n\
2957otherwise any protocol will match.");
2958
Guido van Rossum3901d851996-12-19 16:35:04 +00002959/* Python interface to getprotobyname(name).
2960 This only returns the protocol number, since the other info is
2961 already known or not useful (like the list of aliases). */
2962
2963/*ARGSUSED*/
2964static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002965socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00002966{
2967 char *name;
2968 struct protoent *sp;
Guido van Rossumbcc20741998-08-04 22:53:56 +00002969#ifdef __BEOS__
2970/* Not available in BeOS yet. - [cjh] */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002971 PyErr_SetString(socket_error, "getprotobyname not supported");
Guido van Rossumbcc20741998-08-04 22:53:56 +00002972 return NULL;
2973#else
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002974 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
Guido van Rossum3901d851996-12-19 16:35:04 +00002975 return NULL;
2976 Py_BEGIN_ALLOW_THREADS
2977 sp = getprotobyname(name);
2978 Py_END_ALLOW_THREADS
2979 if (sp == NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002980 PyErr_SetString(socket_error, "protocol not found");
Guido van Rossum3901d851996-12-19 16:35:04 +00002981 return NULL;
2982 }
2983 return PyInt_FromLong((long) sp->p_proto);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002984#endif
Guido van Rossum3901d851996-12-19 16:35:04 +00002985}
2986
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002987PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002988"getprotobyname(name) -> integer\n\
2989\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002990Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002991
Guido van Rossum3901d851996-12-19 16:35:04 +00002992
Dave Cole331708b2004-08-09 04:51:41 +00002993#ifdef HAVE_SOCKETPAIR
2994/* Create a pair of sockets using the socketpair() function.
Dave Cole07fda7e2004-08-23 05:16:23 +00002995 Arguments as for socket() except the default family is AF_UNIX if
Dave Colee8bbfe42004-08-26 00:51:16 +00002996 defined on the platform; otherwise, the default is AF_INET. */
Dave Cole331708b2004-08-09 04:51:41 +00002997
2998/*ARGSUSED*/
2999static PyObject *
3000socket_socketpair(PyObject *self, PyObject *args)
3001{
3002 PySocketSockObject *s0 = NULL, *s1 = NULL;
3003 SOCKET_T sv[2];
3004 int family, type = SOCK_STREAM, proto = 0;
3005 PyObject *res = NULL;
3006
3007#if defined(AF_UNIX)
3008 family = AF_UNIX;
3009#else
3010 family = AF_INET;
3011#endif
3012 if (!PyArg_ParseTuple(args, "|iii:socketpair",
3013 &family, &type, &proto))
3014 return NULL;
3015 /* Create a pair of socket fds */
3016 if (socketpair(family, type, proto, sv) < 0)
3017 return set_error();
Dave Cole331708b2004-08-09 04:51:41 +00003018 s0 = new_sockobject(sv[0], family, type, proto);
3019 if (s0 == NULL)
3020 goto finally;
3021 s1 = new_sockobject(sv[1], family, type, proto);
3022 if (s1 == NULL)
3023 goto finally;
3024 res = PyTuple_Pack(2, s0, s1);
3025
3026finally:
3027 if (res == NULL) {
3028 if (s0 == NULL)
3029 SOCKETCLOSE(sv[0]);
3030 if (s1 == NULL)
3031 SOCKETCLOSE(sv[1]);
3032 }
3033 Py_XDECREF(s0);
3034 Py_XDECREF(s1);
3035 return res;
3036}
3037
3038PyDoc_STRVAR(socketpair_doc,
3039"socketpair([family[, type[, proto]]]) -> (socket object, socket object)\n\
3040\n\
3041Create a pair of socket objects from the sockets returned by the platform\n\
3042socketpair() function.\n\
Dave Cole07fda7e2004-08-23 05:16:23 +00003043The arguments are the same as for socket() except the default family is\n\
Dave Colee8bbfe42004-08-26 00:51:16 +00003044AF_UNIX if defined on the platform; otherwise, the default is AF_INET.");
Dave Cole331708b2004-08-09 04:51:41 +00003045
3046#endif /* HAVE_SOCKETPAIR */
3047
3048
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00003049#ifndef NO_DUP
Guido van Rossum2a7178e1992-12-08 13:38:24 +00003050/* Create a socket object from a numeric file description.
3051 Useful e.g. if stdin is a socket.
3052 Additional arguments as for socket(). */
3053
3054/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00003055static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003056socket_fromfd(PyObject *self, PyObject *args)
Guido van Rossum2a7178e1992-12-08 13:38:24 +00003057{
Guido van Rossum73624e91994-10-10 17:59:00 +00003058 PySocketSockObject *s;
Fred Drakea04eaad2000-06-30 02:46:07 +00003059 SOCKET_T fd;
3060 int family, type, proto = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00003061 if (!PyArg_ParseTuple(args, "iii|i:fromfd",
3062 &fd, &family, &type, &proto))
Guido van Rossumbe32c891996-06-20 16:25:29 +00003063 return NULL;
Guido van Rossum5f59d601992-12-14 16:59:51 +00003064 /* Dup the fd so it and the socket can be closed independently */
3065 fd = dup(fd);
3066 if (fd < 0)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003067 return set_error();
3068 s = new_sockobject(fd, family, type, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00003069 return (PyObject *) s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00003070}
Guido van Rossum82a5c661998-07-07 20:45:43 +00003071
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003072PyDoc_STRVAR(fromfd_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003073"fromfd(fd, family, type[, proto]) -> socket object\n\
3074\n\
3075Create a socket object from the given file descriptor.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003076The remaining arguments are the same as for socket().");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003077
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00003078#endif /* NO_DUP */
Guido van Rossum2a7178e1992-12-08 13:38:24 +00003079
Guido van Rossum82a5c661998-07-07 20:45:43 +00003080
Guido van Rossum006bf911996-06-12 04:04:55 +00003081static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003082socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00003083{
3084 int x1, x2;
3085
Guido van Rossum27fc3c02000-03-24 20:56:56 +00003086 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00003087 return NULL;
3088 }
3089 x2 = (int)ntohs((short)x1);
3090 return PyInt_FromLong(x2);
3091}
3092
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003093PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003094"ntohs(integer) -> integer\n\
3095\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003096Convert a 16-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003097
3098
Guido van Rossum006bf911996-06-12 04:04:55 +00003099static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003100socket_ntohl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00003101{
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003102 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00003103
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003104 if (PyInt_Check(arg)) {
3105 x = PyInt_AS_LONG(arg);
Jeremy Hylton825e47b2002-07-25 16:37:51 +00003106 if (x == (unsigned long) -1 && PyErr_Occurred())
3107 return NULL;
Guido van Rossum006bf911996-06-12 04:04:55 +00003108 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003109 else if (PyLong_Check(arg)) {
3110 x = PyLong_AsUnsignedLong(arg);
Jeremy Hylton825e47b2002-07-25 16:37:51 +00003111 if (x == (unsigned long) -1 && PyErr_Occurred())
3112 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003113#if SIZEOF_LONG > 4
3114 {
3115 unsigned long y;
3116 /* only want the trailing 32 bits */
3117 y = x & 0xFFFFFFFFUL;
3118 if (y ^ x)
3119 return PyErr_Format(PyExc_OverflowError,
3120 "long int larger than 32 bits");
3121 x = y;
Tim Peters58141872002-08-06 22:25:02 +00003122 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003123#endif
3124 }
3125 else
Tim Peters58141872002-08-06 22:25:02 +00003126 return PyErr_Format(PyExc_TypeError,
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003127 "expected int/long, %s found",
3128 arg->ob_type->tp_name);
3129 if (x == (unsigned long) -1 && PyErr_Occurred())
3130 return NULL;
3131 return PyInt_FromLong(ntohl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00003132}
3133
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003134PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003135"ntohl(integer) -> integer\n\
3136\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003137Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003138
3139
Guido van Rossum006bf911996-06-12 04:04:55 +00003140static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003141socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00003142{
Hye-Shik Changa7b673f2003-12-17 09:40:23 +00003143 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00003144
Guido van Rossum27fc3c02000-03-24 20:56:56 +00003145 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00003146 return NULL;
3147 }
3148 x2 = (int)htons((short)x1);
3149 return PyInt_FromLong(x2);
3150}
3151
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003152PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003153"htons(integer) -> integer\n\
3154\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003155Convert a 16-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003156
3157
Guido van Rossum006bf911996-06-12 04:04:55 +00003158static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003159socket_htonl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00003160{
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003161 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00003162
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003163 if (PyInt_Check(arg)) {
3164 x = PyInt_AS_LONG(arg);
Jeremy Hylton825e47b2002-07-25 16:37:51 +00003165 if (x == (unsigned long) -1 && PyErr_Occurred())
3166 return NULL;
Guido van Rossum006bf911996-06-12 04:04:55 +00003167 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003168 else if (PyLong_Check(arg)) {
3169 x = PyLong_AsUnsignedLong(arg);
Jeremy Hylton825e47b2002-07-25 16:37:51 +00003170 if (x == (unsigned long) -1 && PyErr_Occurred())
3171 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003172#if SIZEOF_LONG > 4
3173 {
3174 unsigned long y;
3175 /* only want the trailing 32 bits */
3176 y = x & 0xFFFFFFFFUL;
3177 if (y ^ x)
3178 return PyErr_Format(PyExc_OverflowError,
3179 "long int larger than 32 bits");
3180 x = y;
Tim Peters58141872002-08-06 22:25:02 +00003181 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003182#endif
3183 }
3184 else
Tim Peters58141872002-08-06 22:25:02 +00003185 return PyErr_Format(PyExc_TypeError,
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003186 "expected int/long, %s found",
3187 arg->ob_type->tp_name);
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003188 return PyInt_FromLong(htonl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00003189}
3190
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003191PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003192"htonl(integer) -> integer\n\
3193\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003194Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003195
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003196/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003197
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003198PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003199"inet_aton(string) -> packed 32-bit IP representation\n\
3200\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003201Convert 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 +00003202binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003203
3204static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003205socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003206{
Guido van Rossuma2e48551999-09-09 15:42:59 +00003207#ifndef INADDR_NONE
3208#define INADDR_NONE (-1)
3209#endif
Neal Norwitz88f115b2003-02-13 02:15:42 +00003210#ifdef HAVE_INET_ATON
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003211 struct in_addr buf;
Tim Peters1df9fdd2003-02-13 03:13:40 +00003212#else
3213 /* Have to use inet_addr() instead */
3214 unsigned long packed_addr;
3215#endif
3216 char *ip_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003217
Tim Peters1df9fdd2003-02-13 03:13:40 +00003218 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003219 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003220
Tim Peters1df9fdd2003-02-13 03:13:40 +00003221
3222#ifdef HAVE_INET_ATON
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003223 if (inet_aton(ip_addr, &buf))
3224 return PyString_FromStringAndSize((char *)(&buf),
3225 sizeof(buf));
3226
3227 PyErr_SetString(socket_error,
3228 "illegal IP address string passed to inet_aton");
3229 return NULL;
3230
Tim Peters1df9fdd2003-02-13 03:13:40 +00003231#else /* ! HAVE_INET_ATON */
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003232 /* XXX Problem here: inet_aton('255.255.255.255') raises
3233 an exception while it should be a valid address. */
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003234 packed_addr = inet_addr(ip_addr);
3235
3236 if (packed_addr == INADDR_NONE) { /* invalid address */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003237 PyErr_SetString(socket_error,
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003238 "illegal IP address string passed to inet_aton");
3239 return NULL;
3240 }
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003241 return PyString_FromStringAndSize((char *) &packed_addr,
3242 sizeof(packed_addr));
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003243#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003244}
3245
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003246PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00003247"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003248\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003249Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003250
3251static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003252socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003253{
3254 char *packed_str;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003255 int addr_len;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003256 struct in_addr packed_addr;
3257
Guido van Rossum27fc3c02000-03-24 20:56:56 +00003258 if (!PyArg_ParseTuple(args, "s#:inet_ntoa", &packed_str, &addr_len)) {
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003259 return NULL;
3260 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00003261
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003262 if (addr_len != sizeof(packed_addr)) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003263 PyErr_SetString(socket_error,
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003264 "packed IP wrong length for inet_ntoa");
3265 return NULL;
3266 }
3267
3268 memcpy(&packed_addr, packed_str, addr_len);
3269
3270 return PyString_FromString(inet_ntoa(packed_addr));
3271}
Guido van Rossum82a5c661998-07-07 20:45:43 +00003272
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003273#ifdef HAVE_INET_PTON
3274
3275PyDoc_STRVAR(inet_pton_doc,
3276"inet_pton(af, ip) -> packed IP address string\n\
3277\n\
3278Convert an IP address from string format to a packed string suitable\n\
3279for use with low-level network functions.");
3280
3281static PyObject *
3282socket_inet_pton(PyObject *self, PyObject *args)
3283{
3284 int af;
3285 char* ip;
3286 int retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003287#ifdef ENABLE_IPV6
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003288 char packed[MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003289#else
3290 char packed[sizeof(struct in_addr)];
3291#endif
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003292 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
3293 return NULL;
3294 }
3295
Martin v. Löwis04697e82004-06-02 12:35:29 +00003296#if !defined(ENABLE_IPV6) && defined(AF_INET6)
Martin v. Löwis10649092003-08-05 06:25:06 +00003297 if(af == AF_INET6) {
3298 PyErr_SetString(socket_error,
3299 "can't use AF_INET6, IPv6 is disabled");
3300 return NULL;
3301 }
3302#endif
3303
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003304 retval = inet_pton(af, ip, packed);
3305 if (retval < 0) {
3306 PyErr_SetFromErrno(socket_error);
3307 return NULL;
3308 } else if (retval == 0) {
3309 PyErr_SetString(socket_error,
3310 "illegal IP address string passed to inet_pton");
3311 return NULL;
3312 } else if (af == AF_INET) {
3313 return PyString_FromStringAndSize(packed,
3314 sizeof(struct in_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003315#ifdef ENABLE_IPV6
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003316 } else if (af == AF_INET6) {
3317 return PyString_FromStringAndSize(packed,
3318 sizeof(struct in6_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003319#endif
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003320 } else {
3321 PyErr_SetString(socket_error, "unknown address family");
3322 return NULL;
3323 }
3324}
3325
3326PyDoc_STRVAR(inet_ntop_doc,
3327"inet_ntop(af, packed_ip) -> string formatted IP address\n\
3328\n\
3329Convert a packed IP address of the given family to string format.");
3330
3331static PyObject *
3332socket_inet_ntop(PyObject *self, PyObject *args)
3333{
3334 int af;
3335 char* packed;
3336 int len;
3337 const char* retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003338#ifdef ENABLE_IPV6
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003339 char ip[MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003340#else
3341 char ip[INET_ADDRSTRLEN + 1];
3342#endif
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003343
3344 /* Guarantee NUL-termination for PyString_FromString() below */
3345 memset((void *) &ip[0], '\0', sizeof(ip) + 1);
3346
3347 if (!PyArg_ParseTuple(args, "is#:inet_ntop", &af, &packed, &len)) {
3348 return NULL;
3349 }
3350
3351 if (af == AF_INET) {
3352 if (len != sizeof(struct in_addr)) {
3353 PyErr_SetString(PyExc_ValueError,
3354 "invalid length of packed IP address string");
3355 return NULL;
3356 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003357#ifdef ENABLE_IPV6
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003358 } else if (af == AF_INET6) {
3359 if (len != sizeof(struct in6_addr)) {
3360 PyErr_SetString(PyExc_ValueError,
3361 "invalid length of packed IP address string");
3362 return NULL;
3363 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003364#endif
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003365 } else {
3366 PyErr_Format(PyExc_ValueError,
3367 "unknown address family %d", af);
3368 return NULL;
3369 }
3370
3371 retval = inet_ntop(af, packed, ip, sizeof(ip));
3372 if (!retval) {
3373 PyErr_SetFromErrno(socket_error);
3374 return NULL;
3375 } else {
3376 return PyString_FromString(retval);
3377 }
3378
3379 /* NOTREACHED */
3380 PyErr_SetString(PyExc_RuntimeError, "invalid handling of inet_ntop");
3381 return NULL;
3382}
3383
3384#endif /* HAVE_INET_PTON */
3385
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003386/* Python interface to getaddrinfo(host, port). */
3387
3388/*ARGSUSED*/
3389static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003390socket_getaddrinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003391{
Martin v. Löwisf0b11d22001-11-07 08:31:03 +00003392 struct addrinfo hints, *res;
3393 struct addrinfo *res0 = NULL;
Martin v. Löwis2548c732003-04-18 10:39:54 +00003394 PyObject *hobj = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003395 PyObject *pobj = (PyObject *)NULL;
Martin v. Löwisf65b1a12001-08-12 09:28:40 +00003396 char pbuf[30];
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003397 char *hptr, *pptr;
3398 int family, socktype, protocol, flags;
3399 int error;
3400 PyObject *all = (PyObject *)NULL;
3401 PyObject *single = (PyObject *)NULL;
Martin v. Löwis2548c732003-04-18 10:39:54 +00003402 PyObject *idna = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003403
3404 family = socktype = protocol = flags = 0;
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00003405 family = AF_UNSPEC;
Martin v. Löwis2548c732003-04-18 10:39:54 +00003406 if (!PyArg_ParseTuple(args, "OO|iiii:getaddrinfo",
3407 &hobj, &pobj, &family, &socktype,
3408 &protocol, &flags)) {
3409 return NULL;
3410 }
3411 if (hobj == Py_None) {
3412 hptr = NULL;
3413 } else if (PyUnicode_Check(hobj)) {
3414 idna = PyObject_CallMethod(hobj, "encode", "s", "idna");
3415 if (!idna)
3416 return NULL;
3417 hptr = PyString_AsString(idna);
3418 } else if (PyString_Check(hobj)) {
3419 hptr = PyString_AsString(hobj);
3420 } else {
3421 PyErr_SetString(PyExc_TypeError,
3422 "getaddrinfo() argument 1 must be string or None");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003423 return NULL;
3424 }
3425 if (PyInt_Check(pobj)) {
Marc-André Lemburg03d1b182001-07-31 18:05:33 +00003426 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", PyInt_AsLong(pobj));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003427 pptr = pbuf;
3428 } else if (PyString_Check(pobj)) {
3429 pptr = PyString_AsString(pobj);
3430 } else if (pobj == Py_None) {
3431 pptr = (char *)NULL;
3432 } else {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003433 PyErr_SetString(socket_error, "Int or String expected");
Martin v. Löwis5db099a2003-08-07 11:55:15 +00003434 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003435 }
3436 memset(&hints, 0, sizeof(hints));
3437 hints.ai_family = family;
3438 hints.ai_socktype = socktype;
3439 hints.ai_protocol = protocol;
3440 hints.ai_flags = flags;
Just van Rossum1040d2c2003-05-09 07:53:18 +00003441 Py_BEGIN_ALLOW_THREADS
3442 ACQUIRE_GETADDRINFO_LOCK
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003443 error = getaddrinfo(hptr, pptr, &hints, &res0);
Just van Rossum1040d2c2003-05-09 07:53:18 +00003444 Py_END_ALLOW_THREADS
3445 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003446 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003447 set_gaierror(error);
Martin v. Löwis5db099a2003-08-07 11:55:15 +00003448 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003449 }
3450
3451 if ((all = PyList_New(0)) == NULL)
3452 goto err;
3453 for (res = res0; res; res = res->ai_next) {
Guido van Rossum716aac02001-10-12 18:59:27 +00003454 PyObject *addr =
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00003455 makesockaddr(-1, res->ai_addr, res->ai_addrlen, protocol);
Guido van Rossum716aac02001-10-12 18:59:27 +00003456 if (addr == NULL)
3457 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003458 single = Py_BuildValue("iiisO", res->ai_family,
3459 res->ai_socktype, res->ai_protocol,
3460 res->ai_canonname ? res->ai_canonname : "",
Guido van Rossum716aac02001-10-12 18:59:27 +00003461 addr);
3462 Py_DECREF(addr);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003463 if (single == NULL)
3464 goto err;
3465
3466 if (PyList_Append(all, single))
3467 goto err;
3468 Py_XDECREF(single);
3469 }
Martin v. Löwis2548c732003-04-18 10:39:54 +00003470 Py_XDECREF(idna);
Neal Norwitz90128ba2002-08-09 03:37:42 +00003471 if (res0)
3472 freeaddrinfo(res0);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003473 return all;
3474 err:
3475 Py_XDECREF(single);
3476 Py_XDECREF(all);
Martin v. Löwis2548c732003-04-18 10:39:54 +00003477 Py_XDECREF(idna);
Martin v. Löwisf0b11d22001-11-07 08:31:03 +00003478 if (res0)
3479 freeaddrinfo(res0);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003480 return (PyObject *)NULL;
3481}
3482
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003483PyDoc_STRVAR(getaddrinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003484"getaddrinfo(host, port [, family, socktype, proto, flags])\n\
3485 -> list of (family, socktype, proto, canonname, sockaddr)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003486\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003487Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003488
3489/* Python interface to getnameinfo(sa, flags). */
3490
3491/*ARGSUSED*/
3492static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003493socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003494{
3495 PyObject *sa = (PyObject *)NULL;
3496 int flags;
3497 char *hostp;
Martin v. Löwis06b1d212001-11-02 23:34:52 +00003498 int port, flowinfo, scope_id;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003499 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
3500 struct addrinfo hints, *res = NULL;
3501 int error;
3502 PyObject *ret = (PyObject *)NULL;
3503
3504 flags = flowinfo = scope_id = 0;
Martin v. Löwis06b1d212001-11-02 23:34:52 +00003505 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003506 return NULL;
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003507 if (!PyArg_ParseTuple(sa, "si|ii",
3508 &hostp, &port, &flowinfo, &scope_id))
Martin v. Löwis06b1d212001-11-02 23:34:52 +00003509 return NULL;
Marc-André Lemburg03d1b182001-07-31 18:05:33 +00003510 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003511 memset(&hints, 0, sizeof(hints));
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00003512 hints.ai_family = AF_UNSPEC;
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003513 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Just van Rossum1040d2c2003-05-09 07:53:18 +00003514 Py_BEGIN_ALLOW_THREADS
3515 ACQUIRE_GETADDRINFO_LOCK
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003516 error = getaddrinfo(hostp, pbuf, &hints, &res);
Just van Rossum1040d2c2003-05-09 07:53:18 +00003517 Py_END_ALLOW_THREADS
3518 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003519 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003520 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003521 goto fail;
3522 }
3523 if (res->ai_next) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003524 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003525 "sockaddr resolved to multiple addresses");
3526 goto fail;
3527 }
3528 switch (res->ai_family) {
3529 case AF_INET:
3530 {
3531 char *t1;
3532 int t2;
3533 if (PyArg_ParseTuple(sa, "si", &t1, &t2) == 0) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003534 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003535 "IPv4 sockaddr must be 2 tuple");
3536 goto fail;
3537 }
3538 break;
3539 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00003540#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003541 case AF_INET6:
3542 {
3543 struct sockaddr_in6 *sin6;
3544 sin6 = (struct sockaddr_in6 *)res->ai_addr;
3545 sin6->sin6_flowinfo = flowinfo;
3546 sin6->sin6_scope_id = scope_id;
3547 break;
3548 }
3549#endif
3550 }
3551 error = getnameinfo(res->ai_addr, res->ai_addrlen,
3552 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
3553 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003554 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003555 goto fail;
3556 }
3557 ret = Py_BuildValue("ss", hbuf, pbuf);
3558
3559fail:
3560 if (res)
3561 freeaddrinfo(res);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003562 return ret;
3563}
3564
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003565PyDoc_STRVAR(getnameinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003566"getnameinfo(sockaddr, flags) --> (host, port)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003567\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003568Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003569
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00003570
3571/* Python API to getting and setting the default timeout value. */
3572
3573static PyObject *
3574socket_getdefaulttimeout(PyObject *self)
3575{
3576 if (defaulttimeout < 0.0) {
3577 Py_INCREF(Py_None);
3578 return Py_None;
3579 }
3580 else
3581 return PyFloat_FromDouble(defaulttimeout);
3582}
3583
3584PyDoc_STRVAR(getdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003585"getdefaulttimeout() -> timeout\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00003586\n\
3587Returns the default timeout in floating seconds for new socket objects.\n\
3588A value of None indicates that new socket objects have no timeout.\n\
3589When the socket module is first imported, the default is None.");
3590
3591static PyObject *
3592socket_setdefaulttimeout(PyObject *self, PyObject *arg)
3593{
3594 double timeout;
3595
3596 if (arg == Py_None)
3597 timeout = -1.0;
3598 else {
3599 timeout = PyFloat_AsDouble(arg);
3600 if (timeout < 0.0) {
3601 if (!PyErr_Occurred())
3602 PyErr_SetString(PyExc_ValueError,
3603 "Timeout value out of range");
3604 return NULL;
3605 }
3606 }
3607
3608 defaulttimeout = timeout;
3609
3610 Py_INCREF(Py_None);
3611 return Py_None;
3612}
3613
3614PyDoc_STRVAR(setdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003615"setdefaulttimeout(timeout)\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00003616\n\
3617Set the default timeout in floating seconds for new socket objects.\n\
3618A value of None indicates that new socket objects have no timeout.\n\
3619When the socket module is first imported, the default is None.");
3620
3621
Guido van Rossum30a685f1991-06-27 15:51:29 +00003622/* List of functions exported by this module. */
3623
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003624static PyMethodDef socket_methods[] = {
3625 {"gethostbyname", socket_gethostbyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003626 METH_VARARGS, gethostbyname_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003627 {"gethostbyname_ex", socket_gethostbyname_ex,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003628 METH_VARARGS, ghbn_ex_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003629 {"gethostbyaddr", socket_gethostbyaddr,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003630 METH_VARARGS, gethostbyaddr_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003631 {"gethostname", socket_gethostname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003632 METH_VARARGS, gethostname_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003633 {"getservbyname", socket_getservbyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003634 METH_VARARGS, getservbyname_doc},
Barry Warsaw11b91a02004-06-28 00:50:43 +00003635 {"getservbyport", socket_getservbyport,
3636 METH_VARARGS, getservbyport_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003637 {"getprotobyname", socket_getprotobyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003638 METH_VARARGS,getprotobyname_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00003639#ifndef NO_DUP
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003640 {"fromfd", socket_fromfd,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003641 METH_VARARGS, fromfd_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00003642#endif
Dave Cole331708b2004-08-09 04:51:41 +00003643#ifdef HAVE_SOCKETPAIR
3644 {"socketpair", socket_socketpair,
3645 METH_VARARGS, socketpair_doc},
3646#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003647 {"ntohs", socket_ntohs,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003648 METH_VARARGS, ntohs_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003649 {"ntohl", socket_ntohl,
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003650 METH_O, ntohl_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003651 {"htons", socket_htons,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003652 METH_VARARGS, htons_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003653 {"htonl", socket_htonl,
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003654 METH_O, htonl_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003655 {"inet_aton", socket_inet_aton,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003656 METH_VARARGS, inet_aton_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003657 {"inet_ntoa", socket_inet_ntoa,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003658 METH_VARARGS, inet_ntoa_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003659#ifdef HAVE_INET_PTON
3660 {"inet_pton", socket_inet_pton,
3661 METH_VARARGS, inet_pton_doc},
3662 {"inet_ntop", socket_inet_ntop,
3663 METH_VARARGS, inet_ntop_doc},
3664#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003665 {"getaddrinfo", socket_getaddrinfo,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003666 METH_VARARGS, getaddrinfo_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003667 {"getnameinfo", socket_getnameinfo,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003668 METH_VARARGS, getnameinfo_doc},
Guido van Rossum1693ba82002-07-18 21:11:26 +00003669 {"getdefaulttimeout", (PyCFunction)socket_getdefaulttimeout,
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00003670 METH_NOARGS, getdefaulttimeout_doc},
3671 {"setdefaulttimeout", socket_setdefaulttimeout,
3672 METH_O, setdefaulttimeout_doc},
Guido van Rossum30a685f1991-06-27 15:51:29 +00003673 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003674};
3675
Guido van Rossum30a685f1991-06-27 15:51:29 +00003676
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003677#ifdef RISCOS
3678#define OS_INIT_DEFINED
Guido van Rossumbe32c891996-06-20 16:25:29 +00003679
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003680static int
3681os_init(void)
3682{
3683 _kernel_swi_regs r;
3684
3685 r.r[0] = 0;
3686 _kernel_swi(0x43380, &r, &r);
3687 taskwindow = r.r[0];
3688
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003689 return 1;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003690}
3691
3692#endif /* RISCOS */
3693
3694
3695#ifdef MS_WINDOWS
3696#define OS_INIT_DEFINED
3697
3698/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00003699
3700static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003701os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00003702{
3703 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00003704}
3705
3706static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003707os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00003708{
3709 WSADATA WSAData;
3710 int ret;
3711 char buf[100];
3712 ret = WSAStartup(0x0101, &WSAData);
3713 switch (ret) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003714 case 0: /* No error */
Mark Hammond14350ab2003-07-09 04:57:46 +00003715 Py_AtExit(os_cleanup);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003716 return 1; /* Success */
Guido van Rossumbe32c891996-06-20 16:25:29 +00003717 case WSASYSNOTREADY:
3718 PyErr_SetString(PyExc_ImportError,
3719 "WSAStartup failed: network not ready");
3720 break;
3721 case WSAVERNOTSUPPORTED:
3722 case WSAEINVAL:
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003723 PyErr_SetString(
3724 PyExc_ImportError,
3725 "WSAStartup failed: requested version not supported");
Guido van Rossumbe32c891996-06-20 16:25:29 +00003726 break;
3727 default:
Tim Peters885d4572001-11-28 20:27:42 +00003728 PyOS_snprintf(buf, sizeof(buf),
3729 "WSAStartup failed: error code %d", ret);
Guido van Rossumbe32c891996-06-20 16:25:29 +00003730 PyErr_SetString(PyExc_ImportError, buf);
3731 break;
3732 }
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003733 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00003734}
3735
Guido van Rossum8d665e61996-06-26 18:22:49 +00003736#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00003737
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003738
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003739#ifdef PYOS_OS2
3740#define OS_INIT_DEFINED
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003741
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003742/* Additional initialization for OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003743
3744static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003745os_init(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003746{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003747#ifndef PYCC_GCC
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003748 char reason[64];
3749 int rc = sock_init();
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003750
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003751 if (rc == 0) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003752 return 1; /* Success */
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003753 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003754
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003755 PyOS_snprintf(reason, sizeof(reason),
3756 "OS/2 TCP/IP Error# %d", sock_errno());
3757 PyErr_SetString(PyExc_ImportError, reason);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003758
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003759 return 0; /* Failure */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00003760#else
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003761 /* No need to initialise sockets with GCC/EMX */
3762 return 1; /* Success */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00003763#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003764}
3765
3766#endif /* PYOS_OS2 */
3767
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003768
3769#ifndef OS_INIT_DEFINED
3770static int
3771os_init(void)
3772{
3773 return 1; /* Success */
3774}
3775#endif
3776
3777
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00003778/* C API table - always add new things to the end for binary
3779 compatibility. */
3780static
3781PySocketModule_APIObject PySocketModuleAPI =
3782{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003783 &sock_type,
Brett Cannon06c34792004-03-23 23:16:54 +00003784 NULL
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00003785};
3786
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003787
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003788/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003789
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003790 This module is actually called "_socket", and there's a wrapper
3791 "socket.py" which implements some additional functionality. On some
3792 platforms (e.g. Windows and OS/2), socket.py also implements a
3793 wrapper for the socket type that provides missing functionality such
3794 as makefile(), dup() and fromfd(). The import of "_socket" may fail
3795 with an ImportError exception if os-specific initialization fails.
3796 On Windows, this does WINSOCK initialization. When WINSOCK is
3797 initialized succesfully, a call to WSACleanup() is scheduled to be
3798 made at exit time.
3799*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003800
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003801PyDoc_STRVAR(socket_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003802"Implementation module for socket operations.\n\
3803\n\
3804See the socket module for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003805
Mark Hammondfe51c6d2002-08-02 02:27:13 +00003806PyMODINIT_FUNC
Thomas Wouters1e0c2f42000-07-24 16:06:23 +00003807init_socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003808{
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003809 PyObject *m, *has_ipv6;
Fred Drake4baedc12002-04-01 14:53:37 +00003810
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003811 if (!os_init())
Guido van Rossum0cb96de1997-10-01 04:29:29 +00003812 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003813
3814 sock_type.ob_type = &PyType_Type;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003815 m = Py_InitModule3(PySocket_MODULE_NAME,
3816 socket_methods,
3817 socket_doc);
3818
3819 socket_error = PyErr_NewException("socket.error", NULL, NULL);
3820 if (socket_error == NULL)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003821 return;
Brett Cannon06c34792004-03-23 23:16:54 +00003822 PySocketModuleAPI.error = socket_error;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003823 Py_INCREF(socket_error);
3824 PyModule_AddObject(m, "error", socket_error);
3825 socket_herror = PyErr_NewException("socket.herror",
3826 socket_error, NULL);
3827 if (socket_herror == NULL)
3828 return;
3829 Py_INCREF(socket_herror);
3830 PyModule_AddObject(m, "herror", socket_herror);
3831 socket_gaierror = PyErr_NewException("socket.gaierror", socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003832 NULL);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003833 if (socket_gaierror == NULL)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003834 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003835 Py_INCREF(socket_gaierror);
3836 PyModule_AddObject(m, "gaierror", socket_gaierror);
Raymond Hettingeref7343c2003-06-29 03:08:05 +00003837 socket_timeout = PyErr_NewException("socket.timeout",
3838 socket_error, NULL);
3839 if (socket_timeout == NULL)
3840 return;
3841 Py_INCREF(socket_timeout);
3842 PyModule_AddObject(m, "timeout", socket_timeout);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003843 Py_INCREF((PyObject *)&sock_type);
Fred Drake4baedc12002-04-01 14:53:37 +00003844 if (PyModule_AddObject(m, "SocketType",
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003845 (PyObject *)&sock_type) != 0)
Guido van Rossum0cb96de1997-10-01 04:29:29 +00003846 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003847 Py_INCREF((PyObject *)&sock_type);
Fred Drake4baedc12002-04-01 14:53:37 +00003848 if (PyModule_AddObject(m, "socket",
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003849 (PyObject *)&sock_type) != 0)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003850 return;
Guido van Rossum09be4091999-08-09 14:40:40 +00003851
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003852#ifdef ENABLE_IPV6
3853 has_ipv6 = Py_True;
3854#else
3855 has_ipv6 = Py_False;
3856#endif
3857 Py_INCREF(has_ipv6);
3858 PyModule_AddObject(m, "has_ipv6", has_ipv6);
3859
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00003860 /* Export C API */
Fred Drake4baedc12002-04-01 14:53:37 +00003861 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00003862 PyCObject_FromVoidPtr((void *)&PySocketModuleAPI, NULL)
3863 ) != 0)
3864 return;
3865
Guido van Rossum09be4091999-08-09 14:40:40 +00003866 /* Address families (we only support AF_INET and AF_UNIX) */
3867#ifdef AF_UNSPEC
Fred Drake4baedc12002-04-01 14:53:37 +00003868 PyModule_AddIntConstant(m, "AF_UNSPEC", AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00003869#endif
Fred Drake4baedc12002-04-01 14:53:37 +00003870 PyModule_AddIntConstant(m, "AF_INET", AF_INET);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003871#ifdef AF_INET6
Fred Drake4baedc12002-04-01 14:53:37 +00003872 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003873#endif /* AF_INET6 */
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00003874#if defined(AF_UNIX)
Fred Drake4baedc12002-04-01 14:53:37 +00003875 PyModule_AddIntConstant(m, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00003876#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00003877#ifdef AF_AX25
Fred Drake4baedc12002-04-01 14:53:37 +00003878 /* Amateur Radio AX.25 */
3879 PyModule_AddIntConstant(m, "AF_AX25", AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00003880#endif
3881#ifdef AF_IPX
Fred Drake4baedc12002-04-01 14:53:37 +00003882 PyModule_AddIntConstant(m, "AF_IPX", AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00003883#endif
3884#ifdef AF_APPLETALK
Fred Drake4baedc12002-04-01 14:53:37 +00003885 /* Appletalk DDP */
3886 PyModule_AddIntConstant(m, "AF_APPLETALK", AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00003887#endif
3888#ifdef AF_NETROM
Fred Drake4baedc12002-04-01 14:53:37 +00003889 /* Amateur radio NetROM */
3890 PyModule_AddIntConstant(m, "AF_NETROM", AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00003891#endif
3892#ifdef AF_BRIDGE
Fred Drake4baedc12002-04-01 14:53:37 +00003893 /* Multiprotocol bridge */
3894 PyModule_AddIntConstant(m, "AF_BRIDGE", AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00003895#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00003896#ifdef AF_ATMPVC
3897 /* ATM PVCs */
3898 PyModule_AddIntConstant(m, "AF_ATMPVC", AF_ATMPVC);
3899#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00003900#ifdef AF_AAL5
Fred Drake4baedc12002-04-01 14:53:37 +00003901 /* Reserved for Werner's ATM */
3902 PyModule_AddIntConstant(m, "AF_AAL5", AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00003903#endif
3904#ifdef AF_X25
Fred Drake4baedc12002-04-01 14:53:37 +00003905 /* Reserved for X.25 project */
3906 PyModule_AddIntConstant(m, "AF_X25", AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00003907#endif
3908#ifdef AF_INET6
Fred Drake4baedc12002-04-01 14:53:37 +00003909 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00003910#endif
3911#ifdef AF_ROSE
Fred Drake4baedc12002-04-01 14:53:37 +00003912 /* Amateur Radio X.25 PLP */
3913 PyModule_AddIntConstant(m, "AF_ROSE", AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00003914#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00003915#ifdef AF_DECnet
3916 /* Reserved for DECnet project */
3917 PyModule_AddIntConstant(m, "AF_DECnet", AF_DECnet);
3918#endif
3919#ifdef AF_NETBEUI
3920 /* Reserved for 802.2LLC project */
3921 PyModule_AddIntConstant(m, "AF_NETBEUI", AF_NETBEUI);
3922#endif
3923#ifdef AF_SECURITY
3924 /* Security callback pseudo AF */
3925 PyModule_AddIntConstant(m, "AF_SECURITY", AF_SECURITY);
3926#endif
3927#ifdef AF_KEY
3928 /* PF_KEY key management API */
3929 PyModule_AddIntConstant(m, "AF_KEY", AF_KEY);
3930#endif
3931#ifdef AF_NETLINK
3932 /* */
3933 PyModule_AddIntConstant(m, "AF_NETLINK", AF_NETLINK);
3934#endif
3935#ifdef AF_ROUTE
3936 /* Alias to emulate 4.4BSD */
3937 PyModule_AddIntConstant(m, "AF_ROUTE", AF_ROUTE);
3938#endif
3939#ifdef AF_ASH
3940 /* Ash */
3941 PyModule_AddIntConstant(m, "AF_ASH", AF_ASH);
3942#endif
3943#ifdef AF_ECONET
3944 /* Acorn Econet */
3945 PyModule_AddIntConstant(m, "AF_ECONET", AF_ECONET);
3946#endif
3947#ifdef AF_ATMSVC
3948 /* ATM SVCs */
3949 PyModule_AddIntConstant(m, "AF_ATMSVC", AF_ATMSVC);
3950#endif
3951#ifdef AF_SNA
3952 /* Linux SNA Project (nutters!) */
3953 PyModule_AddIntConstant(m, "AF_SNA", AF_SNA);
3954#endif
3955#ifdef AF_IRDA
3956 /* IRDA sockets */
3957 PyModule_AddIntConstant(m, "AF_IRDA", AF_IRDA);
3958#endif
3959#ifdef AF_PPPOX
3960 /* PPPoX sockets */
3961 PyModule_AddIntConstant(m, "AF_PPPOX", AF_PPPOX);
3962#endif
3963#ifdef AF_WANPIPE
3964 /* Wanpipe API Sockets */
3965 PyModule_AddIntConstant(m, "AF_WANPIPE", AF_WANPIPE);
3966#endif
3967#ifdef AF_LLC
3968 /* Linux LLC */
3969 PyModule_AddIntConstant(m, "AF_LLC", AF_LLC);
3970#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00003971
Hye-Shik Chang81268602004-02-02 06:05:24 +00003972#ifdef USE_BLUETOOTH
Martin v. Löwis12af0482004-01-31 12:34:17 +00003973 PyModule_AddIntConstant(m, "AF_BLUETOOTH", AF_BLUETOOTH);
3974 PyModule_AddIntConstant(m, "BTPROTO_L2CAP", BTPROTO_L2CAP);
Hye-Shik Chang81268602004-02-02 06:05:24 +00003975#if !defined(__FreeBSD__)
Martin v. Löwis12af0482004-01-31 12:34:17 +00003976 PyModule_AddIntConstant(m, "BTPROTO_SCO", BTPROTO_SCO);
Hye-Shik Chang81268602004-02-02 06:05:24 +00003977#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00003978 PyModule_AddIntConstant(m, "BTPROTO_RFCOMM", BTPROTO_RFCOMM);
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00003979 PyModule_AddObject(m, "BDADDR_ANY", Py_BuildValue("s", "00:00:00:00:00:00"));
3980 PyModule_AddObject(m, "BDADDR_LOCAL", Py_BuildValue("s", "00:00:00:FF:FF:FF"));
Martin v. Löwis12af0482004-01-31 12:34:17 +00003981#endif
3982
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00003983#ifdef HAVE_NETPACKET_PACKET_H
Fred Drake4baedc12002-04-01 14:53:37 +00003984 PyModule_AddIntConstant(m, "AF_PACKET", AF_PACKET);
3985 PyModule_AddIntConstant(m, "PF_PACKET", PF_PACKET);
3986 PyModule_AddIntConstant(m, "PACKET_HOST", PACKET_HOST);
3987 PyModule_AddIntConstant(m, "PACKET_BROADCAST", PACKET_BROADCAST);
3988 PyModule_AddIntConstant(m, "PACKET_MULTICAST", PACKET_MULTICAST);
3989 PyModule_AddIntConstant(m, "PACKET_OTHERHOST", PACKET_OTHERHOST);
3990 PyModule_AddIntConstant(m, "PACKET_OUTGOING", PACKET_OUTGOING);
3991 PyModule_AddIntConstant(m, "PACKET_LOOPBACK", PACKET_LOOPBACK);
3992 PyModule_AddIntConstant(m, "PACKET_FASTROUTE", PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00003993#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00003994
3995 /* Socket types */
Fred Drake4baedc12002-04-01 14:53:37 +00003996 PyModule_AddIntConstant(m, "SOCK_STREAM", SOCK_STREAM);
3997 PyModule_AddIntConstant(m, "SOCK_DGRAM", SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00003998#ifndef __BEOS__
3999/* We have incomplete socket support. */
Fred Drake4baedc12002-04-01 14:53:37 +00004000 PyModule_AddIntConstant(m, "SOCK_RAW", SOCK_RAW);
4001 PyModule_AddIntConstant(m, "SOCK_SEQPACKET", SOCK_SEQPACKET);
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00004002#if defined(SOCK_RDM)
Fred Drake4baedc12002-04-01 14:53:37 +00004003 PyModule_AddIntConstant(m, "SOCK_RDM", SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00004004#endif
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00004005#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004006
4007#ifdef SO_DEBUG
Fred Drake4baedc12002-04-01 14:53:37 +00004008 PyModule_AddIntConstant(m, "SO_DEBUG", SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004009#endif
4010#ifdef SO_ACCEPTCONN
Fred Drake4baedc12002-04-01 14:53:37 +00004011 PyModule_AddIntConstant(m, "SO_ACCEPTCONN", SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004012#endif
4013#ifdef SO_REUSEADDR
Fred Drake4baedc12002-04-01 14:53:37 +00004014 PyModule_AddIntConstant(m, "SO_REUSEADDR", SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004015#endif
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00004016#ifdef SO_EXCLUSIVEADDRUSE
4017 PyModule_AddIntConstant(m, "SO_EXCLUSIVEADDRUSE", SO_EXCLUSIVEADDRUSE);
4018#endif
4019
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004020#ifdef SO_KEEPALIVE
Fred Drake4baedc12002-04-01 14:53:37 +00004021 PyModule_AddIntConstant(m, "SO_KEEPALIVE", SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004022#endif
4023#ifdef SO_DONTROUTE
Fred Drake4baedc12002-04-01 14:53:37 +00004024 PyModule_AddIntConstant(m, "SO_DONTROUTE", SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004025#endif
4026#ifdef SO_BROADCAST
Fred Drake4baedc12002-04-01 14:53:37 +00004027 PyModule_AddIntConstant(m, "SO_BROADCAST", SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004028#endif
4029#ifdef SO_USELOOPBACK
Fred Drake4baedc12002-04-01 14:53:37 +00004030 PyModule_AddIntConstant(m, "SO_USELOOPBACK", SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004031#endif
4032#ifdef SO_LINGER
Fred Drake4baedc12002-04-01 14:53:37 +00004033 PyModule_AddIntConstant(m, "SO_LINGER", SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004034#endif
4035#ifdef SO_OOBINLINE
Fred Drake4baedc12002-04-01 14:53:37 +00004036 PyModule_AddIntConstant(m, "SO_OOBINLINE", SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004037#endif
4038#ifdef SO_REUSEPORT
Fred Drake4baedc12002-04-01 14:53:37 +00004039 PyModule_AddIntConstant(m, "SO_REUSEPORT", SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004040#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004041#ifdef SO_SNDBUF
Fred Drake4baedc12002-04-01 14:53:37 +00004042 PyModule_AddIntConstant(m, "SO_SNDBUF", SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004043#endif
4044#ifdef SO_RCVBUF
Fred Drake4baedc12002-04-01 14:53:37 +00004045 PyModule_AddIntConstant(m, "SO_RCVBUF", SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004046#endif
4047#ifdef SO_SNDLOWAT
Fred Drake4baedc12002-04-01 14:53:37 +00004048 PyModule_AddIntConstant(m, "SO_SNDLOWAT", SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004049#endif
4050#ifdef SO_RCVLOWAT
Fred Drake4baedc12002-04-01 14:53:37 +00004051 PyModule_AddIntConstant(m, "SO_RCVLOWAT", SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004052#endif
4053#ifdef SO_SNDTIMEO
Fred Drake4baedc12002-04-01 14:53:37 +00004054 PyModule_AddIntConstant(m, "SO_SNDTIMEO", SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004055#endif
4056#ifdef SO_RCVTIMEO
Fred Drake4baedc12002-04-01 14:53:37 +00004057 PyModule_AddIntConstant(m, "SO_RCVTIMEO", SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004058#endif
4059#ifdef SO_ERROR
Fred Drake4baedc12002-04-01 14:53:37 +00004060 PyModule_AddIntConstant(m, "SO_ERROR", SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004061#endif
4062#ifdef SO_TYPE
Fred Drake4baedc12002-04-01 14:53:37 +00004063 PyModule_AddIntConstant(m, "SO_TYPE", SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004064#endif
4065
4066 /* Maximum number of connections for "listen" */
4067#ifdef SOMAXCONN
Fred Drake4baedc12002-04-01 14:53:37 +00004068 PyModule_AddIntConstant(m, "SOMAXCONN", SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004069#else
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004070 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004071#endif
4072
4073 /* Flags for send, recv */
4074#ifdef MSG_OOB
Fred Drake4baedc12002-04-01 14:53:37 +00004075 PyModule_AddIntConstant(m, "MSG_OOB", MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004076#endif
4077#ifdef MSG_PEEK
Fred Drake4baedc12002-04-01 14:53:37 +00004078 PyModule_AddIntConstant(m, "MSG_PEEK", MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004079#endif
4080#ifdef MSG_DONTROUTE
Fred Drake4baedc12002-04-01 14:53:37 +00004081 PyModule_AddIntConstant(m, "MSG_DONTROUTE", MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004082#endif
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00004083#ifdef MSG_DONTWAIT
Fred Drake4baedc12002-04-01 14:53:37 +00004084 PyModule_AddIntConstant(m, "MSG_DONTWAIT", MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00004085#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004086#ifdef MSG_EOR
Fred Drake4baedc12002-04-01 14:53:37 +00004087 PyModule_AddIntConstant(m, "MSG_EOR", MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004088#endif
4089#ifdef MSG_TRUNC
Fred Drake4baedc12002-04-01 14:53:37 +00004090 PyModule_AddIntConstant(m, "MSG_TRUNC", MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004091#endif
4092#ifdef MSG_CTRUNC
Fred Drake4baedc12002-04-01 14:53:37 +00004093 PyModule_AddIntConstant(m, "MSG_CTRUNC", MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004094#endif
4095#ifdef MSG_WAITALL
Fred Drake4baedc12002-04-01 14:53:37 +00004096 PyModule_AddIntConstant(m, "MSG_WAITALL", MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004097#endif
4098#ifdef MSG_BTAG
Fred Drake4baedc12002-04-01 14:53:37 +00004099 PyModule_AddIntConstant(m, "MSG_BTAG", MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004100#endif
4101#ifdef MSG_ETAG
Fred Drake4baedc12002-04-01 14:53:37 +00004102 PyModule_AddIntConstant(m, "MSG_ETAG", MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004103#endif
4104
4105 /* Protocol level and numbers, usable for [gs]etsockopt */
4106#ifdef SOL_SOCKET
Fred Drake4baedc12002-04-01 14:53:37 +00004107 PyModule_AddIntConstant(m, "SOL_SOCKET", SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004108#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00004109#ifdef SOL_IP
Fred Drake4baedc12002-04-01 14:53:37 +00004110 PyModule_AddIntConstant(m, "SOL_IP", SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00004111#else
Fred Drake4baedc12002-04-01 14:53:37 +00004112 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00004113#endif
4114#ifdef SOL_IPX
Fred Drake4baedc12002-04-01 14:53:37 +00004115 PyModule_AddIntConstant(m, "SOL_IPX", SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00004116#endif
4117#ifdef SOL_AX25
Fred Drake4baedc12002-04-01 14:53:37 +00004118 PyModule_AddIntConstant(m, "SOL_AX25", SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00004119#endif
4120#ifdef SOL_ATALK
Fred Drake4baedc12002-04-01 14:53:37 +00004121 PyModule_AddIntConstant(m, "SOL_ATALK", SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00004122#endif
4123#ifdef SOL_NETROM
Fred Drake4baedc12002-04-01 14:53:37 +00004124 PyModule_AddIntConstant(m, "SOL_NETROM", SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00004125#endif
4126#ifdef SOL_ROSE
Fred Drake4baedc12002-04-01 14:53:37 +00004127 PyModule_AddIntConstant(m, "SOL_ROSE", SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00004128#endif
4129#ifdef SOL_TCP
Fred Drake4baedc12002-04-01 14:53:37 +00004130 PyModule_AddIntConstant(m, "SOL_TCP", SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00004131#else
Fred Drake4baedc12002-04-01 14:53:37 +00004132 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00004133#endif
4134#ifdef SOL_UDP
Fred Drake4baedc12002-04-01 14:53:37 +00004135 PyModule_AddIntConstant(m, "SOL_UDP", SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00004136#else
Fred Drake4baedc12002-04-01 14:53:37 +00004137 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00004138#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004139#ifdef IPPROTO_IP
Fred Drake4baedc12002-04-01 14:53:37 +00004140 PyModule_AddIntConstant(m, "IPPROTO_IP", IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00004141#else
Fred Drake4baedc12002-04-01 14:53:37 +00004142 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004143#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004144#ifdef IPPROTO_HOPOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00004145 PyModule_AddIntConstant(m, "IPPROTO_HOPOPTS", IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004146#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004147#ifdef IPPROTO_ICMP
Fred Drake4baedc12002-04-01 14:53:37 +00004148 PyModule_AddIntConstant(m, "IPPROTO_ICMP", IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00004149#else
Fred Drake4baedc12002-04-01 14:53:37 +00004150 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004151#endif
4152#ifdef IPPROTO_IGMP
Fred Drake4baedc12002-04-01 14:53:37 +00004153 PyModule_AddIntConstant(m, "IPPROTO_IGMP", IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004154#endif
4155#ifdef IPPROTO_GGP
Fred Drake4baedc12002-04-01 14:53:37 +00004156 PyModule_AddIntConstant(m, "IPPROTO_GGP", IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004157#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004158#ifdef IPPROTO_IPV4
Fred Drake4baedc12002-04-01 14:53:37 +00004159 PyModule_AddIntConstant(m, "IPPROTO_IPV4", IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004160#endif
Martin v. Löwisa0f17342003-10-03 13:56:20 +00004161#ifdef IPPROTO_IPV6
4162 PyModule_AddIntConstant(m, "IPPROTO_IPV6", IPPROTO_IPV6);
4163#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004164#ifdef IPPROTO_IPIP
Fred Drake4baedc12002-04-01 14:53:37 +00004165 PyModule_AddIntConstant(m, "IPPROTO_IPIP", IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004166#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004167#ifdef IPPROTO_TCP
Fred Drake4baedc12002-04-01 14:53:37 +00004168 PyModule_AddIntConstant(m, "IPPROTO_TCP", IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00004169#else
Fred Drake4baedc12002-04-01 14:53:37 +00004170 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004171#endif
4172#ifdef IPPROTO_EGP
Fred Drake4baedc12002-04-01 14:53:37 +00004173 PyModule_AddIntConstant(m, "IPPROTO_EGP", IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004174#endif
4175#ifdef IPPROTO_PUP
Fred Drake4baedc12002-04-01 14:53:37 +00004176 PyModule_AddIntConstant(m, "IPPROTO_PUP", IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004177#endif
4178#ifdef IPPROTO_UDP
Fred Drake4baedc12002-04-01 14:53:37 +00004179 PyModule_AddIntConstant(m, "IPPROTO_UDP", IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00004180#else
Fred Drake4baedc12002-04-01 14:53:37 +00004181 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004182#endif
4183#ifdef IPPROTO_IDP
Fred Drake4baedc12002-04-01 14:53:37 +00004184 PyModule_AddIntConstant(m, "IPPROTO_IDP", IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004185#endif
4186#ifdef IPPROTO_HELLO
Fred Drake4baedc12002-04-01 14:53:37 +00004187 PyModule_AddIntConstant(m, "IPPROTO_HELLO", IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004188#endif
4189#ifdef IPPROTO_ND
Fred Drake4baedc12002-04-01 14:53:37 +00004190 PyModule_AddIntConstant(m, "IPPROTO_ND", IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004191#endif
4192#ifdef IPPROTO_TP
Fred Drake4baedc12002-04-01 14:53:37 +00004193 PyModule_AddIntConstant(m, "IPPROTO_TP", IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004194#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004195#ifdef IPPROTO_IPV6
Fred Drake4baedc12002-04-01 14:53:37 +00004196 PyModule_AddIntConstant(m, "IPPROTO_IPV6", IPPROTO_IPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004197#endif
4198#ifdef IPPROTO_ROUTING
Fred Drake4baedc12002-04-01 14:53:37 +00004199 PyModule_AddIntConstant(m, "IPPROTO_ROUTING", IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004200#endif
4201#ifdef IPPROTO_FRAGMENT
Fred Drake4baedc12002-04-01 14:53:37 +00004202 PyModule_AddIntConstant(m, "IPPROTO_FRAGMENT", IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004203#endif
4204#ifdef IPPROTO_RSVP
Fred Drake4baedc12002-04-01 14:53:37 +00004205 PyModule_AddIntConstant(m, "IPPROTO_RSVP", IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004206#endif
4207#ifdef IPPROTO_GRE
Fred Drake4baedc12002-04-01 14:53:37 +00004208 PyModule_AddIntConstant(m, "IPPROTO_GRE", IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004209#endif
4210#ifdef IPPROTO_ESP
Fred Drake4baedc12002-04-01 14:53:37 +00004211 PyModule_AddIntConstant(m, "IPPROTO_ESP", IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004212#endif
4213#ifdef IPPROTO_AH
Fred Drake4baedc12002-04-01 14:53:37 +00004214 PyModule_AddIntConstant(m, "IPPROTO_AH", IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004215#endif
4216#ifdef IPPROTO_MOBILE
Fred Drake4baedc12002-04-01 14:53:37 +00004217 PyModule_AddIntConstant(m, "IPPROTO_MOBILE", IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004218#endif
4219#ifdef IPPROTO_ICMPV6
Fred Drake4baedc12002-04-01 14:53:37 +00004220 PyModule_AddIntConstant(m, "IPPROTO_ICMPV6", IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004221#endif
4222#ifdef IPPROTO_NONE
Fred Drake4baedc12002-04-01 14:53:37 +00004223 PyModule_AddIntConstant(m, "IPPROTO_NONE", IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004224#endif
4225#ifdef IPPROTO_DSTOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00004226 PyModule_AddIntConstant(m, "IPPROTO_DSTOPTS", IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004227#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004228#ifdef IPPROTO_XTP
Fred Drake4baedc12002-04-01 14:53:37 +00004229 PyModule_AddIntConstant(m, "IPPROTO_XTP", IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004230#endif
4231#ifdef IPPROTO_EON
Fred Drake4baedc12002-04-01 14:53:37 +00004232 PyModule_AddIntConstant(m, "IPPROTO_EON", IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004233#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004234#ifdef IPPROTO_PIM
Fred Drake4baedc12002-04-01 14:53:37 +00004235 PyModule_AddIntConstant(m, "IPPROTO_PIM", IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004236#endif
4237#ifdef IPPROTO_IPCOMP
Fred Drake4baedc12002-04-01 14:53:37 +00004238 PyModule_AddIntConstant(m, "IPPROTO_IPCOMP", IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004239#endif
4240#ifdef IPPROTO_VRRP
Fred Drake4baedc12002-04-01 14:53:37 +00004241 PyModule_AddIntConstant(m, "IPPROTO_VRRP", IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004242#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004243#ifdef IPPROTO_BIP
Fred Drake4baedc12002-04-01 14:53:37 +00004244 PyModule_AddIntConstant(m, "IPPROTO_BIP", IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004245#endif
4246/**/
4247#ifdef IPPROTO_RAW
Fred Drake4baedc12002-04-01 14:53:37 +00004248 PyModule_AddIntConstant(m, "IPPROTO_RAW", IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00004249#else
Fred Drake4baedc12002-04-01 14:53:37 +00004250 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004251#endif
4252#ifdef IPPROTO_MAX
Fred Drake4baedc12002-04-01 14:53:37 +00004253 PyModule_AddIntConstant(m, "IPPROTO_MAX", IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004254#endif
4255
4256 /* Some port configuration */
4257#ifdef IPPORT_RESERVED
Fred Drake4baedc12002-04-01 14:53:37 +00004258 PyModule_AddIntConstant(m, "IPPORT_RESERVED", IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004259#else
Fred Drake4baedc12002-04-01 14:53:37 +00004260 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004261#endif
4262#ifdef IPPORT_USERRESERVED
Fred Drake4baedc12002-04-01 14:53:37 +00004263 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004264#else
Fred Drake4baedc12002-04-01 14:53:37 +00004265 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004266#endif
4267
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004268 /* Some reserved IP v.4 addresses */
4269#ifdef INADDR_ANY
Fred Drake4baedc12002-04-01 14:53:37 +00004270 PyModule_AddIntConstant(m, "INADDR_ANY", INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004271#else
Fred Drake4baedc12002-04-01 14:53:37 +00004272 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004273#endif
4274#ifdef INADDR_BROADCAST
Fred Drake4baedc12002-04-01 14:53:37 +00004275 PyModule_AddIntConstant(m, "INADDR_BROADCAST", INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004276#else
Fred Drake4baedc12002-04-01 14:53:37 +00004277 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004278#endif
4279#ifdef INADDR_LOOPBACK
Fred Drake4baedc12002-04-01 14:53:37 +00004280 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004281#else
Fred Drake4baedc12002-04-01 14:53:37 +00004282 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004283#endif
4284#ifdef INADDR_UNSPEC_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00004285 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004286#else
Fred Drake4baedc12002-04-01 14:53:37 +00004287 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004288#endif
4289#ifdef INADDR_ALLHOSTS_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00004290 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
4291 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004292#else
Fred Drake4baedc12002-04-01 14:53:37 +00004293 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004294#endif
4295#ifdef INADDR_MAX_LOCAL_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00004296 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP",
4297 INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004298#else
Fred Drake4baedc12002-04-01 14:53:37 +00004299 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004300#endif
4301#ifdef INADDR_NONE
Fred Drake4baedc12002-04-01 14:53:37 +00004302 PyModule_AddIntConstant(m, "INADDR_NONE", INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004303#else
Fred Drake4baedc12002-04-01 14:53:37 +00004304 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004305#endif
4306
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004307 /* IPv4 [gs]etsockopt options */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004308#ifdef IP_OPTIONS
Fred Drake4baedc12002-04-01 14:53:37 +00004309 PyModule_AddIntConstant(m, "IP_OPTIONS", IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004310#endif
4311#ifdef IP_HDRINCL
Fred Drake4baedc12002-04-01 14:53:37 +00004312 PyModule_AddIntConstant(m, "IP_HDRINCL", IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004313#endif
4314#ifdef IP_TOS
Fred Drake4baedc12002-04-01 14:53:37 +00004315 PyModule_AddIntConstant(m, "IP_TOS", IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004316#endif
4317#ifdef IP_TTL
Fred Drake4baedc12002-04-01 14:53:37 +00004318 PyModule_AddIntConstant(m, "IP_TTL", IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004319#endif
4320#ifdef IP_RECVOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00004321 PyModule_AddIntConstant(m, "IP_RECVOPTS", IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004322#endif
4323#ifdef IP_RECVRETOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00004324 PyModule_AddIntConstant(m, "IP_RECVRETOPTS", IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004325#endif
4326#ifdef IP_RECVDSTADDR
Fred Drake4baedc12002-04-01 14:53:37 +00004327 PyModule_AddIntConstant(m, "IP_RECVDSTADDR", IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004328#endif
4329#ifdef IP_RETOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00004330 PyModule_AddIntConstant(m, "IP_RETOPTS", IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004331#endif
4332#ifdef IP_MULTICAST_IF
Fred Drake4baedc12002-04-01 14:53:37 +00004333 PyModule_AddIntConstant(m, "IP_MULTICAST_IF", IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004334#endif
4335#ifdef IP_MULTICAST_TTL
Fred Drake4baedc12002-04-01 14:53:37 +00004336 PyModule_AddIntConstant(m, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004337#endif
4338#ifdef IP_MULTICAST_LOOP
Fred Drake4baedc12002-04-01 14:53:37 +00004339 PyModule_AddIntConstant(m, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004340#endif
4341#ifdef IP_ADD_MEMBERSHIP
Fred Drake4baedc12002-04-01 14:53:37 +00004342 PyModule_AddIntConstant(m, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004343#endif
4344#ifdef IP_DROP_MEMBERSHIP
Fred Drake4baedc12002-04-01 14:53:37 +00004345 PyModule_AddIntConstant(m, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004346#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00004347#ifdef IP_DEFAULT_MULTICAST_TTL
Fred Drake4baedc12002-04-01 14:53:37 +00004348 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_TTL",
4349 IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00004350#endif
4351#ifdef IP_DEFAULT_MULTICAST_LOOP
Fred Drake4baedc12002-04-01 14:53:37 +00004352 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_LOOP",
4353 IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00004354#endif
4355#ifdef IP_MAX_MEMBERSHIPS
Fred Drake4baedc12002-04-01 14:53:37 +00004356 PyModule_AddIntConstant(m, "IP_MAX_MEMBERSHIPS", IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00004357#endif
4358
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004359 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
4360#ifdef IPV6_JOIN_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00004361 PyModule_AddIntConstant(m, "IPV6_JOIN_GROUP", IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004362#endif
4363#ifdef IPV6_LEAVE_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00004364 PyModule_AddIntConstant(m, "IPV6_LEAVE_GROUP", IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004365#endif
4366#ifdef IPV6_MULTICAST_HOPS
Fred Drake4baedc12002-04-01 14:53:37 +00004367 PyModule_AddIntConstant(m, "IPV6_MULTICAST_HOPS", IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004368#endif
4369#ifdef IPV6_MULTICAST_IF
Fred Drake4baedc12002-04-01 14:53:37 +00004370 PyModule_AddIntConstant(m, "IPV6_MULTICAST_IF", IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004371#endif
4372#ifdef IPV6_MULTICAST_LOOP
Fred Drake4baedc12002-04-01 14:53:37 +00004373 PyModule_AddIntConstant(m, "IPV6_MULTICAST_LOOP", IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004374#endif
4375#ifdef IPV6_UNICAST_HOPS
Fred Drake4baedc12002-04-01 14:53:37 +00004376 PyModule_AddIntConstant(m, "IPV6_UNICAST_HOPS", IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004377#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00004378 /* Additional IPV6 socket options, defined in RFC 3493 */
4379#ifdef IPV6_V6ONLY
4380 PyModule_AddIntConstant(m, "IPV6_V6ONLY", IPV6_V6ONLY);
4381#endif
4382 /* Advanced IPV6 socket options, from RFC 3542 */
4383#ifdef IPV6_CHECKSUM
4384 PyModule_AddIntConstant(m, "IPV6_CHECKSUM", IPV6_CHECKSUM);
4385#endif
4386#ifdef IPV6_DONTFRAG
4387 PyModule_AddIntConstant(m, "IPV6_DONTFRAG", IPV6_DONTFRAG);
4388#endif
4389#ifdef IPV6_DSTOPTS
4390 PyModule_AddIntConstant(m, "IPV6_DSTOPTS", IPV6_DSTOPTS);
4391#endif
4392#ifdef IPV6_HOPLIMIT
4393 PyModule_AddIntConstant(m, "IPV6_HOPLIMIT", IPV6_HOPLIMIT);
4394#endif
4395#ifdef IPV6_HOPOPTS
4396 PyModule_AddIntConstant(m, "IPV6_HOPOPTS", IPV6_HOPOPTS);
4397#endif
4398#ifdef IPV6_NEXTHOP
4399 PyModule_AddIntConstant(m, "IPV6_NEXTHOP", IPV6_NEXTHOP);
4400#endif
4401#ifdef IPV6_PATHMTU
4402 PyModule_AddIntConstant(m, "IPV6_PATHMTU", IPV6_PATHMTU);
4403#endif
4404#ifdef IPV6_PKTINFO
4405 PyModule_AddIntConstant(m, "IPV6_PKTINFO", IPV6_PKTINFO);
4406#endif
4407#ifdef IPV6_RECVDSTOPTS
4408 PyModule_AddIntConstant(m, "IPV6_RECVDSTOPTS", IPV6_RECVDSTOPTS);
4409#endif
4410#ifdef IPV6_RECVHOPLIMIT
4411 PyModule_AddIntConstant(m, "IPV6_RECVHOPLIMIT", IPV6_RECVHOPLIMIT);
4412#endif
4413#ifdef IPV6_RECVHOPOPTS
4414 PyModule_AddIntConstant(m, "IPV6_RECVHOPOPTS", IPV6_RECVHOPOPTS);
4415#endif
4416#ifdef IPV6_RECVPKTINFO
4417 PyModule_AddIntConstant(m, "IPV6_RECVPKTINFO", IPV6_RECVPKTINFO);
4418#endif
4419#ifdef IPV6_RECVRTHDR
4420 PyModule_AddIntConstant(m, "IPV6_RECVRTHDR", IPV6_RECVRTHDR);
4421#endif
4422#ifdef IPV6_RECVTCLASS
4423 PyModule_AddIntConstant(m, "IPV6_RECVTCLASS", IPV6_RECVTCLASS);
4424#endif
4425#ifdef IPV6_RTHDR
4426 PyModule_AddIntConstant(m, "IPV6_RTHDR", IPV6_RTHDR);
4427#endif
4428#ifdef IPV6_RTHDRDSTOPTS
4429 PyModule_AddIntConstant(m, "IPV6_RTHDRDSTOPTS", IPV6_RTHDRDSTOPTS);
4430#endif
4431#ifdef IPV6_RTHDR_TYPE_0
4432 PyModule_AddIntConstant(m, "IPV6_RTHDR_TYPE_0", IPV6_RTHDR_TYPE_0);
4433#endif
4434#ifdef IPV6_RECVPATHMTU
4435 PyModule_AddIntConstant(m, "IPV6_RECVPATHMTU", IPV6_RECVPATHMTU);
4436#endif
4437#ifdef IPV6_TCLASS
4438 PyModule_AddIntConstant(m, "IPV6_TCLASS", IPV6_TCLASS);
4439#endif
4440#ifdef IPV6_USE_MIN_MTU
4441 PyModule_AddIntConstant(m, "IPV6_USE_MIN_MTU", IPV6_USE_MIN_MTU);
4442#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004443
Guido van Rossum09be4091999-08-09 14:40:40 +00004444 /* TCP options */
4445#ifdef TCP_NODELAY
Fred Drake4baedc12002-04-01 14:53:37 +00004446 PyModule_AddIntConstant(m, "TCP_NODELAY", TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00004447#endif
4448#ifdef TCP_MAXSEG
Fred Drake4baedc12002-04-01 14:53:37 +00004449 PyModule_AddIntConstant(m, "TCP_MAXSEG", TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00004450#endif
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004451#ifdef TCP_CORK
Fred Drake4baedc12002-04-01 14:53:37 +00004452 PyModule_AddIntConstant(m, "TCP_CORK", TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004453#endif
4454#ifdef TCP_KEEPIDLE
Fred Drake4baedc12002-04-01 14:53:37 +00004455 PyModule_AddIntConstant(m, "TCP_KEEPIDLE", TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004456#endif
4457#ifdef TCP_KEEPINTVL
Fred Drake4baedc12002-04-01 14:53:37 +00004458 PyModule_AddIntConstant(m, "TCP_KEEPINTVL", TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004459#endif
4460#ifdef TCP_KEEPCNT
Fred Drake4baedc12002-04-01 14:53:37 +00004461 PyModule_AddIntConstant(m, "TCP_KEEPCNT", TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004462#endif
4463#ifdef TCP_SYNCNT
Fred Drake4baedc12002-04-01 14:53:37 +00004464 PyModule_AddIntConstant(m, "TCP_SYNCNT", TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004465#endif
4466#ifdef TCP_LINGER2
Fred Drake4baedc12002-04-01 14:53:37 +00004467 PyModule_AddIntConstant(m, "TCP_LINGER2", TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004468#endif
4469#ifdef TCP_DEFER_ACCEPT
Fred Drake4baedc12002-04-01 14:53:37 +00004470 PyModule_AddIntConstant(m, "TCP_DEFER_ACCEPT", TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004471#endif
4472#ifdef TCP_WINDOW_CLAMP
Fred Drake4baedc12002-04-01 14:53:37 +00004473 PyModule_AddIntConstant(m, "TCP_WINDOW_CLAMP", TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004474#endif
4475#ifdef TCP_INFO
Fred Drake4baedc12002-04-01 14:53:37 +00004476 PyModule_AddIntConstant(m, "TCP_INFO", TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004477#endif
4478#ifdef TCP_QUICKACK
Fred Drake4baedc12002-04-01 14:53:37 +00004479 PyModule_AddIntConstant(m, "TCP_QUICKACK", TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004480#endif
4481
Guido van Rossum09be4091999-08-09 14:40:40 +00004482
4483 /* IPX options */
4484#ifdef IPX_TYPE
Fred Drake4baedc12002-04-01 14:53:37 +00004485 PyModule_AddIntConstant(m, "IPX_TYPE", IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00004486#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004487
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004488 /* get{addr,name}info parameters */
4489#ifdef EAI_ADDRFAMILY
Fred Drake4baedc12002-04-01 14:53:37 +00004490 PyModule_AddIntConstant(m, "EAI_ADDRFAMILY", EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004491#endif
4492#ifdef EAI_AGAIN
Fred Drake4baedc12002-04-01 14:53:37 +00004493 PyModule_AddIntConstant(m, "EAI_AGAIN", EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004494#endif
4495#ifdef EAI_BADFLAGS
Fred Drake4baedc12002-04-01 14:53:37 +00004496 PyModule_AddIntConstant(m, "EAI_BADFLAGS", EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004497#endif
4498#ifdef EAI_FAIL
Fred Drake4baedc12002-04-01 14:53:37 +00004499 PyModule_AddIntConstant(m, "EAI_FAIL", EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004500#endif
4501#ifdef EAI_FAMILY
Fred Drake4baedc12002-04-01 14:53:37 +00004502 PyModule_AddIntConstant(m, "EAI_FAMILY", EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004503#endif
4504#ifdef EAI_MEMORY
Fred Drake4baedc12002-04-01 14:53:37 +00004505 PyModule_AddIntConstant(m, "EAI_MEMORY", EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004506#endif
4507#ifdef EAI_NODATA
Fred Drake4baedc12002-04-01 14:53:37 +00004508 PyModule_AddIntConstant(m, "EAI_NODATA", EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004509#endif
4510#ifdef EAI_NONAME
Fred Drake4baedc12002-04-01 14:53:37 +00004511 PyModule_AddIntConstant(m, "EAI_NONAME", EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004512#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00004513#ifdef EAI_OVERFLOW
4514 PyModule_AddIntConstant(m, "EAI_OVERFLOW", EAI_OVERFLOW);
4515#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004516#ifdef EAI_SERVICE
Fred Drake4baedc12002-04-01 14:53:37 +00004517 PyModule_AddIntConstant(m, "EAI_SERVICE", EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004518#endif
4519#ifdef EAI_SOCKTYPE
Fred Drake4baedc12002-04-01 14:53:37 +00004520 PyModule_AddIntConstant(m, "EAI_SOCKTYPE", EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004521#endif
4522#ifdef EAI_SYSTEM
Fred Drake4baedc12002-04-01 14:53:37 +00004523 PyModule_AddIntConstant(m, "EAI_SYSTEM", EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004524#endif
4525#ifdef EAI_BADHINTS
Fred Drake4baedc12002-04-01 14:53:37 +00004526 PyModule_AddIntConstant(m, "EAI_BADHINTS", EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004527#endif
4528#ifdef EAI_PROTOCOL
Fred Drake4baedc12002-04-01 14:53:37 +00004529 PyModule_AddIntConstant(m, "EAI_PROTOCOL", EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004530#endif
4531#ifdef EAI_MAX
Fred Drake4baedc12002-04-01 14:53:37 +00004532 PyModule_AddIntConstant(m, "EAI_MAX", EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004533#endif
4534#ifdef AI_PASSIVE
Fred Drake4baedc12002-04-01 14:53:37 +00004535 PyModule_AddIntConstant(m, "AI_PASSIVE", AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004536#endif
4537#ifdef AI_CANONNAME
Fred Drake4baedc12002-04-01 14:53:37 +00004538 PyModule_AddIntConstant(m, "AI_CANONNAME", AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004539#endif
4540#ifdef AI_NUMERICHOST
Fred Drake4baedc12002-04-01 14:53:37 +00004541 PyModule_AddIntConstant(m, "AI_NUMERICHOST", AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004542#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00004543#ifdef AI_NUMERICSERV
4544 PyModule_AddIntConstant(m, "AI_NUMERICSERV", AI_NUMERICSERV);
4545#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004546#ifdef AI_MASK
Fred Drake4baedc12002-04-01 14:53:37 +00004547 PyModule_AddIntConstant(m, "AI_MASK", AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004548#endif
4549#ifdef AI_ALL
Fred Drake4baedc12002-04-01 14:53:37 +00004550 PyModule_AddIntConstant(m, "AI_ALL", AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004551#endif
4552#ifdef AI_V4MAPPED_CFG
Fred Drake4baedc12002-04-01 14:53:37 +00004553 PyModule_AddIntConstant(m, "AI_V4MAPPED_CFG", AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004554#endif
4555#ifdef AI_ADDRCONFIG
Fred Drake4baedc12002-04-01 14:53:37 +00004556 PyModule_AddIntConstant(m, "AI_ADDRCONFIG", AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004557#endif
4558#ifdef AI_V4MAPPED
Fred Drake4baedc12002-04-01 14:53:37 +00004559 PyModule_AddIntConstant(m, "AI_V4MAPPED", AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004560#endif
4561#ifdef AI_DEFAULT
Fred Drake4baedc12002-04-01 14:53:37 +00004562 PyModule_AddIntConstant(m, "AI_DEFAULT", AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004563#endif
4564#ifdef NI_MAXHOST
Fred Drake4baedc12002-04-01 14:53:37 +00004565 PyModule_AddIntConstant(m, "NI_MAXHOST", NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004566#endif
4567#ifdef NI_MAXSERV
Fred Drake4baedc12002-04-01 14:53:37 +00004568 PyModule_AddIntConstant(m, "NI_MAXSERV", NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004569#endif
4570#ifdef NI_NOFQDN
Fred Drake4baedc12002-04-01 14:53:37 +00004571 PyModule_AddIntConstant(m, "NI_NOFQDN", NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004572#endif
4573#ifdef NI_NUMERICHOST
Fred Drake4baedc12002-04-01 14:53:37 +00004574 PyModule_AddIntConstant(m, "NI_NUMERICHOST", NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004575#endif
4576#ifdef NI_NAMEREQD
Fred Drake4baedc12002-04-01 14:53:37 +00004577 PyModule_AddIntConstant(m, "NI_NAMEREQD", NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004578#endif
4579#ifdef NI_NUMERICSERV
Fred Drake4baedc12002-04-01 14:53:37 +00004580 PyModule_AddIntConstant(m, "NI_NUMERICSERV", NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004581#endif
4582#ifdef NI_DGRAM
Fred Drake4baedc12002-04-01 14:53:37 +00004583 PyModule_AddIntConstant(m, "NI_DGRAM", NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004584#endif
4585
Martin v. Löwis94681fc2003-11-27 19:40:22 +00004586 /* shutdown() parameters */
4587#ifdef SHUT_RD
4588 PyModule_AddIntConstant(m, "SHUT_RD", SHUT_RD);
4589#elif defined(SD_RECEIVE)
4590 PyModule_AddIntConstant(m, "SHUT_RD", SD_RECEIVE);
4591#else
4592 PyModule_AddIntConstant(m, "SHUT_RD", 0);
4593#endif
4594#ifdef SHUT_WR
4595 PyModule_AddIntConstant(m, "SHUT_WR", SHUT_WR);
4596#elif defined(SD_SEND)
4597 PyModule_AddIntConstant(m, "SHUT_WR", SD_SEND);
4598#else
4599 PyModule_AddIntConstant(m, "SHUT_WR", 1);
4600#endif
4601#ifdef SHUT_RDWR
4602 PyModule_AddIntConstant(m, "SHUT_RDWR", SHUT_RDWR);
4603#elif defined(SD_BOTH)
4604 PyModule_AddIntConstant(m, "SHUT_RDWR", SD_BOTH);
4605#else
4606 PyModule_AddIntConstant(m, "SHUT_RDWR", 2);
4607#endif
4608
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004609 /* Initialize gethostbyname lock */
Just van Rossum1040d2c2003-05-09 07:53:18 +00004610#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
4611 netdb_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004612#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004613}
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004614
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004615
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004616#ifndef HAVE_INET_PTON
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004617
4618/* Simplistic emulation code for inet_pton that only works for IPv4 */
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004619/* These are not exposed because they do not set errno properly */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004620
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004621int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004622inet_pton(int af, const char *src, void *dst)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004623{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004624 if (af == AF_INET) {
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004625 long packed_addr;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004626 packed_addr = inet_addr(src);
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004627 if (packed_addr == INADDR_NONE)
4628 return 0;
4629 memcpy(dst, &packed_addr, 4);
4630 return 1;
4631 }
4632 /* Should set errno to EAFNOSUPPORT */
4633 return -1;
4634}
4635
Martin v. Löwisc925b1532001-07-21 09:42:15 +00004636const char *
4637inet_ntop(int af, const void *src, char *dst, socklen_t size)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004638{
4639 if (af == AF_INET) {
4640 struct in_addr packed_addr;
4641 if (size < 16)
4642 /* Should set errno to ENOSPC. */
4643 return NULL;
4644 memcpy(&packed_addr, src, sizeof(packed_addr));
4645 return strncpy(dst, inet_ntoa(packed_addr), size);
4646 }
4647 /* Should set errno to EAFNOSUPPORT */
4648 return NULL;
4649}
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004650
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004651#endif