blob: 0989171f787c2df29a38db93d5bb4e878084a183 [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
Guido van Rossum27e177d1995-03-16 15:43:47 +000028- socket.getservbyname(servicename, protocolname) --> port number
Guido van Rossum83a072d2002-09-03 19:10:18 +000029- socket.socket([family[, type [, proto]]]) --> new socket object
Guido van Rossum006bf911996-06-12 04:04:55 +000030- socket.ntohs(16 bit value) --> new int object
31- socket.ntohl(32 bit value) --> new int object
32- socket.htons(16 bit value) --> new int object
33- socket.htonl(32 bit value) --> new int object
Martin v. Löwis2d8d4272001-07-21 18:05:31 +000034- socket.getaddrinfo(host, port [, family, socktype, proto, flags])
35 --> List of (family, socktype, proto, canonname, sockaddr)
36- socket.getnameinfo(sockaddr, flags) --> (host, port)
Guido van Rossum27e177d1995-03-16 15:43:47 +000037- socket.AF_INET, socket.SOCK_STREAM, etc.: constants from <socket.h>
Guido van Rossum47dfa4a2003-04-25 05:48:32 +000038- socket.has_ipv6: boolean value indicating if IPv6 is supported
Guido van Rossum5c9eb211999-08-20 18:21:51 +000039- socket.inet_aton(IP address) -> 32-bit packed IP representation
40- socket.inet_ntoa(packed IP) -> IP address string
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +000041- socket.getdefaulttimeout() -> None | float
42- socket.setdefaulttimeout(None | float)
Guido van Rossum6574b3e1991-06-25 21:36:08 +000043- an Internet socket address is a pair (hostname, port)
44 where hostname can be anything recognized by gethostbyname()
45 (including the dd.dd.dd.dd notation) and port is in host byte order
46- where a hostname is returned, the dd.dd.dd.dd notation is used
Guido van Rossum27e177d1995-03-16 15:43:47 +000047- a UNIX domain socket address is a string specifying the pathname
Jeremy Hylton22308652001-02-02 03:23:09 +000048- an AF_PACKET socket address is a tuple containing a string
49 specifying the ethernet interface and an integer specifying
50 the Ethernet protocol number to be received. For example:
Jeremy Hyltondbfb6622001-02-02 19:55:17 +000051 ("eth0",0x1234). Optional 3rd,4th,5th elements in the tuple
52 specify packet-type and ha-type/addr -- these are ignored by
Jeremy Hylton22308652001-02-02 03:23:09 +000053 networking code, but accepted since they are returned by the
54 getsockname() method.
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"
261
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
842/* Create an object representing the given socket address,
843 suitable for passing it back to bind(), connect() etc.
844 The family field of the sockaddr structure is inspected
845 to determine what kind of address it really is. */
846
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000847/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000848static PyObject *
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000849makesockaddr(int sockfd, struct sockaddr *addr, int addrlen)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000850{
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000851 if (addrlen == 0) {
852 /* No address -- may be recvfrom() from known socket */
Guido van Rossum73624e91994-10-10 17:59:00 +0000853 Py_INCREF(Py_None);
854 return Py_None;
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000855 }
856
Guido van Rossumbcc20741998-08-04 22:53:56 +0000857#ifdef __BEOS__
Guido van Rossum2c8bcb82000-04-25 21:34:53 +0000858 /* XXX: BeOS version of accept() doesn't set family correctly */
Guido van Rossumbcc20741998-08-04 22:53:56 +0000859 addr->sa_family = AF_INET;
860#endif
861
Guido van Rossum30a685f1991-06-27 15:51:29 +0000862 switch (addr->sa_family) {
863
864 case AF_INET:
865 {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000866 struct sockaddr_in *a;
867 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
Barry Warsaw752300b1997-01-03 17:18:10 +0000868 PyObject *ret = NULL;
869 if (addrobj) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000870 a = (struct sockaddr_in *)addr;
Barry Warsaw752300b1997-01-03 17:18:10 +0000871 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
872 Py_DECREF(addrobj);
873 }
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000874 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000875 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000876
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +0000877#if defined(AF_UNIX)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000878 case AF_UNIX:
879 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000880 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000881 return PyString_FromString(a->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000882 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000883#endif /* AF_UNIX */
884
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000885#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000886 case AF_INET6:
887 {
888 struct sockaddr_in6 *a;
889 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
890 PyObject *ret = NULL;
891 if (addrobj) {
892 a = (struct sockaddr_in6 *)addr;
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000893 ret = Py_BuildValue("Oiii",
894 addrobj,
895 ntohs(a->sin6_port),
896 a->sin6_flowinfo,
897 a->sin6_scope_id);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000898 Py_DECREF(addrobj);
899 }
900 return ret;
901 }
Jeremy Hylton22308652001-02-02 03:23:09 +0000902#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +0000903
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +0000904#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +0000905 case AF_PACKET:
906 {
907 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
908 char *ifname = "";
909 struct ifreq ifr;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000910 /* need to look up interface name give index */
911 if (a->sll_ifindex) {
Jeremy Hylton22308652001-02-02 03:23:09 +0000912 ifr.ifr_ifindex = a->sll_ifindex;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000913 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
Jeremy Hylton22308652001-02-02 03:23:09 +0000914 ifname = ifr.ifr_name;
Jeremy Hylton22308652001-02-02 03:23:09 +0000915 }
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000916 return Py_BuildValue("shbhs#",
917 ifname,
918 ntohs(a->sll_protocol),
919 a->sll_pkttype,
920 a->sll_hatype,
921 a->sll_addr,
922 a->sll_halen);
Jeremy Hylton22308652001-02-02 03:23:09 +0000923 }
924#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000925
Guido van Rossum30a685f1991-06-27 15:51:29 +0000926 /* More cases here... */
927
928 default:
Guido van Rossumaa948df1997-05-07 17:41:48 +0000929 /* If we don't know the address family, don't raise an
930 exception -- return it as a tuple. */
931 return Py_BuildValue("is#",
932 addr->sa_family,
933 addr->sa_data,
934 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000935
Guido van Rossum30a685f1991-06-27 15:51:29 +0000936 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000937}
938
Guido van Rossum30a685f1991-06-27 15:51:29 +0000939
940/* Parse a socket address argument according to the socket object's
941 address family. Return 1 if the address was in the proper format,
942 0 of not. The address is returned through addr_ret, its length
943 through len_ret. */
944
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000945static int
Guido van Rossum48a680c2001-03-02 06:34:14 +0000946getsockaddrarg(PySocketSockObject *s, PyObject *args,
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000947 struct sockaddr **addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000948{
Guido van Rossum30a685f1991-06-27 15:51:29 +0000949 switch (s->sock_family) {
950
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +0000951#if defined(AF_UNIX)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000952 case AF_UNIX:
953 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000954 struct sockaddr_un* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000955 char *path;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000956 int len;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000957 addr = (struct sockaddr_un*)&(s->sock_addr).un;
Guido van Rossum7e488981998-10-08 02:25:24 +0000958 if (!PyArg_Parse(args, "t#", &path, &len))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000959 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000960 if (len > sizeof addr->sun_path) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000961 PyErr_SetString(socket_error,
Barry Warsaw752300b1997-01-03 17:18:10 +0000962 "AF_UNIX path too long");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000963 return 0;
964 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000965 addr->sun_family = s->sock_family;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000966 memcpy(addr->sun_path, path, len);
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000967 addr->sun_path[len] = 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000968 *addr_ret = (struct sockaddr *) addr;
Andrew MacIntyredaedf212004-04-11 12:03:57 +0000969#if defined(PYOS_OS2)
970 *len_ret = sizeof(*addr);
971#else
Guido van Rossum65af28a1996-06-11 18:36:33 +0000972 *len_ret = len + sizeof(*addr) - sizeof(addr->sun_path);
Andrew MacIntyredaedf212004-04-11 12:03:57 +0000973#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000974 return 1;
975 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000976#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000977
Guido van Rossum30a685f1991-06-27 15:51:29 +0000978 case AF_INET:
979 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000980 struct sockaddr_in* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000981 char *host;
Martin v. Löwis5db099a2003-08-07 11:55:15 +0000982 int port, result;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000983 addr=(struct sockaddr_in*)&(s->sock_addr).in;
Guido van Rossume4dad902000-12-01 13:13:11 +0000984 if (!PyTuple_Check(args)) {
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000985 PyErr_Format(
986 PyExc_TypeError,
987 "getsockaddrarg: "
988 "AF_INET address must be tuple, not %.500s",
989 args->ob_type->tp_name);
Guido van Rossume4dad902000-12-01 13:13:11 +0000990 return 0;
991 }
Martin v. Löwis2548c732003-04-18 10:39:54 +0000992 if (!PyArg_ParseTuple(args, "eti:getsockaddrarg",
993 "idna", &host, &port))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000994 return 0;
Martin v. Löwis5db099a2003-08-07 11:55:15 +0000995 result = setipaddr(host, (struct sockaddr *)addr,
996 sizeof(*addr), AF_INET);
997 PyMem_Free(host);
998 if (result < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000999 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001000 addr->sin_family = AF_INET;
Guido van Rossum644a12b1997-04-09 19:24:53 +00001001 addr->sin_port = htons((short)port);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001002 *addr_ret = (struct sockaddr *) addr;
1003 *len_ret = sizeof *addr;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001004 return 1;
1005 }
1006
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001007#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001008 case AF_INET6:
1009 {
1010 struct sockaddr_in6* addr;
1011 char *host;
Martin v. Löwis5db099a2003-08-07 11:55:15 +00001012 int port, flowinfo, scope_id, result;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001013 addr = (struct sockaddr_in6*)&(s->sock_addr).in6;
1014 flowinfo = scope_id = 0;
Martin v. Löwis2548c732003-04-18 10:39:54 +00001015 if (!PyArg_ParseTuple(args, "eti|ii",
1016 "idna", &host, &port, &flowinfo,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001017 &scope_id)) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001018 return 0;
1019 }
Martin v. Löwis5db099a2003-08-07 11:55:15 +00001020 result = setipaddr(host, (struct sockaddr *)addr,
1021 sizeof(*addr), AF_INET6);
1022 PyMem_Free(host);
1023 if (result < 0)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001024 return 0;
1025 addr->sin6_family = s->sock_family;
1026 addr->sin6_port = htons((short)port);
1027 addr->sin6_flowinfo = flowinfo;
1028 addr->sin6_scope_id = scope_id;
1029 *addr_ret = (struct sockaddr *) addr;
1030 *len_ret = sizeof *addr;
1031 return 1;
1032 }
1033#endif
1034
Hye-Shik Chang81268602004-02-02 06:05:24 +00001035#ifdef USE_BLUETOOTH
Martin v. Löwis12af0482004-01-31 12:34:17 +00001036 case AF_BLUETOOTH:
1037 {
1038 switch( s->sock_proto )
1039 {
1040 case BTPROTO_L2CAP:
1041 {
Hye-Shik Chang81268602004-02-02 06:05:24 +00001042 struct sockaddr_l2* addr = (struct sockaddr_l2*)_BT_SOCKADDR_MEMB(s, l2);
1043 bdaddr_t* bdaddr = &_BT_L2_MEMB(addr, bdaddr);
Martin v. Löwis12af0482004-01-31 12:34:17 +00001044
Hye-Shik Chang81268602004-02-02 06:05:24 +00001045 _BT_L2_MEMB(addr, family) = AF_BLUETOOTH;
1046 if( !PyArg_ParseTuple(args, "(iiiiii)i", &bdaddr->b[0], &bdaddr->b[1], &bdaddr->b[2], &bdaddr->b[3], &bdaddr->b[4], &bdaddr->b[5], &_BT_L2_MEMB(addr, psm)) )
Martin v. Löwis12af0482004-01-31 12:34:17 +00001047 {
1048 PyErr_SetString(socket_error, "getsockaddrarg: wrong format");
1049 return 0;
1050 }
1051
1052 *addr_ret = (struct sockaddr *) addr;
1053 *len_ret = sizeof *addr;
1054 return 1;
1055 }
1056 case BTPROTO_RFCOMM:
1057 {
Hye-Shik Chang81268602004-02-02 06:05:24 +00001058 struct sockaddr_rc* addr = (struct sockaddr_rc*)_BT_SOCKADDR_MEMB(s, rc);
1059 bdaddr_t* bdaddr = &_BT_RC_MEMB(addr, bdaddr);
Martin v. Löwis12af0482004-01-31 12:34:17 +00001060
Hye-Shik Chang81268602004-02-02 06:05:24 +00001061 _BT_RC_MEMB(addr, family) = AF_BLUETOOTH;
1062 if( !PyArg_ParseTuple(args, "(iiiiii)i", &bdaddr->b[0], &bdaddr->b[1], &bdaddr->b[2], &bdaddr->b[3], &bdaddr->b[4], &bdaddr->b[5], &_BT_RC_MEMB(addr, channel)) )
Martin v. Löwis12af0482004-01-31 12:34:17 +00001063 {
1064 PyErr_SetString(socket_error, "getsockaddrarg: wrong format");
1065 return 0;
1066 }
1067
1068 *addr_ret = (struct sockaddr *) addr;
1069 *len_ret = sizeof *addr;
1070 return 1;
1071 }
Hye-Shik Chang81268602004-02-02 06:05:24 +00001072#if !defined(__FreeBSD__)
Martin v. Löwis12af0482004-01-31 12:34:17 +00001073 case BTPROTO_SCO:
1074 {
Hye-Shik Chang81268602004-02-02 06:05:24 +00001075 struct sockaddr_sco* addr = (struct sockaddr_sco*)_BT_SOCKADDR_MEMB(s, sco);
1076 bdaddr_t* bdaddr = &_BT_SCO_MEMB(addr, bdaddr);
Martin v. Löwis12af0482004-01-31 12:34:17 +00001077
Hye-Shik Chang81268602004-02-02 06:05:24 +00001078 _BT_SCO_MEMB(addr, family) = AF_BLUETOOTH;
Martin v. Löwis12af0482004-01-31 12:34:17 +00001079 if( !PyArg_ParseTuple(args, "iiiiii", &bdaddr->b[0], &bdaddr->b[1], &bdaddr->b[2], &bdaddr->b[3], &bdaddr->b[4], &bdaddr->b[5]) )
1080 {
1081 PyErr_SetString(socket_error, "getsockaddrarg: wrong format");
1082 return 0;
1083 }
1084
1085 *addr_ret = (struct sockaddr *) addr;
1086 *len_ret = sizeof *addr;
1087 return 1;
1088 }
Hye-Shik Chang81268602004-02-02 06:05:24 +00001089#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00001090 default:
1091 {
1092 PyErr_SetString(socket_error, "getsockaddrarg: unknown Bluetooth protocol");
1093 return 0;
1094 }
1095 }
1096 }
1097#endif
1098
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00001099#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +00001100 case AF_PACKET:
1101 {
1102 struct sockaddr_ll* addr;
1103 struct ifreq ifr;
1104 char *interfaceName;
1105 int protoNumber;
1106 int hatype = 0;
1107 int pkttype = 0;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001108 char *haddr;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001109
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001110 if (!PyArg_ParseTuple(args, "si|iis", &interfaceName,
1111 &protoNumber, &pkttype, &hatype, &haddr))
Jeremy Hylton22308652001-02-02 03:23:09 +00001112 return 0;
1113 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
1114 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001115 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001116 s->errorhandler();
Jeremy Hylton22308652001-02-02 03:23:09 +00001117 return 0;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001118 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001119 addr = &(s->sock_addr.ll);
1120 addr->sll_family = AF_PACKET;
1121 addr->sll_protocol = htons((short)protoNumber);
1122 addr->sll_ifindex = ifr.ifr_ifindex;
1123 addr->sll_pkttype = pkttype;
1124 addr->sll_hatype = hatype;
1125 *addr_ret = (struct sockaddr *) addr;
1126 *len_ret = sizeof *addr;
1127 return 1;
1128 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00001129#endif
1130
Guido van Rossum30a685f1991-06-27 15:51:29 +00001131 /* More cases here... */
1132
1133 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001134 PyErr_SetString(socket_error, "getsockaddrarg: bad family");
Guido van Rossum30a685f1991-06-27 15:51:29 +00001135 return 0;
1136
1137 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001138}
1139
Guido van Rossum30a685f1991-06-27 15:51:29 +00001140
Guido van Rossum48a680c2001-03-02 06:34:14 +00001141/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +00001142 Return 1 if the family is known, 0 otherwise. The length is returned
1143 through len_ret. */
1144
1145static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +00001146getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +00001147{
1148 switch (s->sock_family) {
1149
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001150#if defined(AF_UNIX)
Guido van Rossum710e1df1992-06-12 10:39:36 +00001151 case AF_UNIX:
1152 {
1153 *len_ret = sizeof (struct sockaddr_un);
1154 return 1;
1155 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001156#endif /* AF_UNIX */
Guido van Rossum710e1df1992-06-12 10:39:36 +00001157
1158 case AF_INET:
1159 {
1160 *len_ret = sizeof (struct sockaddr_in);
1161 return 1;
1162 }
1163
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001164#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001165 case AF_INET6:
1166 {
1167 *len_ret = sizeof (struct sockaddr_in6);
1168 return 1;
1169 }
1170#endif
1171
Hye-Shik Chang81268602004-02-02 06:05:24 +00001172#ifdef USE_BLUETOOTH
Martin v. Löwis12af0482004-01-31 12:34:17 +00001173 case AF_BLUETOOTH:
1174 {
1175 switch(s->sock_proto)
1176 {
1177 case BTPROTO_L2CAP:
1178 {
1179 *len_ret = sizeof (struct sockaddr_l2);
1180 return 1;
1181 }
1182 case BTPROTO_RFCOMM:
1183 {
1184 *len_ret = sizeof (struct sockaddr_rc);
1185 return 1;
1186 }
Hye-Shik Chang81268602004-02-02 06:05:24 +00001187#if !defined(__FreeBSD__)
Martin v. Löwis12af0482004-01-31 12:34:17 +00001188 case BTPROTO_SCO:
1189 {
1190 *len_ret = sizeof (struct sockaddr_sco);
1191 return 1;
1192 }
Hye-Shik Chang81268602004-02-02 06:05:24 +00001193#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00001194 default:
1195 {
1196 PyErr_SetString(socket_error, "getsockaddrlen: unknown BT protocol");
1197 return 0;
1198 }
1199 }
1200 }
1201#endif
1202
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00001203#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +00001204 case AF_PACKET:
1205 {
1206 *len_ret = sizeof (struct sockaddr_ll);
1207 return 1;
1208 }
1209#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001210
Guido van Rossum710e1df1992-06-12 10:39:36 +00001211 /* More cases here... */
1212
1213 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001214 PyErr_SetString(socket_error, "getsockaddrlen: bad family");
Guido van Rossum710e1df1992-06-12 10:39:36 +00001215 return 0;
1216
1217 }
1218}
1219
1220
Guido van Rossum30a685f1991-06-27 15:51:29 +00001221/* s.accept() method */
1222
Guido van Rossum73624e91994-10-10 17:59:00 +00001223static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001224sock_accept(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001225{
1226 char addrbuf[256];
Fred Drakea04eaad2000-06-30 02:46:07 +00001227 SOCKET_T newfd;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001228 socklen_t addrlen;
Barry Warsaw752300b1997-01-03 17:18:10 +00001229 PyObject *sock = NULL;
1230 PyObject *addr = NULL;
1231 PyObject *res = NULL;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001232 int timeout;
Barry Warsaw752300b1997-01-03 17:18:10 +00001233
Guido van Rossum710e1df1992-06-12 10:39:36 +00001234 if (!getsockaddrlen(s, &addrlen))
1235 return NULL;
Fred Drakefd168342001-05-09 19:11:33 +00001236 memset(addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001237
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001238#ifdef MS_WINDOWS
1239 newfd = INVALID_SOCKET;
1240#else
1241 newfd = -1;
1242#endif
1243
Guido van Rossum73624e91994-10-10 17:59:00 +00001244 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001245 timeout = internal_select(s, 0);
1246 if (!timeout)
1247 newfd = accept(s->sock_fd, (struct sockaddr *) addrbuf,
1248 &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001249 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001250
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001251 if (timeout) {
1252 PyErr_SetString(socket_timeout, "timed out");
1253 return NULL;
1254 }
1255
Fred Drakea04eaad2000-06-30 02:46:07 +00001256#ifdef MS_WINDOWS
1257 if (newfd == INVALID_SOCKET)
1258#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001259 if (newfd < 0)
Fred Drakea04eaad2000-06-30 02:46:07 +00001260#endif
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001261 return s->errorhandler();
Barry Warsaw752300b1997-01-03 17:18:10 +00001262
Guido van Rossum30a685f1991-06-27 15:51:29 +00001263 /* Create the new object with unspecified family,
1264 to avoid calls to bind() etc. on it. */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001265 sock = (PyObject *) new_sockobject(newfd,
1266 s->sock_family,
1267 s->sock_type,
1268 s->sock_proto);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001269
Barry Warsaw752300b1997-01-03 17:18:10 +00001270 if (sock == NULL) {
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001271 SOCKETCLOSE(newfd);
Barry Warsaw752300b1997-01-03 17:18:10 +00001272 goto finally;
1273 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00001274 addr = makesockaddr(s->sock_fd, (struct sockaddr *)addrbuf,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001275 addrlen);
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001276 if (addr == NULL)
Barry Warsaw752300b1997-01-03 17:18:10 +00001277 goto finally;
1278
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001279 res = PyTuple_Pack(2, sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00001280
Guido van Rossum67f7a382002-06-06 21:08:16 +00001281finally:
Guido van Rossum73624e91994-10-10 17:59:00 +00001282 Py_XDECREF(sock);
1283 Py_XDECREF(addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001284 return res;
1285}
1286
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001287PyDoc_STRVAR(accept_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001288"accept() -> (socket object, address info)\n\
1289\n\
1290Wait for an incoming connection. Return a new socket representing the\n\
1291connection, and the address of the client. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001292info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001293
Guido van Rossum11ba0942002-06-13 15:07:44 +00001294/* s.setblocking(flag) method. Argument:
1295 False -- non-blocking mode; same as settimeout(0)
1296 True -- blocking mode; same as settimeout(None)
1297*/
Guido van Rossume4485b01994-09-07 14:32:49 +00001298
Guido van Rossum73624e91994-10-10 17:59:00 +00001299static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001300sock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00001301{
1302 int block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001303
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001304 block = PyInt_AsLong(arg);
1305 if (block == -1 && PyErr_Occurred())
Guido van Rossume4485b01994-09-07 14:32:49 +00001306 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001307
Guido van Rossum11ba0942002-06-13 15:07:44 +00001308 s->sock_timeout = block ? -1.0 : 0.0;
Guido van Rossume8008f02002-06-07 03:36:20 +00001309 internal_setblocking(s, block);
Guido van Rossume4485b01994-09-07 14:32:49 +00001310
Guido van Rossum73624e91994-10-10 17:59:00 +00001311 Py_INCREF(Py_None);
1312 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +00001313}
Guido van Rossume4485b01994-09-07 14:32:49 +00001314
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001315PyDoc_STRVAR(setblocking_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001316"setblocking(flag)\n\
1317\n\
1318Set the socket to blocking (flag is true) or non-blocking (false).\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00001319setblocking(True) is equivalent to settimeout(None);\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001320setblocking(False) is equivalent to settimeout(0.0).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001321
Guido van Rossum11ba0942002-06-13 15:07:44 +00001322/* s.settimeout(timeout) method. Argument:
1323 None -- no timeout, blocking mode; same as setblocking(True)
1324 0.0 -- non-blocking mode; same as setblocking(False)
1325 > 0 -- timeout mode; operations time out after timeout seconds
1326 < 0 -- illegal; raises an exception
1327*/
Guido van Rossum67f7a382002-06-06 21:08:16 +00001328static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001329sock_settimeout(PySocketSockObject *s, PyObject *arg)
Guido van Rossum67f7a382002-06-06 21:08:16 +00001330{
Guido van Rossum11ba0942002-06-13 15:07:44 +00001331 double timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001332
1333 if (arg == Py_None)
Guido van Rossum11ba0942002-06-13 15:07:44 +00001334 timeout = -1.0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001335 else {
Guido van Rossum11ba0942002-06-13 15:07:44 +00001336 timeout = PyFloat_AsDouble(arg);
1337 if (timeout < 0.0) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00001338 if (!PyErr_Occurred())
1339 PyErr_SetString(PyExc_ValueError,
Guido van Rossum11ba0942002-06-13 15:07:44 +00001340 "Timeout value out of range");
Guido van Rossum67f7a382002-06-06 21:08:16 +00001341 return NULL;
1342 }
1343 }
1344
Guido van Rossum11ba0942002-06-13 15:07:44 +00001345 s->sock_timeout = timeout;
1346 internal_setblocking(s, timeout < 0.0);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001347
1348 Py_INCREF(Py_None);
1349 return Py_None;
1350}
1351
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001352PyDoc_STRVAR(settimeout_doc,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001353"settimeout(timeout)\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00001354\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00001355Set a timeout on socket operations. 'timeout' can be a float,\n\
1356giving in seconds, or None. Setting a timeout of None disables\n\
1357the timeout feature and is equivalent to setblocking(1).\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001358Setting a timeout of zero is the same as setblocking(0).");
Guido van Rossum67f7a382002-06-06 21:08:16 +00001359
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001360/* s.gettimeout() method.
1361 Returns the timeout associated with a socket. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00001362static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001363sock_gettimeout(PySocketSockObject *s)
Guido van Rossum67f7a382002-06-06 21:08:16 +00001364{
1365 if (s->sock_timeout < 0.0) {
1366 Py_INCREF(Py_None);
1367 return Py_None;
1368 }
1369 else
1370 return PyFloat_FromDouble(s->sock_timeout);
1371}
1372
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001373PyDoc_STRVAR(gettimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00001374"gettimeout() -> timeout\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00001375\n\
1376Returns the timeout in floating seconds associated with socket \n\
1377operations. A timeout of None indicates that timeouts on socket \n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001378operations are disabled.");
Guido van Rossume4485b01994-09-07 14:32:49 +00001379
Guido van Rossum48a680c2001-03-02 06:34:14 +00001380#ifdef RISCOS
1381/* s.sleeptaskw(1 | 0) method */
1382
1383static PyObject *
Martin v. Löwisa94568a2003-05-10 07:36:56 +00001384sock_sleeptaskw(PySocketSockObject *s,PyObject *arg)
Guido van Rossum48a680c2001-03-02 06:34:14 +00001385{
Guido van Rossum67f7a382002-06-06 21:08:16 +00001386 int block;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00001387 block = PyInt_AsLong(arg);
1388 if (block == -1 && PyErr_Occurred())
Guido van Rossum67f7a382002-06-06 21:08:16 +00001389 return NULL;
1390 Py_BEGIN_ALLOW_THREADS
1391 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
1392 Py_END_ALLOW_THREADS
Guido van Rossum48a680c2001-03-02 06:34:14 +00001393
Guido van Rossum67f7a382002-06-06 21:08:16 +00001394 Py_INCREF(Py_None);
1395 return Py_None;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001396}
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001397PyDoc_STRVAR(sleeptaskw_doc,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001398"sleeptaskw(flag)\n\
1399\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001400Allow sleeps in taskwindows.");
Guido van Rossum48a680c2001-03-02 06:34:14 +00001401#endif
1402
1403
Guido van Rossumaee08791992-09-08 09:05:33 +00001404/* s.setsockopt() method.
1405 With an integer third argument, sets an integer option.
1406 With a string third argument, sets an option from a buffer;
1407 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001408
Guido van Rossum73624e91994-10-10 17:59:00 +00001409static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001410sock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001411{
1412 int level;
1413 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001414 int res;
Guido van Rossumaee08791992-09-08 09:05:33 +00001415 char *buf;
1416 int buflen;
1417 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001418
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001419 if (PyArg_ParseTuple(args, "iii:setsockopt",
1420 &level, &optname, &flag)) {
Guido van Rossumaee08791992-09-08 09:05:33 +00001421 buf = (char *) &flag;
1422 buflen = sizeof flag;
1423 }
1424 else {
Guido van Rossum73624e91994-10-10 17:59:00 +00001425 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001426 if (!PyArg_ParseTuple(args, "iis#:setsockopt",
1427 &level, &optname, &buf, &buflen))
Guido van Rossumaee08791992-09-08 09:05:33 +00001428 return NULL;
1429 }
Thomas Wouters334fb892000-07-25 12:56:38 +00001430 res = setsockopt(s->sock_fd, level, optname, (void *)buf, buflen);
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001431 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001432 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001433 Py_INCREF(Py_None);
1434 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001435}
1436
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001437PyDoc_STRVAR(setsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001438"setsockopt(level, option, value)\n\
1439\n\
1440Set a socket option. See the Unix manual for level and option.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001441The value argument can either be an integer or a string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001442
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001443
Guido van Rossumaee08791992-09-08 09:05:33 +00001444/* s.getsockopt() method.
1445 With two arguments, retrieves an integer option.
1446 With a third integer argument, retrieves a string buffer of that size;
1447 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001448
Guido van Rossum73624e91994-10-10 17:59:00 +00001449static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001450sock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001451{
1452 int level;
1453 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001454 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +00001455 PyObject *buf;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001456 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001457
Guido van Rossumbcc20741998-08-04 22:53:56 +00001458#ifdef __BEOS__
Fred Drake564a6cc2001-05-11 20:12:26 +00001459 /* We have incomplete socket support. */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001460 PyErr_SetString(socket_error, "getsockopt not supported");
Guido van Rossumbcc20741998-08-04 22:53:56 +00001461 return NULL;
1462#else
1463
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001464 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
1465 &level, &optname, &buflen))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001466 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001467
Guido van Rossumbe32c891996-06-20 16:25:29 +00001468 if (buflen == 0) {
Guido van Rossumaee08791992-09-08 09:05:33 +00001469 int flag = 0;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001470 socklen_t flagsize = sizeof flag;
Guido van Rossumb376a4a1993-11-23 17:53:17 +00001471 res = getsockopt(s->sock_fd, level, optname,
Thomas Wouters334fb892000-07-25 12:56:38 +00001472 (void *)&flag, &flagsize);
Guido van Rossumaee08791992-09-08 09:05:33 +00001473 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001474 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001475 return PyInt_FromLong(flag);
Guido van Rossumaee08791992-09-08 09:05:33 +00001476 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001477#ifdef __VMS
1478 if (buflen > 1024) {
1479#else
Guido van Rossumaee08791992-09-08 09:05:33 +00001480 if (buflen <= 0 || buflen > 1024) {
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001481#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001482 PyErr_SetString(socket_error,
Barry Warsaw752300b1997-01-03 17:18:10 +00001483 "getsockopt buflen out of range");
Guido van Rossumaee08791992-09-08 09:05:33 +00001484 return NULL;
1485 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001486 buf = PyString_FromStringAndSize((char *)NULL, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001487 if (buf == NULL)
1488 return NULL;
Guido van Rossumb376a4a1993-11-23 17:53:17 +00001489 res = getsockopt(s->sock_fd, level, optname,
Fred Drake564a6cc2001-05-11 20:12:26 +00001490 (void *)PyString_AS_STRING(buf), &buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001491 if (res < 0) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001492 Py_DECREF(buf);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001493 return s->errorhandler();
Guido van Rossumaee08791992-09-08 09:05:33 +00001494 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001495 _PyString_Resize(&buf, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001496 return buf;
Guido van Rossumbcc20741998-08-04 22:53:56 +00001497#endif /* __BEOS__ */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001498}
1499
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001500PyDoc_STRVAR(getsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001501"getsockopt(level, option[, buffersize]) -> value\n\
1502\n\
1503Get a socket option. See the Unix manual for level and option.\n\
1504If a nonzero buffersize argument is given, the return value is a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001505string of that length; otherwise it is an integer.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001506
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001507
Fred Drake728819a2000-07-01 03:40:12 +00001508/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001509
Guido van Rossum73624e91994-10-10 17:59:00 +00001510static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001511sock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001512{
1513 struct sockaddr *addr;
1514 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001515 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001516
Fred Drake728819a2000-07-01 03:40:12 +00001517 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001518 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001519 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001520 res = bind(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001521 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001522 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001523 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001524 Py_INCREF(Py_None);
1525 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001526}
1527
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001528PyDoc_STRVAR(bind_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001529"bind(address)\n\
1530\n\
1531Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00001532pair (host, port); the host must refer to the local host. For raw packet\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001533sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001534
Guido van Rossum30a685f1991-06-27 15:51:29 +00001535
1536/* s.close() method.
1537 Set the file descriptor to -1 so operations tried subsequently
1538 will surely fail. */
1539
Guido van Rossum73624e91994-10-10 17:59:00 +00001540static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001541sock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001542{
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001543 SOCKET_T fd;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001544
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001545 if ((fd = s->sock_fd) != -1) {
1546 s->sock_fd = -1;
Guido van Rossum08481461996-10-12 14:07:22 +00001547 Py_BEGIN_ALLOW_THREADS
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001548 (void) SOCKETCLOSE(fd);
Guido van Rossum08481461996-10-12 14:07:22 +00001549 Py_END_ALLOW_THREADS
1550 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001551 Py_INCREF(Py_None);
1552 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001553}
1554
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001555PyDoc_STRVAR(close_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001556"close()\n\
1557\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001558Close the socket. It cannot be used after this call.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001559
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001560static int
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001561internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen,
1562 int *timeoutp)
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001563{
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001564 int res, timeout;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001565
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001566 timeout = 0;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001567 res = connect(s->sock_fd, addr, addrlen);
1568
1569#ifdef MS_WINDOWS
1570
1571 if (s->sock_timeout > 0.0) {
1572 if (res < 0 && WSAGetLastError() == WSAEWOULDBLOCK) {
Guido van Rossumb76bdf82003-02-19 17:50:16 +00001573 /* This is a mess. Best solution: trust select */
1574 fd_set fds;
1575 struct timeval tv;
1576 tv.tv_sec = (int)s->sock_timeout;
1577 tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6);
1578 FD_ZERO(&fds);
1579 FD_SET(s->sock_fd, &fds);
1580 res = select(s->sock_fd+1, NULL, &fds, NULL, &tv);
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001581 if (res == 0) {
Guido van Rossumb76bdf82003-02-19 17:50:16 +00001582 res = WSAEWOULDBLOCK;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001583 timeout = 1;
1584 } else if (res > 0)
Guido van Rossumb76bdf82003-02-19 17:50:16 +00001585 res = 0;
1586 /* else if (res < 0) an error occurred */
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001587 }
1588 }
1589
1590 if (res < 0)
1591 res = WSAGetLastError();
1592
1593#else
1594
1595 if (s->sock_timeout > 0.0) {
1596 if (res < 0 && errno == EINPROGRESS) {
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001597 timeout = internal_select(s, 1);
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001598 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum12e3c712002-08-08 20:39:30 +00001599 if (res < 0 && errno == EISCONN)
1600 res = 0;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001601 }
1602 }
1603
1604 if (res < 0)
1605 res = errno;
1606
1607#endif
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001608 *timeoutp = timeout;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001609
1610 return res;
1611}
Guido van Rossum30a685f1991-06-27 15:51:29 +00001612
Fred Drake728819a2000-07-01 03:40:12 +00001613/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001614
Guido van Rossum73624e91994-10-10 17:59:00 +00001615static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001616sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001617{
1618 struct sockaddr *addr;
1619 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001620 int res;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001621 int timeout;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001622
Fred Drake728819a2000-07-01 03:40:12 +00001623 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001624 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001625
Guido van Rossum73624e91994-10-10 17:59:00 +00001626 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001627 res = internal_connect(s, addr, addrlen, &timeout);
Guido van Rossum11ba0942002-06-13 15:07:44 +00001628 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001629
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001630 if (timeout) {
1631 PyErr_SetString(socket_timeout, "timed out");
1632 return NULL;
1633 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001634 if (res != 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001635 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001636 Py_INCREF(Py_None);
1637 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001638}
1639
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001640PyDoc_STRVAR(connect_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001641"connect(address)\n\
1642\n\
1643Connect the socket to a remote address. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001644is a pair (host, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001645
Guido van Rossum30a685f1991-06-27 15:51:29 +00001646
Fred Drake728819a2000-07-01 03:40:12 +00001647/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001648
1649static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001650sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001651{
1652 struct sockaddr *addr;
1653 int addrlen;
1654 int res;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001655 int timeout;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001656
Fred Drake728819a2000-07-01 03:40:12 +00001657 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001658 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001659
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001660 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001661 res = internal_connect(s, addr, addrlen, &timeout);
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001662 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001663
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001664 return PyInt_FromLong((long) res);
1665}
1666
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001667PyDoc_STRVAR(connect_ex_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00001668"connect_ex(address) -> errno\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00001669\n\
1670This is like connect(address), but returns an error code (the errno value)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001671instead of raising an exception when an error occurs.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001672
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001673
Guido van Rossumed233a51992-06-23 09:07:03 +00001674/* s.fileno() method */
1675
Guido van Rossum73624e91994-10-10 17:59:00 +00001676static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001677sock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00001678{
Fred Drakea04eaad2000-06-30 02:46:07 +00001679#if SIZEOF_SOCKET_T <= SIZEOF_LONG
Guido van Rossum73624e91994-10-10 17:59:00 +00001680 return PyInt_FromLong((long) s->sock_fd);
Fred Drakea04eaad2000-06-30 02:46:07 +00001681#else
Martin v. Löwisb9a0f912003-03-29 10:06:18 +00001682 return PyLong_FromLongLong((PY_LONG_LONG)s->sock_fd);
Fred Drakea04eaad2000-06-30 02:46:07 +00001683#endif
Guido van Rossumed233a51992-06-23 09:07:03 +00001684}
1685
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001686PyDoc_STRVAR(fileno_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001687"fileno() -> integer\n\
1688\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001689Return the integer file descriptor of the socket.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001690
Guido van Rossumed233a51992-06-23 09:07:03 +00001691
Guido van Rossumbe32c891996-06-20 16:25:29 +00001692#ifndef NO_DUP
1693/* s.dup() method */
1694
1695static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001696sock_dup(PySocketSockObject *s)
Guido van Rossumbe32c891996-06-20 16:25:29 +00001697{
Fred Drakea04eaad2000-06-30 02:46:07 +00001698 SOCKET_T newfd;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001699 PyObject *sock;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001700
Guido van Rossumbe32c891996-06-20 16:25:29 +00001701 newfd = dup(s->sock_fd);
1702 if (newfd < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001703 return s->errorhandler();
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001704 sock = (PyObject *) new_sockobject(newfd,
1705 s->sock_family,
1706 s->sock_type,
1707 s->sock_proto);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001708 if (sock == NULL)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001709 SOCKETCLOSE(newfd);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001710 return sock;
1711}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001712
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001713PyDoc_STRVAR(dup_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001714"dup() -> socket object\n\
1715\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001716Return a new socket object connected to the same system resource.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001717
Guido van Rossumbe32c891996-06-20 16:25:29 +00001718#endif
1719
1720
Guido van Rossumc89705d1992-11-26 08:54:07 +00001721/* s.getsockname() method */
1722
Guido van Rossum73624e91994-10-10 17:59:00 +00001723static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001724sock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001725{
1726 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001727 int res;
1728 socklen_t addrlen;
1729
Guido van Rossumc89705d1992-11-26 08:54:07 +00001730 if (!getsockaddrlen(s, &addrlen))
1731 return NULL;
Guido van Rossumca42b161996-01-12 01:36:05 +00001732 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001733 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001734 res = getsockname(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001735 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001736 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001737 return s->errorhandler();
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001738 return makesockaddr(s->sock_fd, (struct sockaddr *) addrbuf, addrlen);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001739}
1740
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001741PyDoc_STRVAR(getsockname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001742"getsockname() -> address info\n\
1743\n\
1744Return the address of the local endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001745info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001746
Guido van Rossumc89705d1992-11-26 08:54:07 +00001747
Guido van Rossumb6775db1994-08-01 11:34:53 +00001748#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001749/* s.getpeername() method */
1750
Guido van Rossum73624e91994-10-10 17:59:00 +00001751static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001752sock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001753{
1754 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001755 int res;
1756 socklen_t addrlen;
1757
Guido van Rossumc89705d1992-11-26 08:54:07 +00001758 if (!getsockaddrlen(s, &addrlen))
1759 return NULL;
Fred Drakefd168342001-05-09 19:11:33 +00001760 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001761 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001762 res = getpeername(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001763 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001764 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001765 return s->errorhandler();
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001766 return makesockaddr(s->sock_fd, (struct sockaddr *) addrbuf, addrlen);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001767}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001768
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001769PyDoc_STRVAR(getpeername_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001770"getpeername() -> address info\n\
1771\n\
1772Return the address of the remote endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001773info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001774
Guido van Rossumb6775db1994-08-01 11:34:53 +00001775#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001776
1777
Guido van Rossum30a685f1991-06-27 15:51:29 +00001778/* s.listen(n) method */
1779
Guido van Rossum73624e91994-10-10 17:59:00 +00001780static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001781sock_listen(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001782{
1783 int backlog;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001784 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001785
1786 backlog = PyInt_AsLong(arg);
1787 if (backlog == -1 && PyErr_Occurred())
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001788 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001789 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +00001790 if (backlog < 1)
1791 backlog = 1;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001792 res = listen(s->sock_fd, backlog);
Guido van Rossum73624e91994-10-10 17:59:00 +00001793 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001794 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001795 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001796 Py_INCREF(Py_None);
1797 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001798}
1799
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001800PyDoc_STRVAR(listen_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001801"listen(backlog)\n\
1802\n\
1803Enable a server to accept connections. The backlog argument must be at\n\
1804least 1; it specifies the number of unaccepted connection that the system\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001805will allow before refusing new connections.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001806
1807
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001808#ifndef NO_DUP
Guido van Rossum30a685f1991-06-27 15:51:29 +00001809/* s.makefile(mode) method.
1810 Create a new open file object referring to a dupped version of
1811 the socket's file descriptor. (The dup() call is necessary so
1812 that the open file and socket objects may be closed independent
1813 of each other.)
1814 The mode argument specifies 'r' or 'w' passed to fdopen(). */
1815
Guido van Rossum73624e91994-10-10 17:59:00 +00001816static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001817sock_makefile(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001818{
Tim Petersdbd9ba62000-07-09 03:09:57 +00001819 extern int fclose(FILE *);
Guido van Rossum6b144911995-03-14 15:05:13 +00001820 char *mode = "r";
1821 int bufsize = -1;
Fred Drakea04eaad2000-06-30 02:46:07 +00001822#ifdef MS_WIN32
Tim Peters79248aa2001-08-29 21:37:10 +00001823 Py_intptr_t fd;
Fred Drakea04eaad2000-06-30 02:46:07 +00001824#else
Guido van Rossum30a685f1991-06-27 15:51:29 +00001825 int fd;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001826#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001827 FILE *fp;
Guido van Rossum6b144911995-03-14 15:05:13 +00001828 PyObject *f;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001829#ifdef __VMS
1830 char *mode_r = "r";
1831 char *mode_w = "w";
1832#endif
Guido van Rossum6b144911995-03-14 15:05:13 +00001833
Guido van Rossum43713e52000-02-29 13:59:29 +00001834 if (!PyArg_ParseTuple(args, "|si:makefile", &mode, &bufsize))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001835 return NULL;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001836#ifdef __VMS
1837 if (strcmp(mode,"rb") == 0) {
1838 mode = mode_r;
1839 }
1840 else {
1841 if (strcmp(mode,"wb") == 0) {
1842 mode = mode_w;
1843 }
1844 }
1845#endif
Guido van Rossum8d665e61996-06-26 18:22:49 +00001846#ifdef MS_WIN32
Guido van Rossum82a5c661998-07-07 20:45:43 +00001847 if (((fd = _open_osfhandle(s->sock_fd, _O_BINARY)) < 0) ||
1848 ((fd = dup(fd)) < 0) || ((fp = fdopen(fd, mode)) == NULL))
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001849#else
Guido van Rossum82a5c661998-07-07 20:45:43 +00001850 if ((fd = dup(s->sock_fd)) < 0 || (fp = fdopen(fd, mode)) == NULL)
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001851#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001852 {
Guido van Rossum6b144911995-03-14 15:05:13 +00001853 if (fd >= 0)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001854 SOCKETCLOSE(fd);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001855 return s->errorhandler();
Guido van Rossum6b144911995-03-14 15:05:13 +00001856 }
1857 f = PyFile_FromFile(fp, "<socket>", mode, fclose);
1858 if (f != NULL)
1859 PyFile_SetBufSize(f, bufsize);
1860 return f;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001861}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001862
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001863PyDoc_STRVAR(makefile_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001864"makefile([mode[, buffersize]]) -> file object\n\
1865\n\
1866Return a regular file object corresponding to the socket.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001867The mode and buffersize arguments are as for the built-in open() function.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001868
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001869#endif /* NO_DUP */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001870
Guido van Rossum48a680c2001-03-02 06:34:14 +00001871
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001872/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001873
Guido van Rossum73624e91994-10-10 17:59:00 +00001874static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001875sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001876{
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001877 int len, n = 0, flags = 0, timeout;
Guido van Rossum73624e91994-10-10 17:59:00 +00001878 PyObject *buf;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001879#ifdef __VMS
1880 int read_length;
1881 char *read_buf;
1882#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00001883
Guido van Rossum43713e52000-02-29 13:59:29 +00001884 if (!PyArg_ParseTuple(args, "i|i:recv", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001885 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001886
1887 if (len < 0) {
Martin v. Löwisfba64e12001-11-19 10:41:26 +00001888 PyErr_SetString(PyExc_ValueError,
Guido van Rossum11ba0942002-06-13 15:07:44 +00001889 "negative buffersize in recv");
Martin v. Löwisfba64e12001-11-19 10:41:26 +00001890 return NULL;
1891 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00001892
Guido van Rossum73624e91994-10-10 17:59:00 +00001893 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001894 if (buf == NULL)
1895 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001896
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001897#ifndef __VMS
Guido van Rossum73624e91994-10-10 17:59:00 +00001898 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001899 timeout = internal_select(s, 0);
1900 if (!timeout)
1901 n = recv(s->sock_fd, PyString_AS_STRING(buf), len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001902 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001903
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001904 if (timeout) {
1905 Py_DECREF(buf);
1906 PyErr_SetString(socket_timeout, "timed out");
1907 return NULL;
1908 }
Guido van Rossum7c53b771995-09-13 18:39:47 +00001909 if (n < 0) {
1910 Py_DECREF(buf);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001911 return s->errorhandler();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001912 }
Tim Peters5de98422002-04-27 18:44:32 +00001913 if (n != len)
1914 _PyString_Resize(&buf, n);
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001915#else
1916 read_buf = PyString_AsString(buf);
1917 read_length = len;
1918 while (read_length != 0) {
1919 unsigned int segment;
1920
1921 segment = read_length /SEGMENT_SIZE;
1922 if (segment != 0) {
1923 segment = SEGMENT_SIZE;
1924 }
1925 else {
1926 segment = read_length;
1927 }
1928
1929 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001930 timeout = internal_select(s, 0);
1931 if (!timeout)
1932 n = recv(s->sock_fd, read_buf, segment, flags);
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001933 Py_END_ALLOW_THREADS
1934
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001935 if (timeout) {
1936 Py_DECREF(buf);
1937 PyErr_SetString(socket_timeout, "timed out");
1938 return NULL;
1939 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001940 if (n < 0) {
1941 Py_DECREF(buf);
1942 return s->errorhandler();
1943 }
1944 if (n != read_length) {
1945 read_buf += n;
1946 break;
1947 }
1948
1949 read_length -= segment;
1950 read_buf += segment;
1951 }
1952 if (_PyString_Resize(&buf, (read_buf - PyString_AsString(buf))) < 0)
1953 {
1954 return NULL;
1955 }
1956#endif /* !__VMS */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001957 return buf;
1958}
1959
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001960PyDoc_STRVAR(recv_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001961"recv(buffersize[, flags]) -> data\n\
1962\n\
1963Receive up to buffersize bytes from the socket. For the optional flags\n\
1964argument, see the Unix manual. When no data is available, block until\n\
1965at least one byte is available or until the remote end is closed. When\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001966the remote end is closed and all data is read, return the empty string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001967
Guido van Rossum30a685f1991-06-27 15:51:29 +00001968
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001969/* s.recvfrom(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001970
Guido van Rossum73624e91994-10-10 17:59:00 +00001971static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001972sock_recvfrom(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001973{
1974 char addrbuf[256];
Barry Warsaw752300b1997-01-03 17:18:10 +00001975 PyObject *buf = NULL;
1976 PyObject *addr = NULL;
1977 PyObject *ret = NULL;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001978 int len, n = 0, flags = 0, timeout;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001979 socklen_t addrlen;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001980
Guido van Rossum43713e52000-02-29 13:59:29 +00001981 if (!PyArg_ParseTuple(args, "i|i:recvfrom", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001982 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001983
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001984 if (!getsockaddrlen(s, &addrlen))
1985 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001986 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001987 if (buf == NULL)
1988 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001989
Guido van Rossum73624e91994-10-10 17:59:00 +00001990 Py_BEGIN_ALLOW_THREADS
Fred Drakefd168342001-05-09 19:11:33 +00001991 memset(addrbuf, 0, addrlen);
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001992 timeout = internal_select(s, 0);
1993 if (!timeout)
1994 n = recvfrom(s->sock_fd, PyString_AS_STRING(buf), len, flags,
Guido van Rossum8d665e61996-06-26 18:22:49 +00001995#ifndef MS_WINDOWS
Andrew MacIntyreba43e872002-03-03 03:03:52 +00001996#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001997 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001998#else
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001999 (void *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00002000#endif
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002001#else
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002002 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002003#endif
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002004 );
Guido van Rossum73624e91994-10-10 17:59:00 +00002005 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002006
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002007 if (timeout) {
2008 Py_DECREF(buf);
2009 PyErr_SetString(socket_timeout, "timed out");
2010 return NULL;
2011 }
Guido van Rossum7c53b771995-09-13 18:39:47 +00002012 if (n < 0) {
2013 Py_DECREF(buf);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002014 return s->errorhandler();
Guido van Rossum7c53b771995-09-13 18:39:47 +00002015 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002016
Guido van Rossum53a9bf81996-06-11 18:35:24 +00002017 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002018 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002019
Guido van Rossum67f7a382002-06-06 21:08:16 +00002020 if (!(addr = makesockaddr(s->sock_fd, (struct sockaddr *)addrbuf,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002021 addrlen)))
Barry Warsaw752300b1997-01-03 17:18:10 +00002022 goto finally;
2023
Raymond Hettinger8ae46892003-10-12 19:09:37 +00002024 ret = PyTuple_Pack(2, buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002025
2026finally:
Guido van Rossum73624e91994-10-10 17:59:00 +00002027 Py_XDECREF(addr);
2028 Py_XDECREF(buf);
Guido van Rossum6f5afc91993-02-05 09:46:15 +00002029 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002030}
2031
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002032PyDoc_STRVAR(recvfrom_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002033"recvfrom(buffersize[, flags]) -> (data, address info)\n\
2034\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002035Like recv(buffersize, flags) but also return the sender's address info.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002036
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002037/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002038
Guido van Rossum73624e91994-10-10 17:59:00 +00002039static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002040sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002041{
Guido van Rossumff4949e1992-08-05 19:58:53 +00002042 char *buf;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002043 int len, n = 0, flags = 0, timeout;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002044#ifdef __VMS
2045 int send_length;
2046#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00002047
Guido van Rossum43713e52000-02-29 13:59:29 +00002048 if (!PyArg_ParseTuple(args, "s#|i:send", &buf, &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00002049 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002050
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002051#ifndef __VMS
Guido van Rossum73624e91994-10-10 17:59:00 +00002052 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002053 timeout = internal_select(s, 1);
2054 if (!timeout)
2055 n = send(s->sock_fd, buf, len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00002056 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002057
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002058 if (timeout) {
2059 PyErr_SetString(socket_timeout, "timed out");
2060 return NULL;
2061 }
Guido van Rossum30a685f1991-06-27 15:51:29 +00002062 if (n < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002063 return s->errorhandler();
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002064#else
2065 /* Divide packet into smaller segments for */
2066 /* TCP/IP Services for OpenVMS */
2067 send_length = len;
2068 while (send_length != 0) {
2069 unsigned int segment;
2070
2071 segment = send_length / SEGMENT_SIZE;
2072 if (segment != 0) {
2073 segment = SEGMENT_SIZE;
2074 }
2075 else {
2076 segment = send_length;
2077 }
2078 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002079 timeout = internal_select(s, 1);
2080 if (!timeout)
2081 n = send(s->sock_fd, buf, segment, flags);
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002082 Py_END_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002083 if (timeout) {
2084 PyErr_SetString(socket_timeout, "timed out");
2085 return NULL;
2086 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002087 if (n < 0) {
2088 return s->errorhandler();
2089 }
2090 send_length -= segment;
2091 buf += segment;
2092 } /* end while */
2093#endif /* !__VMS */
Guido van Rossum73624e91994-10-10 17:59:00 +00002094 return PyInt_FromLong((long)n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00002095}
2096
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002097PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002098"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002099\n\
2100Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002101argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002102sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002103
2104
2105/* s.sendall(data [,flags]) method */
2106
2107static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002108sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002109{
2110 char *buf;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002111 int len, n = 0, flags = 0, timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002112
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002113 if (!PyArg_ParseTuple(args, "s#|i:sendall", &buf, &len, &flags))
2114 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002115
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002116 Py_BEGIN_ALLOW_THREADS
2117 do {
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002118 timeout = internal_select(s, 1);
2119 if (timeout)
2120 break;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002121 n = send(s->sock_fd, buf, len, flags);
2122 if (n < 0)
2123 break;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002124 buf += n;
2125 len -= n;
2126 } while (len > 0);
2127 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002128
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002129 if (timeout) {
2130 PyErr_SetString(socket_timeout, "timed out");
2131 return NULL;
2132 }
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002133 if (n < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002134 return s->errorhandler();
Guido van Rossum67f7a382002-06-06 21:08:16 +00002135
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002136 Py_INCREF(Py_None);
2137 return Py_None;
2138}
2139
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002140PyDoc_STRVAR(sendall_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002141"sendall(data[, flags])\n\
2142\n\
2143Send a data string to the socket. For the optional flags\n\
2144argument, see the Unix manual. This calls send() repeatedly\n\
2145until all data is sent. If an error occurs, it's impossible\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002146to tell how much data has been sent.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002147
Guido van Rossum30a685f1991-06-27 15:51:29 +00002148
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002149/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002150
Guido van Rossum73624e91994-10-10 17:59:00 +00002151static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002152sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002153{
Guido van Rossum73624e91994-10-10 17:59:00 +00002154 PyObject *addro;
Guido van Rossumff4949e1992-08-05 19:58:53 +00002155 char *buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002156 struct sockaddr *addr;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002157 int addrlen, len, n = 0, flags, timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002158
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002159 flags = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002160 if (!PyArg_ParseTuple(args, "s#O:sendto", &buf, &len, &addro)) {
Guido van Rossum73624e91994-10-10 17:59:00 +00002161 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002162 if (!PyArg_ParseTuple(args, "s#iO:sendto",
2163 &buf, &len, &flags, &addro))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002164 return NULL;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002165 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002166
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002167 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002168 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002169
Guido van Rossum73624e91994-10-10 17:59:00 +00002170 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002171 timeout = internal_select(s, 1);
2172 if (!timeout)
2173 n = sendto(s->sock_fd, buf, len, flags, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00002174 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002175
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002176 if (timeout) {
2177 PyErr_SetString(socket_timeout, "timed out");
2178 return NULL;
2179 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002180 if (n < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002181 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00002182 return PyInt_FromLong((long)n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002183}
2184
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002185PyDoc_STRVAR(sendto_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002186"sendto(data[, flags], address) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002187\n\
2188Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002189For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002190
Guido van Rossum30a685f1991-06-27 15:51:29 +00002191
2192/* s.shutdown(how) method */
2193
Guido van Rossum73624e91994-10-10 17:59:00 +00002194static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002195sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002196{
2197 int how;
Guido van Rossumff4949e1992-08-05 19:58:53 +00002198 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002199
2200 how = PyInt_AsLong(arg);
2201 if (how == -1 && PyErr_Occurred())
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002202 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00002203 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002204 res = shutdown(s->sock_fd, how);
Guido van Rossum73624e91994-10-10 17:59:00 +00002205 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002206 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002207 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00002208 Py_INCREF(Py_None);
2209 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002210}
2211
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002212PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002213"shutdown(flag)\n\
2214\n\
Martin v. Löwis94681fc2003-11-27 19:40:22 +00002215Shut down the reading side of the socket (flag == SHUT_RD), the writing side\n\
2216of the socket (flag == SHUT_WR), or both ends (flag == SHUT_RDWR).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002217
Guido van Rossum30a685f1991-06-27 15:51:29 +00002218
2219/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002220
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002221static PyMethodDef sock_methods[] = {
2222 {"accept", (PyCFunction)sock_accept, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002223 accept_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002224 {"bind", (PyCFunction)sock_bind, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002225 bind_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002226 {"close", (PyCFunction)sock_close, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002227 close_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002228 {"connect", (PyCFunction)sock_connect, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002229 connect_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002230 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002231 connect_ex_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00002232#ifndef NO_DUP
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002233 {"dup", (PyCFunction)sock_dup, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002234 dup_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00002235#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002236 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002237 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00002238#ifdef HAVE_GETPEERNAME
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002239 {"getpeername", (PyCFunction)sock_getpeername,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002240 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00002241#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002242 {"getsockname", (PyCFunction)sock_getsockname,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002243 METH_NOARGS, getsockname_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002244 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002245 getsockopt_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002246 {"listen", (PyCFunction)sock_listen, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002247 listen_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002248#ifndef NO_DUP
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002249 {"makefile", (PyCFunction)sock_makefile, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002250 makefile_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002251#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002252 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002253 recv_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002254 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002255 recvfrom_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002256 {"send", (PyCFunction)sock_send, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002257 send_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002258 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002259 sendall_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002260 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002261 sendto_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002262 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002263 setblocking_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002264 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
Guido van Rossum67f7a382002-06-06 21:08:16 +00002265 settimeout_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002266 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
Guido van Rossum67f7a382002-06-06 21:08:16 +00002267 gettimeout_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002268 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002269 setsockopt_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002270 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002271 shutdown_doc},
2272#ifdef RISCOS
Martin v. Löwisa94568a2003-05-10 07:36:56 +00002273 {"sleeptaskw", (PyCFunction)sock_sleeptaskw, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002274 sleeptaskw_doc},
2275#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +00002276 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002277};
2278
Guido van Rossum30a685f1991-06-27 15:51:29 +00002279
Guido van Rossum73624e91994-10-10 17:59:00 +00002280/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00002281 First close the file description. */
2282
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002283static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002284sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002285{
Guido van Rossumfa972c92000-04-10 12:45:45 +00002286 if (s->sock_fd != -1)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00002287 (void) SOCKETCLOSE(s->sock_fd);
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002288 s->ob_type->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002289}
2290
Guido van Rossum30a685f1991-06-27 15:51:29 +00002291
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002292static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002293sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002294{
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002295 char buf[512];
Fred Drakea04eaad2000-06-30 02:46:07 +00002296#if SIZEOF_SOCKET_T > SIZEOF_LONG
2297 if (s->sock_fd > LONG_MAX) {
2298 /* this can occur on Win64, and actually there is a special
2299 ugly printf formatter for decimal pointer length integer
2300 printing, only bother if necessary*/
2301 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002302 "no printf formatter to display "
2303 "the socket descriptor in decimal");
Fred Drakea04eaad2000-06-30 02:46:07 +00002304 return NULL;
2305 }
2306#endif
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002307 PyOS_snprintf(
2308 buf, sizeof(buf),
2309 "<socket object, fd=%ld, family=%d, type=%d, protocol=%d>",
2310 (long)s->sock_fd, s->sock_family,
2311 s->sock_type,
2312 s->sock_proto);
Guido van Rossumdc1c64a1996-02-27 15:21:19 +00002313 return PyString_FromString(buf);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002314}
2315
2316
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002317/* Create a new, uninitialized socket object. */
2318
2319static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002320sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002321{
2322 PyObject *new;
2323
2324 new = type->tp_alloc(type, 0);
Guido van Rossume1c478f2002-06-06 20:08:25 +00002325 if (new != NULL) {
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002326 ((PySocketSockObject *)new)->sock_fd = -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002327 ((PySocketSockObject *)new)->sock_timeout = -1.0;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002328 ((PySocketSockObject *)new)->errorhandler = &set_error;
Guido van Rossume1c478f2002-06-06 20:08:25 +00002329 }
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002330 return new;
2331}
2332
2333
2334/* Initialize a new socket object. */
2335
2336/*ARGSUSED*/
2337static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00002338sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002339{
2340 PySocketSockObject *s = (PySocketSockObject *)self;
2341 SOCKET_T fd;
2342 int family = AF_INET, type = SOCK_STREAM, proto = 0;
2343 static char *keywords[] = {"family", "type", "proto", 0};
2344
2345 if (!PyArg_ParseTupleAndKeywords(args, kwds,
2346 "|iii:socket", keywords,
2347 &family, &type, &proto))
2348 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002349
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002350 Py_BEGIN_ALLOW_THREADS
2351 fd = socket(family, type, proto);
2352 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002353
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002354#ifdef MS_WINDOWS
2355 if (fd == INVALID_SOCKET)
2356#else
2357 if (fd < 0)
2358#endif
2359 {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002360 set_error();
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002361 return -1;
2362 }
2363 init_sockobject(s, fd, family, type, proto);
2364 /* From now on, ignore SIGPIPE and let the error checking
2365 do the work. */
2366#ifdef SIGPIPE
2367 (void) signal(SIGPIPE, SIG_IGN);
2368#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00002369
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002370 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002371
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002372}
2373
2374
Guido van Rossumb6775db1994-08-01 11:34:53 +00002375/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002376
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002377static PyTypeObject sock_type = {
Guido van Rossum55558541996-05-23 22:54:50 +00002378 PyObject_HEAD_INIT(0) /* Must fill in type value later */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002379 0, /* ob_size */
Guido van Rossumca6dfa52001-10-28 12:31:33 +00002380 "_socket.socket", /* tp_name */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002381 sizeof(PySocketSockObject), /* tp_basicsize */
2382 0, /* tp_itemsize */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002383 (destructor)sock_dealloc, /* tp_dealloc */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002384 0, /* tp_print */
2385 0, /* tp_getattr */
2386 0, /* tp_setattr */
2387 0, /* tp_compare */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002388 (reprfunc)sock_repr, /* tp_repr */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002389 0, /* tp_as_number */
2390 0, /* tp_as_sequence */
2391 0, /* tp_as_mapping */
2392 0, /* tp_hash */
2393 0, /* tp_call */
2394 0, /* tp_str */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002395 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002396 0, /* tp_setattro */
2397 0, /* tp_as_buffer */
2398 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002399 sock_doc, /* tp_doc */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002400 0, /* tp_traverse */
2401 0, /* tp_clear */
2402 0, /* tp_richcompare */
2403 0, /* tp_weaklistoffset */
2404 0, /* tp_iter */
2405 0, /* tp_iternext */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002406 sock_methods, /* tp_methods */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002407 0, /* tp_members */
2408 0, /* tp_getset */
2409 0, /* tp_base */
2410 0, /* tp_dict */
2411 0, /* tp_descr_get */
2412 0, /* tp_descr_set */
2413 0, /* tp_dictoffset */
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00002414 sock_initobj, /* tp_init */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002415 PyType_GenericAlloc, /* tp_alloc */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002416 sock_new, /* tp_new */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002417 PyObject_Del, /* tp_free */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002418};
2419
Guido van Rossum30a685f1991-06-27 15:51:29 +00002420
Guido van Rossum81194471991-07-27 21:42:02 +00002421/* Python interface to gethostname(). */
2422
2423/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002424static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002425socket_gethostname(PyObject *self, PyObject *args)
Guido van Rossum81194471991-07-27 21:42:02 +00002426{
2427 char buf[1024];
Guido van Rossumff4949e1992-08-05 19:58:53 +00002428 int res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002429 if (!PyArg_ParseTuple(args, ":gethostname"))
Guido van Rossum81194471991-07-27 21:42:02 +00002430 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00002431 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002432 res = gethostname(buf, (int) sizeof buf - 1);
Guido van Rossum73624e91994-10-10 17:59:00 +00002433 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002434 if (res < 0)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002435 return set_error();
Guido van Rossum81194471991-07-27 21:42:02 +00002436 buf[sizeof buf - 1] = '\0';
Guido van Rossum73624e91994-10-10 17:59:00 +00002437 return PyString_FromString(buf);
Guido van Rossum81194471991-07-27 21:42:02 +00002438}
Guido van Rossumff4949e1992-08-05 19:58:53 +00002439
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002440PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002441"gethostname() -> string\n\
2442\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002443Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002444
Guido van Rossumff4949e1992-08-05 19:58:53 +00002445
Guido van Rossum30a685f1991-06-27 15:51:29 +00002446/* Python interface to gethostbyname(name). */
2447
2448/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002449static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002450socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002451{
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002452 char *name;
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00002453#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002454 struct sockaddr_storage addrbuf;
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00002455#else
2456 struct sockaddr_in addrbuf;
2457#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002458
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002459 if (!PyArg_ParseTuple(args, "s:gethostbyname", &name))
Guido van Rossum30a685f1991-06-27 15:51:29 +00002460 return NULL;
Martin v. Löwisddc6f472002-07-28 16:10:31 +00002461 if (setipaddr(name, (struct sockaddr *)&addrbuf, sizeof(addrbuf), AF_INET) < 0)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002462 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002463 return makeipaddr((struct sockaddr *)&addrbuf,
2464 sizeof(struct sockaddr_in));
Guido van Rossum30a685f1991-06-27 15:51:29 +00002465}
2466
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002467PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002468"gethostbyname(host) -> address\n\
2469\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002470Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002471
2472
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002473/* Convenience function common to gethostbyname_ex and gethostbyaddr */
2474
2475static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002476gethost_common(struct hostent *h, struct sockaddr *addr, int alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002477{
2478 char **pch;
2479 PyObject *rtn_tuple = (PyObject *)NULL;
2480 PyObject *name_list = (PyObject *)NULL;
2481 PyObject *addr_list = (PyObject *)NULL;
2482 PyObject *tmp;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002483
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002484 if (h == NULL) {
Guido van Rossum48a680c2001-03-02 06:34:14 +00002485 /* Let's get real error message to return */
Guido van Rossume2ae77b2001-10-24 20:42:55 +00002486#ifndef RISCOS
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002487 set_herror(h_errno);
Guido van Rossume2ae77b2001-10-24 20:42:55 +00002488#else
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002489 PyErr_SetString(socket_error, "host not found");
Guido van Rossume2ae77b2001-10-24 20:42:55 +00002490#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002491 return NULL;
2492 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002493
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002494 if (h->h_addrtype != af) {
2495#ifdef HAVE_STRERROR
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002496 /* Let's get real error message to return */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002497 PyErr_SetString(socket_error,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002498 (char *)strerror(EAFNOSUPPORT));
2499#else
2500 PyErr_SetString(
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002501 socket_error,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002502 "Address family not supported by protocol family");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002503#endif
2504 return NULL;
2505 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002506
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002507 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00002508
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002509 case AF_INET:
2510 if (alen < sizeof(struct sockaddr_in))
2511 return NULL;
2512 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002513
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002514#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002515 case AF_INET6:
2516 if (alen < sizeof(struct sockaddr_in6))
2517 return NULL;
2518 break;
2519#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00002520
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002521 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002522
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002523 if ((name_list = PyList_New(0)) == NULL)
2524 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002525
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002526 if ((addr_list = PyList_New(0)) == NULL)
2527 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002528
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002529 for (pch = h->h_aliases; *pch != NULL; pch++) {
2530 int status;
2531 tmp = PyString_FromString(*pch);
2532 if (tmp == NULL)
2533 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002534
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002535 status = PyList_Append(name_list, tmp);
2536 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002537
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002538 if (status)
2539 goto err;
2540 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002541
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002542 for (pch = h->h_addr_list; *pch != NULL; pch++) {
2543 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002544
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002545 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00002546
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002547 case AF_INET:
2548 {
2549 struct sockaddr_in sin;
2550 memset(&sin, 0, sizeof(sin));
2551 sin.sin_family = af;
2552#ifdef HAVE_SOCKADDR_SA_LEN
2553 sin.sin_len = sizeof(sin);
2554#endif
2555 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
2556 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
Guido van Rossum67f7a382002-06-06 21:08:16 +00002557
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002558 if (pch == h->h_addr_list && alen >= sizeof(sin))
2559 memcpy((char *) addr, &sin, sizeof(sin));
2560 break;
2561 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002562
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002563#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002564 case AF_INET6:
2565 {
2566 struct sockaddr_in6 sin6;
2567 memset(&sin6, 0, sizeof(sin6));
2568 sin6.sin6_family = af;
2569#ifdef HAVE_SOCKADDR_SA_LEN
2570 sin6.sin6_len = sizeof(sin6);
2571#endif
2572 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
2573 tmp = makeipaddr((struct sockaddr *)&sin6,
2574 sizeof(sin6));
Guido van Rossum67f7a382002-06-06 21:08:16 +00002575
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002576 if (pch == h->h_addr_list && alen >= sizeof(sin6))
2577 memcpy((char *) addr, &sin6, sizeof(sin6));
2578 break;
2579 }
2580#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00002581
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002582 default: /* can't happen */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002583 PyErr_SetString(socket_error,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002584 "unsupported address family");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002585 return NULL;
2586 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002587
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002588 if (tmp == NULL)
2589 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002590
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002591 status = PyList_Append(addr_list, tmp);
2592 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002593
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002594 if (status)
2595 goto err;
2596 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002597
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002598 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002599
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002600 err:
2601 Py_XDECREF(name_list);
2602 Py_XDECREF(addr_list);
2603 return rtn_tuple;
2604}
2605
2606
2607/* Python interface to gethostbyname_ex(name). */
2608
2609/*ARGSUSED*/
2610static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002611socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002612{
2613 char *name;
2614 struct hostent *h;
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00002615#ifdef ENABLE_IPV6
2616 struct sockaddr_storage addr;
2617#else
2618 struct sockaddr_in addr;
2619#endif
Martin v. Löwis9db2f572001-07-23 01:30:10 +00002620 struct sockaddr *sa;
Guido van Rossum955becc1999-03-22 20:14:53 +00002621 PyObject *ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002622#ifdef HAVE_GETHOSTBYNAME_R
2623 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002624#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
2625 struct hostent_data data;
2626#else
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002627 char buf[16384];
2628 int buf_len = (sizeof buf) - 1;
2629 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002630#endif
2631#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002632 int result;
2633#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002634#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002635
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002636 if (!PyArg_ParseTuple(args, "s:gethostbyname_ex", &name))
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002637 return NULL;
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00002638 if (setipaddr(name, (struct sockaddr *)&addr, sizeof(addr), AF_INET) < 0)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002639 return NULL;
2640 Py_BEGIN_ALLOW_THREADS
2641#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002642#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002643 result = gethostbyname_r(name, &hp_allocated, buf, buf_len,
2644 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002645#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002646 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002647#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00002648 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002649 result = gethostbyname_r(name, &hp_allocated, &data);
2650 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002651#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002652#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00002653#ifdef USE_GETHOSTBYNAME_LOCK
Just van Rossum1040d2c2003-05-09 07:53:18 +00002654 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002655#endif
2656 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002657#endif /* HAVE_GETHOSTBYNAME_R */
2658 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002659 /* Some C libraries would require addr.__ss_family instead of
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002660 addr.ss_family.
2661 Therefore, we cast the sockaddr_storage into sockaddr to
2662 access sa_family. */
Martin v. Löwis9db2f572001-07-23 01:30:10 +00002663 sa = (struct sockaddr*)&addr;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002664 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr),
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002665 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00002666#ifdef USE_GETHOSTBYNAME_LOCK
Just van Rossum1040d2c2003-05-09 07:53:18 +00002667 PyThread_release_lock(netdb_lock);
Guido van Rossum955becc1999-03-22 20:14:53 +00002668#endif
2669 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002670}
2671
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002672PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002673"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
2674\n\
2675Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002676for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002677
2678
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002679/* Python interface to gethostbyaddr(IP). */
2680
2681/*ARGSUSED*/
2682static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002683socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002684{
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002685#ifdef ENABLE_IPV6
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002686 struct sockaddr_storage addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002687#else
Guido van Rossum48a680c2001-03-02 06:34:14 +00002688 struct sockaddr_in addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002689#endif
2690 struct sockaddr *sa = (struct sockaddr *)&addr;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002691 char *ip_num;
2692 struct hostent *h;
Guido van Rossum3baaa131999-03-22 21:44:51 +00002693 PyObject *ret;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002694#ifdef HAVE_GETHOSTBYNAME_R
2695 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002696#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
2697 struct hostent_data data;
2698#else
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002699 char buf[16384];
2700 int buf_len = (sizeof buf) - 1;
2701 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002702#endif
2703#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002704 int result;
2705#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002706#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002707 char *ap;
2708 int al;
2709 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002710
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002711 if (!PyArg_ParseTuple(args, "s:gethostbyaddr", &ip_num))
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002712 return NULL;
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00002713 af = AF_UNSPEC;
Martin v. Löwisddc6f472002-07-28 16:10:31 +00002714 if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002715 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002716 af = sa->sa_family;
2717 ap = NULL;
2718 al = 0;
2719 switch (af) {
2720 case AF_INET:
2721 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
2722 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
2723 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002724#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002725 case AF_INET6:
2726 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
2727 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
2728 break;
2729#endif
2730 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002731 PyErr_SetString(socket_error, "unsupported address family");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002732 return NULL;
2733 }
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002734 Py_BEGIN_ALLOW_THREADS
2735#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002736#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002737 result = gethostbyaddr_r(ap, al, af,
2738 &hp_allocated, buf, buf_len,
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002739 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002740#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002741 h = gethostbyaddr_r(ap, al, af,
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002742 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002743#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00002744 memset((void *) &data, '\0', sizeof(data));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002745 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002746 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002747#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002748#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00002749#ifdef USE_GETHOSTBYNAME_LOCK
Just van Rossum1040d2c2003-05-09 07:53:18 +00002750 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002751#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002752 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002753#endif /* HAVE_GETHOSTBYNAME_R */
2754 Py_END_ALLOW_THREADS
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002755 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00002756#ifdef USE_GETHOSTBYNAME_LOCK
Just van Rossum1040d2c2003-05-09 07:53:18 +00002757 PyThread_release_lock(netdb_lock);
Guido van Rossum3baaa131999-03-22 21:44:51 +00002758#endif
2759 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002760}
2761
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002762PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002763"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
2764\n\
2765Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002766for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002767
Guido van Rossum30a685f1991-06-27 15:51:29 +00002768
2769/* Python interface to getservbyname(name).
2770 This only returns the port number, since the other info is already
2771 known or not useful (like the list of aliases). */
2772
2773/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002774static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002775socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002776{
Guido van Rossumff4949e1992-08-05 19:58:53 +00002777 char *name, *proto;
Guido van Rossum30a685f1991-06-27 15:51:29 +00002778 struct servent *sp;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002779 if (!PyArg_ParseTuple(args, "ss:getservbyname", &name, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +00002780 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00002781 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002782 sp = getservbyname(name, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00002783 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00002784 if (sp == NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002785 PyErr_SetString(socket_error, "service/proto not found");
Guido van Rossum30a685f1991-06-27 15:51:29 +00002786 return NULL;
2787 }
Guido van Rossum73624e91994-10-10 17:59:00 +00002788 return PyInt_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00002789}
2790
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002791PyDoc_STRVAR(getservbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002792"getservbyname(servicename, protocolname) -> integer\n\
2793\n\
2794Return a port number from a service name and protocol name.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002795The protocol name should be 'tcp' or 'udp'.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002796
Guido van Rossum30a685f1991-06-27 15:51:29 +00002797
Guido van Rossum3901d851996-12-19 16:35:04 +00002798/* Python interface to getprotobyname(name).
2799 This only returns the protocol number, since the other info is
2800 already known or not useful (like the list of aliases). */
2801
2802/*ARGSUSED*/
2803static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002804socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00002805{
2806 char *name;
2807 struct protoent *sp;
Guido van Rossumbcc20741998-08-04 22:53:56 +00002808#ifdef __BEOS__
2809/* Not available in BeOS yet. - [cjh] */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002810 PyErr_SetString(socket_error, "getprotobyname not supported");
Guido van Rossumbcc20741998-08-04 22:53:56 +00002811 return NULL;
2812#else
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002813 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
Guido van Rossum3901d851996-12-19 16:35:04 +00002814 return NULL;
2815 Py_BEGIN_ALLOW_THREADS
2816 sp = getprotobyname(name);
2817 Py_END_ALLOW_THREADS
2818 if (sp == NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002819 PyErr_SetString(socket_error, "protocol not found");
Guido van Rossum3901d851996-12-19 16:35:04 +00002820 return NULL;
2821 }
2822 return PyInt_FromLong((long) sp->p_proto);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002823#endif
Guido van Rossum3901d851996-12-19 16:35:04 +00002824}
2825
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002826PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002827"getprotobyname(name) -> integer\n\
2828\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002829Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002830
Guido van Rossum3901d851996-12-19 16:35:04 +00002831
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002832#ifndef NO_DUP
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002833/* Create a socket object from a numeric file description.
2834 Useful e.g. if stdin is a socket.
2835 Additional arguments as for socket(). */
2836
2837/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002838static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002839socket_fromfd(PyObject *self, PyObject *args)
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002840{
Guido van Rossum73624e91994-10-10 17:59:00 +00002841 PySocketSockObject *s;
Fred Drakea04eaad2000-06-30 02:46:07 +00002842 SOCKET_T fd;
2843 int family, type, proto = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002844 if (!PyArg_ParseTuple(args, "iii|i:fromfd",
2845 &fd, &family, &type, &proto))
Guido van Rossumbe32c891996-06-20 16:25:29 +00002846 return NULL;
Guido van Rossum5f59d601992-12-14 16:59:51 +00002847 /* Dup the fd so it and the socket can be closed independently */
2848 fd = dup(fd);
2849 if (fd < 0)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002850 return set_error();
2851 s = new_sockobject(fd, family, type, proto);
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002852 /* From now on, ignore SIGPIPE and let the error checking
2853 do the work. */
Guido van Rossum48a680c2001-03-02 06:34:14 +00002854#ifdef SIGPIPE
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002855 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum48a680c2001-03-02 06:34:14 +00002856#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00002857 return (PyObject *) s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002858}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002859
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002860PyDoc_STRVAR(fromfd_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002861"fromfd(fd, family, type[, proto]) -> socket object\n\
2862\n\
2863Create a socket object from the given file descriptor.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002864The remaining arguments are the same as for socket().");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002865
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002866#endif /* NO_DUP */
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002867
Guido van Rossum82a5c661998-07-07 20:45:43 +00002868
Guido van Rossum006bf911996-06-12 04:04:55 +00002869static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002870socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002871{
2872 int x1, x2;
2873
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002874 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002875 return NULL;
2876 }
2877 x2 = (int)ntohs((short)x1);
2878 return PyInt_FromLong(x2);
2879}
2880
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002881PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002882"ntohs(integer) -> integer\n\
2883\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002884Convert a 16-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002885
2886
Guido van Rossum006bf911996-06-12 04:04:55 +00002887static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002888socket_ntohl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00002889{
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002890 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00002891
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002892 if (PyInt_Check(arg)) {
2893 x = PyInt_AS_LONG(arg);
Jeremy Hylton825e47b2002-07-25 16:37:51 +00002894 if (x == (unsigned long) -1 && PyErr_Occurred())
2895 return NULL;
Guido van Rossum006bf911996-06-12 04:04:55 +00002896 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002897 else if (PyLong_Check(arg)) {
2898 x = PyLong_AsUnsignedLong(arg);
Jeremy Hylton825e47b2002-07-25 16:37:51 +00002899 if (x == (unsigned long) -1 && PyErr_Occurred())
2900 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002901#if SIZEOF_LONG > 4
2902 {
2903 unsigned long y;
2904 /* only want the trailing 32 bits */
2905 y = x & 0xFFFFFFFFUL;
2906 if (y ^ x)
2907 return PyErr_Format(PyExc_OverflowError,
2908 "long int larger than 32 bits");
2909 x = y;
Tim Peters58141872002-08-06 22:25:02 +00002910 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002911#endif
2912 }
2913 else
Tim Peters58141872002-08-06 22:25:02 +00002914 return PyErr_Format(PyExc_TypeError,
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002915 "expected int/long, %s found",
2916 arg->ob_type->tp_name);
2917 if (x == (unsigned long) -1 && PyErr_Occurred())
2918 return NULL;
2919 return PyInt_FromLong(ntohl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00002920}
2921
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002922PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002923"ntohl(integer) -> integer\n\
2924\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002925Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002926
2927
Guido van Rossum006bf911996-06-12 04:04:55 +00002928static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002929socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002930{
Hye-Shik Changa7b673f2003-12-17 09:40:23 +00002931 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00002932
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002933 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002934 return NULL;
2935 }
2936 x2 = (int)htons((short)x1);
2937 return PyInt_FromLong(x2);
2938}
2939
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002940PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002941"htons(integer) -> integer\n\
2942\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002943Convert a 16-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002944
2945
Guido van Rossum006bf911996-06-12 04:04:55 +00002946static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002947socket_htonl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00002948{
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002949 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00002950
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002951 if (PyInt_Check(arg)) {
2952 x = PyInt_AS_LONG(arg);
Jeremy Hylton825e47b2002-07-25 16:37:51 +00002953 if (x == (unsigned long) -1 && PyErr_Occurred())
2954 return NULL;
Guido van Rossum006bf911996-06-12 04:04:55 +00002955 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002956 else if (PyLong_Check(arg)) {
2957 x = PyLong_AsUnsignedLong(arg);
Jeremy Hylton825e47b2002-07-25 16:37:51 +00002958 if (x == (unsigned long) -1 && PyErr_Occurred())
2959 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002960#if SIZEOF_LONG > 4
2961 {
2962 unsigned long y;
2963 /* only want the trailing 32 bits */
2964 y = x & 0xFFFFFFFFUL;
2965 if (y ^ x)
2966 return PyErr_Format(PyExc_OverflowError,
2967 "long int larger than 32 bits");
2968 x = y;
Tim Peters58141872002-08-06 22:25:02 +00002969 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002970#endif
2971 }
2972 else
Tim Peters58141872002-08-06 22:25:02 +00002973 return PyErr_Format(PyExc_TypeError,
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002974 "expected int/long, %s found",
2975 arg->ob_type->tp_name);
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002976 return PyInt_FromLong(htonl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00002977}
2978
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002979PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002980"htonl(integer) -> integer\n\
2981\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002982Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002983
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002984/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002985
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002986PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002987"inet_aton(string) -> packed 32-bit IP representation\n\
2988\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002989Convert 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 +00002990binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002991
2992static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002993socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002994{
Guido van Rossuma2e48551999-09-09 15:42:59 +00002995#ifndef INADDR_NONE
2996#define INADDR_NONE (-1)
2997#endif
Neal Norwitz88f115b2003-02-13 02:15:42 +00002998#ifdef HAVE_INET_ATON
Guido van Rossumad05cdf2003-02-12 23:08:22 +00002999 struct in_addr buf;
Tim Peters1df9fdd2003-02-13 03:13:40 +00003000#else
3001 /* Have to use inet_addr() instead */
3002 unsigned long packed_addr;
3003#endif
3004 char *ip_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003005
Tim Peters1df9fdd2003-02-13 03:13:40 +00003006 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003007 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003008
Tim Peters1df9fdd2003-02-13 03:13:40 +00003009
3010#ifdef HAVE_INET_ATON
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003011 if (inet_aton(ip_addr, &buf))
3012 return PyString_FromStringAndSize((char *)(&buf),
3013 sizeof(buf));
3014
3015 PyErr_SetString(socket_error,
3016 "illegal IP address string passed to inet_aton");
3017 return NULL;
3018
Tim Peters1df9fdd2003-02-13 03:13:40 +00003019#else /* ! HAVE_INET_ATON */
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003020 /* XXX Problem here: inet_aton('255.255.255.255') raises
3021 an exception while it should be a valid address. */
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003022 packed_addr = inet_addr(ip_addr);
3023
3024 if (packed_addr == INADDR_NONE) { /* invalid address */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003025 PyErr_SetString(socket_error,
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003026 "illegal IP address string passed to inet_aton");
3027 return NULL;
3028 }
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003029 return PyString_FromStringAndSize((char *) &packed_addr,
3030 sizeof(packed_addr));
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003031#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003032}
3033
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003034PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00003035"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003036\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003037Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003038
3039static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003040socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003041{
3042 char *packed_str;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003043 int addr_len;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003044 struct in_addr packed_addr;
3045
Guido van Rossum27fc3c02000-03-24 20:56:56 +00003046 if (!PyArg_ParseTuple(args, "s#:inet_ntoa", &packed_str, &addr_len)) {
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003047 return NULL;
3048 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00003049
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003050 if (addr_len != sizeof(packed_addr)) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003051 PyErr_SetString(socket_error,
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003052 "packed IP wrong length for inet_ntoa");
3053 return NULL;
3054 }
3055
3056 memcpy(&packed_addr, packed_str, addr_len);
3057
3058 return PyString_FromString(inet_ntoa(packed_addr));
3059}
Guido van Rossum82a5c661998-07-07 20:45:43 +00003060
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003061#ifdef HAVE_INET_PTON
3062
3063PyDoc_STRVAR(inet_pton_doc,
3064"inet_pton(af, ip) -> packed IP address string\n\
3065\n\
3066Convert an IP address from string format to a packed string suitable\n\
3067for use with low-level network functions.");
3068
3069static PyObject *
3070socket_inet_pton(PyObject *self, PyObject *args)
3071{
3072 int af;
3073 char* ip;
3074 int retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003075#ifdef ENABLE_IPV6
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003076 char packed[MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003077#else
3078 char packed[sizeof(struct in_addr)];
3079#endif
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003080 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
3081 return NULL;
3082 }
3083
Martin v. Löwis10649092003-08-05 06:25:06 +00003084#ifndef ENABLE_IPV6
3085 if(af == AF_INET6) {
3086 PyErr_SetString(socket_error,
3087 "can't use AF_INET6, IPv6 is disabled");
3088 return NULL;
3089 }
3090#endif
3091
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003092 retval = inet_pton(af, ip, packed);
3093 if (retval < 0) {
3094 PyErr_SetFromErrno(socket_error);
3095 return NULL;
3096 } else if (retval == 0) {
3097 PyErr_SetString(socket_error,
3098 "illegal IP address string passed to inet_pton");
3099 return NULL;
3100 } else if (af == AF_INET) {
3101 return PyString_FromStringAndSize(packed,
3102 sizeof(struct in_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003103#ifdef ENABLE_IPV6
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003104 } else if (af == AF_INET6) {
3105 return PyString_FromStringAndSize(packed,
3106 sizeof(struct in6_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003107#endif
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003108 } else {
3109 PyErr_SetString(socket_error, "unknown address family");
3110 return NULL;
3111 }
3112}
3113
3114PyDoc_STRVAR(inet_ntop_doc,
3115"inet_ntop(af, packed_ip) -> string formatted IP address\n\
3116\n\
3117Convert a packed IP address of the given family to string format.");
3118
3119static PyObject *
3120socket_inet_ntop(PyObject *self, PyObject *args)
3121{
3122 int af;
3123 char* packed;
3124 int len;
3125 const char* retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003126#ifdef ENABLE_IPV6
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003127 char ip[MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003128#else
3129 char ip[INET_ADDRSTRLEN + 1];
3130#endif
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003131
3132 /* Guarantee NUL-termination for PyString_FromString() below */
3133 memset((void *) &ip[0], '\0', sizeof(ip) + 1);
3134
3135 if (!PyArg_ParseTuple(args, "is#:inet_ntop", &af, &packed, &len)) {
3136 return NULL;
3137 }
3138
3139 if (af == AF_INET) {
3140 if (len != sizeof(struct in_addr)) {
3141 PyErr_SetString(PyExc_ValueError,
3142 "invalid length of packed IP address string");
3143 return NULL;
3144 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003145#ifdef ENABLE_IPV6
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003146 } else if (af == AF_INET6) {
3147 if (len != sizeof(struct in6_addr)) {
3148 PyErr_SetString(PyExc_ValueError,
3149 "invalid length of packed IP address string");
3150 return NULL;
3151 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003152#endif
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003153 } else {
3154 PyErr_Format(PyExc_ValueError,
3155 "unknown address family %d", af);
3156 return NULL;
3157 }
3158
3159 retval = inet_ntop(af, packed, ip, sizeof(ip));
3160 if (!retval) {
3161 PyErr_SetFromErrno(socket_error);
3162 return NULL;
3163 } else {
3164 return PyString_FromString(retval);
3165 }
3166
3167 /* NOTREACHED */
3168 PyErr_SetString(PyExc_RuntimeError, "invalid handling of inet_ntop");
3169 return NULL;
3170}
3171
3172#endif /* HAVE_INET_PTON */
3173
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003174/* Python interface to getaddrinfo(host, port). */
3175
3176/*ARGSUSED*/
3177static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003178socket_getaddrinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003179{
Martin v. Löwisf0b11d22001-11-07 08:31:03 +00003180 struct addrinfo hints, *res;
3181 struct addrinfo *res0 = NULL;
Martin v. Löwis2548c732003-04-18 10:39:54 +00003182 PyObject *hobj = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003183 PyObject *pobj = (PyObject *)NULL;
Martin v. Löwisf65b1a12001-08-12 09:28:40 +00003184 char pbuf[30];
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003185 char *hptr, *pptr;
3186 int family, socktype, protocol, flags;
3187 int error;
3188 PyObject *all = (PyObject *)NULL;
3189 PyObject *single = (PyObject *)NULL;
Martin v. Löwis2548c732003-04-18 10:39:54 +00003190 PyObject *idna = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003191
3192 family = socktype = protocol = flags = 0;
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00003193 family = AF_UNSPEC;
Martin v. Löwis2548c732003-04-18 10:39:54 +00003194 if (!PyArg_ParseTuple(args, "OO|iiii:getaddrinfo",
3195 &hobj, &pobj, &family, &socktype,
3196 &protocol, &flags)) {
3197 return NULL;
3198 }
3199 if (hobj == Py_None) {
3200 hptr = NULL;
3201 } else if (PyUnicode_Check(hobj)) {
3202 idna = PyObject_CallMethod(hobj, "encode", "s", "idna");
3203 if (!idna)
3204 return NULL;
3205 hptr = PyString_AsString(idna);
3206 } else if (PyString_Check(hobj)) {
3207 hptr = PyString_AsString(hobj);
3208 } else {
3209 PyErr_SetString(PyExc_TypeError,
3210 "getaddrinfo() argument 1 must be string or None");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003211 return NULL;
3212 }
3213 if (PyInt_Check(pobj)) {
Marc-André Lemburg03d1b182001-07-31 18:05:33 +00003214 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", PyInt_AsLong(pobj));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003215 pptr = pbuf;
3216 } else if (PyString_Check(pobj)) {
3217 pptr = PyString_AsString(pobj);
3218 } else if (pobj == Py_None) {
3219 pptr = (char *)NULL;
3220 } else {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003221 PyErr_SetString(socket_error, "Int or String expected");
Martin v. Löwis5db099a2003-08-07 11:55:15 +00003222 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003223 }
3224 memset(&hints, 0, sizeof(hints));
3225 hints.ai_family = family;
3226 hints.ai_socktype = socktype;
3227 hints.ai_protocol = protocol;
3228 hints.ai_flags = flags;
Just van Rossum1040d2c2003-05-09 07:53:18 +00003229 Py_BEGIN_ALLOW_THREADS
3230 ACQUIRE_GETADDRINFO_LOCK
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003231 error = getaddrinfo(hptr, pptr, &hints, &res0);
Just van Rossum1040d2c2003-05-09 07:53:18 +00003232 Py_END_ALLOW_THREADS
3233 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003234 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003235 set_gaierror(error);
Martin v. Löwis5db099a2003-08-07 11:55:15 +00003236 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003237 }
3238
3239 if ((all = PyList_New(0)) == NULL)
3240 goto err;
3241 for (res = res0; res; res = res->ai_next) {
Guido van Rossum716aac02001-10-12 18:59:27 +00003242 PyObject *addr =
3243 makesockaddr(-1, res->ai_addr, res->ai_addrlen);
3244 if (addr == NULL)
3245 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003246 single = Py_BuildValue("iiisO", res->ai_family,
3247 res->ai_socktype, res->ai_protocol,
3248 res->ai_canonname ? res->ai_canonname : "",
Guido van Rossum716aac02001-10-12 18:59:27 +00003249 addr);
3250 Py_DECREF(addr);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003251 if (single == NULL)
3252 goto err;
3253
3254 if (PyList_Append(all, single))
3255 goto err;
3256 Py_XDECREF(single);
3257 }
Martin v. Löwis2548c732003-04-18 10:39:54 +00003258 Py_XDECREF(idna);
Neal Norwitz90128ba2002-08-09 03:37:42 +00003259 if (res0)
3260 freeaddrinfo(res0);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003261 return all;
3262 err:
3263 Py_XDECREF(single);
3264 Py_XDECREF(all);
Martin v. Löwis2548c732003-04-18 10:39:54 +00003265 Py_XDECREF(idna);
Martin v. Löwisf0b11d22001-11-07 08:31:03 +00003266 if (res0)
3267 freeaddrinfo(res0);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003268 return (PyObject *)NULL;
3269}
3270
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003271PyDoc_STRVAR(getaddrinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003272"getaddrinfo(host, port [, family, socktype, proto, flags])\n\
3273 -> list of (family, socktype, proto, canonname, sockaddr)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003274\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003275Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003276
3277/* Python interface to getnameinfo(sa, flags). */
3278
3279/*ARGSUSED*/
3280static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003281socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003282{
3283 PyObject *sa = (PyObject *)NULL;
3284 int flags;
3285 char *hostp;
Martin v. Löwis06b1d212001-11-02 23:34:52 +00003286 int port, flowinfo, scope_id;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003287 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
3288 struct addrinfo hints, *res = NULL;
3289 int error;
3290 PyObject *ret = (PyObject *)NULL;
3291
3292 flags = flowinfo = scope_id = 0;
Martin v. Löwis06b1d212001-11-02 23:34:52 +00003293 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003294 return NULL;
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003295 if (!PyArg_ParseTuple(sa, "si|ii",
3296 &hostp, &port, &flowinfo, &scope_id))
Martin v. Löwis06b1d212001-11-02 23:34:52 +00003297 return NULL;
Marc-André Lemburg03d1b182001-07-31 18:05:33 +00003298 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003299 memset(&hints, 0, sizeof(hints));
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00003300 hints.ai_family = AF_UNSPEC;
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003301 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Just van Rossum1040d2c2003-05-09 07:53:18 +00003302 Py_BEGIN_ALLOW_THREADS
3303 ACQUIRE_GETADDRINFO_LOCK
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003304 error = getaddrinfo(hostp, pbuf, &hints, &res);
Just van Rossum1040d2c2003-05-09 07:53:18 +00003305 Py_END_ALLOW_THREADS
3306 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003307 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003308 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003309 goto fail;
3310 }
3311 if (res->ai_next) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003312 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003313 "sockaddr resolved to multiple addresses");
3314 goto fail;
3315 }
3316 switch (res->ai_family) {
3317 case AF_INET:
3318 {
3319 char *t1;
3320 int t2;
3321 if (PyArg_ParseTuple(sa, "si", &t1, &t2) == 0) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003322 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003323 "IPv4 sockaddr must be 2 tuple");
3324 goto fail;
3325 }
3326 break;
3327 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00003328#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003329 case AF_INET6:
3330 {
3331 struct sockaddr_in6 *sin6;
3332 sin6 = (struct sockaddr_in6 *)res->ai_addr;
3333 sin6->sin6_flowinfo = flowinfo;
3334 sin6->sin6_scope_id = scope_id;
3335 break;
3336 }
3337#endif
3338 }
3339 error = getnameinfo(res->ai_addr, res->ai_addrlen,
3340 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
3341 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003342 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003343 goto fail;
3344 }
3345 ret = Py_BuildValue("ss", hbuf, pbuf);
3346
3347fail:
3348 if (res)
3349 freeaddrinfo(res);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003350 return ret;
3351}
3352
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003353PyDoc_STRVAR(getnameinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003354"getnameinfo(sockaddr, flags) --> (host, port)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003355\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003356Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003357
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00003358
3359/* Python API to getting and setting the default timeout value. */
3360
3361static PyObject *
3362socket_getdefaulttimeout(PyObject *self)
3363{
3364 if (defaulttimeout < 0.0) {
3365 Py_INCREF(Py_None);
3366 return Py_None;
3367 }
3368 else
3369 return PyFloat_FromDouble(defaulttimeout);
3370}
3371
3372PyDoc_STRVAR(getdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003373"getdefaulttimeout() -> timeout\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00003374\n\
3375Returns the default timeout in floating seconds for new socket objects.\n\
3376A value of None indicates that new socket objects have no timeout.\n\
3377When the socket module is first imported, the default is None.");
3378
3379static PyObject *
3380socket_setdefaulttimeout(PyObject *self, PyObject *arg)
3381{
3382 double timeout;
3383
3384 if (arg == Py_None)
3385 timeout = -1.0;
3386 else {
3387 timeout = PyFloat_AsDouble(arg);
3388 if (timeout < 0.0) {
3389 if (!PyErr_Occurred())
3390 PyErr_SetString(PyExc_ValueError,
3391 "Timeout value out of range");
3392 return NULL;
3393 }
3394 }
3395
3396 defaulttimeout = timeout;
3397
3398 Py_INCREF(Py_None);
3399 return Py_None;
3400}
3401
3402PyDoc_STRVAR(setdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003403"setdefaulttimeout(timeout)\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00003404\n\
3405Set the default timeout in floating seconds for new socket objects.\n\
3406A value of None indicates that new socket objects have no timeout.\n\
3407When the socket module is first imported, the default is None.");
3408
3409
Guido van Rossum30a685f1991-06-27 15:51:29 +00003410/* List of functions exported by this module. */
3411
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003412static PyMethodDef socket_methods[] = {
3413 {"gethostbyname", socket_gethostbyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003414 METH_VARARGS, gethostbyname_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003415 {"gethostbyname_ex", socket_gethostbyname_ex,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003416 METH_VARARGS, ghbn_ex_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003417 {"gethostbyaddr", socket_gethostbyaddr,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003418 METH_VARARGS, gethostbyaddr_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003419 {"gethostname", socket_gethostname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003420 METH_VARARGS, gethostname_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003421 {"getservbyname", socket_getservbyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003422 METH_VARARGS, getservbyname_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003423 {"getprotobyname", socket_getprotobyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003424 METH_VARARGS,getprotobyname_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00003425#ifndef NO_DUP
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003426 {"fromfd", socket_fromfd,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003427 METH_VARARGS, fromfd_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00003428#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003429 {"ntohs", socket_ntohs,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003430 METH_VARARGS, ntohs_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003431 {"ntohl", socket_ntohl,
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003432 METH_O, ntohl_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003433 {"htons", socket_htons,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003434 METH_VARARGS, htons_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003435 {"htonl", socket_htonl,
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003436 METH_O, htonl_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003437 {"inet_aton", socket_inet_aton,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003438 METH_VARARGS, inet_aton_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003439 {"inet_ntoa", socket_inet_ntoa,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003440 METH_VARARGS, inet_ntoa_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003441#ifdef HAVE_INET_PTON
3442 {"inet_pton", socket_inet_pton,
3443 METH_VARARGS, inet_pton_doc},
3444 {"inet_ntop", socket_inet_ntop,
3445 METH_VARARGS, inet_ntop_doc},
3446#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003447 {"getaddrinfo", socket_getaddrinfo,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003448 METH_VARARGS, getaddrinfo_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003449 {"getnameinfo", socket_getnameinfo,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003450 METH_VARARGS, getnameinfo_doc},
Guido van Rossum1693ba82002-07-18 21:11:26 +00003451 {"getdefaulttimeout", (PyCFunction)socket_getdefaulttimeout,
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00003452 METH_NOARGS, getdefaulttimeout_doc},
3453 {"setdefaulttimeout", socket_setdefaulttimeout,
3454 METH_O, setdefaulttimeout_doc},
Guido van Rossum30a685f1991-06-27 15:51:29 +00003455 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003456};
3457
Guido van Rossum30a685f1991-06-27 15:51:29 +00003458
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003459#ifdef RISCOS
3460#define OS_INIT_DEFINED
Guido van Rossumbe32c891996-06-20 16:25:29 +00003461
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003462static int
3463os_init(void)
3464{
3465 _kernel_swi_regs r;
3466
3467 r.r[0] = 0;
3468 _kernel_swi(0x43380, &r, &r);
3469 taskwindow = r.r[0];
3470
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003471 return 1;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003472}
3473
3474#endif /* RISCOS */
3475
3476
3477#ifdef MS_WINDOWS
3478#define OS_INIT_DEFINED
3479
3480/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00003481
3482static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003483os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00003484{
3485 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00003486}
3487
3488static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003489os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00003490{
3491 WSADATA WSAData;
3492 int ret;
3493 char buf[100];
3494 ret = WSAStartup(0x0101, &WSAData);
3495 switch (ret) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003496 case 0: /* No error */
Mark Hammond14350ab2003-07-09 04:57:46 +00003497 Py_AtExit(os_cleanup);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003498 return 1; /* Success */
Guido van Rossumbe32c891996-06-20 16:25:29 +00003499 case WSASYSNOTREADY:
3500 PyErr_SetString(PyExc_ImportError,
3501 "WSAStartup failed: network not ready");
3502 break;
3503 case WSAVERNOTSUPPORTED:
3504 case WSAEINVAL:
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003505 PyErr_SetString(
3506 PyExc_ImportError,
3507 "WSAStartup failed: requested version not supported");
Guido van Rossumbe32c891996-06-20 16:25:29 +00003508 break;
3509 default:
Tim Peters885d4572001-11-28 20:27:42 +00003510 PyOS_snprintf(buf, sizeof(buf),
3511 "WSAStartup failed: error code %d", ret);
Guido van Rossumbe32c891996-06-20 16:25:29 +00003512 PyErr_SetString(PyExc_ImportError, buf);
3513 break;
3514 }
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003515 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00003516}
3517
Guido van Rossum8d665e61996-06-26 18:22:49 +00003518#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00003519
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003520
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003521#ifdef PYOS_OS2
3522#define OS_INIT_DEFINED
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003523
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003524/* Additional initialization for OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003525
3526static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003527os_init(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003528{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003529#ifndef PYCC_GCC
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003530 char reason[64];
3531 int rc = sock_init();
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003532
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003533 if (rc == 0) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003534 return 1; /* Success */
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003535 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003536
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003537 PyOS_snprintf(reason, sizeof(reason),
3538 "OS/2 TCP/IP Error# %d", sock_errno());
3539 PyErr_SetString(PyExc_ImportError, reason);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003540
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003541 return 0; /* Failure */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00003542#else
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003543 /* No need to initialise sockets with GCC/EMX */
3544 return 1; /* Success */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00003545#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003546}
3547
3548#endif /* PYOS_OS2 */
3549
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003550
3551#ifndef OS_INIT_DEFINED
3552static int
3553os_init(void)
3554{
3555 return 1; /* Success */
3556}
3557#endif
3558
3559
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00003560/* C API table - always add new things to the end for binary
3561 compatibility. */
3562static
3563PySocketModule_APIObject PySocketModuleAPI =
3564{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003565 &sock_type,
Brett Cannon06c34792004-03-23 23:16:54 +00003566 NULL
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00003567};
3568
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003569
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003570/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003571
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003572 This module is actually called "_socket", and there's a wrapper
3573 "socket.py" which implements some additional functionality. On some
3574 platforms (e.g. Windows and OS/2), socket.py also implements a
3575 wrapper for the socket type that provides missing functionality such
3576 as makefile(), dup() and fromfd(). The import of "_socket" may fail
3577 with an ImportError exception if os-specific initialization fails.
3578 On Windows, this does WINSOCK initialization. When WINSOCK is
3579 initialized succesfully, a call to WSACleanup() is scheduled to be
3580 made at exit time.
3581*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003582
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003583PyDoc_STRVAR(socket_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003584"Implementation module for socket operations.\n\
3585\n\
3586See the socket module for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003587
Mark Hammondfe51c6d2002-08-02 02:27:13 +00003588PyMODINIT_FUNC
Thomas Wouters1e0c2f42000-07-24 16:06:23 +00003589init_socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003590{
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003591 PyObject *m, *has_ipv6;
Fred Drake4baedc12002-04-01 14:53:37 +00003592
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003593 if (!os_init())
Guido van Rossum0cb96de1997-10-01 04:29:29 +00003594 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003595
3596 sock_type.ob_type = &PyType_Type;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003597 m = Py_InitModule3(PySocket_MODULE_NAME,
3598 socket_methods,
3599 socket_doc);
3600
3601 socket_error = PyErr_NewException("socket.error", NULL, NULL);
3602 if (socket_error == NULL)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003603 return;
Brett Cannon06c34792004-03-23 23:16:54 +00003604 PySocketModuleAPI.error = socket_error;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003605 Py_INCREF(socket_error);
3606 PyModule_AddObject(m, "error", socket_error);
3607 socket_herror = PyErr_NewException("socket.herror",
3608 socket_error, NULL);
3609 if (socket_herror == NULL)
3610 return;
3611 Py_INCREF(socket_herror);
3612 PyModule_AddObject(m, "herror", socket_herror);
3613 socket_gaierror = PyErr_NewException("socket.gaierror", socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003614 NULL);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003615 if (socket_gaierror == NULL)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003616 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003617 Py_INCREF(socket_gaierror);
3618 PyModule_AddObject(m, "gaierror", socket_gaierror);
Raymond Hettingeref7343c2003-06-29 03:08:05 +00003619 socket_timeout = PyErr_NewException("socket.timeout",
3620 socket_error, NULL);
3621 if (socket_timeout == NULL)
3622 return;
3623 Py_INCREF(socket_timeout);
3624 PyModule_AddObject(m, "timeout", socket_timeout);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003625 Py_INCREF((PyObject *)&sock_type);
Fred Drake4baedc12002-04-01 14:53:37 +00003626 if (PyModule_AddObject(m, "SocketType",
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003627 (PyObject *)&sock_type) != 0)
Guido van Rossum0cb96de1997-10-01 04:29:29 +00003628 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003629 Py_INCREF((PyObject *)&sock_type);
Fred Drake4baedc12002-04-01 14:53:37 +00003630 if (PyModule_AddObject(m, "socket",
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003631 (PyObject *)&sock_type) != 0)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003632 return;
Guido van Rossum09be4091999-08-09 14:40:40 +00003633
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003634#ifdef ENABLE_IPV6
3635 has_ipv6 = Py_True;
3636#else
3637 has_ipv6 = Py_False;
3638#endif
3639 Py_INCREF(has_ipv6);
3640 PyModule_AddObject(m, "has_ipv6", has_ipv6);
3641
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00003642 /* Export C API */
Fred Drake4baedc12002-04-01 14:53:37 +00003643 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00003644 PyCObject_FromVoidPtr((void *)&PySocketModuleAPI, NULL)
3645 ) != 0)
3646 return;
3647
Guido van Rossum09be4091999-08-09 14:40:40 +00003648 /* Address families (we only support AF_INET and AF_UNIX) */
3649#ifdef AF_UNSPEC
Fred Drake4baedc12002-04-01 14:53:37 +00003650 PyModule_AddIntConstant(m, "AF_UNSPEC", AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00003651#endif
Fred Drake4baedc12002-04-01 14:53:37 +00003652 PyModule_AddIntConstant(m, "AF_INET", AF_INET);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003653#ifdef AF_INET6
Fred Drake4baedc12002-04-01 14:53:37 +00003654 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003655#endif /* AF_INET6 */
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00003656#if defined(AF_UNIX)
Fred Drake4baedc12002-04-01 14:53:37 +00003657 PyModule_AddIntConstant(m, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00003658#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00003659#ifdef AF_AX25
Fred Drake4baedc12002-04-01 14:53:37 +00003660 /* Amateur Radio AX.25 */
3661 PyModule_AddIntConstant(m, "AF_AX25", AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00003662#endif
3663#ifdef AF_IPX
Fred Drake4baedc12002-04-01 14:53:37 +00003664 PyModule_AddIntConstant(m, "AF_IPX", AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00003665#endif
3666#ifdef AF_APPLETALK
Fred Drake4baedc12002-04-01 14:53:37 +00003667 /* Appletalk DDP */
3668 PyModule_AddIntConstant(m, "AF_APPLETALK", AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00003669#endif
3670#ifdef AF_NETROM
Fred Drake4baedc12002-04-01 14:53:37 +00003671 /* Amateur radio NetROM */
3672 PyModule_AddIntConstant(m, "AF_NETROM", AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00003673#endif
3674#ifdef AF_BRIDGE
Fred Drake4baedc12002-04-01 14:53:37 +00003675 /* Multiprotocol bridge */
3676 PyModule_AddIntConstant(m, "AF_BRIDGE", AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00003677#endif
3678#ifdef AF_AAL5
Fred Drake4baedc12002-04-01 14:53:37 +00003679 /* Reserved for Werner's ATM */
3680 PyModule_AddIntConstant(m, "AF_AAL5", AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00003681#endif
3682#ifdef AF_X25
Fred Drake4baedc12002-04-01 14:53:37 +00003683 /* Reserved for X.25 project */
3684 PyModule_AddIntConstant(m, "AF_X25", AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00003685#endif
3686#ifdef AF_INET6
Fred Drake4baedc12002-04-01 14:53:37 +00003687 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00003688#endif
3689#ifdef AF_ROSE
Fred Drake4baedc12002-04-01 14:53:37 +00003690 /* Amateur Radio X.25 PLP */
3691 PyModule_AddIntConstant(m, "AF_ROSE", AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00003692#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00003693
Hye-Shik Chang81268602004-02-02 06:05:24 +00003694#ifdef USE_BLUETOOTH
Martin v. Löwis12af0482004-01-31 12:34:17 +00003695 PyModule_AddIntConstant(m, "AF_BLUETOOTH", AF_BLUETOOTH);
3696 PyModule_AddIntConstant(m, "BTPROTO_L2CAP", BTPROTO_L2CAP);
Hye-Shik Chang81268602004-02-02 06:05:24 +00003697#if !defined(__FreeBSD__)
Martin v. Löwis12af0482004-01-31 12:34:17 +00003698 PyModule_AddIntConstant(m, "BTPROTO_SCO", BTPROTO_SCO);
Hye-Shik Chang81268602004-02-02 06:05:24 +00003699#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00003700 PyModule_AddIntConstant(m, "BTPROTO_RFCOMM", BTPROTO_RFCOMM);
3701 PyModule_AddObject(m, "BDADDR_ANY", Py_BuildValue( "iiiiii", 0,0,0,0,0,0 ) );
3702 PyModule_AddObject(m, "BDADDR_LOCAL", Py_BuildValue( "iiiiii", 0,0,0,0xff,0xff,0xff ) );
3703#endif
3704
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00003705#ifdef HAVE_NETPACKET_PACKET_H
Fred Drake4baedc12002-04-01 14:53:37 +00003706 PyModule_AddIntConstant(m, "AF_PACKET", AF_PACKET);
3707 PyModule_AddIntConstant(m, "PF_PACKET", PF_PACKET);
3708 PyModule_AddIntConstant(m, "PACKET_HOST", PACKET_HOST);
3709 PyModule_AddIntConstant(m, "PACKET_BROADCAST", PACKET_BROADCAST);
3710 PyModule_AddIntConstant(m, "PACKET_MULTICAST", PACKET_MULTICAST);
3711 PyModule_AddIntConstant(m, "PACKET_OTHERHOST", PACKET_OTHERHOST);
3712 PyModule_AddIntConstant(m, "PACKET_OUTGOING", PACKET_OUTGOING);
3713 PyModule_AddIntConstant(m, "PACKET_LOOPBACK", PACKET_LOOPBACK);
3714 PyModule_AddIntConstant(m, "PACKET_FASTROUTE", PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00003715#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00003716
3717 /* Socket types */
Fred Drake4baedc12002-04-01 14:53:37 +00003718 PyModule_AddIntConstant(m, "SOCK_STREAM", SOCK_STREAM);
3719 PyModule_AddIntConstant(m, "SOCK_DGRAM", SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00003720#ifndef __BEOS__
3721/* We have incomplete socket support. */
Fred Drake4baedc12002-04-01 14:53:37 +00003722 PyModule_AddIntConstant(m, "SOCK_RAW", SOCK_RAW);
3723 PyModule_AddIntConstant(m, "SOCK_SEQPACKET", SOCK_SEQPACKET);
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00003724#if defined(SOCK_RDM)
Fred Drake4baedc12002-04-01 14:53:37 +00003725 PyModule_AddIntConstant(m, "SOCK_RDM", SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00003726#endif
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00003727#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003728
3729#ifdef SO_DEBUG
Fred Drake4baedc12002-04-01 14:53:37 +00003730 PyModule_AddIntConstant(m, "SO_DEBUG", SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003731#endif
3732#ifdef SO_ACCEPTCONN
Fred Drake4baedc12002-04-01 14:53:37 +00003733 PyModule_AddIntConstant(m, "SO_ACCEPTCONN", SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003734#endif
3735#ifdef SO_REUSEADDR
Fred Drake4baedc12002-04-01 14:53:37 +00003736 PyModule_AddIntConstant(m, "SO_REUSEADDR", SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003737#endif
3738#ifdef SO_KEEPALIVE
Fred Drake4baedc12002-04-01 14:53:37 +00003739 PyModule_AddIntConstant(m, "SO_KEEPALIVE", SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003740#endif
3741#ifdef SO_DONTROUTE
Fred Drake4baedc12002-04-01 14:53:37 +00003742 PyModule_AddIntConstant(m, "SO_DONTROUTE", SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003743#endif
3744#ifdef SO_BROADCAST
Fred Drake4baedc12002-04-01 14:53:37 +00003745 PyModule_AddIntConstant(m, "SO_BROADCAST", SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003746#endif
3747#ifdef SO_USELOOPBACK
Fred Drake4baedc12002-04-01 14:53:37 +00003748 PyModule_AddIntConstant(m, "SO_USELOOPBACK", SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003749#endif
3750#ifdef SO_LINGER
Fred Drake4baedc12002-04-01 14:53:37 +00003751 PyModule_AddIntConstant(m, "SO_LINGER", SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003752#endif
3753#ifdef SO_OOBINLINE
Fred Drake4baedc12002-04-01 14:53:37 +00003754 PyModule_AddIntConstant(m, "SO_OOBINLINE", SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003755#endif
3756#ifdef SO_REUSEPORT
Fred Drake4baedc12002-04-01 14:53:37 +00003757 PyModule_AddIntConstant(m, "SO_REUSEPORT", SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003758#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003759#ifdef SO_SNDBUF
Fred Drake4baedc12002-04-01 14:53:37 +00003760 PyModule_AddIntConstant(m, "SO_SNDBUF", SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003761#endif
3762#ifdef SO_RCVBUF
Fred Drake4baedc12002-04-01 14:53:37 +00003763 PyModule_AddIntConstant(m, "SO_RCVBUF", SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003764#endif
3765#ifdef SO_SNDLOWAT
Fred Drake4baedc12002-04-01 14:53:37 +00003766 PyModule_AddIntConstant(m, "SO_SNDLOWAT", SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003767#endif
3768#ifdef SO_RCVLOWAT
Fred Drake4baedc12002-04-01 14:53:37 +00003769 PyModule_AddIntConstant(m, "SO_RCVLOWAT", SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003770#endif
3771#ifdef SO_SNDTIMEO
Fred Drake4baedc12002-04-01 14:53:37 +00003772 PyModule_AddIntConstant(m, "SO_SNDTIMEO", SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003773#endif
3774#ifdef SO_RCVTIMEO
Fred Drake4baedc12002-04-01 14:53:37 +00003775 PyModule_AddIntConstant(m, "SO_RCVTIMEO", SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003776#endif
3777#ifdef SO_ERROR
Fred Drake4baedc12002-04-01 14:53:37 +00003778 PyModule_AddIntConstant(m, "SO_ERROR", SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003779#endif
3780#ifdef SO_TYPE
Fred Drake4baedc12002-04-01 14:53:37 +00003781 PyModule_AddIntConstant(m, "SO_TYPE", SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003782#endif
3783
3784 /* Maximum number of connections for "listen" */
3785#ifdef SOMAXCONN
Fred Drake4baedc12002-04-01 14:53:37 +00003786 PyModule_AddIntConstant(m, "SOMAXCONN", SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003787#else
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003788 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003789#endif
3790
3791 /* Flags for send, recv */
3792#ifdef MSG_OOB
Fred Drake4baedc12002-04-01 14:53:37 +00003793 PyModule_AddIntConstant(m, "MSG_OOB", MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003794#endif
3795#ifdef MSG_PEEK
Fred Drake4baedc12002-04-01 14:53:37 +00003796 PyModule_AddIntConstant(m, "MSG_PEEK", MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003797#endif
3798#ifdef MSG_DONTROUTE
Fred Drake4baedc12002-04-01 14:53:37 +00003799 PyModule_AddIntConstant(m, "MSG_DONTROUTE", MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003800#endif
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00003801#ifdef MSG_DONTWAIT
Fred Drake4baedc12002-04-01 14:53:37 +00003802 PyModule_AddIntConstant(m, "MSG_DONTWAIT", MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00003803#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003804#ifdef MSG_EOR
Fred Drake4baedc12002-04-01 14:53:37 +00003805 PyModule_AddIntConstant(m, "MSG_EOR", MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003806#endif
3807#ifdef MSG_TRUNC
Fred Drake4baedc12002-04-01 14:53:37 +00003808 PyModule_AddIntConstant(m, "MSG_TRUNC", MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003809#endif
3810#ifdef MSG_CTRUNC
Fred Drake4baedc12002-04-01 14:53:37 +00003811 PyModule_AddIntConstant(m, "MSG_CTRUNC", MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003812#endif
3813#ifdef MSG_WAITALL
Fred Drake4baedc12002-04-01 14:53:37 +00003814 PyModule_AddIntConstant(m, "MSG_WAITALL", MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003815#endif
3816#ifdef MSG_BTAG
Fred Drake4baedc12002-04-01 14:53:37 +00003817 PyModule_AddIntConstant(m, "MSG_BTAG", MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003818#endif
3819#ifdef MSG_ETAG
Fred Drake4baedc12002-04-01 14:53:37 +00003820 PyModule_AddIntConstant(m, "MSG_ETAG", MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003821#endif
3822
3823 /* Protocol level and numbers, usable for [gs]etsockopt */
3824#ifdef SOL_SOCKET
Fred Drake4baedc12002-04-01 14:53:37 +00003825 PyModule_AddIntConstant(m, "SOL_SOCKET", SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003826#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00003827#ifdef SOL_IP
Fred Drake4baedc12002-04-01 14:53:37 +00003828 PyModule_AddIntConstant(m, "SOL_IP", SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00003829#else
Fred Drake4baedc12002-04-01 14:53:37 +00003830 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00003831#endif
3832#ifdef SOL_IPX
Fred Drake4baedc12002-04-01 14:53:37 +00003833 PyModule_AddIntConstant(m, "SOL_IPX", SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00003834#endif
3835#ifdef SOL_AX25
Fred Drake4baedc12002-04-01 14:53:37 +00003836 PyModule_AddIntConstant(m, "SOL_AX25", SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00003837#endif
3838#ifdef SOL_ATALK
Fred Drake4baedc12002-04-01 14:53:37 +00003839 PyModule_AddIntConstant(m, "SOL_ATALK", SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00003840#endif
3841#ifdef SOL_NETROM
Fred Drake4baedc12002-04-01 14:53:37 +00003842 PyModule_AddIntConstant(m, "SOL_NETROM", SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00003843#endif
3844#ifdef SOL_ROSE
Fred Drake4baedc12002-04-01 14:53:37 +00003845 PyModule_AddIntConstant(m, "SOL_ROSE", SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00003846#endif
3847#ifdef SOL_TCP
Fred Drake4baedc12002-04-01 14:53:37 +00003848 PyModule_AddIntConstant(m, "SOL_TCP", SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00003849#else
Fred Drake4baedc12002-04-01 14:53:37 +00003850 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00003851#endif
3852#ifdef SOL_UDP
Fred Drake4baedc12002-04-01 14:53:37 +00003853 PyModule_AddIntConstant(m, "SOL_UDP", SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00003854#else
Fred Drake4baedc12002-04-01 14:53:37 +00003855 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00003856#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003857#ifdef IPPROTO_IP
Fred Drake4baedc12002-04-01 14:53:37 +00003858 PyModule_AddIntConstant(m, "IPPROTO_IP", IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00003859#else
Fred Drake4baedc12002-04-01 14:53:37 +00003860 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003861#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003862#ifdef IPPROTO_HOPOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00003863 PyModule_AddIntConstant(m, "IPPROTO_HOPOPTS", IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003864#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003865#ifdef IPPROTO_ICMP
Fred Drake4baedc12002-04-01 14:53:37 +00003866 PyModule_AddIntConstant(m, "IPPROTO_ICMP", IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00003867#else
Fred Drake4baedc12002-04-01 14:53:37 +00003868 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003869#endif
3870#ifdef IPPROTO_IGMP
Fred Drake4baedc12002-04-01 14:53:37 +00003871 PyModule_AddIntConstant(m, "IPPROTO_IGMP", IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003872#endif
3873#ifdef IPPROTO_GGP
Fred Drake4baedc12002-04-01 14:53:37 +00003874 PyModule_AddIntConstant(m, "IPPROTO_GGP", IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003875#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003876#ifdef IPPROTO_IPV4
Fred Drake4baedc12002-04-01 14:53:37 +00003877 PyModule_AddIntConstant(m, "IPPROTO_IPV4", IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003878#endif
Martin v. Löwisa0f17342003-10-03 13:56:20 +00003879#ifdef IPPROTO_IPV6
3880 PyModule_AddIntConstant(m, "IPPROTO_IPV6", IPPROTO_IPV6);
3881#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003882#ifdef IPPROTO_IPIP
Fred Drake4baedc12002-04-01 14:53:37 +00003883 PyModule_AddIntConstant(m, "IPPROTO_IPIP", IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003884#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003885#ifdef IPPROTO_TCP
Fred Drake4baedc12002-04-01 14:53:37 +00003886 PyModule_AddIntConstant(m, "IPPROTO_TCP", IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00003887#else
Fred Drake4baedc12002-04-01 14:53:37 +00003888 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003889#endif
3890#ifdef IPPROTO_EGP
Fred Drake4baedc12002-04-01 14:53:37 +00003891 PyModule_AddIntConstant(m, "IPPROTO_EGP", IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003892#endif
3893#ifdef IPPROTO_PUP
Fred Drake4baedc12002-04-01 14:53:37 +00003894 PyModule_AddIntConstant(m, "IPPROTO_PUP", IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003895#endif
3896#ifdef IPPROTO_UDP
Fred Drake4baedc12002-04-01 14:53:37 +00003897 PyModule_AddIntConstant(m, "IPPROTO_UDP", IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00003898#else
Fred Drake4baedc12002-04-01 14:53:37 +00003899 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003900#endif
3901#ifdef IPPROTO_IDP
Fred Drake4baedc12002-04-01 14:53:37 +00003902 PyModule_AddIntConstant(m, "IPPROTO_IDP", IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003903#endif
3904#ifdef IPPROTO_HELLO
Fred Drake4baedc12002-04-01 14:53:37 +00003905 PyModule_AddIntConstant(m, "IPPROTO_HELLO", IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003906#endif
3907#ifdef IPPROTO_ND
Fred Drake4baedc12002-04-01 14:53:37 +00003908 PyModule_AddIntConstant(m, "IPPROTO_ND", IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003909#endif
3910#ifdef IPPROTO_TP
Fred Drake4baedc12002-04-01 14:53:37 +00003911 PyModule_AddIntConstant(m, "IPPROTO_TP", IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003912#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003913#ifdef IPPROTO_IPV6
Fred Drake4baedc12002-04-01 14:53:37 +00003914 PyModule_AddIntConstant(m, "IPPROTO_IPV6", IPPROTO_IPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003915#endif
3916#ifdef IPPROTO_ROUTING
Fred Drake4baedc12002-04-01 14:53:37 +00003917 PyModule_AddIntConstant(m, "IPPROTO_ROUTING", IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003918#endif
3919#ifdef IPPROTO_FRAGMENT
Fred Drake4baedc12002-04-01 14:53:37 +00003920 PyModule_AddIntConstant(m, "IPPROTO_FRAGMENT", IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003921#endif
3922#ifdef IPPROTO_RSVP
Fred Drake4baedc12002-04-01 14:53:37 +00003923 PyModule_AddIntConstant(m, "IPPROTO_RSVP", IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003924#endif
3925#ifdef IPPROTO_GRE
Fred Drake4baedc12002-04-01 14:53:37 +00003926 PyModule_AddIntConstant(m, "IPPROTO_GRE", IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003927#endif
3928#ifdef IPPROTO_ESP
Fred Drake4baedc12002-04-01 14:53:37 +00003929 PyModule_AddIntConstant(m, "IPPROTO_ESP", IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003930#endif
3931#ifdef IPPROTO_AH
Fred Drake4baedc12002-04-01 14:53:37 +00003932 PyModule_AddIntConstant(m, "IPPROTO_AH", IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003933#endif
3934#ifdef IPPROTO_MOBILE
Fred Drake4baedc12002-04-01 14:53:37 +00003935 PyModule_AddIntConstant(m, "IPPROTO_MOBILE", IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003936#endif
3937#ifdef IPPROTO_ICMPV6
Fred Drake4baedc12002-04-01 14:53:37 +00003938 PyModule_AddIntConstant(m, "IPPROTO_ICMPV6", IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003939#endif
3940#ifdef IPPROTO_NONE
Fred Drake4baedc12002-04-01 14:53:37 +00003941 PyModule_AddIntConstant(m, "IPPROTO_NONE", IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003942#endif
3943#ifdef IPPROTO_DSTOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00003944 PyModule_AddIntConstant(m, "IPPROTO_DSTOPTS", IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003945#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003946#ifdef IPPROTO_XTP
Fred Drake4baedc12002-04-01 14:53:37 +00003947 PyModule_AddIntConstant(m, "IPPROTO_XTP", IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003948#endif
3949#ifdef IPPROTO_EON
Fred Drake4baedc12002-04-01 14:53:37 +00003950 PyModule_AddIntConstant(m, "IPPROTO_EON", IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003951#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003952#ifdef IPPROTO_PIM
Fred Drake4baedc12002-04-01 14:53:37 +00003953 PyModule_AddIntConstant(m, "IPPROTO_PIM", IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003954#endif
3955#ifdef IPPROTO_IPCOMP
Fred Drake4baedc12002-04-01 14:53:37 +00003956 PyModule_AddIntConstant(m, "IPPROTO_IPCOMP", IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003957#endif
3958#ifdef IPPROTO_VRRP
Fred Drake4baedc12002-04-01 14:53:37 +00003959 PyModule_AddIntConstant(m, "IPPROTO_VRRP", IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003960#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003961#ifdef IPPROTO_BIP
Fred Drake4baedc12002-04-01 14:53:37 +00003962 PyModule_AddIntConstant(m, "IPPROTO_BIP", IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003963#endif
3964/**/
3965#ifdef IPPROTO_RAW
Fred Drake4baedc12002-04-01 14:53:37 +00003966 PyModule_AddIntConstant(m, "IPPROTO_RAW", IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00003967#else
Fred Drake4baedc12002-04-01 14:53:37 +00003968 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003969#endif
3970#ifdef IPPROTO_MAX
Fred Drake4baedc12002-04-01 14:53:37 +00003971 PyModule_AddIntConstant(m, "IPPROTO_MAX", IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003972#endif
3973
3974 /* Some port configuration */
3975#ifdef IPPORT_RESERVED
Fred Drake4baedc12002-04-01 14:53:37 +00003976 PyModule_AddIntConstant(m, "IPPORT_RESERVED", IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003977#else
Fred Drake4baedc12002-04-01 14:53:37 +00003978 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003979#endif
3980#ifdef IPPORT_USERRESERVED
Fred Drake4baedc12002-04-01 14:53:37 +00003981 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003982#else
Fred Drake4baedc12002-04-01 14:53:37 +00003983 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003984#endif
3985
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003986 /* Some reserved IP v.4 addresses */
3987#ifdef INADDR_ANY
Fred Drake4baedc12002-04-01 14:53:37 +00003988 PyModule_AddIntConstant(m, "INADDR_ANY", INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003989#else
Fred Drake4baedc12002-04-01 14:53:37 +00003990 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003991#endif
3992#ifdef INADDR_BROADCAST
Fred Drake4baedc12002-04-01 14:53:37 +00003993 PyModule_AddIntConstant(m, "INADDR_BROADCAST", INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003994#else
Fred Drake4baedc12002-04-01 14:53:37 +00003995 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003996#endif
3997#ifdef INADDR_LOOPBACK
Fred Drake4baedc12002-04-01 14:53:37 +00003998 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003999#else
Fred Drake4baedc12002-04-01 14:53:37 +00004000 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004001#endif
4002#ifdef INADDR_UNSPEC_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00004003 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004004#else
Fred Drake4baedc12002-04-01 14:53:37 +00004005 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004006#endif
4007#ifdef INADDR_ALLHOSTS_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00004008 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
4009 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004010#else
Fred Drake4baedc12002-04-01 14:53:37 +00004011 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004012#endif
4013#ifdef INADDR_MAX_LOCAL_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00004014 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP",
4015 INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004016#else
Fred Drake4baedc12002-04-01 14:53:37 +00004017 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004018#endif
4019#ifdef INADDR_NONE
Fred Drake4baedc12002-04-01 14:53:37 +00004020 PyModule_AddIntConstant(m, "INADDR_NONE", INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004021#else
Fred Drake4baedc12002-04-01 14:53:37 +00004022 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004023#endif
4024
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004025 /* IPv4 [gs]etsockopt options */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004026#ifdef IP_OPTIONS
Fred Drake4baedc12002-04-01 14:53:37 +00004027 PyModule_AddIntConstant(m, "IP_OPTIONS", IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004028#endif
4029#ifdef IP_HDRINCL
Fred Drake4baedc12002-04-01 14:53:37 +00004030 PyModule_AddIntConstant(m, "IP_HDRINCL", IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004031#endif
4032#ifdef IP_TOS
Fred Drake4baedc12002-04-01 14:53:37 +00004033 PyModule_AddIntConstant(m, "IP_TOS", IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004034#endif
4035#ifdef IP_TTL
Fred Drake4baedc12002-04-01 14:53:37 +00004036 PyModule_AddIntConstant(m, "IP_TTL", IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004037#endif
4038#ifdef IP_RECVOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00004039 PyModule_AddIntConstant(m, "IP_RECVOPTS", IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004040#endif
4041#ifdef IP_RECVRETOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00004042 PyModule_AddIntConstant(m, "IP_RECVRETOPTS", IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004043#endif
4044#ifdef IP_RECVDSTADDR
Fred Drake4baedc12002-04-01 14:53:37 +00004045 PyModule_AddIntConstant(m, "IP_RECVDSTADDR", IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004046#endif
4047#ifdef IP_RETOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00004048 PyModule_AddIntConstant(m, "IP_RETOPTS", IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004049#endif
4050#ifdef IP_MULTICAST_IF
Fred Drake4baedc12002-04-01 14:53:37 +00004051 PyModule_AddIntConstant(m, "IP_MULTICAST_IF", IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004052#endif
4053#ifdef IP_MULTICAST_TTL
Fred Drake4baedc12002-04-01 14:53:37 +00004054 PyModule_AddIntConstant(m, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004055#endif
4056#ifdef IP_MULTICAST_LOOP
Fred Drake4baedc12002-04-01 14:53:37 +00004057 PyModule_AddIntConstant(m, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004058#endif
4059#ifdef IP_ADD_MEMBERSHIP
Fred Drake4baedc12002-04-01 14:53:37 +00004060 PyModule_AddIntConstant(m, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004061#endif
4062#ifdef IP_DROP_MEMBERSHIP
Fred Drake4baedc12002-04-01 14:53:37 +00004063 PyModule_AddIntConstant(m, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004064#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00004065#ifdef IP_DEFAULT_MULTICAST_TTL
Fred Drake4baedc12002-04-01 14:53:37 +00004066 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_TTL",
4067 IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00004068#endif
4069#ifdef IP_DEFAULT_MULTICAST_LOOP
Fred Drake4baedc12002-04-01 14:53:37 +00004070 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_LOOP",
4071 IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00004072#endif
4073#ifdef IP_MAX_MEMBERSHIPS
Fred Drake4baedc12002-04-01 14:53:37 +00004074 PyModule_AddIntConstant(m, "IP_MAX_MEMBERSHIPS", IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00004075#endif
4076
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004077 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
4078#ifdef IPV6_JOIN_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00004079 PyModule_AddIntConstant(m, "IPV6_JOIN_GROUP", IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004080#endif
4081#ifdef IPV6_LEAVE_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00004082 PyModule_AddIntConstant(m, "IPV6_LEAVE_GROUP", IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004083#endif
4084#ifdef IPV6_MULTICAST_HOPS
Fred Drake4baedc12002-04-01 14:53:37 +00004085 PyModule_AddIntConstant(m, "IPV6_MULTICAST_HOPS", IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004086#endif
4087#ifdef IPV6_MULTICAST_IF
Fred Drake4baedc12002-04-01 14:53:37 +00004088 PyModule_AddIntConstant(m, "IPV6_MULTICAST_IF", IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004089#endif
4090#ifdef IPV6_MULTICAST_LOOP
Fred Drake4baedc12002-04-01 14:53:37 +00004091 PyModule_AddIntConstant(m, "IPV6_MULTICAST_LOOP", IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004092#endif
4093#ifdef IPV6_UNICAST_HOPS
Fred Drake4baedc12002-04-01 14:53:37 +00004094 PyModule_AddIntConstant(m, "IPV6_UNICAST_HOPS", IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004095#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00004096 /* Additional IPV6 socket options, defined in RFC 3493 */
4097#ifdef IPV6_V6ONLY
4098 PyModule_AddIntConstant(m, "IPV6_V6ONLY", IPV6_V6ONLY);
4099#endif
4100 /* Advanced IPV6 socket options, from RFC 3542 */
4101#ifdef IPV6_CHECKSUM
4102 PyModule_AddIntConstant(m, "IPV6_CHECKSUM", IPV6_CHECKSUM);
4103#endif
4104#ifdef IPV6_DONTFRAG
4105 PyModule_AddIntConstant(m, "IPV6_DONTFRAG", IPV6_DONTFRAG);
4106#endif
4107#ifdef IPV6_DSTOPTS
4108 PyModule_AddIntConstant(m, "IPV6_DSTOPTS", IPV6_DSTOPTS);
4109#endif
4110#ifdef IPV6_HOPLIMIT
4111 PyModule_AddIntConstant(m, "IPV6_HOPLIMIT", IPV6_HOPLIMIT);
4112#endif
4113#ifdef IPV6_HOPOPTS
4114 PyModule_AddIntConstant(m, "IPV6_HOPOPTS", IPV6_HOPOPTS);
4115#endif
4116#ifdef IPV6_NEXTHOP
4117 PyModule_AddIntConstant(m, "IPV6_NEXTHOP", IPV6_NEXTHOP);
4118#endif
4119#ifdef IPV6_PATHMTU
4120 PyModule_AddIntConstant(m, "IPV6_PATHMTU", IPV6_PATHMTU);
4121#endif
4122#ifdef IPV6_PKTINFO
4123 PyModule_AddIntConstant(m, "IPV6_PKTINFO", IPV6_PKTINFO);
4124#endif
4125#ifdef IPV6_RECVDSTOPTS
4126 PyModule_AddIntConstant(m, "IPV6_RECVDSTOPTS", IPV6_RECVDSTOPTS);
4127#endif
4128#ifdef IPV6_RECVHOPLIMIT
4129 PyModule_AddIntConstant(m, "IPV6_RECVHOPLIMIT", IPV6_RECVHOPLIMIT);
4130#endif
4131#ifdef IPV6_RECVHOPOPTS
4132 PyModule_AddIntConstant(m, "IPV6_RECVHOPOPTS", IPV6_RECVHOPOPTS);
4133#endif
4134#ifdef IPV6_RECVPKTINFO
4135 PyModule_AddIntConstant(m, "IPV6_RECVPKTINFO", IPV6_RECVPKTINFO);
4136#endif
4137#ifdef IPV6_RECVRTHDR
4138 PyModule_AddIntConstant(m, "IPV6_RECVRTHDR", IPV6_RECVRTHDR);
4139#endif
4140#ifdef IPV6_RECVTCLASS
4141 PyModule_AddIntConstant(m, "IPV6_RECVTCLASS", IPV6_RECVTCLASS);
4142#endif
4143#ifdef IPV6_RTHDR
4144 PyModule_AddIntConstant(m, "IPV6_RTHDR", IPV6_RTHDR);
4145#endif
4146#ifdef IPV6_RTHDRDSTOPTS
4147 PyModule_AddIntConstant(m, "IPV6_RTHDRDSTOPTS", IPV6_RTHDRDSTOPTS);
4148#endif
4149#ifdef IPV6_RTHDR_TYPE_0
4150 PyModule_AddIntConstant(m, "IPV6_RTHDR_TYPE_0", IPV6_RTHDR_TYPE_0);
4151#endif
4152#ifdef IPV6_RECVPATHMTU
4153 PyModule_AddIntConstant(m, "IPV6_RECVPATHMTU", IPV6_RECVPATHMTU);
4154#endif
4155#ifdef IPV6_TCLASS
4156 PyModule_AddIntConstant(m, "IPV6_TCLASS", IPV6_TCLASS);
4157#endif
4158#ifdef IPV6_USE_MIN_MTU
4159 PyModule_AddIntConstant(m, "IPV6_USE_MIN_MTU", IPV6_USE_MIN_MTU);
4160#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004161
Guido van Rossum09be4091999-08-09 14:40:40 +00004162 /* TCP options */
4163#ifdef TCP_NODELAY
Fred Drake4baedc12002-04-01 14:53:37 +00004164 PyModule_AddIntConstant(m, "TCP_NODELAY", TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00004165#endif
4166#ifdef TCP_MAXSEG
Fred Drake4baedc12002-04-01 14:53:37 +00004167 PyModule_AddIntConstant(m, "TCP_MAXSEG", TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00004168#endif
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004169#ifdef TCP_CORK
Fred Drake4baedc12002-04-01 14:53:37 +00004170 PyModule_AddIntConstant(m, "TCP_CORK", TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004171#endif
4172#ifdef TCP_KEEPIDLE
Fred Drake4baedc12002-04-01 14:53:37 +00004173 PyModule_AddIntConstant(m, "TCP_KEEPIDLE", TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004174#endif
4175#ifdef TCP_KEEPINTVL
Fred Drake4baedc12002-04-01 14:53:37 +00004176 PyModule_AddIntConstant(m, "TCP_KEEPINTVL", TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004177#endif
4178#ifdef TCP_KEEPCNT
Fred Drake4baedc12002-04-01 14:53:37 +00004179 PyModule_AddIntConstant(m, "TCP_KEEPCNT", TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004180#endif
4181#ifdef TCP_SYNCNT
Fred Drake4baedc12002-04-01 14:53:37 +00004182 PyModule_AddIntConstant(m, "TCP_SYNCNT", TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004183#endif
4184#ifdef TCP_LINGER2
Fred Drake4baedc12002-04-01 14:53:37 +00004185 PyModule_AddIntConstant(m, "TCP_LINGER2", TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004186#endif
4187#ifdef TCP_DEFER_ACCEPT
Fred Drake4baedc12002-04-01 14:53:37 +00004188 PyModule_AddIntConstant(m, "TCP_DEFER_ACCEPT", TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004189#endif
4190#ifdef TCP_WINDOW_CLAMP
Fred Drake4baedc12002-04-01 14:53:37 +00004191 PyModule_AddIntConstant(m, "TCP_WINDOW_CLAMP", TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004192#endif
4193#ifdef TCP_INFO
Fred Drake4baedc12002-04-01 14:53:37 +00004194 PyModule_AddIntConstant(m, "TCP_INFO", TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004195#endif
4196#ifdef TCP_QUICKACK
Fred Drake4baedc12002-04-01 14:53:37 +00004197 PyModule_AddIntConstant(m, "TCP_QUICKACK", TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004198#endif
4199
Guido van Rossum09be4091999-08-09 14:40:40 +00004200
4201 /* IPX options */
4202#ifdef IPX_TYPE
Fred Drake4baedc12002-04-01 14:53:37 +00004203 PyModule_AddIntConstant(m, "IPX_TYPE", IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00004204#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004205
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004206 /* get{addr,name}info parameters */
4207#ifdef EAI_ADDRFAMILY
Fred Drake4baedc12002-04-01 14:53:37 +00004208 PyModule_AddIntConstant(m, "EAI_ADDRFAMILY", EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004209#endif
4210#ifdef EAI_AGAIN
Fred Drake4baedc12002-04-01 14:53:37 +00004211 PyModule_AddIntConstant(m, "EAI_AGAIN", EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004212#endif
4213#ifdef EAI_BADFLAGS
Fred Drake4baedc12002-04-01 14:53:37 +00004214 PyModule_AddIntConstant(m, "EAI_BADFLAGS", EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004215#endif
4216#ifdef EAI_FAIL
Fred Drake4baedc12002-04-01 14:53:37 +00004217 PyModule_AddIntConstant(m, "EAI_FAIL", EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004218#endif
4219#ifdef EAI_FAMILY
Fred Drake4baedc12002-04-01 14:53:37 +00004220 PyModule_AddIntConstant(m, "EAI_FAMILY", EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004221#endif
4222#ifdef EAI_MEMORY
Fred Drake4baedc12002-04-01 14:53:37 +00004223 PyModule_AddIntConstant(m, "EAI_MEMORY", EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004224#endif
4225#ifdef EAI_NODATA
Fred Drake4baedc12002-04-01 14:53:37 +00004226 PyModule_AddIntConstant(m, "EAI_NODATA", EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004227#endif
4228#ifdef EAI_NONAME
Fred Drake4baedc12002-04-01 14:53:37 +00004229 PyModule_AddIntConstant(m, "EAI_NONAME", EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004230#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00004231#ifdef EAI_OVERFLOW
4232 PyModule_AddIntConstant(m, "EAI_OVERFLOW", EAI_OVERFLOW);
4233#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004234#ifdef EAI_SERVICE
Fred Drake4baedc12002-04-01 14:53:37 +00004235 PyModule_AddIntConstant(m, "EAI_SERVICE", EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004236#endif
4237#ifdef EAI_SOCKTYPE
Fred Drake4baedc12002-04-01 14:53:37 +00004238 PyModule_AddIntConstant(m, "EAI_SOCKTYPE", EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004239#endif
4240#ifdef EAI_SYSTEM
Fred Drake4baedc12002-04-01 14:53:37 +00004241 PyModule_AddIntConstant(m, "EAI_SYSTEM", EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004242#endif
4243#ifdef EAI_BADHINTS
Fred Drake4baedc12002-04-01 14:53:37 +00004244 PyModule_AddIntConstant(m, "EAI_BADHINTS", EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004245#endif
4246#ifdef EAI_PROTOCOL
Fred Drake4baedc12002-04-01 14:53:37 +00004247 PyModule_AddIntConstant(m, "EAI_PROTOCOL", EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004248#endif
4249#ifdef EAI_MAX
Fred Drake4baedc12002-04-01 14:53:37 +00004250 PyModule_AddIntConstant(m, "EAI_MAX", EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004251#endif
4252#ifdef AI_PASSIVE
Fred Drake4baedc12002-04-01 14:53:37 +00004253 PyModule_AddIntConstant(m, "AI_PASSIVE", AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004254#endif
4255#ifdef AI_CANONNAME
Fred Drake4baedc12002-04-01 14:53:37 +00004256 PyModule_AddIntConstant(m, "AI_CANONNAME", AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004257#endif
4258#ifdef AI_NUMERICHOST
Fred Drake4baedc12002-04-01 14:53:37 +00004259 PyModule_AddIntConstant(m, "AI_NUMERICHOST", AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004260#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00004261#ifdef AI_NUMERICSERV
4262 PyModule_AddIntConstant(m, "AI_NUMERICSERV", AI_NUMERICSERV);
4263#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004264#ifdef AI_MASK
Fred Drake4baedc12002-04-01 14:53:37 +00004265 PyModule_AddIntConstant(m, "AI_MASK", AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004266#endif
4267#ifdef AI_ALL
Fred Drake4baedc12002-04-01 14:53:37 +00004268 PyModule_AddIntConstant(m, "AI_ALL", AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004269#endif
4270#ifdef AI_V4MAPPED_CFG
Fred Drake4baedc12002-04-01 14:53:37 +00004271 PyModule_AddIntConstant(m, "AI_V4MAPPED_CFG", AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004272#endif
4273#ifdef AI_ADDRCONFIG
Fred Drake4baedc12002-04-01 14:53:37 +00004274 PyModule_AddIntConstant(m, "AI_ADDRCONFIG", AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004275#endif
4276#ifdef AI_V4MAPPED
Fred Drake4baedc12002-04-01 14:53:37 +00004277 PyModule_AddIntConstant(m, "AI_V4MAPPED", AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004278#endif
4279#ifdef AI_DEFAULT
Fred Drake4baedc12002-04-01 14:53:37 +00004280 PyModule_AddIntConstant(m, "AI_DEFAULT", AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004281#endif
4282#ifdef NI_MAXHOST
Fred Drake4baedc12002-04-01 14:53:37 +00004283 PyModule_AddIntConstant(m, "NI_MAXHOST", NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004284#endif
4285#ifdef NI_MAXSERV
Fred Drake4baedc12002-04-01 14:53:37 +00004286 PyModule_AddIntConstant(m, "NI_MAXSERV", NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004287#endif
4288#ifdef NI_NOFQDN
Fred Drake4baedc12002-04-01 14:53:37 +00004289 PyModule_AddIntConstant(m, "NI_NOFQDN", NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004290#endif
4291#ifdef NI_NUMERICHOST
Fred Drake4baedc12002-04-01 14:53:37 +00004292 PyModule_AddIntConstant(m, "NI_NUMERICHOST", NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004293#endif
4294#ifdef NI_NAMEREQD
Fred Drake4baedc12002-04-01 14:53:37 +00004295 PyModule_AddIntConstant(m, "NI_NAMEREQD", NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004296#endif
4297#ifdef NI_NUMERICSERV
Fred Drake4baedc12002-04-01 14:53:37 +00004298 PyModule_AddIntConstant(m, "NI_NUMERICSERV", NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004299#endif
4300#ifdef NI_DGRAM
Fred Drake4baedc12002-04-01 14:53:37 +00004301 PyModule_AddIntConstant(m, "NI_DGRAM", NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004302#endif
4303
Martin v. Löwis94681fc2003-11-27 19:40:22 +00004304 /* shutdown() parameters */
4305#ifdef SHUT_RD
4306 PyModule_AddIntConstant(m, "SHUT_RD", SHUT_RD);
4307#elif defined(SD_RECEIVE)
4308 PyModule_AddIntConstant(m, "SHUT_RD", SD_RECEIVE);
4309#else
4310 PyModule_AddIntConstant(m, "SHUT_RD", 0);
4311#endif
4312#ifdef SHUT_WR
4313 PyModule_AddIntConstant(m, "SHUT_WR", SHUT_WR);
4314#elif defined(SD_SEND)
4315 PyModule_AddIntConstant(m, "SHUT_WR", SD_SEND);
4316#else
4317 PyModule_AddIntConstant(m, "SHUT_WR", 1);
4318#endif
4319#ifdef SHUT_RDWR
4320 PyModule_AddIntConstant(m, "SHUT_RDWR", SHUT_RDWR);
4321#elif defined(SD_BOTH)
4322 PyModule_AddIntConstant(m, "SHUT_RDWR", SD_BOTH);
4323#else
4324 PyModule_AddIntConstant(m, "SHUT_RDWR", 2);
4325#endif
4326
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004327 /* Initialize gethostbyname lock */
Just van Rossum1040d2c2003-05-09 07:53:18 +00004328#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
4329 netdb_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004330#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004331}
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004332
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004333
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004334#ifndef HAVE_INET_PTON
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004335
4336/* Simplistic emulation code for inet_pton that only works for IPv4 */
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004337/* These are not exposed because they do not set errno properly */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004338
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004339int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004340inet_pton(int af, const char *src, void *dst)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004341{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004342 if (af == AF_INET) {
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004343 long packed_addr;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004344 packed_addr = inet_addr(src);
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004345 if (packed_addr == INADDR_NONE)
4346 return 0;
4347 memcpy(dst, &packed_addr, 4);
4348 return 1;
4349 }
4350 /* Should set errno to EAFNOSUPPORT */
4351 return -1;
4352}
4353
Martin v. Löwisc925b1532001-07-21 09:42:15 +00004354const char *
4355inet_ntop(int af, const void *src, char *dst, socklen_t size)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004356{
4357 if (af == AF_INET) {
4358 struct in_addr packed_addr;
4359 if (size < 16)
4360 /* Should set errno to ENOSPC. */
4361 return NULL;
4362 memcpy(&packed_addr, src, sizeof(packed_addr));
4363 return strncpy(dst, inet_ntoa(packed_addr), size);
4364 }
4365 /* Should set errno to EAFNOSUPPORT */
4366 return NULL;
4367}
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004368
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004369#endif