blob: 5d8a5523bc2dac4f8d9914b4ac9c01928e3b238a [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
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000260#include "addrinfo.h"
Jason Tishlerc246cb72004-08-09 13:25:59 +0000261
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000262#ifndef HAVE_INET_PTON
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000263int inet_pton(int af, const char *src, void *dst);
Martin v. Löwisc925b1532001-07-21 09:42:15 +0000264const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000265#endif
266
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000267#ifdef __APPLE__
268/* On OS X, getaddrinfo returns no error indication of lookup
269 failure, so we must use the emulation instead of the libinfo
270 implementation. Unfortunately, performing an autoconf test
271 for this bug would require DNS access for the machine performing
272 the configuration, which is not acceptable. Therefore, we
273 determine the bug just by checking for __APPLE__. If this bug
274 gets ever fixed, perhaps checking for sys/version.h would be
275 appropriate, which is 10/0 on the system with the bug. */
Jack Jansen84262fb2002-07-02 14:40:42 +0000276#ifndef HAVE_GETNAMEINFO
277/* This bug seems to be fixed in Jaguar. Ths easiest way I could
278 Find to check for Jaguar is that it has getnameinfo(), which
279 older releases don't have */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000280#undef HAVE_GETADDRINFO
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000281#endif
Jack Jansen84262fb2002-07-02 14:40:42 +0000282#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000283
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000284/* I know this is a bad practice, but it is the easiest... */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000285#if !defined(HAVE_GETADDRINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000286/* avoid clashes with the C library definition of the symbol. */
287#define getaddrinfo fake_getaddrinfo
288#define gai_strerror fake_gai_strerror
289#define freeaddrinfo fake_freeaddrinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000290#include "getaddrinfo.c"
291#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000292#if !defined(HAVE_GETNAMEINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000293#define getnameinfo fake_getnameinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000294#include "getnameinfo.c"
295#endif
296
Guido van Rossumbcc20741998-08-04 22:53:56 +0000297#if defined(MS_WINDOWS) || defined(__BEOS__)
298/* BeOS suffers from the same socket dichotomy as Win32... - [cjh] */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000299/* seem to be a few differences in the API */
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000300#define SOCKETCLOSE closesocket
Guido van Rossumbe32c891996-06-20 16:25:29 +0000301#define NO_DUP /* Actually it exists on NT 3.5, but what the heck... */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000302#endif
303
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000304#ifdef MS_WIN32
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000305#define EAFNOSUPPORT WSAEAFNOSUPPORT
306#define snprintf _snprintf
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000307#endif
Fred Drakea04eaad2000-06-30 02:46:07 +0000308
Andrew MacIntyreba43e872002-03-03 03:03:52 +0000309#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000310#define SOCKETCLOSE soclose
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000311#define NO_DUP /* Sockets are Not Actual File Handles under OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000312#endif
313
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000314#ifndef SOCKETCLOSE
315#define SOCKETCLOSE close
316#endif
317
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000318#ifdef __VMS
319/* TCP/IP Services for VMS uses a maximum send/revc buffer length of 65535 */
320#define SEGMENT_SIZE 65535
321#endif
322
Hye-Shik Chang81268602004-02-02 06:05:24 +0000323#if defined(HAVE_BLUETOOTH_H) || defined(HAVE_BLUETOOTH_BLUETOOTH_H)
324#define USE_BLUETOOTH 1
325#if defined(__FreeBSD__)
326#define BTPROTO_L2CAP BLUETOOTH_PROTO_L2CAP
327#define BTPROTO_RFCOMM BLUETOOTH_PROTO_RFCOMM
328#define sockaddr_l2 sockaddr_l2cap
329#define sockaddr_rc sockaddr_rfcomm
330#define _BT_SOCKADDR_MEMB(s, proto) &((s)->sock_addr)
331#define _BT_L2_MEMB(sa, memb) ((sa)->l2cap_##memb)
332#define _BT_RC_MEMB(sa, memb) ((sa)->rfcomm_##memb)
333#else
Anthony Baxter5d7c0672004-02-16 05:35:28 +0000334#define _BT_SOCKADDR_MEMB(s, proto) (&((s)->sock_addr).bt_##proto)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000335#define _BT_L2_MEMB(sa, memb) ((sa)->l2_##memb)
336#define _BT_RC_MEMB(sa, memb) ((sa)->rc_##memb)
337#define _BT_SCO_MEMB(sa, memb) ((sa)->sco_##memb)
338#endif
339#endif
340
Martin v. Löwise9416172003-05-03 10:12:45 +0000341/*
342 * Constants for getnameinfo()
343 */
344#if !defined(NI_MAXHOST)
345#define NI_MAXHOST 1025
346#endif
347#if !defined(NI_MAXSERV)
348#define NI_MAXSERV 32
349#endif
350
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000351/* XXX There's a problem here: *static* functions are not supposed to have
352 a Py prefix (or use CapitalizedWords). Later... */
353
Guido van Rossum30a685f1991-06-27 15:51:29 +0000354/* Global variable holding the exception type for errors detected
355 by this module (but not argument type or memory errors, etc.). */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000356static PyObject *socket_error;
357static PyObject *socket_herror;
358static PyObject *socket_gaierror;
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000359static PyObject *socket_timeout;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000360
Guido van Rossum48a680c2001-03-02 06:34:14 +0000361#ifdef RISCOS
362/* Global variable which is !=0 if Python is running in a RISC OS taskwindow */
363static int taskwindow;
364#endif
365
Tim Peters643a7fc2002-02-17 04:13:21 +0000366/* A forward reference to the socket type object.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000367 The sock_type variable contains pointers to various functions,
368 some of which call new_sockobject(), which uses sock_type, so
Tim Peters643a7fc2002-02-17 04:13:21 +0000369 there has to be a circular reference. */
Jeremy Hylton938ace62002-07-17 16:30:39 +0000370static PyTypeObject sock_type;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000371
Guido van Rossum30a685f1991-06-27 15:51:29 +0000372/* Convenience function to raise an error according to errno
373 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000374
Guido van Rossum73624e91994-10-10 17:59:00 +0000375static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000376set_error(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000377{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000378#ifdef MS_WINDOWS
Mark Hammond46a733d2000-07-24 01:45:11 +0000379 int err_no = WSAGetLastError();
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000380 static struct {
381 int no;
382 const char *msg;
383 } *msgp, msgs[] = {
384 {WSAEINTR, "Interrupted system call"},
385 {WSAEBADF, "Bad file descriptor"},
386 {WSAEACCES, "Permission denied"},
387 {WSAEFAULT, "Bad address"},
388 {WSAEINVAL, "Invalid argument"},
389 {WSAEMFILE, "Too many open files"},
390 {WSAEWOULDBLOCK,
391 "The socket operation could not complete "
392 "without blocking"},
393 {WSAEINPROGRESS, "Operation now in progress"},
394 {WSAEALREADY, "Operation already in progress"},
395 {WSAENOTSOCK, "Socket operation on non-socket"},
396 {WSAEDESTADDRREQ, "Destination address required"},
397 {WSAEMSGSIZE, "Message too long"},
398 {WSAEPROTOTYPE, "Protocol wrong type for socket"},
399 {WSAENOPROTOOPT, "Protocol not available"},
400 {WSAEPROTONOSUPPORT, "Protocol not supported"},
401 {WSAESOCKTNOSUPPORT, "Socket type not supported"},
402 {WSAEOPNOTSUPP, "Operation not supported"},
403 {WSAEPFNOSUPPORT, "Protocol family not supported"},
404 {WSAEAFNOSUPPORT, "Address family not supported"},
405 {WSAEADDRINUSE, "Address already in use"},
406 {WSAEADDRNOTAVAIL, "Can't assign requested address"},
407 {WSAENETDOWN, "Network is down"},
408 {WSAENETUNREACH, "Network is unreachable"},
409 {WSAENETRESET, "Network dropped connection on reset"},
410 {WSAECONNABORTED, "Software caused connection abort"},
411 {WSAECONNRESET, "Connection reset by peer"},
412 {WSAENOBUFS, "No buffer space available"},
413 {WSAEISCONN, "Socket is already connected"},
414 {WSAENOTCONN, "Socket is not connected"},
415 {WSAESHUTDOWN, "Can't send after socket shutdown"},
416 {WSAETOOMANYREFS, "Too many references: can't splice"},
417 {WSAETIMEDOUT, "Operation timed out"},
418 {WSAECONNREFUSED, "Connection refused"},
419 {WSAELOOP, "Too many levels of symbolic links"},
420 {WSAENAMETOOLONG, "File name too long"},
421 {WSAEHOSTDOWN, "Host is down"},
422 {WSAEHOSTUNREACH, "No route to host"},
423 {WSAENOTEMPTY, "Directory not empty"},
424 {WSAEPROCLIM, "Too many processes"},
425 {WSAEUSERS, "Too many users"},
426 {WSAEDQUOT, "Disc quota exceeded"},
427 {WSAESTALE, "Stale NFS file handle"},
428 {WSAEREMOTE, "Too many levels of remote in path"},
429 {WSASYSNOTREADY, "Network subsystem is unvailable"},
430 {WSAVERNOTSUPPORTED, "WinSock version is not supported"},
431 {WSANOTINITIALISED,
432 "Successful WSAStartup() not yet performed"},
433 {WSAEDISCON, "Graceful shutdown in progress"},
434 /* Resolver errors */
435 {WSAHOST_NOT_FOUND, "No such host is known"},
436 {WSATRY_AGAIN, "Host not found, or server failed"},
437 {WSANO_RECOVERY, "Unexpected server error encountered"},
438 {WSANO_DATA, "Valid name without requested data"},
439 {WSANO_ADDRESS, "No address, look for MX record"},
440 {0, NULL}
441 };
Mark Hammond46a733d2000-07-24 01:45:11 +0000442 if (err_no) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000443 PyObject *v;
Mark Hammond46a733d2000-07-24 01:45:11 +0000444 const char *msg = "winsock error";
Guido van Rossum48a680c2001-03-02 06:34:14 +0000445
Mark Hammond46a733d2000-07-24 01:45:11 +0000446 for (msgp = msgs; msgp->msg; msgp++) {
447 if (err_no == msgp->no) {
448 msg = msgp->msg;
449 break;
450 }
451 }
452
453 v = Py_BuildValue("(is)", err_no, msg);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000454 if (v != NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000455 PyErr_SetObject(socket_error, v);
Guido van Rossum73624e91994-10-10 17:59:00 +0000456 Py_DECREF(v);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000457 }
458 return NULL;
459 }
460 else
461#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000462
Andrew MacIntyreba43e872002-03-03 03:03:52 +0000463#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000464 if (sock_errno() != NO_ERROR) {
465 APIRET rc;
466 ULONG msglen;
467 char outbuf[100];
468 int myerrorcode = sock_errno();
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000469
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000470 /* Retrieve socket-related error message from MPTN.MSG file */
471 rc = DosGetMessage(NULL, 0, outbuf, sizeof(outbuf),
472 myerrorcode - SOCBASEERR + 26,
473 "mptn.msg",
474 &msglen);
475 if (rc == NO_ERROR) {
476 PyObject *v;
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000477
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000478 /* OS/2 doesn't guarantee a terminator */
479 outbuf[msglen] = '\0';
480 if (strlen(outbuf) > 0) {
481 /* If non-empty msg, trim CRLF */
482 char *lastc = &outbuf[ strlen(outbuf)-1 ];
483 while (lastc > outbuf && isspace(*lastc)) {
484 /* Trim trailing whitespace (CRLF) */
485 *lastc-- = '\0';
486 }
487 }
488 v = Py_BuildValue("(is)", myerrorcode, outbuf);
489 if (v != NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000490 PyErr_SetObject(socket_error, v);
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000491 Py_DECREF(v);
492 }
493 return NULL;
494 }
495 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000496#endif
497
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000498#if defined(RISCOS)
499 if (_inet_error.errnum != NULL) {
500 PyObject *v;
501 v = Py_BuildValue("(is)", errno, _inet_err());
502 if (v != NULL) {
503 PyErr_SetObject(socket_error, v);
504 Py_DECREF(v);
505 }
506 return NULL;
507 }
508#endif
509
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000510 return PyErr_SetFromErrno(socket_error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000511}
512
Guido van Rossum30a685f1991-06-27 15:51:29 +0000513
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000514static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000515set_herror(int h_error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000516{
517 PyObject *v;
518
519#ifdef HAVE_HSTRERROR
520 v = Py_BuildValue("(is)", h_error, (char *)hstrerror(h_error));
521#else
522 v = Py_BuildValue("(is)", h_error, "host not found");
523#endif
524 if (v != NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000525 PyErr_SetObject(socket_herror, v);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000526 Py_DECREF(v);
527 }
528
529 return NULL;
530}
531
532
533static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000534set_gaierror(int error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000535{
536 PyObject *v;
537
Martin v. Löwis272cb402002-03-01 08:31:07 +0000538#ifdef EAI_SYSTEM
539 /* EAI_SYSTEM is not available on Windows XP. */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000540 if (error == EAI_SYSTEM)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000541 return set_error();
Martin v. Löwis272cb402002-03-01 08:31:07 +0000542#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000543
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000544#ifdef HAVE_GAI_STRERROR
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000545 v = Py_BuildValue("(is)", error, gai_strerror(error));
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000546#else
547 v = Py_BuildValue("(is)", error, "getaddrinfo failed");
548#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000549 if (v != NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000550 PyErr_SetObject(socket_gaierror, v);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000551 Py_DECREF(v);
552 }
553
554 return NULL;
555}
556
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000557/* Function to perform the setting of socket blocking mode
558 internally. block = (1 | 0). */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000559static int
560internal_setblocking(PySocketSockObject *s, int block)
561{
562#ifndef RISCOS
563#ifndef MS_WINDOWS
564 int delay_flag;
565#endif
566#endif
567
568 Py_BEGIN_ALLOW_THREADS
569#ifdef __BEOS__
570 block = !block;
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000571 setsockopt(s->sock_fd, SOL_SOCKET, SO_NONBLOCK,
572 (void *)(&block), sizeof(int));
Guido van Rossum67f7a382002-06-06 21:08:16 +0000573#else
574#ifndef RISCOS
575#ifndef MS_WINDOWS
576#if defined(PYOS_OS2) && !defined(PYCC_GCC)
577 block = !block;
578 ioctl(s->sock_fd, FIONBIO, (caddr_t)&block, sizeof(block));
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000579#elif defined(__VMS)
580 block = !block;
581 ioctl(s->sock_fd, FIONBIO, (char *)&block);
582#else /* !PYOS_OS2 && !_VMS */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000583 delay_flag = fcntl(s->sock_fd, F_GETFL, 0);
584 if (block)
Neal Norwitz39d22e52002-11-02 19:55:21 +0000585 delay_flag &= (~O_NONBLOCK);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000586 else
Neal Norwitz39d22e52002-11-02 19:55:21 +0000587 delay_flag |= O_NONBLOCK;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000588 fcntl(s->sock_fd, F_SETFL, delay_flag);
589#endif /* !PYOS_OS2 */
590#else /* MS_WINDOWS */
591 block = !block;
592 ioctlsocket(s->sock_fd, FIONBIO, (u_long*)&block);
593#endif /* MS_WINDOWS */
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000594#else /* RISCOS */
595 block = !block;
596 socketioctl(s->sock_fd, FIONBIO, (u_long*)&block);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000597#endif /* RISCOS */
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000598#endif /* __BEOS__ */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000599 Py_END_ALLOW_THREADS
600
601 /* Since these don't return anything */
602 return 1;
603}
604
Guido van Rossum11ba0942002-06-13 15:07:44 +0000605/* Do a select() on the socket, if necessary (sock_timeout > 0).
606 The argument writing indicates the direction.
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000607 This does not raise an exception; we'll let our caller do that
608 after they've reacquired the interpreter lock.
609 Returns 1 on timeout, 0 otherwise. */
610static int
Guido van Rossumb9e916a2002-06-07 01:42:47 +0000611internal_select(PySocketSockObject *s, int writing)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000612{
613 fd_set fds;
614 struct timeval tv;
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000615 int n;
Guido van Rossum11ba0942002-06-13 15:07:44 +0000616
Guido van Rossumad654902002-07-19 12:44:59 +0000617 /* Nothing to do unless we're in timeout mode (not non-blocking) */
Guido van Rossum11ba0942002-06-13 15:07:44 +0000618 if (s->sock_timeout <= 0.0)
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000619 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000620
Guido van Rossumad654902002-07-19 12:44:59 +0000621 /* Guard against closed socket */
622 if (s->sock_fd < 0)
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000623 return 0;
Guido van Rossumad654902002-07-19 12:44:59 +0000624
Guido van Rossum67f7a382002-06-06 21:08:16 +0000625 /* Construct the arguments to select */
626 tv.tv_sec = (int)s->sock_timeout;
Guido van Rossumb9e916a2002-06-07 01:42:47 +0000627 tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000628 FD_ZERO(&fds);
629 FD_SET(s->sock_fd, &fds);
630
631 /* See if the socket is ready */
Guido van Rossumb9e916a2002-06-07 01:42:47 +0000632 if (writing)
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000633 n = select(s->sock_fd+1, NULL, &fds, NULL, &tv);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000634 else
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000635 n = select(s->sock_fd+1, &fds, NULL, NULL, &tv);
636 if (n == 0)
637 return 1;
638 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000639}
640
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000641/* Initialize a new socket object. */
642
Tim Petersa12b4cf2002-07-18 22:38:44 +0000643static double defaulttimeout = -1.0; /* Default timeout for new sockets */
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000644
Mark Hammond62b1ab12002-07-23 06:31:15 +0000645PyMODINIT_FUNC
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000646init_sockobject(PySocketSockObject *s,
647 SOCKET_T fd, int family, int type, int proto)
648{
649#ifdef RISCOS
650 int block = 1;
651#endif
652 s->sock_fd = fd;
653 s->sock_family = family;
654 s->sock_type = type;
655 s->sock_proto = proto;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000656 s->sock_timeout = defaulttimeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000657
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000658 s->errorhandler = &set_error;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000659
660 if (defaulttimeout >= 0.0)
661 internal_setblocking(s, 0);
662
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000663#ifdef RISCOS
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000664 if (taskwindow)
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000665 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000666#endif
667}
668
669
Guido van Rossum30a685f1991-06-27 15:51:29 +0000670/* Create a new socket object.
671 This just creates the object and initializes it.
672 If the creation fails, return NULL and set an exception (implicit
673 in NEWOBJ()). */
674
Guido van Rossum73624e91994-10-10 17:59:00 +0000675static PySocketSockObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000676new_sockobject(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000677{
Guido van Rossum73624e91994-10-10 17:59:00 +0000678 PySocketSockObject *s;
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000679 s = (PySocketSockObject *)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000680 PyType_GenericNew(&sock_type, NULL, NULL);
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000681 if (s != NULL)
682 init_sockobject(s, fd, family, type, proto);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000683 return s;
684}
685
Guido van Rossum30a685f1991-06-27 15:51:29 +0000686
Guido van Rossum48a680c2001-03-02 06:34:14 +0000687/* Lock to allow python interpreter to continue, but only allow one
Just van Rossum1040d2c2003-05-09 07:53:18 +0000688 thread to be in gethostbyname or getaddrinfo */
689#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
690PyThread_type_lock netdb_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000691#endif
692
693
Guido van Rossum30a685f1991-06-27 15:51:29 +0000694/* Convert a string specifying a host name or one of a few symbolic
695 names to a numeric IP address. This usually calls gethostbyname()
696 to do the work; the names "" and "<broadcast>" are special.
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000697 Return the length (IPv4 should be 4 bytes), or negative if
Guido van Rossum30a685f1991-06-27 15:51:29 +0000698 an error occurred; then an exception is raised. */
699
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000700static int
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000701setipaddr(char *name, struct sockaddr *addr_ret, size_t addr_ret_size, int af)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000702{
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000703 struct addrinfo hints, *res;
704 int error;
Anthony Baxter0e85f9d2003-05-02 15:40:46 +0000705 int d1, d2, d3, d4;
706 char ch;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000707
Guido van Rossuma376cc51996-12-05 23:43:35 +0000708 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
Guido van Rossum30a685f1991-06-27 15:51:29 +0000709 if (name[0] == '\0') {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000710 int siz;
711 memset(&hints, 0, sizeof(hints));
712 hints.ai_family = af;
713 hints.ai_socktype = SOCK_DGRAM; /*dummy*/
714 hints.ai_flags = AI_PASSIVE;
Just van Rossum1040d2c2003-05-09 07:53:18 +0000715 Py_BEGIN_ALLOW_THREADS
716 ACQUIRE_GETADDRINFO_LOCK
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000717 error = getaddrinfo(NULL, "0", &hints, &res);
Just van Rossum1040d2c2003-05-09 07:53:18 +0000718 Py_END_ALLOW_THREADS
719 /* We assume that those thread-unsafe getaddrinfo() versions
720 *are* safe regarding their return value, ie. that a
721 subsequent call to getaddrinfo() does not destroy the
722 outcome of the first call. */
723 RELEASE_GETADDRINFO_LOCK
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000724 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000725 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000726 return -1;
727 }
728 switch (res->ai_family) {
729 case AF_INET:
730 siz = 4;
731 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000732#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000733 case AF_INET6:
734 siz = 16;
735 break;
736#endif
737 default:
738 freeaddrinfo(res);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000739 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000740 "unsupported address family");
741 return -1;
742 }
743 if (res->ai_next) {
Martin v. Löwisf0b11d22001-11-07 08:31:03 +0000744 freeaddrinfo(res);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000745 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000746 "wildcard resolved to multiple address");
747 return -1;
748 }
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000749 if (res->ai_addrlen < addr_ret_size)
750 addr_ret_size = res->ai_addrlen;
751 memcpy(addr_ret, res->ai_addr, addr_ret_size);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000752 freeaddrinfo(res);
753 return siz;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000754 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000755 if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000756 struct sockaddr_in *sin;
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +0000757 if (af != AF_INET && af != AF_UNSPEC) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000758 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000759 "address family mismatched");
760 return -1;
761 }
762 sin = (struct sockaddr_in *)addr_ret;
763 memset((void *) sin, '\0', sizeof(*sin));
764 sin->sin_family = AF_INET;
765#ifdef HAVE_SOCKADDR_SA_LEN
766 sin->sin_len = sizeof(*sin);
767#endif
768 sin->sin_addr.s_addr = INADDR_BROADCAST;
769 return sizeof(sin->sin_addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000770 }
Anthony Baxter0e85f9d2003-05-02 15:40:46 +0000771 if (sscanf(name, "%d.%d.%d.%d%c", &d1, &d2, &d3, &d4, &ch) == 4 &&
772 0 <= d1 && d1 <= 255 && 0 <= d2 && d2 <= 255 &&
773 0 <= d3 && d3 <= 255 && 0 <= d4 && d4 <= 255) {
774 struct sockaddr_in *sin;
775 sin = (struct sockaddr_in *)addr_ret;
776 sin->sin_addr.s_addr = htonl(
777 ((long) d1 << 24) | ((long) d2 << 16) |
778 ((long) d3 << 8) | ((long) d4 << 0));
779 sin->sin_family = AF_INET;
780#ifdef HAVE_SOCKADDR_SA_LEN
781 sin->sin_len = sizeof(*sin);
782#endif
783 return 4;
784 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000785 memset(&hints, 0, sizeof(hints));
786 hints.ai_family = af;
Just van Rossum1040d2c2003-05-09 07:53:18 +0000787 Py_BEGIN_ALLOW_THREADS
788 ACQUIRE_GETADDRINFO_LOCK
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000789 error = getaddrinfo(name, NULL, &hints, &res);
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000790#if defined(__digital__) && defined(__unix__)
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000791 if (error == EAI_NONAME && af == AF_UNSPEC) {
792 /* On Tru64 V5.1, numeric-to-addr conversion fails
793 if no address family is given. Assume IPv4 for now.*/
794 hints.ai_family = AF_INET;
795 error = getaddrinfo(name, NULL, &hints, &res);
796 }
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000797#endif
Just van Rossum1040d2c2003-05-09 07:53:18 +0000798 Py_END_ALLOW_THREADS
799 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000800 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000801 set_gaierror(error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000802 return -1;
803 }
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000804 if (res->ai_addrlen < addr_ret_size)
805 addr_ret_size = res->ai_addrlen;
806 memcpy((char *) addr_ret, res->ai_addr, addr_ret_size);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000807 freeaddrinfo(res);
808 switch (addr_ret->sa_family) {
809 case AF_INET:
810 return 4;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000811#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000812 case AF_INET6:
813 return 16;
Guido van Rossum955becc1999-03-22 20:14:53 +0000814#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000815 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000816 PyErr_SetString(socket_error, "unknown address family");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000817 return -1;
818 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000819}
820
Guido van Rossum30a685f1991-06-27 15:51:29 +0000821
Guido van Rossum30a685f1991-06-27 15:51:29 +0000822/* Create a string object representing an IP address.
823 This is always a string of the form 'dd.dd.dd.dd' (with variable
824 size numbers). */
825
Guido van Rossum73624e91994-10-10 17:59:00 +0000826static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000827makeipaddr(struct sockaddr *addr, int addrlen)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000828{
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000829 char buf[NI_MAXHOST];
830 int error;
831
832 error = getnameinfo(addr, addrlen, buf, sizeof(buf), NULL, 0,
833 NI_NUMERICHOST);
834 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000835 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000836 return NULL;
837 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000838 return PyString_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000839}
840
841
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000842#ifdef USE_BLUETOOTH
843/* Convert a string representation of a Bluetooth address into a numeric
844 address. Returns the length (6), or raises an exception and returns -1 if
845 an error occurred. */
846
847static int
848setbdaddr(char *name, bdaddr_t *bdaddr)
849{
850 unsigned int b0, b1, b2, b3, b4, b5;
851 char ch;
852 int n;
853
854 n = sscanf(name, "%X:%X:%X:%X:%X:%X%c",
855 &b5, &b4, &b3, &b2, &b1, &b0, &ch);
856 if (n == 6 && (b0 | b1 | b2 | b3 | b4 | b5) < 256) {
857 bdaddr->b[0] = b0;
858 bdaddr->b[1] = b1;
859 bdaddr->b[2] = b2;
860 bdaddr->b[3] = b3;
861 bdaddr->b[4] = b4;
862 bdaddr->b[5] = b5;
863 return 6;
864 } else {
865 PyErr_SetString(socket_error, "bad bluetooth address");
866 return -1;
867 }
868}
869
870/* Create a string representation of the Bluetooth address. This is always a
871 string of the form 'XX:XX:XX:XX:XX:XX' where XX is a two digit hexadecimal
872 value (zero padded if necessary). */
873
874static PyObject *
875makebdaddr(bdaddr_t *bdaddr)
876{
877 char buf[(6 * 2) + 5 + 1];
878
879 sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X",
880 bdaddr->b[5], bdaddr->b[4], bdaddr->b[3],
881 bdaddr->b[2], bdaddr->b[1], bdaddr->b[0]);
882 return PyString_FromString(buf);
883}
884#endif
885
886
Guido van Rossum30a685f1991-06-27 15:51:29 +0000887/* Create an object representing the given socket address,
888 suitable for passing it back to bind(), connect() etc.
889 The family field of the sockaddr structure is inspected
890 to determine what kind of address it really is. */
891
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000892/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000893static PyObject *
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000894makesockaddr(int sockfd, struct sockaddr *addr, int addrlen, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000895{
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000896 if (addrlen == 0) {
897 /* No address -- may be recvfrom() from known socket */
Guido van Rossum73624e91994-10-10 17:59:00 +0000898 Py_INCREF(Py_None);
899 return Py_None;
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000900 }
901
Guido van Rossumbcc20741998-08-04 22:53:56 +0000902#ifdef __BEOS__
Guido van Rossum2c8bcb82000-04-25 21:34:53 +0000903 /* XXX: BeOS version of accept() doesn't set family correctly */
Guido van Rossumbcc20741998-08-04 22:53:56 +0000904 addr->sa_family = AF_INET;
905#endif
906
Guido van Rossum30a685f1991-06-27 15:51:29 +0000907 switch (addr->sa_family) {
908
909 case AF_INET:
910 {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000911 struct sockaddr_in *a;
912 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
Barry Warsaw752300b1997-01-03 17:18:10 +0000913 PyObject *ret = NULL;
914 if (addrobj) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000915 a = (struct sockaddr_in *)addr;
Barry Warsaw752300b1997-01-03 17:18:10 +0000916 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
917 Py_DECREF(addrobj);
918 }
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000919 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000920 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000921
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +0000922#if defined(AF_UNIX)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000923 case AF_UNIX:
924 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000925 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000926 return PyString_FromString(a->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000927 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000928#endif /* AF_UNIX */
929
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000930#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000931 case AF_INET6:
932 {
933 struct sockaddr_in6 *a;
934 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
935 PyObject *ret = NULL;
936 if (addrobj) {
937 a = (struct sockaddr_in6 *)addr;
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000938 ret = Py_BuildValue("Oiii",
939 addrobj,
940 ntohs(a->sin6_port),
941 a->sin6_flowinfo,
942 a->sin6_scope_id);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000943 Py_DECREF(addrobj);
944 }
945 return ret;
946 }
Jeremy Hylton22308652001-02-02 03:23:09 +0000947#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +0000948
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000949#ifdef USE_BLUETOOTH
950 case AF_BLUETOOTH:
951 switch (proto) {
952
953 case BTPROTO_L2CAP:
954 {
955 struct sockaddr_l2 *a = (struct sockaddr_l2 *) addr;
956 PyObject *addrobj = makebdaddr(&_BT_L2_MEMB(a, bdaddr));
957 PyObject *ret = NULL;
958 if (addrobj) {
959 ret = Py_BuildValue("Oi",
960 addrobj,
961 _BT_L2_MEMB(a, psm));
962 Py_DECREF(addrobj);
963 }
964 return ret;
965 }
966
967 case BTPROTO_RFCOMM:
968 {
969 struct sockaddr_rc *a = (struct sockaddr_rc *) addr;
970 PyObject *addrobj = makebdaddr(&_BT_RC_MEMB(a, bdaddr));
971 PyObject *ret = NULL;
972 if (addrobj) {
973 ret = Py_BuildValue("Oi",
974 addrobj,
975 _BT_RC_MEMB(a, channel));
976 Py_DECREF(addrobj);
977 }
978 return ret;
979 }
980
981#if !defined(__FreeBSD__)
982 case BTPROTO_SCO:
983 {
984 struct sockaddr_sco *a = (struct sockaddr_sco *) addr;
985 return makebdaddr(&_BT_SCO_MEMB(a, bdaddr));
986 }
987#endif
988
989 }
990#endif
991
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +0000992#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +0000993 case AF_PACKET:
994 {
995 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
996 char *ifname = "";
997 struct ifreq ifr;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000998 /* need to look up interface name give index */
999 if (a->sll_ifindex) {
Jeremy Hylton22308652001-02-02 03:23:09 +00001000 ifr.ifr_ifindex = a->sll_ifindex;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001001 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
Jeremy Hylton22308652001-02-02 03:23:09 +00001002 ifname = ifr.ifr_name;
Jeremy Hylton22308652001-02-02 03:23:09 +00001003 }
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001004 return Py_BuildValue("shbhs#",
1005 ifname,
1006 ntohs(a->sll_protocol),
1007 a->sll_pkttype,
1008 a->sll_hatype,
1009 a->sll_addr,
1010 a->sll_halen);
Jeremy Hylton22308652001-02-02 03:23:09 +00001011 }
1012#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001013
Guido van Rossum30a685f1991-06-27 15:51:29 +00001014 /* More cases here... */
1015
1016 default:
Guido van Rossumaa948df1997-05-07 17:41:48 +00001017 /* If we don't know the address family, don't raise an
1018 exception -- return it as a tuple. */
1019 return Py_BuildValue("is#",
1020 addr->sa_family,
1021 addr->sa_data,
1022 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001023
Guido van Rossum30a685f1991-06-27 15:51:29 +00001024 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001025}
1026
Guido van Rossum30a685f1991-06-27 15:51:29 +00001027
1028/* Parse a socket address argument according to the socket object's
1029 address family. Return 1 if the address was in the proper format,
1030 0 of not. The address is returned through addr_ret, its length
1031 through len_ret. */
1032
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001033static int
Guido van Rossum48a680c2001-03-02 06:34:14 +00001034getsockaddrarg(PySocketSockObject *s, PyObject *args,
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001035 struct sockaddr **addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001036{
Guido van Rossum30a685f1991-06-27 15:51:29 +00001037 switch (s->sock_family) {
1038
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001039#if defined(AF_UNIX)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001040 case AF_UNIX:
1041 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001042 struct sockaddr_un* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001043 char *path;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001044 int len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001045 addr = (struct sockaddr_un*)&(s->sock_addr).un;
Guido van Rossum7e488981998-10-08 02:25:24 +00001046 if (!PyArg_Parse(args, "t#", &path, &len))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001047 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001048 if (len > sizeof addr->sun_path) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001049 PyErr_SetString(socket_error,
Barry Warsaw752300b1997-01-03 17:18:10 +00001050 "AF_UNIX path too long");
Guido van Rossum30a685f1991-06-27 15:51:29 +00001051 return 0;
1052 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001053 addr->sun_family = s->sock_family;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001054 memcpy(addr->sun_path, path, len);
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001055 addr->sun_path[len] = 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001056 *addr_ret = (struct sockaddr *) addr;
Andrew MacIntyredaedf212004-04-11 12:03:57 +00001057#if defined(PYOS_OS2)
1058 *len_ret = sizeof(*addr);
1059#else
Guido van Rossum65af28a1996-06-11 18:36:33 +00001060 *len_ret = len + sizeof(*addr) - sizeof(addr->sun_path);
Andrew MacIntyredaedf212004-04-11 12:03:57 +00001061#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001062 return 1;
1063 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001064#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001065
Guido van Rossum30a685f1991-06-27 15:51:29 +00001066 case AF_INET:
1067 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001068 struct sockaddr_in* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001069 char *host;
Martin v. Löwis5db099a2003-08-07 11:55:15 +00001070 int port, result;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001071 addr=(struct sockaddr_in*)&(s->sock_addr).in;
Guido van Rossume4dad902000-12-01 13:13:11 +00001072 if (!PyTuple_Check(args)) {
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001073 PyErr_Format(
1074 PyExc_TypeError,
1075 "getsockaddrarg: "
1076 "AF_INET address must be tuple, not %.500s",
1077 args->ob_type->tp_name);
Guido van Rossume4dad902000-12-01 13:13:11 +00001078 return 0;
1079 }
Martin v. Löwis2548c732003-04-18 10:39:54 +00001080 if (!PyArg_ParseTuple(args, "eti:getsockaddrarg",
1081 "idna", &host, &port))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001082 return 0;
Martin v. Löwis5db099a2003-08-07 11:55:15 +00001083 result = setipaddr(host, (struct sockaddr *)addr,
1084 sizeof(*addr), AF_INET);
1085 PyMem_Free(host);
1086 if (result < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001087 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001088 addr->sin_family = AF_INET;
Guido van Rossum644a12b1997-04-09 19:24:53 +00001089 addr->sin_port = htons((short)port);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001090 *addr_ret = (struct sockaddr *) addr;
1091 *len_ret = sizeof *addr;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001092 return 1;
1093 }
1094
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001095#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001096 case AF_INET6:
1097 {
1098 struct sockaddr_in6* addr;
1099 char *host;
Martin v. Löwis5db099a2003-08-07 11:55:15 +00001100 int port, flowinfo, scope_id, result;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001101 addr = (struct sockaddr_in6*)&(s->sock_addr).in6;
1102 flowinfo = scope_id = 0;
Martin v. Löwis2548c732003-04-18 10:39:54 +00001103 if (!PyArg_ParseTuple(args, "eti|ii",
1104 "idna", &host, &port, &flowinfo,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001105 &scope_id)) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001106 return 0;
1107 }
Martin v. Löwis5db099a2003-08-07 11:55:15 +00001108 result = setipaddr(host, (struct sockaddr *)addr,
1109 sizeof(*addr), AF_INET6);
1110 PyMem_Free(host);
1111 if (result < 0)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001112 return 0;
1113 addr->sin6_family = s->sock_family;
1114 addr->sin6_port = htons((short)port);
1115 addr->sin6_flowinfo = flowinfo;
1116 addr->sin6_scope_id = scope_id;
1117 *addr_ret = (struct sockaddr *) addr;
1118 *len_ret = sizeof *addr;
1119 return 1;
1120 }
1121#endif
1122
Hye-Shik Chang81268602004-02-02 06:05:24 +00001123#ifdef USE_BLUETOOTH
Martin v. Löwis12af0482004-01-31 12:34:17 +00001124 case AF_BLUETOOTH:
1125 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001126 switch (s->sock_proto) {
1127 case BTPROTO_L2CAP:
Martin v. Löwis12af0482004-01-31 12:34:17 +00001128 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001129 struct sockaddr_l2 *addr = (struct sockaddr_l2 *) _BT_SOCKADDR_MEMB(s, l2);
1130 char *straddr;
Martin v. Löwis12af0482004-01-31 12:34:17 +00001131
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001132 _BT_L2_MEMB(addr, family) = AF_BLUETOOTH;
1133 if (!PyArg_ParseTuple(args, "si", &straddr,
1134 &_BT_L2_MEMB(addr, psm))) {
1135 PyErr_SetString(socket_error, "getsockaddrarg: "
1136 "wrong format");
Martin v. Löwis12af0482004-01-31 12:34:17 +00001137 return 0;
1138 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001139 if (setbdaddr(straddr, &_BT_L2_MEMB(addr, bdaddr)) < 0)
1140 return 0;
1141
1142 *addr_ret = (struct sockaddr *) addr;
1143 *len_ret = sizeof *addr;
1144 return 1;
1145 }
1146 case BTPROTO_RFCOMM:
1147 {
1148 struct sockaddr_rc *addr = (struct sockaddr_rc *) _BT_SOCKADDR_MEMB(s, rc);
1149 char *straddr;
1150
1151 _BT_RC_MEMB(addr, family) = AF_BLUETOOTH;
1152 if (!PyArg_ParseTuple(args, "si", &straddr,
1153 &_BT_RC_MEMB(addr, channel))) {
1154 PyErr_SetString(socket_error, "getsockaddrarg: "
1155 "wrong format");
1156 return 0;
1157 }
1158 if (setbdaddr(straddr, &_BT_RC_MEMB(addr, bdaddr)) < 0)
1159 return 0;
1160
1161 *addr_ret = (struct sockaddr *) addr;
1162 *len_ret = sizeof *addr;
1163 return 1;
1164 }
1165#if !defined(__FreeBSD__)
1166 case BTPROTO_SCO:
1167 {
1168 struct sockaddr_sco *addr = (struct sockaddr_sco *) _BT_SOCKADDR_MEMB(s, sco);
1169 char *straddr;
1170
1171 _BT_SCO_MEMB(addr, family) = AF_BLUETOOTH;
1172 straddr = PyString_AsString(args);
1173 if (straddr == NULL) {
1174 PyErr_SetString(socket_error, "getsockaddrarg: "
1175 "wrong format");
1176 return 0;
1177 }
1178 if (setbdaddr(straddr, &_BT_SCO_MEMB(addr, bdaddr)) < 0)
1179 return 0;
1180
1181 *addr_ret = (struct sockaddr *) addr;
1182 *len_ret = sizeof *addr;
1183 return 1;
1184 }
1185#endif
1186 default:
1187 PyErr_SetString(socket_error, "getsockaddrarg: unknown Bluetooth protocol");
1188 return 0;
Martin v. Löwis12af0482004-01-31 12:34:17 +00001189 }
1190 }
1191#endif
1192
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00001193#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +00001194 case AF_PACKET:
1195 {
1196 struct sockaddr_ll* addr;
1197 struct ifreq ifr;
1198 char *interfaceName;
1199 int protoNumber;
1200 int hatype = 0;
1201 int pkttype = 0;
Andrew M. Kuchlingb8e17172004-07-10 23:39:35 +00001202 char *haddr = NULL;
1203 unsigned int halen = 0;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001204
Andrew M. Kuchlingb8e17172004-07-10 23:39:35 +00001205 if (!PyArg_ParseTuple(args, "si|iis#", &interfaceName,
1206 &protoNumber, &pkttype, &hatype,
1207 &haddr, &halen))
Jeremy Hylton22308652001-02-02 03:23:09 +00001208 return 0;
1209 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
1210 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001211 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001212 s->errorhandler();
Jeremy Hylton22308652001-02-02 03:23:09 +00001213 return 0;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001214 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001215 addr = &(s->sock_addr.ll);
1216 addr->sll_family = AF_PACKET;
1217 addr->sll_protocol = htons((short)protoNumber);
1218 addr->sll_ifindex = ifr.ifr_ifindex;
1219 addr->sll_pkttype = pkttype;
1220 addr->sll_hatype = hatype;
Andrew M. Kuchlingb8e17172004-07-10 23:39:35 +00001221 if (halen > 8) {
1222 PyErr_SetString(PyExc_ValueError,
1223 "Hardware address must be 8 bytes or less");
1224 return 0;
1225 }
1226 if (halen != 0) {
1227 memcpy(&addr->sll_addr, haddr, halen);
1228 }
1229 addr->sll_halen = halen;
Jeremy Hylton22308652001-02-02 03:23:09 +00001230 *addr_ret = (struct sockaddr *) addr;
1231 *len_ret = sizeof *addr;
1232 return 1;
1233 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00001234#endif
1235
Guido van Rossum30a685f1991-06-27 15:51:29 +00001236 /* More cases here... */
1237
1238 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001239 PyErr_SetString(socket_error, "getsockaddrarg: bad family");
Guido van Rossum30a685f1991-06-27 15:51:29 +00001240 return 0;
1241
1242 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001243}
1244
Guido van Rossum30a685f1991-06-27 15:51:29 +00001245
Guido van Rossum48a680c2001-03-02 06:34:14 +00001246/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +00001247 Return 1 if the family is known, 0 otherwise. The length is returned
1248 through len_ret. */
1249
1250static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +00001251getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +00001252{
1253 switch (s->sock_family) {
1254
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001255#if defined(AF_UNIX)
Guido van Rossum710e1df1992-06-12 10:39:36 +00001256 case AF_UNIX:
1257 {
1258 *len_ret = sizeof (struct sockaddr_un);
1259 return 1;
1260 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001261#endif /* AF_UNIX */
Guido van Rossum710e1df1992-06-12 10:39:36 +00001262
1263 case AF_INET:
1264 {
1265 *len_ret = sizeof (struct sockaddr_in);
1266 return 1;
1267 }
1268
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001269#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001270 case AF_INET6:
1271 {
1272 *len_ret = sizeof (struct sockaddr_in6);
1273 return 1;
1274 }
1275#endif
1276
Hye-Shik Chang81268602004-02-02 06:05:24 +00001277#ifdef USE_BLUETOOTH
Martin v. Löwis12af0482004-01-31 12:34:17 +00001278 case AF_BLUETOOTH:
1279 {
1280 switch(s->sock_proto)
1281 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001282
1283 case BTPROTO_L2CAP:
1284 *len_ret = sizeof (struct sockaddr_l2);
1285 return 1;
1286 case BTPROTO_RFCOMM:
1287 *len_ret = sizeof (struct sockaddr_rc);
1288 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00001289#if !defined(__FreeBSD__)
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001290 case BTPROTO_SCO:
1291 *len_ret = sizeof (struct sockaddr_sco);
1292 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00001293#endif
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001294 default:
1295 PyErr_SetString(socket_error, "getsockaddrlen: "
1296 "unknown BT protocol");
1297 return 0;
1298
Martin v. Löwis12af0482004-01-31 12:34:17 +00001299 }
1300 }
1301#endif
1302
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00001303#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +00001304 case AF_PACKET:
1305 {
1306 *len_ret = sizeof (struct sockaddr_ll);
1307 return 1;
1308 }
1309#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001310
Guido van Rossum710e1df1992-06-12 10:39:36 +00001311 /* More cases here... */
1312
1313 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001314 PyErr_SetString(socket_error, "getsockaddrlen: bad family");
Guido van Rossum710e1df1992-06-12 10:39:36 +00001315 return 0;
1316
1317 }
1318}
1319
1320
Guido van Rossum30a685f1991-06-27 15:51:29 +00001321/* s.accept() method */
1322
Guido van Rossum73624e91994-10-10 17:59:00 +00001323static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001324sock_accept(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001325{
1326 char addrbuf[256];
Fred Drakea04eaad2000-06-30 02:46:07 +00001327 SOCKET_T newfd;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001328 socklen_t addrlen;
Barry Warsaw752300b1997-01-03 17:18:10 +00001329 PyObject *sock = NULL;
1330 PyObject *addr = NULL;
1331 PyObject *res = NULL;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001332 int timeout;
Barry Warsaw752300b1997-01-03 17:18:10 +00001333
Guido van Rossum710e1df1992-06-12 10:39:36 +00001334 if (!getsockaddrlen(s, &addrlen))
1335 return NULL;
Fred Drakefd168342001-05-09 19:11:33 +00001336 memset(addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001337
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001338#ifdef MS_WINDOWS
1339 newfd = INVALID_SOCKET;
1340#else
1341 newfd = -1;
1342#endif
1343
Guido van Rossum73624e91994-10-10 17:59:00 +00001344 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001345 timeout = internal_select(s, 0);
1346 if (!timeout)
1347 newfd = accept(s->sock_fd, (struct sockaddr *) addrbuf,
1348 &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001349 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001350
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001351 if (timeout) {
1352 PyErr_SetString(socket_timeout, "timed out");
1353 return NULL;
1354 }
1355
Fred Drakea04eaad2000-06-30 02:46:07 +00001356#ifdef MS_WINDOWS
1357 if (newfd == INVALID_SOCKET)
1358#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001359 if (newfd < 0)
Fred Drakea04eaad2000-06-30 02:46:07 +00001360#endif
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001361 return s->errorhandler();
Barry Warsaw752300b1997-01-03 17:18:10 +00001362
Guido van Rossum30a685f1991-06-27 15:51:29 +00001363 /* Create the new object with unspecified family,
1364 to avoid calls to bind() etc. on it. */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001365 sock = (PyObject *) new_sockobject(newfd,
1366 s->sock_family,
1367 s->sock_type,
1368 s->sock_proto);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001369
Barry Warsaw752300b1997-01-03 17:18:10 +00001370 if (sock == NULL) {
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001371 SOCKETCLOSE(newfd);
Barry Warsaw752300b1997-01-03 17:18:10 +00001372 goto finally;
1373 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00001374 addr = makesockaddr(s->sock_fd, (struct sockaddr *)addrbuf,
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001375 addrlen, s->sock_proto);
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001376 if (addr == NULL)
Barry Warsaw752300b1997-01-03 17:18:10 +00001377 goto finally;
1378
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001379 res = PyTuple_Pack(2, sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00001380
Guido van Rossum67f7a382002-06-06 21:08:16 +00001381finally:
Guido van Rossum73624e91994-10-10 17:59:00 +00001382 Py_XDECREF(sock);
1383 Py_XDECREF(addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001384 return res;
1385}
1386
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001387PyDoc_STRVAR(accept_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001388"accept() -> (socket object, address info)\n\
1389\n\
1390Wait for an incoming connection. Return a new socket representing the\n\
1391connection, and the address of the client. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001392info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001393
Guido van Rossum11ba0942002-06-13 15:07:44 +00001394/* s.setblocking(flag) method. Argument:
1395 False -- non-blocking mode; same as settimeout(0)
1396 True -- blocking mode; same as settimeout(None)
1397*/
Guido van Rossume4485b01994-09-07 14:32:49 +00001398
Guido van Rossum73624e91994-10-10 17:59:00 +00001399static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001400sock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00001401{
1402 int block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001403
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001404 block = PyInt_AsLong(arg);
1405 if (block == -1 && PyErr_Occurred())
Guido van Rossume4485b01994-09-07 14:32:49 +00001406 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001407
Guido van Rossum11ba0942002-06-13 15:07:44 +00001408 s->sock_timeout = block ? -1.0 : 0.0;
Guido van Rossume8008f02002-06-07 03:36:20 +00001409 internal_setblocking(s, block);
Guido van Rossume4485b01994-09-07 14:32:49 +00001410
Guido van Rossum73624e91994-10-10 17:59:00 +00001411 Py_INCREF(Py_None);
1412 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +00001413}
Guido van Rossume4485b01994-09-07 14:32:49 +00001414
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001415PyDoc_STRVAR(setblocking_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001416"setblocking(flag)\n\
1417\n\
1418Set the socket to blocking (flag is true) or non-blocking (false).\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00001419setblocking(True) is equivalent to settimeout(None);\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001420setblocking(False) is equivalent to settimeout(0.0).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001421
Guido van Rossum11ba0942002-06-13 15:07:44 +00001422/* s.settimeout(timeout) method. Argument:
1423 None -- no timeout, blocking mode; same as setblocking(True)
1424 0.0 -- non-blocking mode; same as setblocking(False)
1425 > 0 -- timeout mode; operations time out after timeout seconds
1426 < 0 -- illegal; raises an exception
1427*/
Guido van Rossum67f7a382002-06-06 21:08:16 +00001428static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001429sock_settimeout(PySocketSockObject *s, PyObject *arg)
Guido van Rossum67f7a382002-06-06 21:08:16 +00001430{
Guido van Rossum11ba0942002-06-13 15:07:44 +00001431 double timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001432
1433 if (arg == Py_None)
Guido van Rossum11ba0942002-06-13 15:07:44 +00001434 timeout = -1.0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001435 else {
Guido van Rossum11ba0942002-06-13 15:07:44 +00001436 timeout = PyFloat_AsDouble(arg);
1437 if (timeout < 0.0) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00001438 if (!PyErr_Occurred())
1439 PyErr_SetString(PyExc_ValueError,
Guido van Rossum11ba0942002-06-13 15:07:44 +00001440 "Timeout value out of range");
Guido van Rossum67f7a382002-06-06 21:08:16 +00001441 return NULL;
1442 }
1443 }
1444
Guido van Rossum11ba0942002-06-13 15:07:44 +00001445 s->sock_timeout = timeout;
1446 internal_setblocking(s, timeout < 0.0);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001447
1448 Py_INCREF(Py_None);
1449 return Py_None;
1450}
1451
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001452PyDoc_STRVAR(settimeout_doc,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001453"settimeout(timeout)\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00001454\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00001455Set a timeout on socket operations. 'timeout' can be a float,\n\
1456giving in seconds, or None. Setting a timeout of None disables\n\
1457the timeout feature and is equivalent to setblocking(1).\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001458Setting a timeout of zero is the same as setblocking(0).");
Guido van Rossum67f7a382002-06-06 21:08:16 +00001459
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001460/* s.gettimeout() method.
1461 Returns the timeout associated with a socket. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00001462static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001463sock_gettimeout(PySocketSockObject *s)
Guido van Rossum67f7a382002-06-06 21:08:16 +00001464{
1465 if (s->sock_timeout < 0.0) {
1466 Py_INCREF(Py_None);
1467 return Py_None;
1468 }
1469 else
1470 return PyFloat_FromDouble(s->sock_timeout);
1471}
1472
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001473PyDoc_STRVAR(gettimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00001474"gettimeout() -> timeout\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00001475\n\
1476Returns the timeout in floating seconds associated with socket \n\
1477operations. A timeout of None indicates that timeouts on socket \n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001478operations are disabled.");
Guido van Rossume4485b01994-09-07 14:32:49 +00001479
Guido van Rossum48a680c2001-03-02 06:34:14 +00001480#ifdef RISCOS
1481/* s.sleeptaskw(1 | 0) method */
1482
1483static PyObject *
Martin v. Löwisa94568a2003-05-10 07:36:56 +00001484sock_sleeptaskw(PySocketSockObject *s,PyObject *arg)
Guido van Rossum48a680c2001-03-02 06:34:14 +00001485{
Guido van Rossum67f7a382002-06-06 21:08:16 +00001486 int block;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00001487 block = PyInt_AsLong(arg);
1488 if (block == -1 && PyErr_Occurred())
Guido van Rossum67f7a382002-06-06 21:08:16 +00001489 return NULL;
1490 Py_BEGIN_ALLOW_THREADS
1491 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
1492 Py_END_ALLOW_THREADS
Guido van Rossum48a680c2001-03-02 06:34:14 +00001493
Guido van Rossum67f7a382002-06-06 21:08:16 +00001494 Py_INCREF(Py_None);
1495 return Py_None;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001496}
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001497PyDoc_STRVAR(sleeptaskw_doc,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001498"sleeptaskw(flag)\n\
1499\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001500Allow sleeps in taskwindows.");
Guido van Rossum48a680c2001-03-02 06:34:14 +00001501#endif
1502
1503
Guido van Rossumaee08791992-09-08 09:05:33 +00001504/* s.setsockopt() method.
1505 With an integer third argument, sets an integer option.
1506 With a string third argument, sets an option from a buffer;
1507 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001508
Guido van Rossum73624e91994-10-10 17:59:00 +00001509static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001510sock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001511{
1512 int level;
1513 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001514 int res;
Guido van Rossumaee08791992-09-08 09:05:33 +00001515 char *buf;
1516 int buflen;
1517 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001518
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001519 if (PyArg_ParseTuple(args, "iii:setsockopt",
1520 &level, &optname, &flag)) {
Guido van Rossumaee08791992-09-08 09:05:33 +00001521 buf = (char *) &flag;
1522 buflen = sizeof flag;
1523 }
1524 else {
Guido van Rossum73624e91994-10-10 17:59:00 +00001525 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001526 if (!PyArg_ParseTuple(args, "iis#:setsockopt",
1527 &level, &optname, &buf, &buflen))
Guido van Rossumaee08791992-09-08 09:05:33 +00001528 return NULL;
1529 }
Thomas Wouters334fb892000-07-25 12:56:38 +00001530 res = setsockopt(s->sock_fd, level, optname, (void *)buf, buflen);
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001531 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001532 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001533 Py_INCREF(Py_None);
1534 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001535}
1536
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001537PyDoc_STRVAR(setsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001538"setsockopt(level, option, value)\n\
1539\n\
1540Set a socket option. See the Unix manual for level and option.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001541The value argument can either be an integer or a string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001542
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001543
Guido van Rossumaee08791992-09-08 09:05:33 +00001544/* s.getsockopt() method.
1545 With two arguments, retrieves an integer option.
1546 With a third integer argument, retrieves a string buffer of that size;
1547 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001548
Guido van Rossum73624e91994-10-10 17:59:00 +00001549static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001550sock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001551{
1552 int level;
1553 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001554 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +00001555 PyObject *buf;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001556 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001557
Guido van Rossumbcc20741998-08-04 22:53:56 +00001558#ifdef __BEOS__
Fred Drake564a6cc2001-05-11 20:12:26 +00001559 /* We have incomplete socket support. */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001560 PyErr_SetString(socket_error, "getsockopt not supported");
Guido van Rossumbcc20741998-08-04 22:53:56 +00001561 return NULL;
1562#else
1563
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001564 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
1565 &level, &optname, &buflen))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001566 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001567
Guido van Rossumbe32c891996-06-20 16:25:29 +00001568 if (buflen == 0) {
Guido van Rossumaee08791992-09-08 09:05:33 +00001569 int flag = 0;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001570 socklen_t flagsize = sizeof flag;
Guido van Rossumb376a4a1993-11-23 17:53:17 +00001571 res = getsockopt(s->sock_fd, level, optname,
Thomas Wouters334fb892000-07-25 12:56:38 +00001572 (void *)&flag, &flagsize);
Guido van Rossumaee08791992-09-08 09:05:33 +00001573 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001574 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001575 return PyInt_FromLong(flag);
Guido van Rossumaee08791992-09-08 09:05:33 +00001576 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001577#ifdef __VMS
1578 if (buflen > 1024) {
1579#else
Guido van Rossumaee08791992-09-08 09:05:33 +00001580 if (buflen <= 0 || buflen > 1024) {
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001581#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001582 PyErr_SetString(socket_error,
Barry Warsaw752300b1997-01-03 17:18:10 +00001583 "getsockopt buflen out of range");
Guido van Rossumaee08791992-09-08 09:05:33 +00001584 return NULL;
1585 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001586 buf = PyString_FromStringAndSize((char *)NULL, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001587 if (buf == NULL)
1588 return NULL;
Guido van Rossumb376a4a1993-11-23 17:53:17 +00001589 res = getsockopt(s->sock_fd, level, optname,
Fred Drake564a6cc2001-05-11 20:12:26 +00001590 (void *)PyString_AS_STRING(buf), &buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001591 if (res < 0) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001592 Py_DECREF(buf);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001593 return s->errorhandler();
Guido van Rossumaee08791992-09-08 09:05:33 +00001594 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001595 _PyString_Resize(&buf, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001596 return buf;
Guido van Rossumbcc20741998-08-04 22:53:56 +00001597#endif /* __BEOS__ */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001598}
1599
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001600PyDoc_STRVAR(getsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001601"getsockopt(level, option[, buffersize]) -> value\n\
1602\n\
1603Get a socket option. See the Unix manual for level and option.\n\
1604If a nonzero buffersize argument is given, the return value is a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001605string of that length; otherwise it is an integer.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001606
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001607
Fred Drake728819a2000-07-01 03:40:12 +00001608/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001609
Guido van Rossum73624e91994-10-10 17:59:00 +00001610static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001611sock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001612{
1613 struct sockaddr *addr;
1614 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001615 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001616
Fred Drake728819a2000-07-01 03:40:12 +00001617 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001618 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001619 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001620 res = bind(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001621 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001622 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001623 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001624 Py_INCREF(Py_None);
1625 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001626}
1627
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001628PyDoc_STRVAR(bind_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001629"bind(address)\n\
1630\n\
1631Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00001632pair (host, port); the host must refer to the local host. For raw packet\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001633sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001634
Guido van Rossum30a685f1991-06-27 15:51:29 +00001635
1636/* s.close() method.
1637 Set the file descriptor to -1 so operations tried subsequently
1638 will surely fail. */
1639
Guido van Rossum73624e91994-10-10 17:59:00 +00001640static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001641sock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001642{
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001643 SOCKET_T fd;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001644
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001645 if ((fd = s->sock_fd) != -1) {
1646 s->sock_fd = -1;
Guido van Rossum08481461996-10-12 14:07:22 +00001647 Py_BEGIN_ALLOW_THREADS
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001648 (void) SOCKETCLOSE(fd);
Guido van Rossum08481461996-10-12 14:07:22 +00001649 Py_END_ALLOW_THREADS
1650 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001651 Py_INCREF(Py_None);
1652 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001653}
1654
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001655PyDoc_STRVAR(close_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001656"close()\n\
1657\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001658Close the socket. It cannot be used after this call.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001659
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001660static int
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001661internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen,
1662 int *timeoutp)
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001663{
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001664 int res, timeout;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001665
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001666 timeout = 0;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001667 res = connect(s->sock_fd, addr, addrlen);
1668
1669#ifdef MS_WINDOWS
1670
1671 if (s->sock_timeout > 0.0) {
1672 if (res < 0 && WSAGetLastError() == WSAEWOULDBLOCK) {
Guido van Rossumb76bdf82003-02-19 17:50:16 +00001673 /* This is a mess. Best solution: trust select */
1674 fd_set fds;
Mark Hammonda57ec932004-08-03 05:06:26 +00001675 fd_set fds_exc;
Guido van Rossumb76bdf82003-02-19 17:50:16 +00001676 struct timeval tv;
1677 tv.tv_sec = (int)s->sock_timeout;
1678 tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6);
1679 FD_ZERO(&fds);
1680 FD_SET(s->sock_fd, &fds);
Mark Hammonda57ec932004-08-03 05:06:26 +00001681 FD_ZERO(&fds_exc);
1682 FD_SET(s->sock_fd, &fds_exc);
1683 res = select(s->sock_fd+1, NULL, &fds, &fds_exc, &tv);
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001684 if (res == 0) {
Guido van Rossumb76bdf82003-02-19 17:50:16 +00001685 res = WSAEWOULDBLOCK;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001686 timeout = 1;
Mark Hammonda57ec932004-08-03 05:06:26 +00001687 } else if (res > 0) {
1688 if (FD_ISSET(s->sock_fd, &fds))
1689 /* The socket is in the writeable set - this
1690 means connected */
1691 res = 0;
1692 else {
1693 /* As per MS docs, we need to call getsockopt()
1694 to get the underlying error */
1695 int res_size = sizeof res;
1696 /* It must be in the exception set */
1697 assert(FD_ISSET(s->sock_fd, &fds_exc));
1698 if (0 == getsockopt(s->sock_fd, SOL_SOCKET, SO_ERROR,
1699 (char *)&res, &res_size))
1700 /* getsockopt also clears WSAGetLastError,
1701 so reset it back. */
1702 WSASetLastError(res);
1703 else
1704 res = WSAGetLastError();
1705 }
1706 }
Guido van Rossumb76bdf82003-02-19 17:50:16 +00001707 /* else if (res < 0) an error occurred */
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001708 }
1709 }
1710
1711 if (res < 0)
1712 res = WSAGetLastError();
1713
1714#else
1715
1716 if (s->sock_timeout > 0.0) {
1717 if (res < 0 && errno == EINPROGRESS) {
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001718 timeout = internal_select(s, 1);
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001719 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum12e3c712002-08-08 20:39:30 +00001720 if (res < 0 && errno == EISCONN)
1721 res = 0;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001722 }
1723 }
1724
1725 if (res < 0)
1726 res = errno;
1727
1728#endif
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001729 *timeoutp = timeout;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001730
1731 return res;
1732}
Guido van Rossum30a685f1991-06-27 15:51:29 +00001733
Fred Drake728819a2000-07-01 03:40:12 +00001734/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001735
Guido van Rossum73624e91994-10-10 17:59:00 +00001736static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001737sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001738{
1739 struct sockaddr *addr;
1740 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001741 int res;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001742 int timeout;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001743
Fred Drake728819a2000-07-01 03:40:12 +00001744 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001745 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001746
Guido van Rossum73624e91994-10-10 17:59:00 +00001747 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001748 res = internal_connect(s, addr, addrlen, &timeout);
Guido van Rossum11ba0942002-06-13 15:07:44 +00001749 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001750
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001751 if (timeout) {
1752 PyErr_SetString(socket_timeout, "timed out");
1753 return NULL;
1754 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001755 if (res != 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001756 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001757 Py_INCREF(Py_None);
1758 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001759}
1760
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001761PyDoc_STRVAR(connect_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001762"connect(address)\n\
1763\n\
1764Connect the socket to a remote address. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001765is a pair (host, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001766
Guido van Rossum30a685f1991-06-27 15:51:29 +00001767
Fred Drake728819a2000-07-01 03:40:12 +00001768/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001769
1770static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001771sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001772{
1773 struct sockaddr *addr;
1774 int addrlen;
1775 int res;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001776 int timeout;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001777
Fred Drake728819a2000-07-01 03:40:12 +00001778 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001779 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001780
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001781 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001782 res = internal_connect(s, addr, addrlen, &timeout);
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001783 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001784
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001785 return PyInt_FromLong((long) res);
1786}
1787
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001788PyDoc_STRVAR(connect_ex_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00001789"connect_ex(address) -> errno\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00001790\n\
1791This is like connect(address), but returns an error code (the errno value)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001792instead of raising an exception when an error occurs.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001793
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001794
Guido van Rossumed233a51992-06-23 09:07:03 +00001795/* s.fileno() method */
1796
Guido van Rossum73624e91994-10-10 17:59:00 +00001797static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001798sock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00001799{
Fred Drakea04eaad2000-06-30 02:46:07 +00001800#if SIZEOF_SOCKET_T <= SIZEOF_LONG
Guido van Rossum73624e91994-10-10 17:59:00 +00001801 return PyInt_FromLong((long) s->sock_fd);
Fred Drakea04eaad2000-06-30 02:46:07 +00001802#else
Martin v. Löwisb9a0f912003-03-29 10:06:18 +00001803 return PyLong_FromLongLong((PY_LONG_LONG)s->sock_fd);
Fred Drakea04eaad2000-06-30 02:46:07 +00001804#endif
Guido van Rossumed233a51992-06-23 09:07:03 +00001805}
1806
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001807PyDoc_STRVAR(fileno_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001808"fileno() -> integer\n\
1809\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001810Return the integer file descriptor of the socket.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001811
Guido van Rossumed233a51992-06-23 09:07:03 +00001812
Guido van Rossumbe32c891996-06-20 16:25:29 +00001813#ifndef NO_DUP
1814/* s.dup() method */
1815
1816static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001817sock_dup(PySocketSockObject *s)
Guido van Rossumbe32c891996-06-20 16:25:29 +00001818{
Fred Drakea04eaad2000-06-30 02:46:07 +00001819 SOCKET_T newfd;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001820 PyObject *sock;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001821
Guido van Rossumbe32c891996-06-20 16:25:29 +00001822 newfd = dup(s->sock_fd);
1823 if (newfd < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001824 return s->errorhandler();
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001825 sock = (PyObject *) new_sockobject(newfd,
1826 s->sock_family,
1827 s->sock_type,
1828 s->sock_proto);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001829 if (sock == NULL)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001830 SOCKETCLOSE(newfd);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001831 return sock;
1832}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001833
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001834PyDoc_STRVAR(dup_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001835"dup() -> socket object\n\
1836\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001837Return a new socket object connected to the same system resource.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001838
Guido van Rossumbe32c891996-06-20 16:25:29 +00001839#endif
1840
1841
Guido van Rossumc89705d1992-11-26 08:54:07 +00001842/* s.getsockname() method */
1843
Guido van Rossum73624e91994-10-10 17:59:00 +00001844static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001845sock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001846{
1847 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001848 int res;
1849 socklen_t addrlen;
1850
Guido van Rossumc89705d1992-11-26 08:54:07 +00001851 if (!getsockaddrlen(s, &addrlen))
1852 return NULL;
Guido van Rossumca42b161996-01-12 01:36:05 +00001853 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001854 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001855 res = getsockname(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001856 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001857 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001858 return s->errorhandler();
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001859 return makesockaddr(s->sock_fd, (struct sockaddr *) addrbuf, addrlen,
1860 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001861}
1862
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001863PyDoc_STRVAR(getsockname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001864"getsockname() -> address info\n\
1865\n\
1866Return the address of the local endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001867info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001868
Guido van Rossumc89705d1992-11-26 08:54:07 +00001869
Guido van Rossumb6775db1994-08-01 11:34:53 +00001870#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001871/* s.getpeername() method */
1872
Guido van Rossum73624e91994-10-10 17:59:00 +00001873static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001874sock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001875{
1876 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001877 int res;
1878 socklen_t addrlen;
1879
Guido van Rossumc89705d1992-11-26 08:54:07 +00001880 if (!getsockaddrlen(s, &addrlen))
1881 return NULL;
Fred Drakefd168342001-05-09 19:11:33 +00001882 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001883 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001884 res = getpeername(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001885 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001886 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001887 return s->errorhandler();
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001888 return makesockaddr(s->sock_fd, (struct sockaddr *) addrbuf, addrlen,
1889 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001890}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001891
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001892PyDoc_STRVAR(getpeername_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001893"getpeername() -> address info\n\
1894\n\
1895Return the address of the remote endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001896info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001897
Guido van Rossumb6775db1994-08-01 11:34:53 +00001898#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001899
1900
Guido van Rossum30a685f1991-06-27 15:51:29 +00001901/* s.listen(n) method */
1902
Guido van Rossum73624e91994-10-10 17:59:00 +00001903static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001904sock_listen(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001905{
1906 int backlog;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001907 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001908
1909 backlog = PyInt_AsLong(arg);
1910 if (backlog == -1 && PyErr_Occurred())
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001911 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001912 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +00001913 if (backlog < 1)
1914 backlog = 1;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001915 res = listen(s->sock_fd, backlog);
Guido van Rossum73624e91994-10-10 17:59:00 +00001916 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001917 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001918 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001919 Py_INCREF(Py_None);
1920 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001921}
1922
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001923PyDoc_STRVAR(listen_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001924"listen(backlog)\n\
1925\n\
1926Enable a server to accept connections. The backlog argument must be at\n\
1927least 1; it specifies the number of unaccepted connection that the system\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001928will allow before refusing new connections.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001929
1930
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001931#ifndef NO_DUP
Guido van Rossum30a685f1991-06-27 15:51:29 +00001932/* s.makefile(mode) method.
1933 Create a new open file object referring to a dupped version of
1934 the socket's file descriptor. (The dup() call is necessary so
1935 that the open file and socket objects may be closed independent
1936 of each other.)
1937 The mode argument specifies 'r' or 'w' passed to fdopen(). */
1938
Guido van Rossum73624e91994-10-10 17:59:00 +00001939static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001940sock_makefile(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001941{
Tim Petersdbd9ba62000-07-09 03:09:57 +00001942 extern int fclose(FILE *);
Guido van Rossum6b144911995-03-14 15:05:13 +00001943 char *mode = "r";
1944 int bufsize = -1;
Fred Drakea04eaad2000-06-30 02:46:07 +00001945#ifdef MS_WIN32
Tim Peters79248aa2001-08-29 21:37:10 +00001946 Py_intptr_t fd;
Fred Drakea04eaad2000-06-30 02:46:07 +00001947#else
Guido van Rossum30a685f1991-06-27 15:51:29 +00001948 int fd;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001949#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001950 FILE *fp;
Guido van Rossum6b144911995-03-14 15:05:13 +00001951 PyObject *f;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001952#ifdef __VMS
1953 char *mode_r = "r";
1954 char *mode_w = "w";
1955#endif
Guido van Rossum6b144911995-03-14 15:05:13 +00001956
Guido van Rossum43713e52000-02-29 13:59:29 +00001957 if (!PyArg_ParseTuple(args, "|si:makefile", &mode, &bufsize))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001958 return NULL;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001959#ifdef __VMS
1960 if (strcmp(mode,"rb") == 0) {
1961 mode = mode_r;
1962 }
1963 else {
1964 if (strcmp(mode,"wb") == 0) {
1965 mode = mode_w;
1966 }
1967 }
1968#endif
Guido van Rossum8d665e61996-06-26 18:22:49 +00001969#ifdef MS_WIN32
Guido van Rossum82a5c661998-07-07 20:45:43 +00001970 if (((fd = _open_osfhandle(s->sock_fd, _O_BINARY)) < 0) ||
1971 ((fd = dup(fd)) < 0) || ((fp = fdopen(fd, mode)) == NULL))
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001972#else
Guido van Rossum82a5c661998-07-07 20:45:43 +00001973 if ((fd = dup(s->sock_fd)) < 0 || (fp = fdopen(fd, mode)) == NULL)
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001974#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001975 {
Guido van Rossum6b144911995-03-14 15:05:13 +00001976 if (fd >= 0)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001977 SOCKETCLOSE(fd);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001978 return s->errorhandler();
Guido van Rossum6b144911995-03-14 15:05:13 +00001979 }
1980 f = PyFile_FromFile(fp, "<socket>", mode, fclose);
1981 if (f != NULL)
1982 PyFile_SetBufSize(f, bufsize);
1983 return f;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001984}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001985
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001986PyDoc_STRVAR(makefile_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001987"makefile([mode[, buffersize]]) -> file object\n\
1988\n\
1989Return a regular file object corresponding to the socket.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001990The mode and buffersize arguments are as for the built-in open() function.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001991
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001992#endif /* NO_DUP */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001993
Guido van Rossum48a680c2001-03-02 06:34:14 +00001994
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001995/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001996
Guido van Rossum73624e91994-10-10 17:59:00 +00001997static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001998sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001999{
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002000 int len, n = 0, flags = 0, timeout;
Guido van Rossum73624e91994-10-10 17:59:00 +00002001 PyObject *buf;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002002#ifdef __VMS
2003 int read_length;
2004 char *read_buf;
2005#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00002006
Guido van Rossum43713e52000-02-29 13:59:29 +00002007 if (!PyArg_ParseTuple(args, "i|i:recv", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00002008 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002009
2010 if (len < 0) {
Martin v. Löwisfba64e12001-11-19 10:41:26 +00002011 PyErr_SetString(PyExc_ValueError,
Guido van Rossum11ba0942002-06-13 15:07:44 +00002012 "negative buffersize in recv");
Martin v. Löwisfba64e12001-11-19 10:41:26 +00002013 return NULL;
2014 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002015
Guido van Rossum73624e91994-10-10 17:59:00 +00002016 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002017 if (buf == NULL)
2018 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002019
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002020#ifndef __VMS
Guido van Rossum73624e91994-10-10 17:59:00 +00002021 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002022 timeout = internal_select(s, 0);
2023 if (!timeout)
2024 n = recv(s->sock_fd, PyString_AS_STRING(buf), len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00002025 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002026
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002027 if (timeout) {
2028 Py_DECREF(buf);
2029 PyErr_SetString(socket_timeout, "timed out");
2030 return NULL;
2031 }
Guido van Rossum7c53b771995-09-13 18:39:47 +00002032 if (n < 0) {
2033 Py_DECREF(buf);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002034 return s->errorhandler();
Guido van Rossum7c53b771995-09-13 18:39:47 +00002035 }
Tim Peters5de98422002-04-27 18:44:32 +00002036 if (n != len)
2037 _PyString_Resize(&buf, n);
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002038#else
2039 read_buf = PyString_AsString(buf);
2040 read_length = len;
2041 while (read_length != 0) {
2042 unsigned int segment;
2043
2044 segment = read_length /SEGMENT_SIZE;
2045 if (segment != 0) {
2046 segment = SEGMENT_SIZE;
2047 }
2048 else {
2049 segment = read_length;
2050 }
2051
2052 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002053 timeout = internal_select(s, 0);
2054 if (!timeout)
2055 n = recv(s->sock_fd, read_buf, segment, flags);
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002056 Py_END_ALLOW_THREADS
2057
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002058 if (timeout) {
2059 Py_DECREF(buf);
2060 PyErr_SetString(socket_timeout, "timed out");
2061 return NULL;
2062 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002063 if (n < 0) {
2064 Py_DECREF(buf);
2065 return s->errorhandler();
2066 }
2067 if (n != read_length) {
2068 read_buf += n;
2069 break;
2070 }
2071
2072 read_length -= segment;
2073 read_buf += segment;
2074 }
2075 if (_PyString_Resize(&buf, (read_buf - PyString_AsString(buf))) < 0)
2076 {
2077 return NULL;
2078 }
2079#endif /* !__VMS */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002080 return buf;
2081}
2082
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002083PyDoc_STRVAR(recv_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002084"recv(buffersize[, flags]) -> data\n\
2085\n\
2086Receive up to buffersize bytes from the socket. For the optional flags\n\
2087argument, see the Unix manual. When no data is available, block until\n\
2088at least one byte is available or until the remote end is closed. When\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002089the remote end is closed and all data is read, return the empty string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002090
Guido van Rossum30a685f1991-06-27 15:51:29 +00002091
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002092/* s.recvfrom(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002093
Guido van Rossum73624e91994-10-10 17:59:00 +00002094static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002095sock_recvfrom(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002096{
2097 char addrbuf[256];
Barry Warsaw752300b1997-01-03 17:18:10 +00002098 PyObject *buf = NULL;
2099 PyObject *addr = NULL;
2100 PyObject *ret = NULL;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002101 int len, n = 0, flags = 0, timeout;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002102 socklen_t addrlen;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002103
Guido van Rossum43713e52000-02-29 13:59:29 +00002104 if (!PyArg_ParseTuple(args, "i|i:recvfrom", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00002105 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002106
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00002107 if (!getsockaddrlen(s, &addrlen))
2108 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00002109 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00002110 if (buf == NULL)
2111 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002112
Guido van Rossum73624e91994-10-10 17:59:00 +00002113 Py_BEGIN_ALLOW_THREADS
Fred Drakefd168342001-05-09 19:11:33 +00002114 memset(addrbuf, 0, addrlen);
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002115 timeout = internal_select(s, 0);
2116 if (!timeout)
2117 n = recvfrom(s->sock_fd, PyString_AS_STRING(buf), len, flags,
Guido van Rossum8d665e61996-06-26 18:22:49 +00002118#ifndef MS_WINDOWS
Andrew MacIntyreba43e872002-03-03 03:03:52 +00002119#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002120 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00002121#else
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002122 (void *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00002123#endif
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002124#else
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002125 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002126#endif
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002127 );
Guido van Rossum73624e91994-10-10 17:59:00 +00002128 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002129
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002130 if (timeout) {
2131 Py_DECREF(buf);
2132 PyErr_SetString(socket_timeout, "timed out");
2133 return NULL;
2134 }
Guido van Rossum7c53b771995-09-13 18:39:47 +00002135 if (n < 0) {
2136 Py_DECREF(buf);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002137 return s->errorhandler();
Guido van Rossum7c53b771995-09-13 18:39:47 +00002138 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002139
Guido van Rossum53a9bf81996-06-11 18:35:24 +00002140 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002141 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002142
Guido van Rossum67f7a382002-06-06 21:08:16 +00002143 if (!(addr = makesockaddr(s->sock_fd, (struct sockaddr *)addrbuf,
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00002144 addrlen, s->sock_proto)))
Barry Warsaw752300b1997-01-03 17:18:10 +00002145 goto finally;
2146
Raymond Hettinger8ae46892003-10-12 19:09:37 +00002147 ret = PyTuple_Pack(2, buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002148
2149finally:
Guido van Rossum73624e91994-10-10 17:59:00 +00002150 Py_XDECREF(addr);
2151 Py_XDECREF(buf);
Guido van Rossum6f5afc91993-02-05 09:46:15 +00002152 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002153}
2154
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002155PyDoc_STRVAR(recvfrom_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002156"recvfrom(buffersize[, flags]) -> (data, address info)\n\
2157\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002158Like recv(buffersize, flags) but also return the sender's address info.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002159
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002160/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002161
Guido van Rossum73624e91994-10-10 17:59:00 +00002162static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002163sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002164{
Guido van Rossumff4949e1992-08-05 19:58:53 +00002165 char *buf;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002166 int len, n = 0, flags = 0, timeout;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002167#ifdef __VMS
2168 int send_length;
2169#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00002170
Guido van Rossum43713e52000-02-29 13:59:29 +00002171 if (!PyArg_ParseTuple(args, "s#|i:send", &buf, &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00002172 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002173
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002174#ifndef __VMS
Guido van Rossum73624e91994-10-10 17:59:00 +00002175 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002176 timeout = internal_select(s, 1);
2177 if (!timeout)
2178 n = send(s->sock_fd, buf, len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00002179 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002180
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002181 if (timeout) {
2182 PyErr_SetString(socket_timeout, "timed out");
2183 return NULL;
2184 }
Guido van Rossum30a685f1991-06-27 15:51:29 +00002185 if (n < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002186 return s->errorhandler();
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002187#else
2188 /* Divide packet into smaller segments for */
2189 /* TCP/IP Services for OpenVMS */
2190 send_length = len;
2191 while (send_length != 0) {
2192 unsigned int segment;
2193
2194 segment = send_length / SEGMENT_SIZE;
2195 if (segment != 0) {
2196 segment = SEGMENT_SIZE;
2197 }
2198 else {
2199 segment = send_length;
2200 }
2201 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002202 timeout = internal_select(s, 1);
2203 if (!timeout)
2204 n = send(s->sock_fd, buf, segment, flags);
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002205 Py_END_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002206 if (timeout) {
2207 PyErr_SetString(socket_timeout, "timed out");
2208 return NULL;
2209 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002210 if (n < 0) {
2211 return s->errorhandler();
2212 }
2213 send_length -= segment;
2214 buf += segment;
2215 } /* end while */
2216#endif /* !__VMS */
Guido van Rossum73624e91994-10-10 17:59:00 +00002217 return PyInt_FromLong((long)n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00002218}
2219
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002220PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002221"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002222\n\
2223Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002224argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002225sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002226
2227
2228/* s.sendall(data [,flags]) method */
2229
2230static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002231sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002232{
2233 char *buf;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002234 int len, n = 0, flags = 0, timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002235
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002236 if (!PyArg_ParseTuple(args, "s#|i:sendall", &buf, &len, &flags))
2237 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002238
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002239 Py_BEGIN_ALLOW_THREADS
2240 do {
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002241 timeout = internal_select(s, 1);
2242 if (timeout)
2243 break;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002244 n = send(s->sock_fd, buf, len, flags);
2245 if (n < 0)
2246 break;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002247 buf += n;
2248 len -= n;
2249 } while (len > 0);
2250 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002251
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002252 if (timeout) {
2253 PyErr_SetString(socket_timeout, "timed out");
2254 return NULL;
2255 }
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002256 if (n < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002257 return s->errorhandler();
Guido van Rossum67f7a382002-06-06 21:08:16 +00002258
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002259 Py_INCREF(Py_None);
2260 return Py_None;
2261}
2262
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002263PyDoc_STRVAR(sendall_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002264"sendall(data[, flags])\n\
2265\n\
2266Send a data string to the socket. For the optional flags\n\
2267argument, see the Unix manual. This calls send() repeatedly\n\
2268until all data is sent. If an error occurs, it's impossible\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002269to tell how much data has been sent.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002270
Guido van Rossum30a685f1991-06-27 15:51:29 +00002271
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002272/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002273
Guido van Rossum73624e91994-10-10 17:59:00 +00002274static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002275sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002276{
Guido van Rossum73624e91994-10-10 17:59:00 +00002277 PyObject *addro;
Guido van Rossumff4949e1992-08-05 19:58:53 +00002278 char *buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002279 struct sockaddr *addr;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002280 int addrlen, len, n = 0, flags, timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002281
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002282 flags = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002283 if (!PyArg_ParseTuple(args, "s#O:sendto", &buf, &len, &addro)) {
Guido van Rossum73624e91994-10-10 17:59:00 +00002284 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002285 if (!PyArg_ParseTuple(args, "s#iO:sendto",
2286 &buf, &len, &flags, &addro))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002287 return NULL;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002288 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002289
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002290 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002291 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002292
Guido van Rossum73624e91994-10-10 17:59:00 +00002293 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002294 timeout = internal_select(s, 1);
2295 if (!timeout)
2296 n = sendto(s->sock_fd, buf, len, flags, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00002297 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002298
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002299 if (timeout) {
2300 PyErr_SetString(socket_timeout, "timed out");
2301 return NULL;
2302 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002303 if (n < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002304 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00002305 return PyInt_FromLong((long)n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002306}
2307
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002308PyDoc_STRVAR(sendto_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002309"sendto(data[, flags], address) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002310\n\
2311Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002312For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002313
Guido van Rossum30a685f1991-06-27 15:51:29 +00002314
2315/* s.shutdown(how) method */
2316
Guido van Rossum73624e91994-10-10 17:59:00 +00002317static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002318sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002319{
2320 int how;
Guido van Rossumff4949e1992-08-05 19:58:53 +00002321 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002322
2323 how = PyInt_AsLong(arg);
2324 if (how == -1 && PyErr_Occurred())
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002325 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00002326 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002327 res = shutdown(s->sock_fd, how);
Guido van Rossum73624e91994-10-10 17:59:00 +00002328 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002329 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002330 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00002331 Py_INCREF(Py_None);
2332 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002333}
2334
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002335PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002336"shutdown(flag)\n\
2337\n\
Martin v. Löwis94681fc2003-11-27 19:40:22 +00002338Shut down the reading side of the socket (flag == SHUT_RD), the writing side\n\
2339of the socket (flag == SHUT_WR), or both ends (flag == SHUT_RDWR).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002340
Guido van Rossum30a685f1991-06-27 15:51:29 +00002341
2342/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002343
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002344static PyMethodDef sock_methods[] = {
2345 {"accept", (PyCFunction)sock_accept, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002346 accept_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002347 {"bind", (PyCFunction)sock_bind, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002348 bind_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002349 {"close", (PyCFunction)sock_close, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002350 close_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002351 {"connect", (PyCFunction)sock_connect, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002352 connect_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002353 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002354 connect_ex_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00002355#ifndef NO_DUP
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002356 {"dup", (PyCFunction)sock_dup, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002357 dup_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00002358#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002359 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002360 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00002361#ifdef HAVE_GETPEERNAME
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002362 {"getpeername", (PyCFunction)sock_getpeername,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002363 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00002364#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002365 {"getsockname", (PyCFunction)sock_getsockname,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002366 METH_NOARGS, getsockname_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002367 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002368 getsockopt_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002369 {"listen", (PyCFunction)sock_listen, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002370 listen_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002371#ifndef NO_DUP
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002372 {"makefile", (PyCFunction)sock_makefile, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002373 makefile_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002374#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002375 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002376 recv_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002377 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002378 recvfrom_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002379 {"send", (PyCFunction)sock_send, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002380 send_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002381 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002382 sendall_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002383 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002384 sendto_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002385 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002386 setblocking_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002387 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
Guido van Rossum67f7a382002-06-06 21:08:16 +00002388 settimeout_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002389 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
Guido van Rossum67f7a382002-06-06 21:08:16 +00002390 gettimeout_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002391 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002392 setsockopt_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002393 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002394 shutdown_doc},
2395#ifdef RISCOS
Martin v. Löwisa94568a2003-05-10 07:36:56 +00002396 {"sleeptaskw", (PyCFunction)sock_sleeptaskw, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002397 sleeptaskw_doc},
2398#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +00002399 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002400};
2401
Guido van Rossum30a685f1991-06-27 15:51:29 +00002402
Guido van Rossum73624e91994-10-10 17:59:00 +00002403/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00002404 First close the file description. */
2405
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002406static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002407sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002408{
Guido van Rossumfa972c92000-04-10 12:45:45 +00002409 if (s->sock_fd != -1)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00002410 (void) SOCKETCLOSE(s->sock_fd);
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002411 s->ob_type->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002412}
2413
Guido van Rossum30a685f1991-06-27 15:51:29 +00002414
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002415static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002416sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002417{
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002418 char buf[512];
Fred Drakea04eaad2000-06-30 02:46:07 +00002419#if SIZEOF_SOCKET_T > SIZEOF_LONG
2420 if (s->sock_fd > LONG_MAX) {
2421 /* this can occur on Win64, and actually there is a special
2422 ugly printf formatter for decimal pointer length integer
2423 printing, only bother if necessary*/
2424 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002425 "no printf formatter to display "
2426 "the socket descriptor in decimal");
Fred Drakea04eaad2000-06-30 02:46:07 +00002427 return NULL;
2428 }
2429#endif
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002430 PyOS_snprintf(
2431 buf, sizeof(buf),
2432 "<socket object, fd=%ld, family=%d, type=%d, protocol=%d>",
2433 (long)s->sock_fd, s->sock_family,
2434 s->sock_type,
2435 s->sock_proto);
Guido van Rossumdc1c64a1996-02-27 15:21:19 +00002436 return PyString_FromString(buf);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002437}
2438
2439
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002440/* Create a new, uninitialized socket object. */
2441
2442static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002443sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002444{
2445 PyObject *new;
2446
2447 new = type->tp_alloc(type, 0);
Guido van Rossume1c478f2002-06-06 20:08:25 +00002448 if (new != NULL) {
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002449 ((PySocketSockObject *)new)->sock_fd = -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002450 ((PySocketSockObject *)new)->sock_timeout = -1.0;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002451 ((PySocketSockObject *)new)->errorhandler = &set_error;
Guido van Rossume1c478f2002-06-06 20:08:25 +00002452 }
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002453 return new;
2454}
2455
2456
2457/* Initialize a new socket object. */
2458
2459/*ARGSUSED*/
2460static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00002461sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002462{
2463 PySocketSockObject *s = (PySocketSockObject *)self;
2464 SOCKET_T fd;
2465 int family = AF_INET, type = SOCK_STREAM, proto = 0;
2466 static char *keywords[] = {"family", "type", "proto", 0};
2467
2468 if (!PyArg_ParseTupleAndKeywords(args, kwds,
2469 "|iii:socket", keywords,
2470 &family, &type, &proto))
2471 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002472
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002473 Py_BEGIN_ALLOW_THREADS
2474 fd = socket(family, type, proto);
2475 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002476
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002477#ifdef MS_WINDOWS
2478 if (fd == INVALID_SOCKET)
2479#else
2480 if (fd < 0)
2481#endif
2482 {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002483 set_error();
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002484 return -1;
2485 }
2486 init_sockobject(s, fd, family, type, proto);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002487
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002488 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002489
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002490}
2491
2492
Guido van Rossumb6775db1994-08-01 11:34:53 +00002493/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002494
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002495static PyTypeObject sock_type = {
Guido van Rossum55558541996-05-23 22:54:50 +00002496 PyObject_HEAD_INIT(0) /* Must fill in type value later */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002497 0, /* ob_size */
Guido van Rossumca6dfa52001-10-28 12:31:33 +00002498 "_socket.socket", /* tp_name */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002499 sizeof(PySocketSockObject), /* tp_basicsize */
2500 0, /* tp_itemsize */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002501 (destructor)sock_dealloc, /* tp_dealloc */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002502 0, /* tp_print */
2503 0, /* tp_getattr */
2504 0, /* tp_setattr */
2505 0, /* tp_compare */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002506 (reprfunc)sock_repr, /* tp_repr */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002507 0, /* tp_as_number */
2508 0, /* tp_as_sequence */
2509 0, /* tp_as_mapping */
2510 0, /* tp_hash */
2511 0, /* tp_call */
2512 0, /* tp_str */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002513 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002514 0, /* tp_setattro */
2515 0, /* tp_as_buffer */
2516 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002517 sock_doc, /* tp_doc */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002518 0, /* tp_traverse */
2519 0, /* tp_clear */
2520 0, /* tp_richcompare */
2521 0, /* tp_weaklistoffset */
2522 0, /* tp_iter */
2523 0, /* tp_iternext */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002524 sock_methods, /* tp_methods */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002525 0, /* tp_members */
2526 0, /* tp_getset */
2527 0, /* tp_base */
2528 0, /* tp_dict */
2529 0, /* tp_descr_get */
2530 0, /* tp_descr_set */
2531 0, /* tp_dictoffset */
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00002532 sock_initobj, /* tp_init */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002533 PyType_GenericAlloc, /* tp_alloc */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002534 sock_new, /* tp_new */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002535 PyObject_Del, /* tp_free */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002536};
2537
Guido van Rossum30a685f1991-06-27 15:51:29 +00002538
Guido van Rossum81194471991-07-27 21:42:02 +00002539/* Python interface to gethostname(). */
2540
2541/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002542static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002543socket_gethostname(PyObject *self, PyObject *args)
Guido van Rossum81194471991-07-27 21:42:02 +00002544{
2545 char buf[1024];
Guido van Rossumff4949e1992-08-05 19:58:53 +00002546 int res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002547 if (!PyArg_ParseTuple(args, ":gethostname"))
Guido van Rossum81194471991-07-27 21:42:02 +00002548 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00002549 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002550 res = gethostname(buf, (int) sizeof buf - 1);
Guido van Rossum73624e91994-10-10 17:59:00 +00002551 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002552 if (res < 0)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002553 return set_error();
Guido van Rossum81194471991-07-27 21:42:02 +00002554 buf[sizeof buf - 1] = '\0';
Guido van Rossum73624e91994-10-10 17:59:00 +00002555 return PyString_FromString(buf);
Guido van Rossum81194471991-07-27 21:42:02 +00002556}
Guido van Rossumff4949e1992-08-05 19:58:53 +00002557
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002558PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002559"gethostname() -> string\n\
2560\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002561Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002562
Guido van Rossumff4949e1992-08-05 19:58:53 +00002563
Guido van Rossum30a685f1991-06-27 15:51:29 +00002564/* Python interface to gethostbyname(name). */
2565
2566/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002567static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002568socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002569{
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002570 char *name;
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00002571#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002572 struct sockaddr_storage addrbuf;
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00002573#else
2574 struct sockaddr_in addrbuf;
2575#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002576
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002577 if (!PyArg_ParseTuple(args, "s:gethostbyname", &name))
Guido van Rossum30a685f1991-06-27 15:51:29 +00002578 return NULL;
Martin v. Löwisddc6f472002-07-28 16:10:31 +00002579 if (setipaddr(name, (struct sockaddr *)&addrbuf, sizeof(addrbuf), AF_INET) < 0)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002580 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002581 return makeipaddr((struct sockaddr *)&addrbuf,
2582 sizeof(struct sockaddr_in));
Guido van Rossum30a685f1991-06-27 15:51:29 +00002583}
2584
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002585PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002586"gethostbyname(host) -> address\n\
2587\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002588Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002589
2590
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002591/* Convenience function common to gethostbyname_ex and gethostbyaddr */
2592
2593static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002594gethost_common(struct hostent *h, struct sockaddr *addr, int alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002595{
2596 char **pch;
2597 PyObject *rtn_tuple = (PyObject *)NULL;
2598 PyObject *name_list = (PyObject *)NULL;
2599 PyObject *addr_list = (PyObject *)NULL;
2600 PyObject *tmp;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002601
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002602 if (h == NULL) {
Guido van Rossum48a680c2001-03-02 06:34:14 +00002603 /* Let's get real error message to return */
Guido van Rossume2ae77b2001-10-24 20:42:55 +00002604#ifndef RISCOS
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002605 set_herror(h_errno);
Guido van Rossume2ae77b2001-10-24 20:42:55 +00002606#else
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002607 PyErr_SetString(socket_error, "host not found");
Guido van Rossume2ae77b2001-10-24 20:42:55 +00002608#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002609 return NULL;
2610 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002611
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002612 if (h->h_addrtype != af) {
2613#ifdef HAVE_STRERROR
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002614 /* Let's get real error message to return */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002615 PyErr_SetString(socket_error,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002616 (char *)strerror(EAFNOSUPPORT));
2617#else
2618 PyErr_SetString(
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002619 socket_error,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002620 "Address family not supported by protocol family");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002621#endif
2622 return NULL;
2623 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002624
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002625 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00002626
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002627 case AF_INET:
2628 if (alen < sizeof(struct sockaddr_in))
2629 return NULL;
2630 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002631
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002632#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002633 case AF_INET6:
2634 if (alen < sizeof(struct sockaddr_in6))
2635 return NULL;
2636 break;
2637#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00002638
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002639 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002640
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002641 if ((name_list = PyList_New(0)) == NULL)
2642 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002643
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002644 if ((addr_list = PyList_New(0)) == NULL)
2645 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002646
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002647 for (pch = h->h_aliases; *pch != NULL; pch++) {
2648 int status;
2649 tmp = PyString_FromString(*pch);
2650 if (tmp == NULL)
2651 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002652
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002653 status = PyList_Append(name_list, tmp);
2654 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002655
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002656 if (status)
2657 goto err;
2658 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002659
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002660 for (pch = h->h_addr_list; *pch != NULL; pch++) {
2661 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002662
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002663 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00002664
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002665 case AF_INET:
2666 {
2667 struct sockaddr_in sin;
2668 memset(&sin, 0, sizeof(sin));
2669 sin.sin_family = af;
2670#ifdef HAVE_SOCKADDR_SA_LEN
2671 sin.sin_len = sizeof(sin);
2672#endif
2673 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
2674 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
Guido van Rossum67f7a382002-06-06 21:08:16 +00002675
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002676 if (pch == h->h_addr_list && alen >= sizeof(sin))
2677 memcpy((char *) addr, &sin, sizeof(sin));
2678 break;
2679 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002680
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002681#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002682 case AF_INET6:
2683 {
2684 struct sockaddr_in6 sin6;
2685 memset(&sin6, 0, sizeof(sin6));
2686 sin6.sin6_family = af;
2687#ifdef HAVE_SOCKADDR_SA_LEN
2688 sin6.sin6_len = sizeof(sin6);
2689#endif
2690 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
2691 tmp = makeipaddr((struct sockaddr *)&sin6,
2692 sizeof(sin6));
Guido van Rossum67f7a382002-06-06 21:08:16 +00002693
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002694 if (pch == h->h_addr_list && alen >= sizeof(sin6))
2695 memcpy((char *) addr, &sin6, sizeof(sin6));
2696 break;
2697 }
2698#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00002699
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002700 default: /* can't happen */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002701 PyErr_SetString(socket_error,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002702 "unsupported address family");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002703 return NULL;
2704 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002705
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002706 if (tmp == NULL)
2707 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002708
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002709 status = PyList_Append(addr_list, tmp);
2710 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002711
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002712 if (status)
2713 goto err;
2714 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002715
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002716 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002717
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002718 err:
2719 Py_XDECREF(name_list);
2720 Py_XDECREF(addr_list);
2721 return rtn_tuple;
2722}
2723
2724
2725/* Python interface to gethostbyname_ex(name). */
2726
2727/*ARGSUSED*/
2728static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002729socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002730{
2731 char *name;
2732 struct hostent *h;
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00002733#ifdef ENABLE_IPV6
2734 struct sockaddr_storage addr;
2735#else
2736 struct sockaddr_in addr;
2737#endif
Martin v. Löwis9db2f572001-07-23 01:30:10 +00002738 struct sockaddr *sa;
Guido van Rossum955becc1999-03-22 20:14:53 +00002739 PyObject *ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002740#ifdef HAVE_GETHOSTBYNAME_R
2741 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002742#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
2743 struct hostent_data data;
2744#else
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002745 char buf[16384];
2746 int buf_len = (sizeof buf) - 1;
2747 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002748#endif
2749#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002750 int result;
2751#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002752#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002753
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002754 if (!PyArg_ParseTuple(args, "s:gethostbyname_ex", &name))
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002755 return NULL;
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00002756 if (setipaddr(name, (struct sockaddr *)&addr, sizeof(addr), AF_INET) < 0)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002757 return NULL;
2758 Py_BEGIN_ALLOW_THREADS
2759#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002760#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002761 result = gethostbyname_r(name, &hp_allocated, buf, buf_len,
2762 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002763#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002764 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002765#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00002766 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002767 result = gethostbyname_r(name, &hp_allocated, &data);
2768 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002769#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002770#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00002771#ifdef USE_GETHOSTBYNAME_LOCK
Just van Rossum1040d2c2003-05-09 07:53:18 +00002772 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002773#endif
2774 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002775#endif /* HAVE_GETHOSTBYNAME_R */
2776 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002777 /* Some C libraries would require addr.__ss_family instead of
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002778 addr.ss_family.
2779 Therefore, we cast the sockaddr_storage into sockaddr to
2780 access sa_family. */
Martin v. Löwis9db2f572001-07-23 01:30:10 +00002781 sa = (struct sockaddr*)&addr;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002782 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr),
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002783 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00002784#ifdef USE_GETHOSTBYNAME_LOCK
Just van Rossum1040d2c2003-05-09 07:53:18 +00002785 PyThread_release_lock(netdb_lock);
Guido van Rossum955becc1999-03-22 20:14:53 +00002786#endif
2787 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002788}
2789
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002790PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002791"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
2792\n\
2793Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002794for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002795
2796
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002797/* Python interface to gethostbyaddr(IP). */
2798
2799/*ARGSUSED*/
2800static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002801socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002802{
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002803#ifdef ENABLE_IPV6
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002804 struct sockaddr_storage addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002805#else
Guido van Rossum48a680c2001-03-02 06:34:14 +00002806 struct sockaddr_in addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002807#endif
2808 struct sockaddr *sa = (struct sockaddr *)&addr;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002809 char *ip_num;
2810 struct hostent *h;
Guido van Rossum3baaa131999-03-22 21:44:51 +00002811 PyObject *ret;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002812#ifdef HAVE_GETHOSTBYNAME_R
2813 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002814#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
2815 struct hostent_data data;
2816#else
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002817 char buf[16384];
2818 int buf_len = (sizeof buf) - 1;
2819 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002820#endif
2821#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002822 int result;
2823#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002824#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002825 char *ap;
2826 int al;
2827 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002828
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002829 if (!PyArg_ParseTuple(args, "s:gethostbyaddr", &ip_num))
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002830 return NULL;
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00002831 af = AF_UNSPEC;
Martin v. Löwisddc6f472002-07-28 16:10:31 +00002832 if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002833 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002834 af = sa->sa_family;
2835 ap = NULL;
2836 al = 0;
2837 switch (af) {
2838 case AF_INET:
2839 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
2840 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
2841 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002842#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002843 case AF_INET6:
2844 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
2845 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
2846 break;
2847#endif
2848 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002849 PyErr_SetString(socket_error, "unsupported address family");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002850 return NULL;
2851 }
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002852 Py_BEGIN_ALLOW_THREADS
2853#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002854#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002855 result = gethostbyaddr_r(ap, al, af,
2856 &hp_allocated, buf, buf_len,
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002857 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002858#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002859 h = gethostbyaddr_r(ap, al, af,
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002860 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002861#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00002862 memset((void *) &data, '\0', sizeof(data));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002863 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002864 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002865#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002866#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00002867#ifdef USE_GETHOSTBYNAME_LOCK
Just van Rossum1040d2c2003-05-09 07:53:18 +00002868 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002869#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002870 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002871#endif /* HAVE_GETHOSTBYNAME_R */
2872 Py_END_ALLOW_THREADS
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002873 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00002874#ifdef USE_GETHOSTBYNAME_LOCK
Just van Rossum1040d2c2003-05-09 07:53:18 +00002875 PyThread_release_lock(netdb_lock);
Guido van Rossum3baaa131999-03-22 21:44:51 +00002876#endif
2877 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002878}
2879
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002880PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002881"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
2882\n\
2883Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002884for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002885
Guido van Rossum30a685f1991-06-27 15:51:29 +00002886
2887/* Python interface to getservbyname(name).
2888 This only returns the port number, since the other info is already
2889 known or not useful (like the list of aliases). */
2890
2891/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002892static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002893socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002894{
Barry Warsaw11b91a02004-06-28 00:50:43 +00002895 char *name, *proto=NULL;
Guido van Rossum30a685f1991-06-27 15:51:29 +00002896 struct servent *sp;
Barry Warsaw11b91a02004-06-28 00:50:43 +00002897 if (!PyArg_ParseTuple(args, "s|s:getservbyname", &name, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +00002898 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00002899 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002900 sp = getservbyname(name, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00002901 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00002902 if (sp == NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002903 PyErr_SetString(socket_error, "service/proto not found");
Guido van Rossum30a685f1991-06-27 15:51:29 +00002904 return NULL;
2905 }
Guido van Rossum73624e91994-10-10 17:59:00 +00002906 return PyInt_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00002907}
2908
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002909PyDoc_STRVAR(getservbyname_doc,
Barry Warsaw11b91a02004-06-28 00:50:43 +00002910"getservbyname(servicename[, protocolname]) -> integer\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002911\n\
2912Return a port number from a service name and protocol name.\n\
Barry Warsaw11b91a02004-06-28 00:50:43 +00002913The optional protocol name, if given, should be 'tcp' or 'udp',\n\
2914otherwise any protocol will match.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002915
Guido van Rossum30a685f1991-06-27 15:51:29 +00002916
Barry Warsaw11b91a02004-06-28 00:50:43 +00002917/* Python interface to getservbyport(port).
2918 This only returns the service name, since the other info is already
2919 known or not useful (like the list of aliases). */
2920
2921/*ARGSUSED*/
2922static PyObject *
2923socket_getservbyport(PyObject *self, PyObject *args)
2924{
2925 int port;
2926 char *proto=NULL;
2927 struct servent *sp;
2928 if (!PyArg_ParseTuple(args, "i|s:getservbyport", &port, &proto))
2929 return NULL;
2930 Py_BEGIN_ALLOW_THREADS
2931 sp = getservbyport(htons(port), proto);
2932 Py_END_ALLOW_THREADS
2933 if (sp == NULL) {
2934 PyErr_SetString(socket_error, "port/proto not found");
2935 return NULL;
2936 }
2937 return PyString_FromString(sp->s_name);
2938}
2939
2940PyDoc_STRVAR(getservbyport_doc,
2941"getservbyport(port[, protocolname]) -> string\n\
2942\n\
2943Return the service name from a port number and protocol name.\n\
2944The optional protocol name, if given, should be 'tcp' or 'udp',\n\
2945otherwise any protocol will match.");
2946
Guido van Rossum3901d851996-12-19 16:35:04 +00002947/* Python interface to getprotobyname(name).
2948 This only returns the protocol number, since the other info is
2949 already known or not useful (like the list of aliases). */
2950
2951/*ARGSUSED*/
2952static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002953socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00002954{
2955 char *name;
2956 struct protoent *sp;
Guido van Rossumbcc20741998-08-04 22:53:56 +00002957#ifdef __BEOS__
2958/* Not available in BeOS yet. - [cjh] */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002959 PyErr_SetString(socket_error, "getprotobyname not supported");
Guido van Rossumbcc20741998-08-04 22:53:56 +00002960 return NULL;
2961#else
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002962 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
Guido van Rossum3901d851996-12-19 16:35:04 +00002963 return NULL;
2964 Py_BEGIN_ALLOW_THREADS
2965 sp = getprotobyname(name);
2966 Py_END_ALLOW_THREADS
2967 if (sp == NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002968 PyErr_SetString(socket_error, "protocol not found");
Guido van Rossum3901d851996-12-19 16:35:04 +00002969 return NULL;
2970 }
2971 return PyInt_FromLong((long) sp->p_proto);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002972#endif
Guido van Rossum3901d851996-12-19 16:35:04 +00002973}
2974
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002975PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002976"getprotobyname(name) -> integer\n\
2977\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002978Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002979
Guido van Rossum3901d851996-12-19 16:35:04 +00002980
Dave Cole331708b2004-08-09 04:51:41 +00002981#ifdef HAVE_SOCKETPAIR
2982/* Create a pair of sockets using the socketpair() function.
Dave Cole07fda7e2004-08-23 05:16:23 +00002983 Arguments as for socket() except the default family is AF_UNIX if
Dave Colee8bbfe42004-08-26 00:51:16 +00002984 defined on the platform; otherwise, the default is AF_INET. */
Dave Cole331708b2004-08-09 04:51:41 +00002985
2986/*ARGSUSED*/
2987static PyObject *
2988socket_socketpair(PyObject *self, PyObject *args)
2989{
2990 PySocketSockObject *s0 = NULL, *s1 = NULL;
2991 SOCKET_T sv[2];
2992 int family, type = SOCK_STREAM, proto = 0;
2993 PyObject *res = NULL;
2994
2995#if defined(AF_UNIX)
2996 family = AF_UNIX;
2997#else
2998 family = AF_INET;
2999#endif
3000 if (!PyArg_ParseTuple(args, "|iii:socketpair",
3001 &family, &type, &proto))
3002 return NULL;
3003 /* Create a pair of socket fds */
3004 if (socketpair(family, type, proto, sv) < 0)
3005 return set_error();
Dave Cole331708b2004-08-09 04:51:41 +00003006 s0 = new_sockobject(sv[0], family, type, proto);
3007 if (s0 == NULL)
3008 goto finally;
3009 s1 = new_sockobject(sv[1], family, type, proto);
3010 if (s1 == NULL)
3011 goto finally;
3012 res = PyTuple_Pack(2, s0, s1);
3013
3014finally:
3015 if (res == NULL) {
3016 if (s0 == NULL)
3017 SOCKETCLOSE(sv[0]);
3018 if (s1 == NULL)
3019 SOCKETCLOSE(sv[1]);
3020 }
3021 Py_XDECREF(s0);
3022 Py_XDECREF(s1);
3023 return res;
3024}
3025
3026PyDoc_STRVAR(socketpair_doc,
3027"socketpair([family[, type[, proto]]]) -> (socket object, socket object)\n\
3028\n\
3029Create a pair of socket objects from the sockets returned by the platform\n\
3030socketpair() function.\n\
Dave Cole07fda7e2004-08-23 05:16:23 +00003031The arguments are the same as for socket() except the default family is\n\
Dave Colee8bbfe42004-08-26 00:51:16 +00003032AF_UNIX if defined on the platform; otherwise, the default is AF_INET.");
Dave Cole331708b2004-08-09 04:51:41 +00003033
3034#endif /* HAVE_SOCKETPAIR */
3035
3036
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00003037#ifndef NO_DUP
Guido van Rossum2a7178e1992-12-08 13:38:24 +00003038/* Create a socket object from a numeric file description.
3039 Useful e.g. if stdin is a socket.
3040 Additional arguments as for socket(). */
3041
3042/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00003043static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003044socket_fromfd(PyObject *self, PyObject *args)
Guido van Rossum2a7178e1992-12-08 13:38:24 +00003045{
Guido van Rossum73624e91994-10-10 17:59:00 +00003046 PySocketSockObject *s;
Fred Drakea04eaad2000-06-30 02:46:07 +00003047 SOCKET_T fd;
3048 int family, type, proto = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00003049 if (!PyArg_ParseTuple(args, "iii|i:fromfd",
3050 &fd, &family, &type, &proto))
Guido van Rossumbe32c891996-06-20 16:25:29 +00003051 return NULL;
Guido van Rossum5f59d601992-12-14 16:59:51 +00003052 /* Dup the fd so it and the socket can be closed independently */
3053 fd = dup(fd);
3054 if (fd < 0)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003055 return set_error();
3056 s = new_sockobject(fd, family, type, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00003057 return (PyObject *) s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00003058}
Guido van Rossum82a5c661998-07-07 20:45:43 +00003059
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003060PyDoc_STRVAR(fromfd_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003061"fromfd(fd, family, type[, proto]) -> socket object\n\
3062\n\
3063Create a socket object from the given file descriptor.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003064The remaining arguments are the same as for socket().");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003065
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00003066#endif /* NO_DUP */
Guido van Rossum2a7178e1992-12-08 13:38:24 +00003067
Guido van Rossum82a5c661998-07-07 20:45:43 +00003068
Guido van Rossum006bf911996-06-12 04:04:55 +00003069static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003070socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00003071{
3072 int x1, x2;
3073
Guido van Rossum27fc3c02000-03-24 20:56:56 +00003074 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00003075 return NULL;
3076 }
3077 x2 = (int)ntohs((short)x1);
3078 return PyInt_FromLong(x2);
3079}
3080
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003081PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003082"ntohs(integer) -> integer\n\
3083\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003084Convert a 16-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003085
3086
Guido van Rossum006bf911996-06-12 04:04:55 +00003087static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003088socket_ntohl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00003089{
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003090 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00003091
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003092 if (PyInt_Check(arg)) {
3093 x = PyInt_AS_LONG(arg);
Jeremy Hylton825e47b2002-07-25 16:37:51 +00003094 if (x == (unsigned long) -1 && PyErr_Occurred())
3095 return NULL;
Guido van Rossum006bf911996-06-12 04:04:55 +00003096 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003097 else if (PyLong_Check(arg)) {
3098 x = PyLong_AsUnsignedLong(arg);
Jeremy Hylton825e47b2002-07-25 16:37:51 +00003099 if (x == (unsigned long) -1 && PyErr_Occurred())
3100 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003101#if SIZEOF_LONG > 4
3102 {
3103 unsigned long y;
3104 /* only want the trailing 32 bits */
3105 y = x & 0xFFFFFFFFUL;
3106 if (y ^ x)
3107 return PyErr_Format(PyExc_OverflowError,
3108 "long int larger than 32 bits");
3109 x = y;
Tim Peters58141872002-08-06 22:25:02 +00003110 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003111#endif
3112 }
3113 else
Tim Peters58141872002-08-06 22:25:02 +00003114 return PyErr_Format(PyExc_TypeError,
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003115 "expected int/long, %s found",
3116 arg->ob_type->tp_name);
3117 if (x == (unsigned long) -1 && PyErr_Occurred())
3118 return NULL;
3119 return PyInt_FromLong(ntohl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00003120}
3121
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003122PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003123"ntohl(integer) -> integer\n\
3124\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003125Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003126
3127
Guido van Rossum006bf911996-06-12 04:04:55 +00003128static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003129socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00003130{
Hye-Shik Changa7b673f2003-12-17 09:40:23 +00003131 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00003132
Guido van Rossum27fc3c02000-03-24 20:56:56 +00003133 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00003134 return NULL;
3135 }
3136 x2 = (int)htons((short)x1);
3137 return PyInt_FromLong(x2);
3138}
3139
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003140PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003141"htons(integer) -> integer\n\
3142\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003143Convert a 16-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003144
3145
Guido van Rossum006bf911996-06-12 04:04:55 +00003146static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003147socket_htonl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00003148{
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003149 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00003150
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003151 if (PyInt_Check(arg)) {
3152 x = PyInt_AS_LONG(arg);
Jeremy Hylton825e47b2002-07-25 16:37:51 +00003153 if (x == (unsigned long) -1 && PyErr_Occurred())
3154 return NULL;
Guido van Rossum006bf911996-06-12 04:04:55 +00003155 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003156 else if (PyLong_Check(arg)) {
3157 x = PyLong_AsUnsignedLong(arg);
Jeremy Hylton825e47b2002-07-25 16:37:51 +00003158 if (x == (unsigned long) -1 && PyErr_Occurred())
3159 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003160#if SIZEOF_LONG > 4
3161 {
3162 unsigned long y;
3163 /* only want the trailing 32 bits */
3164 y = x & 0xFFFFFFFFUL;
3165 if (y ^ x)
3166 return PyErr_Format(PyExc_OverflowError,
3167 "long int larger than 32 bits");
3168 x = y;
Tim Peters58141872002-08-06 22:25:02 +00003169 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003170#endif
3171 }
3172 else
Tim Peters58141872002-08-06 22:25:02 +00003173 return PyErr_Format(PyExc_TypeError,
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003174 "expected int/long, %s found",
3175 arg->ob_type->tp_name);
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003176 return PyInt_FromLong(htonl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00003177}
3178
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003179PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003180"htonl(integer) -> integer\n\
3181\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003182Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003183
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003184/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003185
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003186PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003187"inet_aton(string) -> packed 32-bit IP representation\n\
3188\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003189Convert 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 +00003190binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003191
3192static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003193socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003194{
Guido van Rossuma2e48551999-09-09 15:42:59 +00003195#ifndef INADDR_NONE
3196#define INADDR_NONE (-1)
3197#endif
Neal Norwitz88f115b2003-02-13 02:15:42 +00003198#ifdef HAVE_INET_ATON
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003199 struct in_addr buf;
Tim Peters1df9fdd2003-02-13 03:13:40 +00003200#else
3201 /* Have to use inet_addr() instead */
3202 unsigned long packed_addr;
3203#endif
3204 char *ip_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003205
Tim Peters1df9fdd2003-02-13 03:13:40 +00003206 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003207 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003208
Tim Peters1df9fdd2003-02-13 03:13:40 +00003209
3210#ifdef HAVE_INET_ATON
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003211 if (inet_aton(ip_addr, &buf))
3212 return PyString_FromStringAndSize((char *)(&buf),
3213 sizeof(buf));
3214
3215 PyErr_SetString(socket_error,
3216 "illegal IP address string passed to inet_aton");
3217 return NULL;
3218
Tim Peters1df9fdd2003-02-13 03:13:40 +00003219#else /* ! HAVE_INET_ATON */
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003220 /* XXX Problem here: inet_aton('255.255.255.255') raises
3221 an exception while it should be a valid address. */
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003222 packed_addr = inet_addr(ip_addr);
3223
3224 if (packed_addr == INADDR_NONE) { /* invalid address */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003225 PyErr_SetString(socket_error,
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003226 "illegal IP address string passed to inet_aton");
3227 return NULL;
3228 }
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003229 return PyString_FromStringAndSize((char *) &packed_addr,
3230 sizeof(packed_addr));
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003231#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003232}
3233
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003234PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00003235"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003236\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003237Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003238
3239static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003240socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003241{
3242 char *packed_str;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003243 int addr_len;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003244 struct in_addr packed_addr;
3245
Guido van Rossum27fc3c02000-03-24 20:56:56 +00003246 if (!PyArg_ParseTuple(args, "s#:inet_ntoa", &packed_str, &addr_len)) {
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003247 return NULL;
3248 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00003249
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003250 if (addr_len != sizeof(packed_addr)) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003251 PyErr_SetString(socket_error,
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003252 "packed IP wrong length for inet_ntoa");
3253 return NULL;
3254 }
3255
3256 memcpy(&packed_addr, packed_str, addr_len);
3257
3258 return PyString_FromString(inet_ntoa(packed_addr));
3259}
Guido van Rossum82a5c661998-07-07 20:45:43 +00003260
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003261#ifdef HAVE_INET_PTON
3262
3263PyDoc_STRVAR(inet_pton_doc,
3264"inet_pton(af, ip) -> packed IP address string\n\
3265\n\
3266Convert an IP address from string format to a packed string suitable\n\
3267for use with low-level network functions.");
3268
3269static PyObject *
3270socket_inet_pton(PyObject *self, PyObject *args)
3271{
3272 int af;
3273 char* ip;
3274 int retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003275#ifdef ENABLE_IPV6
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003276 char packed[MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003277#else
3278 char packed[sizeof(struct in_addr)];
3279#endif
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003280 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
3281 return NULL;
3282 }
3283
Martin v. Löwis04697e82004-06-02 12:35:29 +00003284#if !defined(ENABLE_IPV6) && defined(AF_INET6)
Martin v. Löwis10649092003-08-05 06:25:06 +00003285 if(af == AF_INET6) {
3286 PyErr_SetString(socket_error,
3287 "can't use AF_INET6, IPv6 is disabled");
3288 return NULL;
3289 }
3290#endif
3291
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003292 retval = inet_pton(af, ip, packed);
3293 if (retval < 0) {
3294 PyErr_SetFromErrno(socket_error);
3295 return NULL;
3296 } else if (retval == 0) {
3297 PyErr_SetString(socket_error,
3298 "illegal IP address string passed to inet_pton");
3299 return NULL;
3300 } else if (af == AF_INET) {
3301 return PyString_FromStringAndSize(packed,
3302 sizeof(struct in_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003303#ifdef ENABLE_IPV6
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003304 } else if (af == AF_INET6) {
3305 return PyString_FromStringAndSize(packed,
3306 sizeof(struct in6_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003307#endif
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003308 } else {
3309 PyErr_SetString(socket_error, "unknown address family");
3310 return NULL;
3311 }
3312}
3313
3314PyDoc_STRVAR(inet_ntop_doc,
3315"inet_ntop(af, packed_ip) -> string formatted IP address\n\
3316\n\
3317Convert a packed IP address of the given family to string format.");
3318
3319static PyObject *
3320socket_inet_ntop(PyObject *self, PyObject *args)
3321{
3322 int af;
3323 char* packed;
3324 int len;
3325 const char* retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003326#ifdef ENABLE_IPV6
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003327 char ip[MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003328#else
3329 char ip[INET_ADDRSTRLEN + 1];
3330#endif
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003331
3332 /* Guarantee NUL-termination for PyString_FromString() below */
3333 memset((void *) &ip[0], '\0', sizeof(ip) + 1);
3334
3335 if (!PyArg_ParseTuple(args, "is#:inet_ntop", &af, &packed, &len)) {
3336 return NULL;
3337 }
3338
3339 if (af == AF_INET) {
3340 if (len != sizeof(struct in_addr)) {
3341 PyErr_SetString(PyExc_ValueError,
3342 "invalid length of packed IP address string");
3343 return NULL;
3344 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003345#ifdef ENABLE_IPV6
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003346 } else if (af == AF_INET6) {
3347 if (len != sizeof(struct in6_addr)) {
3348 PyErr_SetString(PyExc_ValueError,
3349 "invalid length of packed IP address string");
3350 return NULL;
3351 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003352#endif
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003353 } else {
3354 PyErr_Format(PyExc_ValueError,
3355 "unknown address family %d", af);
3356 return NULL;
3357 }
3358
3359 retval = inet_ntop(af, packed, ip, sizeof(ip));
3360 if (!retval) {
3361 PyErr_SetFromErrno(socket_error);
3362 return NULL;
3363 } else {
3364 return PyString_FromString(retval);
3365 }
3366
3367 /* NOTREACHED */
3368 PyErr_SetString(PyExc_RuntimeError, "invalid handling of inet_ntop");
3369 return NULL;
3370}
3371
3372#endif /* HAVE_INET_PTON */
3373
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003374/* Python interface to getaddrinfo(host, port). */
3375
3376/*ARGSUSED*/
3377static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003378socket_getaddrinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003379{
Martin v. Löwisf0b11d22001-11-07 08:31:03 +00003380 struct addrinfo hints, *res;
3381 struct addrinfo *res0 = NULL;
Martin v. Löwis2548c732003-04-18 10:39:54 +00003382 PyObject *hobj = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003383 PyObject *pobj = (PyObject *)NULL;
Martin v. Löwisf65b1a12001-08-12 09:28:40 +00003384 char pbuf[30];
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003385 char *hptr, *pptr;
3386 int family, socktype, protocol, flags;
3387 int error;
3388 PyObject *all = (PyObject *)NULL;
3389 PyObject *single = (PyObject *)NULL;
Martin v. Löwis2548c732003-04-18 10:39:54 +00003390 PyObject *idna = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003391
3392 family = socktype = protocol = flags = 0;
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00003393 family = AF_UNSPEC;
Martin v. Löwis2548c732003-04-18 10:39:54 +00003394 if (!PyArg_ParseTuple(args, "OO|iiii:getaddrinfo",
3395 &hobj, &pobj, &family, &socktype,
3396 &protocol, &flags)) {
3397 return NULL;
3398 }
3399 if (hobj == Py_None) {
3400 hptr = NULL;
3401 } else if (PyUnicode_Check(hobj)) {
3402 idna = PyObject_CallMethod(hobj, "encode", "s", "idna");
3403 if (!idna)
3404 return NULL;
3405 hptr = PyString_AsString(idna);
3406 } else if (PyString_Check(hobj)) {
3407 hptr = PyString_AsString(hobj);
3408 } else {
3409 PyErr_SetString(PyExc_TypeError,
3410 "getaddrinfo() argument 1 must be string or None");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003411 return NULL;
3412 }
3413 if (PyInt_Check(pobj)) {
Marc-André Lemburg03d1b182001-07-31 18:05:33 +00003414 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", PyInt_AsLong(pobj));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003415 pptr = pbuf;
3416 } else if (PyString_Check(pobj)) {
3417 pptr = PyString_AsString(pobj);
3418 } else if (pobj == Py_None) {
3419 pptr = (char *)NULL;
3420 } else {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003421 PyErr_SetString(socket_error, "Int or String expected");
Martin v. Löwis5db099a2003-08-07 11:55:15 +00003422 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003423 }
3424 memset(&hints, 0, sizeof(hints));
3425 hints.ai_family = family;
3426 hints.ai_socktype = socktype;
3427 hints.ai_protocol = protocol;
3428 hints.ai_flags = flags;
Just van Rossum1040d2c2003-05-09 07:53:18 +00003429 Py_BEGIN_ALLOW_THREADS
3430 ACQUIRE_GETADDRINFO_LOCK
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003431 error = getaddrinfo(hptr, pptr, &hints, &res0);
Just van Rossum1040d2c2003-05-09 07:53:18 +00003432 Py_END_ALLOW_THREADS
3433 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003434 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003435 set_gaierror(error);
Martin v. Löwis5db099a2003-08-07 11:55:15 +00003436 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003437 }
3438
3439 if ((all = PyList_New(0)) == NULL)
3440 goto err;
3441 for (res = res0; res; res = res->ai_next) {
Guido van Rossum716aac02001-10-12 18:59:27 +00003442 PyObject *addr =
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00003443 makesockaddr(-1, res->ai_addr, res->ai_addrlen, protocol);
Guido van Rossum716aac02001-10-12 18:59:27 +00003444 if (addr == NULL)
3445 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003446 single = Py_BuildValue("iiisO", res->ai_family,
3447 res->ai_socktype, res->ai_protocol,
3448 res->ai_canonname ? res->ai_canonname : "",
Guido van Rossum716aac02001-10-12 18:59:27 +00003449 addr);
3450 Py_DECREF(addr);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003451 if (single == NULL)
3452 goto err;
3453
3454 if (PyList_Append(all, single))
3455 goto err;
3456 Py_XDECREF(single);
3457 }
Martin v. Löwis2548c732003-04-18 10:39:54 +00003458 Py_XDECREF(idna);
Neal Norwitz90128ba2002-08-09 03:37:42 +00003459 if (res0)
3460 freeaddrinfo(res0);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003461 return all;
3462 err:
3463 Py_XDECREF(single);
3464 Py_XDECREF(all);
Martin v. Löwis2548c732003-04-18 10:39:54 +00003465 Py_XDECREF(idna);
Martin v. Löwisf0b11d22001-11-07 08:31:03 +00003466 if (res0)
3467 freeaddrinfo(res0);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003468 return (PyObject *)NULL;
3469}
3470
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003471PyDoc_STRVAR(getaddrinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003472"getaddrinfo(host, port [, family, socktype, proto, flags])\n\
3473 -> list of (family, socktype, proto, canonname, sockaddr)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003474\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003475Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003476
3477/* Python interface to getnameinfo(sa, flags). */
3478
3479/*ARGSUSED*/
3480static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003481socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003482{
3483 PyObject *sa = (PyObject *)NULL;
3484 int flags;
3485 char *hostp;
Martin v. Löwis06b1d212001-11-02 23:34:52 +00003486 int port, flowinfo, scope_id;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003487 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
3488 struct addrinfo hints, *res = NULL;
3489 int error;
3490 PyObject *ret = (PyObject *)NULL;
3491
3492 flags = flowinfo = scope_id = 0;
Martin v. Löwis06b1d212001-11-02 23:34:52 +00003493 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003494 return NULL;
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003495 if (!PyArg_ParseTuple(sa, "si|ii",
3496 &hostp, &port, &flowinfo, &scope_id))
Martin v. Löwis06b1d212001-11-02 23:34:52 +00003497 return NULL;
Marc-André Lemburg03d1b182001-07-31 18:05:33 +00003498 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003499 memset(&hints, 0, sizeof(hints));
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00003500 hints.ai_family = AF_UNSPEC;
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003501 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Just van Rossum1040d2c2003-05-09 07:53:18 +00003502 Py_BEGIN_ALLOW_THREADS
3503 ACQUIRE_GETADDRINFO_LOCK
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003504 error = getaddrinfo(hostp, pbuf, &hints, &res);
Just van Rossum1040d2c2003-05-09 07:53:18 +00003505 Py_END_ALLOW_THREADS
3506 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003507 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003508 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003509 goto fail;
3510 }
3511 if (res->ai_next) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003512 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003513 "sockaddr resolved to multiple addresses");
3514 goto fail;
3515 }
3516 switch (res->ai_family) {
3517 case AF_INET:
3518 {
3519 char *t1;
3520 int t2;
3521 if (PyArg_ParseTuple(sa, "si", &t1, &t2) == 0) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003522 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003523 "IPv4 sockaddr must be 2 tuple");
3524 goto fail;
3525 }
3526 break;
3527 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00003528#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003529 case AF_INET6:
3530 {
3531 struct sockaddr_in6 *sin6;
3532 sin6 = (struct sockaddr_in6 *)res->ai_addr;
3533 sin6->sin6_flowinfo = flowinfo;
3534 sin6->sin6_scope_id = scope_id;
3535 break;
3536 }
3537#endif
3538 }
3539 error = getnameinfo(res->ai_addr, res->ai_addrlen,
3540 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
3541 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003542 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003543 goto fail;
3544 }
3545 ret = Py_BuildValue("ss", hbuf, pbuf);
3546
3547fail:
3548 if (res)
3549 freeaddrinfo(res);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003550 return ret;
3551}
3552
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003553PyDoc_STRVAR(getnameinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003554"getnameinfo(sockaddr, flags) --> (host, port)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003555\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003556Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003557
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00003558
3559/* Python API to getting and setting the default timeout value. */
3560
3561static PyObject *
3562socket_getdefaulttimeout(PyObject *self)
3563{
3564 if (defaulttimeout < 0.0) {
3565 Py_INCREF(Py_None);
3566 return Py_None;
3567 }
3568 else
3569 return PyFloat_FromDouble(defaulttimeout);
3570}
3571
3572PyDoc_STRVAR(getdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003573"getdefaulttimeout() -> timeout\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00003574\n\
3575Returns the default timeout in floating seconds for new socket objects.\n\
3576A value of None indicates that new socket objects have no timeout.\n\
3577When the socket module is first imported, the default is None.");
3578
3579static PyObject *
3580socket_setdefaulttimeout(PyObject *self, PyObject *arg)
3581{
3582 double timeout;
3583
3584 if (arg == Py_None)
3585 timeout = -1.0;
3586 else {
3587 timeout = PyFloat_AsDouble(arg);
3588 if (timeout < 0.0) {
3589 if (!PyErr_Occurred())
3590 PyErr_SetString(PyExc_ValueError,
3591 "Timeout value out of range");
3592 return NULL;
3593 }
3594 }
3595
3596 defaulttimeout = timeout;
3597
3598 Py_INCREF(Py_None);
3599 return Py_None;
3600}
3601
3602PyDoc_STRVAR(setdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003603"setdefaulttimeout(timeout)\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00003604\n\
3605Set the default timeout in floating seconds for new socket objects.\n\
3606A value of None indicates that new socket objects have no timeout.\n\
3607When the socket module is first imported, the default is None.");
3608
3609
Guido van Rossum30a685f1991-06-27 15:51:29 +00003610/* List of functions exported by this module. */
3611
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003612static PyMethodDef socket_methods[] = {
3613 {"gethostbyname", socket_gethostbyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003614 METH_VARARGS, gethostbyname_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003615 {"gethostbyname_ex", socket_gethostbyname_ex,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003616 METH_VARARGS, ghbn_ex_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003617 {"gethostbyaddr", socket_gethostbyaddr,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003618 METH_VARARGS, gethostbyaddr_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003619 {"gethostname", socket_gethostname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003620 METH_VARARGS, gethostname_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003621 {"getservbyname", socket_getservbyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003622 METH_VARARGS, getservbyname_doc},
Barry Warsaw11b91a02004-06-28 00:50:43 +00003623 {"getservbyport", socket_getservbyport,
3624 METH_VARARGS, getservbyport_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003625 {"getprotobyname", socket_getprotobyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003626 METH_VARARGS,getprotobyname_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00003627#ifndef NO_DUP
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003628 {"fromfd", socket_fromfd,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003629 METH_VARARGS, fromfd_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00003630#endif
Dave Cole331708b2004-08-09 04:51:41 +00003631#ifdef HAVE_SOCKETPAIR
3632 {"socketpair", socket_socketpair,
3633 METH_VARARGS, socketpair_doc},
3634#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003635 {"ntohs", socket_ntohs,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003636 METH_VARARGS, ntohs_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003637 {"ntohl", socket_ntohl,
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003638 METH_O, ntohl_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003639 {"htons", socket_htons,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003640 METH_VARARGS, htons_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003641 {"htonl", socket_htonl,
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003642 METH_O, htonl_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003643 {"inet_aton", socket_inet_aton,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003644 METH_VARARGS, inet_aton_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003645 {"inet_ntoa", socket_inet_ntoa,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003646 METH_VARARGS, inet_ntoa_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003647#ifdef HAVE_INET_PTON
3648 {"inet_pton", socket_inet_pton,
3649 METH_VARARGS, inet_pton_doc},
3650 {"inet_ntop", socket_inet_ntop,
3651 METH_VARARGS, inet_ntop_doc},
3652#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003653 {"getaddrinfo", socket_getaddrinfo,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003654 METH_VARARGS, getaddrinfo_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003655 {"getnameinfo", socket_getnameinfo,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003656 METH_VARARGS, getnameinfo_doc},
Guido van Rossum1693ba82002-07-18 21:11:26 +00003657 {"getdefaulttimeout", (PyCFunction)socket_getdefaulttimeout,
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00003658 METH_NOARGS, getdefaulttimeout_doc},
3659 {"setdefaulttimeout", socket_setdefaulttimeout,
3660 METH_O, setdefaulttimeout_doc},
Guido van Rossum30a685f1991-06-27 15:51:29 +00003661 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003662};
3663
Guido van Rossum30a685f1991-06-27 15:51:29 +00003664
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003665#ifdef RISCOS
3666#define OS_INIT_DEFINED
Guido van Rossumbe32c891996-06-20 16:25:29 +00003667
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003668static int
3669os_init(void)
3670{
3671 _kernel_swi_regs r;
3672
3673 r.r[0] = 0;
3674 _kernel_swi(0x43380, &r, &r);
3675 taskwindow = r.r[0];
3676
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003677 return 1;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003678}
3679
3680#endif /* RISCOS */
3681
3682
3683#ifdef MS_WINDOWS
3684#define OS_INIT_DEFINED
3685
3686/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00003687
3688static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003689os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00003690{
3691 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00003692}
3693
3694static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003695os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00003696{
3697 WSADATA WSAData;
3698 int ret;
3699 char buf[100];
3700 ret = WSAStartup(0x0101, &WSAData);
3701 switch (ret) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003702 case 0: /* No error */
Mark Hammond14350ab2003-07-09 04:57:46 +00003703 Py_AtExit(os_cleanup);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003704 return 1; /* Success */
Guido van Rossumbe32c891996-06-20 16:25:29 +00003705 case WSASYSNOTREADY:
3706 PyErr_SetString(PyExc_ImportError,
3707 "WSAStartup failed: network not ready");
3708 break;
3709 case WSAVERNOTSUPPORTED:
3710 case WSAEINVAL:
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003711 PyErr_SetString(
3712 PyExc_ImportError,
3713 "WSAStartup failed: requested version not supported");
Guido van Rossumbe32c891996-06-20 16:25:29 +00003714 break;
3715 default:
Tim Peters885d4572001-11-28 20:27:42 +00003716 PyOS_snprintf(buf, sizeof(buf),
3717 "WSAStartup failed: error code %d", ret);
Guido van Rossumbe32c891996-06-20 16:25:29 +00003718 PyErr_SetString(PyExc_ImportError, buf);
3719 break;
3720 }
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003721 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00003722}
3723
Guido van Rossum8d665e61996-06-26 18:22:49 +00003724#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00003725
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003726
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003727#ifdef PYOS_OS2
3728#define OS_INIT_DEFINED
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003729
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003730/* Additional initialization for OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003731
3732static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003733os_init(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003734{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003735#ifndef PYCC_GCC
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003736 char reason[64];
3737 int rc = sock_init();
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003738
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003739 if (rc == 0) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003740 return 1; /* Success */
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003741 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003742
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003743 PyOS_snprintf(reason, sizeof(reason),
3744 "OS/2 TCP/IP Error# %d", sock_errno());
3745 PyErr_SetString(PyExc_ImportError, reason);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003746
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003747 return 0; /* Failure */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00003748#else
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003749 /* No need to initialise sockets with GCC/EMX */
3750 return 1; /* Success */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00003751#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003752}
3753
3754#endif /* PYOS_OS2 */
3755
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003756
3757#ifndef OS_INIT_DEFINED
3758static int
3759os_init(void)
3760{
3761 return 1; /* Success */
3762}
3763#endif
3764
3765
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00003766/* C API table - always add new things to the end for binary
3767 compatibility. */
3768static
3769PySocketModule_APIObject PySocketModuleAPI =
3770{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003771 &sock_type,
Brett Cannon06c34792004-03-23 23:16:54 +00003772 NULL
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00003773};
3774
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003775
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003776/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003777
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003778 This module is actually called "_socket", and there's a wrapper
3779 "socket.py" which implements some additional functionality. On some
3780 platforms (e.g. Windows and OS/2), socket.py also implements a
3781 wrapper for the socket type that provides missing functionality such
3782 as makefile(), dup() and fromfd(). The import of "_socket" may fail
3783 with an ImportError exception if os-specific initialization fails.
3784 On Windows, this does WINSOCK initialization. When WINSOCK is
3785 initialized succesfully, a call to WSACleanup() is scheduled to be
3786 made at exit time.
3787*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003788
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003789PyDoc_STRVAR(socket_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003790"Implementation module for socket operations.\n\
3791\n\
3792See the socket module for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003793
Mark Hammondfe51c6d2002-08-02 02:27:13 +00003794PyMODINIT_FUNC
Thomas Wouters1e0c2f42000-07-24 16:06:23 +00003795init_socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003796{
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003797 PyObject *m, *has_ipv6;
Fred Drake4baedc12002-04-01 14:53:37 +00003798
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003799 if (!os_init())
Guido van Rossum0cb96de1997-10-01 04:29:29 +00003800 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003801
3802 sock_type.ob_type = &PyType_Type;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003803 m = Py_InitModule3(PySocket_MODULE_NAME,
3804 socket_methods,
3805 socket_doc);
3806
3807 socket_error = PyErr_NewException("socket.error", NULL, NULL);
3808 if (socket_error == NULL)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003809 return;
Brett Cannon06c34792004-03-23 23:16:54 +00003810 PySocketModuleAPI.error = socket_error;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003811 Py_INCREF(socket_error);
3812 PyModule_AddObject(m, "error", socket_error);
3813 socket_herror = PyErr_NewException("socket.herror",
3814 socket_error, NULL);
3815 if (socket_herror == NULL)
3816 return;
3817 Py_INCREF(socket_herror);
3818 PyModule_AddObject(m, "herror", socket_herror);
3819 socket_gaierror = PyErr_NewException("socket.gaierror", socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003820 NULL);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003821 if (socket_gaierror == NULL)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003822 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003823 Py_INCREF(socket_gaierror);
3824 PyModule_AddObject(m, "gaierror", socket_gaierror);
Raymond Hettingeref7343c2003-06-29 03:08:05 +00003825 socket_timeout = PyErr_NewException("socket.timeout",
3826 socket_error, NULL);
3827 if (socket_timeout == NULL)
3828 return;
3829 Py_INCREF(socket_timeout);
3830 PyModule_AddObject(m, "timeout", socket_timeout);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003831 Py_INCREF((PyObject *)&sock_type);
Fred Drake4baedc12002-04-01 14:53:37 +00003832 if (PyModule_AddObject(m, "SocketType",
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003833 (PyObject *)&sock_type) != 0)
Guido van Rossum0cb96de1997-10-01 04:29:29 +00003834 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003835 Py_INCREF((PyObject *)&sock_type);
Fred Drake4baedc12002-04-01 14:53:37 +00003836 if (PyModule_AddObject(m, "socket",
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003837 (PyObject *)&sock_type) != 0)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003838 return;
Guido van Rossum09be4091999-08-09 14:40:40 +00003839
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003840#ifdef ENABLE_IPV6
3841 has_ipv6 = Py_True;
3842#else
3843 has_ipv6 = Py_False;
3844#endif
3845 Py_INCREF(has_ipv6);
3846 PyModule_AddObject(m, "has_ipv6", has_ipv6);
3847
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00003848 /* Export C API */
Fred Drake4baedc12002-04-01 14:53:37 +00003849 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00003850 PyCObject_FromVoidPtr((void *)&PySocketModuleAPI, NULL)
3851 ) != 0)
3852 return;
3853
Guido van Rossum09be4091999-08-09 14:40:40 +00003854 /* Address families (we only support AF_INET and AF_UNIX) */
3855#ifdef AF_UNSPEC
Fred Drake4baedc12002-04-01 14:53:37 +00003856 PyModule_AddIntConstant(m, "AF_UNSPEC", AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00003857#endif
Fred Drake4baedc12002-04-01 14:53:37 +00003858 PyModule_AddIntConstant(m, "AF_INET", AF_INET);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003859#ifdef AF_INET6
Fred Drake4baedc12002-04-01 14:53:37 +00003860 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003861#endif /* AF_INET6 */
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00003862#if defined(AF_UNIX)
Fred Drake4baedc12002-04-01 14:53:37 +00003863 PyModule_AddIntConstant(m, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00003864#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00003865#ifdef AF_AX25
Fred Drake4baedc12002-04-01 14:53:37 +00003866 /* Amateur Radio AX.25 */
3867 PyModule_AddIntConstant(m, "AF_AX25", AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00003868#endif
3869#ifdef AF_IPX
Fred Drake4baedc12002-04-01 14:53:37 +00003870 PyModule_AddIntConstant(m, "AF_IPX", AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00003871#endif
3872#ifdef AF_APPLETALK
Fred Drake4baedc12002-04-01 14:53:37 +00003873 /* Appletalk DDP */
3874 PyModule_AddIntConstant(m, "AF_APPLETALK", AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00003875#endif
3876#ifdef AF_NETROM
Fred Drake4baedc12002-04-01 14:53:37 +00003877 /* Amateur radio NetROM */
3878 PyModule_AddIntConstant(m, "AF_NETROM", AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00003879#endif
3880#ifdef AF_BRIDGE
Fred Drake4baedc12002-04-01 14:53:37 +00003881 /* Multiprotocol bridge */
3882 PyModule_AddIntConstant(m, "AF_BRIDGE", AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00003883#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00003884#ifdef AF_ATMPVC
3885 /* ATM PVCs */
3886 PyModule_AddIntConstant(m, "AF_ATMPVC", AF_ATMPVC);
3887#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00003888#ifdef AF_AAL5
Fred Drake4baedc12002-04-01 14:53:37 +00003889 /* Reserved for Werner's ATM */
3890 PyModule_AddIntConstant(m, "AF_AAL5", AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00003891#endif
3892#ifdef AF_X25
Fred Drake4baedc12002-04-01 14:53:37 +00003893 /* Reserved for X.25 project */
3894 PyModule_AddIntConstant(m, "AF_X25", AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00003895#endif
3896#ifdef AF_INET6
Fred Drake4baedc12002-04-01 14:53:37 +00003897 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00003898#endif
3899#ifdef AF_ROSE
Fred Drake4baedc12002-04-01 14:53:37 +00003900 /* Amateur Radio X.25 PLP */
3901 PyModule_AddIntConstant(m, "AF_ROSE", AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00003902#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00003903#ifdef AF_DECnet
3904 /* Reserved for DECnet project */
3905 PyModule_AddIntConstant(m, "AF_DECnet", AF_DECnet);
3906#endif
3907#ifdef AF_NETBEUI
3908 /* Reserved for 802.2LLC project */
3909 PyModule_AddIntConstant(m, "AF_NETBEUI", AF_NETBEUI);
3910#endif
3911#ifdef AF_SECURITY
3912 /* Security callback pseudo AF */
3913 PyModule_AddIntConstant(m, "AF_SECURITY", AF_SECURITY);
3914#endif
3915#ifdef AF_KEY
3916 /* PF_KEY key management API */
3917 PyModule_AddIntConstant(m, "AF_KEY", AF_KEY);
3918#endif
3919#ifdef AF_NETLINK
3920 /* */
3921 PyModule_AddIntConstant(m, "AF_NETLINK", AF_NETLINK);
3922#endif
3923#ifdef AF_ROUTE
3924 /* Alias to emulate 4.4BSD */
3925 PyModule_AddIntConstant(m, "AF_ROUTE", AF_ROUTE);
3926#endif
3927#ifdef AF_ASH
3928 /* Ash */
3929 PyModule_AddIntConstant(m, "AF_ASH", AF_ASH);
3930#endif
3931#ifdef AF_ECONET
3932 /* Acorn Econet */
3933 PyModule_AddIntConstant(m, "AF_ECONET", AF_ECONET);
3934#endif
3935#ifdef AF_ATMSVC
3936 /* ATM SVCs */
3937 PyModule_AddIntConstant(m, "AF_ATMSVC", AF_ATMSVC);
3938#endif
3939#ifdef AF_SNA
3940 /* Linux SNA Project (nutters!) */
3941 PyModule_AddIntConstant(m, "AF_SNA", AF_SNA);
3942#endif
3943#ifdef AF_IRDA
3944 /* IRDA sockets */
3945 PyModule_AddIntConstant(m, "AF_IRDA", AF_IRDA);
3946#endif
3947#ifdef AF_PPPOX
3948 /* PPPoX sockets */
3949 PyModule_AddIntConstant(m, "AF_PPPOX", AF_PPPOX);
3950#endif
3951#ifdef AF_WANPIPE
3952 /* Wanpipe API Sockets */
3953 PyModule_AddIntConstant(m, "AF_WANPIPE", AF_WANPIPE);
3954#endif
3955#ifdef AF_LLC
3956 /* Linux LLC */
3957 PyModule_AddIntConstant(m, "AF_LLC", AF_LLC);
3958#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00003959
Hye-Shik Chang81268602004-02-02 06:05:24 +00003960#ifdef USE_BLUETOOTH
Martin v. Löwis12af0482004-01-31 12:34:17 +00003961 PyModule_AddIntConstant(m, "AF_BLUETOOTH", AF_BLUETOOTH);
3962 PyModule_AddIntConstant(m, "BTPROTO_L2CAP", BTPROTO_L2CAP);
Hye-Shik Chang81268602004-02-02 06:05:24 +00003963#if !defined(__FreeBSD__)
Martin v. Löwis12af0482004-01-31 12:34:17 +00003964 PyModule_AddIntConstant(m, "BTPROTO_SCO", BTPROTO_SCO);
Hye-Shik Chang81268602004-02-02 06:05:24 +00003965#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00003966 PyModule_AddIntConstant(m, "BTPROTO_RFCOMM", BTPROTO_RFCOMM);
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00003967 PyModule_AddObject(m, "BDADDR_ANY", Py_BuildValue("s", "00:00:00:00:00:00"));
3968 PyModule_AddObject(m, "BDADDR_LOCAL", Py_BuildValue("s", "00:00:00:FF:FF:FF"));
Martin v. Löwis12af0482004-01-31 12:34:17 +00003969#endif
3970
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00003971#ifdef HAVE_NETPACKET_PACKET_H
Fred Drake4baedc12002-04-01 14:53:37 +00003972 PyModule_AddIntConstant(m, "AF_PACKET", AF_PACKET);
3973 PyModule_AddIntConstant(m, "PF_PACKET", PF_PACKET);
3974 PyModule_AddIntConstant(m, "PACKET_HOST", PACKET_HOST);
3975 PyModule_AddIntConstant(m, "PACKET_BROADCAST", PACKET_BROADCAST);
3976 PyModule_AddIntConstant(m, "PACKET_MULTICAST", PACKET_MULTICAST);
3977 PyModule_AddIntConstant(m, "PACKET_OTHERHOST", PACKET_OTHERHOST);
3978 PyModule_AddIntConstant(m, "PACKET_OUTGOING", PACKET_OUTGOING);
3979 PyModule_AddIntConstant(m, "PACKET_LOOPBACK", PACKET_LOOPBACK);
3980 PyModule_AddIntConstant(m, "PACKET_FASTROUTE", PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00003981#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00003982
3983 /* Socket types */
Fred Drake4baedc12002-04-01 14:53:37 +00003984 PyModule_AddIntConstant(m, "SOCK_STREAM", SOCK_STREAM);
3985 PyModule_AddIntConstant(m, "SOCK_DGRAM", SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00003986#ifndef __BEOS__
3987/* We have incomplete socket support. */
Fred Drake4baedc12002-04-01 14:53:37 +00003988 PyModule_AddIntConstant(m, "SOCK_RAW", SOCK_RAW);
3989 PyModule_AddIntConstant(m, "SOCK_SEQPACKET", SOCK_SEQPACKET);
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00003990#if defined(SOCK_RDM)
Fred Drake4baedc12002-04-01 14:53:37 +00003991 PyModule_AddIntConstant(m, "SOCK_RDM", SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00003992#endif
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00003993#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003994
3995#ifdef SO_DEBUG
Fred Drake4baedc12002-04-01 14:53:37 +00003996 PyModule_AddIntConstant(m, "SO_DEBUG", SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003997#endif
3998#ifdef SO_ACCEPTCONN
Fred Drake4baedc12002-04-01 14:53:37 +00003999 PyModule_AddIntConstant(m, "SO_ACCEPTCONN", SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004000#endif
4001#ifdef SO_REUSEADDR
Fred Drake4baedc12002-04-01 14:53:37 +00004002 PyModule_AddIntConstant(m, "SO_REUSEADDR", SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004003#endif
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00004004#ifdef SO_EXCLUSIVEADDRUSE
4005 PyModule_AddIntConstant(m, "SO_EXCLUSIVEADDRUSE", SO_EXCLUSIVEADDRUSE);
4006#endif
4007
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004008#ifdef SO_KEEPALIVE
Fred Drake4baedc12002-04-01 14:53:37 +00004009 PyModule_AddIntConstant(m, "SO_KEEPALIVE", SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004010#endif
4011#ifdef SO_DONTROUTE
Fred Drake4baedc12002-04-01 14:53:37 +00004012 PyModule_AddIntConstant(m, "SO_DONTROUTE", SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004013#endif
4014#ifdef SO_BROADCAST
Fred Drake4baedc12002-04-01 14:53:37 +00004015 PyModule_AddIntConstant(m, "SO_BROADCAST", SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004016#endif
4017#ifdef SO_USELOOPBACK
Fred Drake4baedc12002-04-01 14:53:37 +00004018 PyModule_AddIntConstant(m, "SO_USELOOPBACK", SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004019#endif
4020#ifdef SO_LINGER
Fred Drake4baedc12002-04-01 14:53:37 +00004021 PyModule_AddIntConstant(m, "SO_LINGER", SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004022#endif
4023#ifdef SO_OOBINLINE
Fred Drake4baedc12002-04-01 14:53:37 +00004024 PyModule_AddIntConstant(m, "SO_OOBINLINE", SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004025#endif
4026#ifdef SO_REUSEPORT
Fred Drake4baedc12002-04-01 14:53:37 +00004027 PyModule_AddIntConstant(m, "SO_REUSEPORT", SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004028#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004029#ifdef SO_SNDBUF
Fred Drake4baedc12002-04-01 14:53:37 +00004030 PyModule_AddIntConstant(m, "SO_SNDBUF", SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004031#endif
4032#ifdef SO_RCVBUF
Fred Drake4baedc12002-04-01 14:53:37 +00004033 PyModule_AddIntConstant(m, "SO_RCVBUF", SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004034#endif
4035#ifdef SO_SNDLOWAT
Fred Drake4baedc12002-04-01 14:53:37 +00004036 PyModule_AddIntConstant(m, "SO_SNDLOWAT", SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004037#endif
4038#ifdef SO_RCVLOWAT
Fred Drake4baedc12002-04-01 14:53:37 +00004039 PyModule_AddIntConstant(m, "SO_RCVLOWAT", SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004040#endif
4041#ifdef SO_SNDTIMEO
Fred Drake4baedc12002-04-01 14:53:37 +00004042 PyModule_AddIntConstant(m, "SO_SNDTIMEO", SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004043#endif
4044#ifdef SO_RCVTIMEO
Fred Drake4baedc12002-04-01 14:53:37 +00004045 PyModule_AddIntConstant(m, "SO_RCVTIMEO", SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004046#endif
4047#ifdef SO_ERROR
Fred Drake4baedc12002-04-01 14:53:37 +00004048 PyModule_AddIntConstant(m, "SO_ERROR", SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004049#endif
4050#ifdef SO_TYPE
Fred Drake4baedc12002-04-01 14:53:37 +00004051 PyModule_AddIntConstant(m, "SO_TYPE", SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004052#endif
4053
4054 /* Maximum number of connections for "listen" */
4055#ifdef SOMAXCONN
Fred Drake4baedc12002-04-01 14:53:37 +00004056 PyModule_AddIntConstant(m, "SOMAXCONN", SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004057#else
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004058 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004059#endif
4060
4061 /* Flags for send, recv */
4062#ifdef MSG_OOB
Fred Drake4baedc12002-04-01 14:53:37 +00004063 PyModule_AddIntConstant(m, "MSG_OOB", MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004064#endif
4065#ifdef MSG_PEEK
Fred Drake4baedc12002-04-01 14:53:37 +00004066 PyModule_AddIntConstant(m, "MSG_PEEK", MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004067#endif
4068#ifdef MSG_DONTROUTE
Fred Drake4baedc12002-04-01 14:53:37 +00004069 PyModule_AddIntConstant(m, "MSG_DONTROUTE", MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004070#endif
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00004071#ifdef MSG_DONTWAIT
Fred Drake4baedc12002-04-01 14:53:37 +00004072 PyModule_AddIntConstant(m, "MSG_DONTWAIT", MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00004073#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004074#ifdef MSG_EOR
Fred Drake4baedc12002-04-01 14:53:37 +00004075 PyModule_AddIntConstant(m, "MSG_EOR", MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004076#endif
4077#ifdef MSG_TRUNC
Fred Drake4baedc12002-04-01 14:53:37 +00004078 PyModule_AddIntConstant(m, "MSG_TRUNC", MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004079#endif
4080#ifdef MSG_CTRUNC
Fred Drake4baedc12002-04-01 14:53:37 +00004081 PyModule_AddIntConstant(m, "MSG_CTRUNC", MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004082#endif
4083#ifdef MSG_WAITALL
Fred Drake4baedc12002-04-01 14:53:37 +00004084 PyModule_AddIntConstant(m, "MSG_WAITALL", MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004085#endif
4086#ifdef MSG_BTAG
Fred Drake4baedc12002-04-01 14:53:37 +00004087 PyModule_AddIntConstant(m, "MSG_BTAG", MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004088#endif
4089#ifdef MSG_ETAG
Fred Drake4baedc12002-04-01 14:53:37 +00004090 PyModule_AddIntConstant(m, "MSG_ETAG", MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004091#endif
4092
4093 /* Protocol level and numbers, usable for [gs]etsockopt */
4094#ifdef SOL_SOCKET
Fred Drake4baedc12002-04-01 14:53:37 +00004095 PyModule_AddIntConstant(m, "SOL_SOCKET", SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004096#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00004097#ifdef SOL_IP
Fred Drake4baedc12002-04-01 14:53:37 +00004098 PyModule_AddIntConstant(m, "SOL_IP", SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00004099#else
Fred Drake4baedc12002-04-01 14:53:37 +00004100 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00004101#endif
4102#ifdef SOL_IPX
Fred Drake4baedc12002-04-01 14:53:37 +00004103 PyModule_AddIntConstant(m, "SOL_IPX", SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00004104#endif
4105#ifdef SOL_AX25
Fred Drake4baedc12002-04-01 14:53:37 +00004106 PyModule_AddIntConstant(m, "SOL_AX25", SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00004107#endif
4108#ifdef SOL_ATALK
Fred Drake4baedc12002-04-01 14:53:37 +00004109 PyModule_AddIntConstant(m, "SOL_ATALK", SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00004110#endif
4111#ifdef SOL_NETROM
Fred Drake4baedc12002-04-01 14:53:37 +00004112 PyModule_AddIntConstant(m, "SOL_NETROM", SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00004113#endif
4114#ifdef SOL_ROSE
Fred Drake4baedc12002-04-01 14:53:37 +00004115 PyModule_AddIntConstant(m, "SOL_ROSE", SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00004116#endif
4117#ifdef SOL_TCP
Fred Drake4baedc12002-04-01 14:53:37 +00004118 PyModule_AddIntConstant(m, "SOL_TCP", SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00004119#else
Fred Drake4baedc12002-04-01 14:53:37 +00004120 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00004121#endif
4122#ifdef SOL_UDP
Fred Drake4baedc12002-04-01 14:53:37 +00004123 PyModule_AddIntConstant(m, "SOL_UDP", SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00004124#else
Fred Drake4baedc12002-04-01 14:53:37 +00004125 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00004126#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004127#ifdef IPPROTO_IP
Fred Drake4baedc12002-04-01 14:53:37 +00004128 PyModule_AddIntConstant(m, "IPPROTO_IP", IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00004129#else
Fred Drake4baedc12002-04-01 14:53:37 +00004130 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004131#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004132#ifdef IPPROTO_HOPOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00004133 PyModule_AddIntConstant(m, "IPPROTO_HOPOPTS", IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004134#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004135#ifdef IPPROTO_ICMP
Fred Drake4baedc12002-04-01 14:53:37 +00004136 PyModule_AddIntConstant(m, "IPPROTO_ICMP", IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00004137#else
Fred Drake4baedc12002-04-01 14:53:37 +00004138 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004139#endif
4140#ifdef IPPROTO_IGMP
Fred Drake4baedc12002-04-01 14:53:37 +00004141 PyModule_AddIntConstant(m, "IPPROTO_IGMP", IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004142#endif
4143#ifdef IPPROTO_GGP
Fred Drake4baedc12002-04-01 14:53:37 +00004144 PyModule_AddIntConstant(m, "IPPROTO_GGP", IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004145#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004146#ifdef IPPROTO_IPV4
Fred Drake4baedc12002-04-01 14:53:37 +00004147 PyModule_AddIntConstant(m, "IPPROTO_IPV4", IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004148#endif
Martin v. Löwisa0f17342003-10-03 13:56:20 +00004149#ifdef IPPROTO_IPV6
4150 PyModule_AddIntConstant(m, "IPPROTO_IPV6", IPPROTO_IPV6);
4151#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004152#ifdef IPPROTO_IPIP
Fred Drake4baedc12002-04-01 14:53:37 +00004153 PyModule_AddIntConstant(m, "IPPROTO_IPIP", IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004154#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004155#ifdef IPPROTO_TCP
Fred Drake4baedc12002-04-01 14:53:37 +00004156 PyModule_AddIntConstant(m, "IPPROTO_TCP", IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00004157#else
Fred Drake4baedc12002-04-01 14:53:37 +00004158 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004159#endif
4160#ifdef IPPROTO_EGP
Fred Drake4baedc12002-04-01 14:53:37 +00004161 PyModule_AddIntConstant(m, "IPPROTO_EGP", IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004162#endif
4163#ifdef IPPROTO_PUP
Fred Drake4baedc12002-04-01 14:53:37 +00004164 PyModule_AddIntConstant(m, "IPPROTO_PUP", IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004165#endif
4166#ifdef IPPROTO_UDP
Fred Drake4baedc12002-04-01 14:53:37 +00004167 PyModule_AddIntConstant(m, "IPPROTO_UDP", IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00004168#else
Fred Drake4baedc12002-04-01 14:53:37 +00004169 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004170#endif
4171#ifdef IPPROTO_IDP
Fred Drake4baedc12002-04-01 14:53:37 +00004172 PyModule_AddIntConstant(m, "IPPROTO_IDP", IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004173#endif
4174#ifdef IPPROTO_HELLO
Fred Drake4baedc12002-04-01 14:53:37 +00004175 PyModule_AddIntConstant(m, "IPPROTO_HELLO", IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004176#endif
4177#ifdef IPPROTO_ND
Fred Drake4baedc12002-04-01 14:53:37 +00004178 PyModule_AddIntConstant(m, "IPPROTO_ND", IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004179#endif
4180#ifdef IPPROTO_TP
Fred Drake4baedc12002-04-01 14:53:37 +00004181 PyModule_AddIntConstant(m, "IPPROTO_TP", IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004182#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004183#ifdef IPPROTO_IPV6
Fred Drake4baedc12002-04-01 14:53:37 +00004184 PyModule_AddIntConstant(m, "IPPROTO_IPV6", IPPROTO_IPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004185#endif
4186#ifdef IPPROTO_ROUTING
Fred Drake4baedc12002-04-01 14:53:37 +00004187 PyModule_AddIntConstant(m, "IPPROTO_ROUTING", IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004188#endif
4189#ifdef IPPROTO_FRAGMENT
Fred Drake4baedc12002-04-01 14:53:37 +00004190 PyModule_AddIntConstant(m, "IPPROTO_FRAGMENT", IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004191#endif
4192#ifdef IPPROTO_RSVP
Fred Drake4baedc12002-04-01 14:53:37 +00004193 PyModule_AddIntConstant(m, "IPPROTO_RSVP", IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004194#endif
4195#ifdef IPPROTO_GRE
Fred Drake4baedc12002-04-01 14:53:37 +00004196 PyModule_AddIntConstant(m, "IPPROTO_GRE", IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004197#endif
4198#ifdef IPPROTO_ESP
Fred Drake4baedc12002-04-01 14:53:37 +00004199 PyModule_AddIntConstant(m, "IPPROTO_ESP", IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004200#endif
4201#ifdef IPPROTO_AH
Fred Drake4baedc12002-04-01 14:53:37 +00004202 PyModule_AddIntConstant(m, "IPPROTO_AH", IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004203#endif
4204#ifdef IPPROTO_MOBILE
Fred Drake4baedc12002-04-01 14:53:37 +00004205 PyModule_AddIntConstant(m, "IPPROTO_MOBILE", IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004206#endif
4207#ifdef IPPROTO_ICMPV6
Fred Drake4baedc12002-04-01 14:53:37 +00004208 PyModule_AddIntConstant(m, "IPPROTO_ICMPV6", IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004209#endif
4210#ifdef IPPROTO_NONE
Fred Drake4baedc12002-04-01 14:53:37 +00004211 PyModule_AddIntConstant(m, "IPPROTO_NONE", IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004212#endif
4213#ifdef IPPROTO_DSTOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00004214 PyModule_AddIntConstant(m, "IPPROTO_DSTOPTS", IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004215#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004216#ifdef IPPROTO_XTP
Fred Drake4baedc12002-04-01 14:53:37 +00004217 PyModule_AddIntConstant(m, "IPPROTO_XTP", IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004218#endif
4219#ifdef IPPROTO_EON
Fred Drake4baedc12002-04-01 14:53:37 +00004220 PyModule_AddIntConstant(m, "IPPROTO_EON", IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004221#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004222#ifdef IPPROTO_PIM
Fred Drake4baedc12002-04-01 14:53:37 +00004223 PyModule_AddIntConstant(m, "IPPROTO_PIM", IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004224#endif
4225#ifdef IPPROTO_IPCOMP
Fred Drake4baedc12002-04-01 14:53:37 +00004226 PyModule_AddIntConstant(m, "IPPROTO_IPCOMP", IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004227#endif
4228#ifdef IPPROTO_VRRP
Fred Drake4baedc12002-04-01 14:53:37 +00004229 PyModule_AddIntConstant(m, "IPPROTO_VRRP", IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004230#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004231#ifdef IPPROTO_BIP
Fred Drake4baedc12002-04-01 14:53:37 +00004232 PyModule_AddIntConstant(m, "IPPROTO_BIP", IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004233#endif
4234/**/
4235#ifdef IPPROTO_RAW
Fred Drake4baedc12002-04-01 14:53:37 +00004236 PyModule_AddIntConstant(m, "IPPROTO_RAW", IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00004237#else
Fred Drake4baedc12002-04-01 14:53:37 +00004238 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004239#endif
4240#ifdef IPPROTO_MAX
Fred Drake4baedc12002-04-01 14:53:37 +00004241 PyModule_AddIntConstant(m, "IPPROTO_MAX", IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004242#endif
4243
4244 /* Some port configuration */
4245#ifdef IPPORT_RESERVED
Fred Drake4baedc12002-04-01 14:53:37 +00004246 PyModule_AddIntConstant(m, "IPPORT_RESERVED", IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004247#else
Fred Drake4baedc12002-04-01 14:53:37 +00004248 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004249#endif
4250#ifdef IPPORT_USERRESERVED
Fred Drake4baedc12002-04-01 14:53:37 +00004251 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004252#else
Fred Drake4baedc12002-04-01 14:53:37 +00004253 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004254#endif
4255
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004256 /* Some reserved IP v.4 addresses */
4257#ifdef INADDR_ANY
Fred Drake4baedc12002-04-01 14:53:37 +00004258 PyModule_AddIntConstant(m, "INADDR_ANY", INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004259#else
Fred Drake4baedc12002-04-01 14:53:37 +00004260 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004261#endif
4262#ifdef INADDR_BROADCAST
Fred Drake4baedc12002-04-01 14:53:37 +00004263 PyModule_AddIntConstant(m, "INADDR_BROADCAST", INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004264#else
Fred Drake4baedc12002-04-01 14:53:37 +00004265 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004266#endif
4267#ifdef INADDR_LOOPBACK
Fred Drake4baedc12002-04-01 14:53:37 +00004268 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004269#else
Fred Drake4baedc12002-04-01 14:53:37 +00004270 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004271#endif
4272#ifdef INADDR_UNSPEC_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00004273 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004274#else
Fred Drake4baedc12002-04-01 14:53:37 +00004275 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004276#endif
4277#ifdef INADDR_ALLHOSTS_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00004278 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
4279 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004280#else
Fred Drake4baedc12002-04-01 14:53:37 +00004281 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004282#endif
4283#ifdef INADDR_MAX_LOCAL_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00004284 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP",
4285 INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004286#else
Fred Drake4baedc12002-04-01 14:53:37 +00004287 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004288#endif
4289#ifdef INADDR_NONE
Fred Drake4baedc12002-04-01 14:53:37 +00004290 PyModule_AddIntConstant(m, "INADDR_NONE", INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004291#else
Fred Drake4baedc12002-04-01 14:53:37 +00004292 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004293#endif
4294
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004295 /* IPv4 [gs]etsockopt options */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004296#ifdef IP_OPTIONS
Fred Drake4baedc12002-04-01 14:53:37 +00004297 PyModule_AddIntConstant(m, "IP_OPTIONS", IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004298#endif
4299#ifdef IP_HDRINCL
Fred Drake4baedc12002-04-01 14:53:37 +00004300 PyModule_AddIntConstant(m, "IP_HDRINCL", IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004301#endif
4302#ifdef IP_TOS
Fred Drake4baedc12002-04-01 14:53:37 +00004303 PyModule_AddIntConstant(m, "IP_TOS", IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004304#endif
4305#ifdef IP_TTL
Fred Drake4baedc12002-04-01 14:53:37 +00004306 PyModule_AddIntConstant(m, "IP_TTL", IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004307#endif
4308#ifdef IP_RECVOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00004309 PyModule_AddIntConstant(m, "IP_RECVOPTS", IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004310#endif
4311#ifdef IP_RECVRETOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00004312 PyModule_AddIntConstant(m, "IP_RECVRETOPTS", IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004313#endif
4314#ifdef IP_RECVDSTADDR
Fred Drake4baedc12002-04-01 14:53:37 +00004315 PyModule_AddIntConstant(m, "IP_RECVDSTADDR", IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004316#endif
4317#ifdef IP_RETOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00004318 PyModule_AddIntConstant(m, "IP_RETOPTS", IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004319#endif
4320#ifdef IP_MULTICAST_IF
Fred Drake4baedc12002-04-01 14:53:37 +00004321 PyModule_AddIntConstant(m, "IP_MULTICAST_IF", IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004322#endif
4323#ifdef IP_MULTICAST_TTL
Fred Drake4baedc12002-04-01 14:53:37 +00004324 PyModule_AddIntConstant(m, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004325#endif
4326#ifdef IP_MULTICAST_LOOP
Fred Drake4baedc12002-04-01 14:53:37 +00004327 PyModule_AddIntConstant(m, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004328#endif
4329#ifdef IP_ADD_MEMBERSHIP
Fred Drake4baedc12002-04-01 14:53:37 +00004330 PyModule_AddIntConstant(m, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004331#endif
4332#ifdef IP_DROP_MEMBERSHIP
Fred Drake4baedc12002-04-01 14:53:37 +00004333 PyModule_AddIntConstant(m, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004334#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00004335#ifdef IP_DEFAULT_MULTICAST_TTL
Fred Drake4baedc12002-04-01 14:53:37 +00004336 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_TTL",
4337 IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00004338#endif
4339#ifdef IP_DEFAULT_MULTICAST_LOOP
Fred Drake4baedc12002-04-01 14:53:37 +00004340 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_LOOP",
4341 IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00004342#endif
4343#ifdef IP_MAX_MEMBERSHIPS
Fred Drake4baedc12002-04-01 14:53:37 +00004344 PyModule_AddIntConstant(m, "IP_MAX_MEMBERSHIPS", IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00004345#endif
4346
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004347 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
4348#ifdef IPV6_JOIN_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00004349 PyModule_AddIntConstant(m, "IPV6_JOIN_GROUP", IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004350#endif
4351#ifdef IPV6_LEAVE_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00004352 PyModule_AddIntConstant(m, "IPV6_LEAVE_GROUP", IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004353#endif
4354#ifdef IPV6_MULTICAST_HOPS
Fred Drake4baedc12002-04-01 14:53:37 +00004355 PyModule_AddIntConstant(m, "IPV6_MULTICAST_HOPS", IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004356#endif
4357#ifdef IPV6_MULTICAST_IF
Fred Drake4baedc12002-04-01 14:53:37 +00004358 PyModule_AddIntConstant(m, "IPV6_MULTICAST_IF", IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004359#endif
4360#ifdef IPV6_MULTICAST_LOOP
Fred Drake4baedc12002-04-01 14:53:37 +00004361 PyModule_AddIntConstant(m, "IPV6_MULTICAST_LOOP", IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004362#endif
4363#ifdef IPV6_UNICAST_HOPS
Fred Drake4baedc12002-04-01 14:53:37 +00004364 PyModule_AddIntConstant(m, "IPV6_UNICAST_HOPS", IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004365#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00004366 /* Additional IPV6 socket options, defined in RFC 3493 */
4367#ifdef IPV6_V6ONLY
4368 PyModule_AddIntConstant(m, "IPV6_V6ONLY", IPV6_V6ONLY);
4369#endif
4370 /* Advanced IPV6 socket options, from RFC 3542 */
4371#ifdef IPV6_CHECKSUM
4372 PyModule_AddIntConstant(m, "IPV6_CHECKSUM", IPV6_CHECKSUM);
4373#endif
4374#ifdef IPV6_DONTFRAG
4375 PyModule_AddIntConstant(m, "IPV6_DONTFRAG", IPV6_DONTFRAG);
4376#endif
4377#ifdef IPV6_DSTOPTS
4378 PyModule_AddIntConstant(m, "IPV6_DSTOPTS", IPV6_DSTOPTS);
4379#endif
4380#ifdef IPV6_HOPLIMIT
4381 PyModule_AddIntConstant(m, "IPV6_HOPLIMIT", IPV6_HOPLIMIT);
4382#endif
4383#ifdef IPV6_HOPOPTS
4384 PyModule_AddIntConstant(m, "IPV6_HOPOPTS", IPV6_HOPOPTS);
4385#endif
4386#ifdef IPV6_NEXTHOP
4387 PyModule_AddIntConstant(m, "IPV6_NEXTHOP", IPV6_NEXTHOP);
4388#endif
4389#ifdef IPV6_PATHMTU
4390 PyModule_AddIntConstant(m, "IPV6_PATHMTU", IPV6_PATHMTU);
4391#endif
4392#ifdef IPV6_PKTINFO
4393 PyModule_AddIntConstant(m, "IPV6_PKTINFO", IPV6_PKTINFO);
4394#endif
4395#ifdef IPV6_RECVDSTOPTS
4396 PyModule_AddIntConstant(m, "IPV6_RECVDSTOPTS", IPV6_RECVDSTOPTS);
4397#endif
4398#ifdef IPV6_RECVHOPLIMIT
4399 PyModule_AddIntConstant(m, "IPV6_RECVHOPLIMIT", IPV6_RECVHOPLIMIT);
4400#endif
4401#ifdef IPV6_RECVHOPOPTS
4402 PyModule_AddIntConstant(m, "IPV6_RECVHOPOPTS", IPV6_RECVHOPOPTS);
4403#endif
4404#ifdef IPV6_RECVPKTINFO
4405 PyModule_AddIntConstant(m, "IPV6_RECVPKTINFO", IPV6_RECVPKTINFO);
4406#endif
4407#ifdef IPV6_RECVRTHDR
4408 PyModule_AddIntConstant(m, "IPV6_RECVRTHDR", IPV6_RECVRTHDR);
4409#endif
4410#ifdef IPV6_RECVTCLASS
4411 PyModule_AddIntConstant(m, "IPV6_RECVTCLASS", IPV6_RECVTCLASS);
4412#endif
4413#ifdef IPV6_RTHDR
4414 PyModule_AddIntConstant(m, "IPV6_RTHDR", IPV6_RTHDR);
4415#endif
4416#ifdef IPV6_RTHDRDSTOPTS
4417 PyModule_AddIntConstant(m, "IPV6_RTHDRDSTOPTS", IPV6_RTHDRDSTOPTS);
4418#endif
4419#ifdef IPV6_RTHDR_TYPE_0
4420 PyModule_AddIntConstant(m, "IPV6_RTHDR_TYPE_0", IPV6_RTHDR_TYPE_0);
4421#endif
4422#ifdef IPV6_RECVPATHMTU
4423 PyModule_AddIntConstant(m, "IPV6_RECVPATHMTU", IPV6_RECVPATHMTU);
4424#endif
4425#ifdef IPV6_TCLASS
4426 PyModule_AddIntConstant(m, "IPV6_TCLASS", IPV6_TCLASS);
4427#endif
4428#ifdef IPV6_USE_MIN_MTU
4429 PyModule_AddIntConstant(m, "IPV6_USE_MIN_MTU", IPV6_USE_MIN_MTU);
4430#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004431
Guido van Rossum09be4091999-08-09 14:40:40 +00004432 /* TCP options */
4433#ifdef TCP_NODELAY
Fred Drake4baedc12002-04-01 14:53:37 +00004434 PyModule_AddIntConstant(m, "TCP_NODELAY", TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00004435#endif
4436#ifdef TCP_MAXSEG
Fred Drake4baedc12002-04-01 14:53:37 +00004437 PyModule_AddIntConstant(m, "TCP_MAXSEG", TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00004438#endif
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004439#ifdef TCP_CORK
Fred Drake4baedc12002-04-01 14:53:37 +00004440 PyModule_AddIntConstant(m, "TCP_CORK", TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004441#endif
4442#ifdef TCP_KEEPIDLE
Fred Drake4baedc12002-04-01 14:53:37 +00004443 PyModule_AddIntConstant(m, "TCP_KEEPIDLE", TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004444#endif
4445#ifdef TCP_KEEPINTVL
Fred Drake4baedc12002-04-01 14:53:37 +00004446 PyModule_AddIntConstant(m, "TCP_KEEPINTVL", TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004447#endif
4448#ifdef TCP_KEEPCNT
Fred Drake4baedc12002-04-01 14:53:37 +00004449 PyModule_AddIntConstant(m, "TCP_KEEPCNT", TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004450#endif
4451#ifdef TCP_SYNCNT
Fred Drake4baedc12002-04-01 14:53:37 +00004452 PyModule_AddIntConstant(m, "TCP_SYNCNT", TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004453#endif
4454#ifdef TCP_LINGER2
Fred Drake4baedc12002-04-01 14:53:37 +00004455 PyModule_AddIntConstant(m, "TCP_LINGER2", TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004456#endif
4457#ifdef TCP_DEFER_ACCEPT
Fred Drake4baedc12002-04-01 14:53:37 +00004458 PyModule_AddIntConstant(m, "TCP_DEFER_ACCEPT", TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004459#endif
4460#ifdef TCP_WINDOW_CLAMP
Fred Drake4baedc12002-04-01 14:53:37 +00004461 PyModule_AddIntConstant(m, "TCP_WINDOW_CLAMP", TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004462#endif
4463#ifdef TCP_INFO
Fred Drake4baedc12002-04-01 14:53:37 +00004464 PyModule_AddIntConstant(m, "TCP_INFO", TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004465#endif
4466#ifdef TCP_QUICKACK
Fred Drake4baedc12002-04-01 14:53:37 +00004467 PyModule_AddIntConstant(m, "TCP_QUICKACK", TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004468#endif
4469
Guido van Rossum09be4091999-08-09 14:40:40 +00004470
4471 /* IPX options */
4472#ifdef IPX_TYPE
Fred Drake4baedc12002-04-01 14:53:37 +00004473 PyModule_AddIntConstant(m, "IPX_TYPE", IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00004474#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004475
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004476 /* get{addr,name}info parameters */
4477#ifdef EAI_ADDRFAMILY
Fred Drake4baedc12002-04-01 14:53:37 +00004478 PyModule_AddIntConstant(m, "EAI_ADDRFAMILY", EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004479#endif
4480#ifdef EAI_AGAIN
Fred Drake4baedc12002-04-01 14:53:37 +00004481 PyModule_AddIntConstant(m, "EAI_AGAIN", EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004482#endif
4483#ifdef EAI_BADFLAGS
Fred Drake4baedc12002-04-01 14:53:37 +00004484 PyModule_AddIntConstant(m, "EAI_BADFLAGS", EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004485#endif
4486#ifdef EAI_FAIL
Fred Drake4baedc12002-04-01 14:53:37 +00004487 PyModule_AddIntConstant(m, "EAI_FAIL", EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004488#endif
4489#ifdef EAI_FAMILY
Fred Drake4baedc12002-04-01 14:53:37 +00004490 PyModule_AddIntConstant(m, "EAI_FAMILY", EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004491#endif
4492#ifdef EAI_MEMORY
Fred Drake4baedc12002-04-01 14:53:37 +00004493 PyModule_AddIntConstant(m, "EAI_MEMORY", EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004494#endif
4495#ifdef EAI_NODATA
Fred Drake4baedc12002-04-01 14:53:37 +00004496 PyModule_AddIntConstant(m, "EAI_NODATA", EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004497#endif
4498#ifdef EAI_NONAME
Fred Drake4baedc12002-04-01 14:53:37 +00004499 PyModule_AddIntConstant(m, "EAI_NONAME", EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004500#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00004501#ifdef EAI_OVERFLOW
4502 PyModule_AddIntConstant(m, "EAI_OVERFLOW", EAI_OVERFLOW);
4503#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004504#ifdef EAI_SERVICE
Fred Drake4baedc12002-04-01 14:53:37 +00004505 PyModule_AddIntConstant(m, "EAI_SERVICE", EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004506#endif
4507#ifdef EAI_SOCKTYPE
Fred Drake4baedc12002-04-01 14:53:37 +00004508 PyModule_AddIntConstant(m, "EAI_SOCKTYPE", EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004509#endif
4510#ifdef EAI_SYSTEM
Fred Drake4baedc12002-04-01 14:53:37 +00004511 PyModule_AddIntConstant(m, "EAI_SYSTEM", EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004512#endif
4513#ifdef EAI_BADHINTS
Fred Drake4baedc12002-04-01 14:53:37 +00004514 PyModule_AddIntConstant(m, "EAI_BADHINTS", EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004515#endif
4516#ifdef EAI_PROTOCOL
Fred Drake4baedc12002-04-01 14:53:37 +00004517 PyModule_AddIntConstant(m, "EAI_PROTOCOL", EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004518#endif
4519#ifdef EAI_MAX
Fred Drake4baedc12002-04-01 14:53:37 +00004520 PyModule_AddIntConstant(m, "EAI_MAX", EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004521#endif
4522#ifdef AI_PASSIVE
Fred Drake4baedc12002-04-01 14:53:37 +00004523 PyModule_AddIntConstant(m, "AI_PASSIVE", AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004524#endif
4525#ifdef AI_CANONNAME
Fred Drake4baedc12002-04-01 14:53:37 +00004526 PyModule_AddIntConstant(m, "AI_CANONNAME", AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004527#endif
4528#ifdef AI_NUMERICHOST
Fred Drake4baedc12002-04-01 14:53:37 +00004529 PyModule_AddIntConstant(m, "AI_NUMERICHOST", AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004530#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00004531#ifdef AI_NUMERICSERV
4532 PyModule_AddIntConstant(m, "AI_NUMERICSERV", AI_NUMERICSERV);
4533#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004534#ifdef AI_MASK
Fred Drake4baedc12002-04-01 14:53:37 +00004535 PyModule_AddIntConstant(m, "AI_MASK", AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004536#endif
4537#ifdef AI_ALL
Fred Drake4baedc12002-04-01 14:53:37 +00004538 PyModule_AddIntConstant(m, "AI_ALL", AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004539#endif
4540#ifdef AI_V4MAPPED_CFG
Fred Drake4baedc12002-04-01 14:53:37 +00004541 PyModule_AddIntConstant(m, "AI_V4MAPPED_CFG", AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004542#endif
4543#ifdef AI_ADDRCONFIG
Fred Drake4baedc12002-04-01 14:53:37 +00004544 PyModule_AddIntConstant(m, "AI_ADDRCONFIG", AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004545#endif
4546#ifdef AI_V4MAPPED
Fred Drake4baedc12002-04-01 14:53:37 +00004547 PyModule_AddIntConstant(m, "AI_V4MAPPED", AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004548#endif
4549#ifdef AI_DEFAULT
Fred Drake4baedc12002-04-01 14:53:37 +00004550 PyModule_AddIntConstant(m, "AI_DEFAULT", AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004551#endif
4552#ifdef NI_MAXHOST
Fred Drake4baedc12002-04-01 14:53:37 +00004553 PyModule_AddIntConstant(m, "NI_MAXHOST", NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004554#endif
4555#ifdef NI_MAXSERV
Fred Drake4baedc12002-04-01 14:53:37 +00004556 PyModule_AddIntConstant(m, "NI_MAXSERV", NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004557#endif
4558#ifdef NI_NOFQDN
Fred Drake4baedc12002-04-01 14:53:37 +00004559 PyModule_AddIntConstant(m, "NI_NOFQDN", NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004560#endif
4561#ifdef NI_NUMERICHOST
Fred Drake4baedc12002-04-01 14:53:37 +00004562 PyModule_AddIntConstant(m, "NI_NUMERICHOST", NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004563#endif
4564#ifdef NI_NAMEREQD
Fred Drake4baedc12002-04-01 14:53:37 +00004565 PyModule_AddIntConstant(m, "NI_NAMEREQD", NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004566#endif
4567#ifdef NI_NUMERICSERV
Fred Drake4baedc12002-04-01 14:53:37 +00004568 PyModule_AddIntConstant(m, "NI_NUMERICSERV", NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004569#endif
4570#ifdef NI_DGRAM
Fred Drake4baedc12002-04-01 14:53:37 +00004571 PyModule_AddIntConstant(m, "NI_DGRAM", NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004572#endif
4573
Martin v. Löwis94681fc2003-11-27 19:40:22 +00004574 /* shutdown() parameters */
4575#ifdef SHUT_RD
4576 PyModule_AddIntConstant(m, "SHUT_RD", SHUT_RD);
4577#elif defined(SD_RECEIVE)
4578 PyModule_AddIntConstant(m, "SHUT_RD", SD_RECEIVE);
4579#else
4580 PyModule_AddIntConstant(m, "SHUT_RD", 0);
4581#endif
4582#ifdef SHUT_WR
4583 PyModule_AddIntConstant(m, "SHUT_WR", SHUT_WR);
4584#elif defined(SD_SEND)
4585 PyModule_AddIntConstant(m, "SHUT_WR", SD_SEND);
4586#else
4587 PyModule_AddIntConstant(m, "SHUT_WR", 1);
4588#endif
4589#ifdef SHUT_RDWR
4590 PyModule_AddIntConstant(m, "SHUT_RDWR", SHUT_RDWR);
4591#elif defined(SD_BOTH)
4592 PyModule_AddIntConstant(m, "SHUT_RDWR", SD_BOTH);
4593#else
4594 PyModule_AddIntConstant(m, "SHUT_RDWR", 2);
4595#endif
4596
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004597 /* Initialize gethostbyname lock */
Just van Rossum1040d2c2003-05-09 07:53:18 +00004598#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
4599 netdb_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004600#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004601}
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004602
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004603
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004604#ifndef HAVE_INET_PTON
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004605
4606/* Simplistic emulation code for inet_pton that only works for IPv4 */
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004607/* These are not exposed because they do not set errno properly */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004608
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004609int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004610inet_pton(int af, const char *src, void *dst)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004611{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004612 if (af == AF_INET) {
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004613 long packed_addr;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004614 packed_addr = inet_addr(src);
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004615 if (packed_addr == INADDR_NONE)
4616 return 0;
4617 memcpy(dst, &packed_addr, 4);
4618 return 1;
4619 }
4620 /* Should set errno to EAFNOSUPPORT */
4621 return -1;
4622}
4623
Martin v. Löwisc925b1532001-07-21 09:42:15 +00004624const char *
4625inet_ntop(int af, const void *src, char *dst, socklen_t size)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004626{
4627 if (af == AF_INET) {
4628 struct in_addr packed_addr;
4629 if (size < 16)
4630 /* Should set errno to ENOSPC. */
4631 return NULL;
4632 memcpy(&packed_addr, src, sizeof(packed_addr));
4633 return strncpy(dst, inet_ntoa(packed_addr), size);
4634 }
4635 /* Should set errno to EAFNOSUPPORT */
4636 return NULL;
4637}
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004638
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004639#endif