blob: 7beb1cfa869157e805b655e1abd9b0dbbfbb7b05 [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 MacIntyre34d3e2d2003-01-02 12:45:34 +0000877#if defined(AF_UNIX) && !defined(PYOS_OS2)
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 MacIntyre34d3e2d2003-01-02 12:45:34 +0000951#if defined(AF_UNIX) && !defined(PYOS_OS2)
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;
Guido van Rossum65af28a1996-06-11 18:36:33 +0000969 *len_ret = len + sizeof(*addr) - sizeof(addr->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000970 return 1;
971 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000972#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000973
Guido van Rossum30a685f1991-06-27 15:51:29 +0000974 case AF_INET:
975 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000976 struct sockaddr_in* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000977 char *host;
Martin v. Löwis5db099a2003-08-07 11:55:15 +0000978 int port, result;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000979 addr=(struct sockaddr_in*)&(s->sock_addr).in;
Guido van Rossume4dad902000-12-01 13:13:11 +0000980 if (!PyTuple_Check(args)) {
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000981 PyErr_Format(
982 PyExc_TypeError,
983 "getsockaddrarg: "
984 "AF_INET address must be tuple, not %.500s",
985 args->ob_type->tp_name);
Guido van Rossume4dad902000-12-01 13:13:11 +0000986 return 0;
987 }
Martin v. Löwis2548c732003-04-18 10:39:54 +0000988 if (!PyArg_ParseTuple(args, "eti:getsockaddrarg",
989 "idna", &host, &port))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000990 return 0;
Martin v. Löwis5db099a2003-08-07 11:55:15 +0000991 result = setipaddr(host, (struct sockaddr *)addr,
992 sizeof(*addr), AF_INET);
993 PyMem_Free(host);
994 if (result < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000995 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000996 addr->sin_family = AF_INET;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000997 addr->sin_port = htons((short)port);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000998 *addr_ret = (struct sockaddr *) addr;
999 *len_ret = sizeof *addr;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001000 return 1;
1001 }
1002
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001003#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001004 case AF_INET6:
1005 {
1006 struct sockaddr_in6* addr;
1007 char *host;
Martin v. Löwis5db099a2003-08-07 11:55:15 +00001008 int port, flowinfo, scope_id, result;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001009 addr = (struct sockaddr_in6*)&(s->sock_addr).in6;
1010 flowinfo = scope_id = 0;
Martin v. Löwis2548c732003-04-18 10:39:54 +00001011 if (!PyArg_ParseTuple(args, "eti|ii",
1012 "idna", &host, &port, &flowinfo,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001013 &scope_id)) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001014 return 0;
1015 }
Martin v. Löwis5db099a2003-08-07 11:55:15 +00001016 result = setipaddr(host, (struct sockaddr *)addr,
1017 sizeof(*addr), AF_INET6);
1018 PyMem_Free(host);
1019 if (result < 0)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001020 return 0;
1021 addr->sin6_family = s->sock_family;
1022 addr->sin6_port = htons((short)port);
1023 addr->sin6_flowinfo = flowinfo;
1024 addr->sin6_scope_id = scope_id;
1025 *addr_ret = (struct sockaddr *) addr;
1026 *len_ret = sizeof *addr;
1027 return 1;
1028 }
1029#endif
1030
Hye-Shik Chang81268602004-02-02 06:05:24 +00001031#ifdef USE_BLUETOOTH
Martin v. Löwis12af0482004-01-31 12:34:17 +00001032 case AF_BLUETOOTH:
1033 {
1034 switch( s->sock_proto )
1035 {
1036 case BTPROTO_L2CAP:
1037 {
Hye-Shik Chang81268602004-02-02 06:05:24 +00001038 struct sockaddr_l2* addr = (struct sockaddr_l2*)_BT_SOCKADDR_MEMB(s, l2);
1039 bdaddr_t* bdaddr = &_BT_L2_MEMB(addr, bdaddr);
Martin v. Löwis12af0482004-01-31 12:34:17 +00001040
Hye-Shik Chang81268602004-02-02 06:05:24 +00001041 _BT_L2_MEMB(addr, family) = AF_BLUETOOTH;
1042 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 +00001043 {
1044 PyErr_SetString(socket_error, "getsockaddrarg: wrong format");
1045 return 0;
1046 }
1047
1048 *addr_ret = (struct sockaddr *) addr;
1049 *len_ret = sizeof *addr;
1050 return 1;
1051 }
1052 case BTPROTO_RFCOMM:
1053 {
Hye-Shik Chang81268602004-02-02 06:05:24 +00001054 struct sockaddr_rc* addr = (struct sockaddr_rc*)_BT_SOCKADDR_MEMB(s, rc);
1055 bdaddr_t* bdaddr = &_BT_RC_MEMB(addr, bdaddr);
Martin v. Löwis12af0482004-01-31 12:34:17 +00001056
Hye-Shik Chang81268602004-02-02 06:05:24 +00001057 _BT_RC_MEMB(addr, family) = AF_BLUETOOTH;
1058 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 +00001059 {
1060 PyErr_SetString(socket_error, "getsockaddrarg: wrong format");
1061 return 0;
1062 }
1063
1064 *addr_ret = (struct sockaddr *) addr;
1065 *len_ret = sizeof *addr;
1066 return 1;
1067 }
Hye-Shik Chang81268602004-02-02 06:05:24 +00001068#if !defined(__FreeBSD__)
Martin v. Löwis12af0482004-01-31 12:34:17 +00001069 case BTPROTO_SCO:
1070 {
Hye-Shik Chang81268602004-02-02 06:05:24 +00001071 struct sockaddr_sco* addr = (struct sockaddr_sco*)_BT_SOCKADDR_MEMB(s, sco);
1072 bdaddr_t* bdaddr = &_BT_SCO_MEMB(addr, bdaddr);
Martin v. Löwis12af0482004-01-31 12:34:17 +00001073
Hye-Shik Chang81268602004-02-02 06:05:24 +00001074 _BT_SCO_MEMB(addr, family) = AF_BLUETOOTH;
Martin v. Löwis12af0482004-01-31 12:34:17 +00001075 if( !PyArg_ParseTuple(args, "iiiiii", &bdaddr->b[0], &bdaddr->b[1], &bdaddr->b[2], &bdaddr->b[3], &bdaddr->b[4], &bdaddr->b[5]) )
1076 {
1077 PyErr_SetString(socket_error, "getsockaddrarg: wrong format");
1078 return 0;
1079 }
1080
1081 *addr_ret = (struct sockaddr *) addr;
1082 *len_ret = sizeof *addr;
1083 return 1;
1084 }
Hye-Shik Chang81268602004-02-02 06:05:24 +00001085#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00001086 default:
1087 {
1088 PyErr_SetString(socket_error, "getsockaddrarg: unknown Bluetooth protocol");
1089 return 0;
1090 }
1091 }
1092 }
1093#endif
1094
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00001095#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +00001096 case AF_PACKET:
1097 {
1098 struct sockaddr_ll* addr;
1099 struct ifreq ifr;
1100 char *interfaceName;
1101 int protoNumber;
1102 int hatype = 0;
1103 int pkttype = 0;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001104 char *haddr;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001105
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001106 if (!PyArg_ParseTuple(args, "si|iis", &interfaceName,
1107 &protoNumber, &pkttype, &hatype, &haddr))
Jeremy Hylton22308652001-02-02 03:23:09 +00001108 return 0;
1109 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
1110 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001111 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001112 s->errorhandler();
Jeremy Hylton22308652001-02-02 03:23:09 +00001113 return 0;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001114 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001115 addr = &(s->sock_addr.ll);
1116 addr->sll_family = AF_PACKET;
1117 addr->sll_protocol = htons((short)protoNumber);
1118 addr->sll_ifindex = ifr.ifr_ifindex;
1119 addr->sll_pkttype = pkttype;
1120 addr->sll_hatype = hatype;
1121 *addr_ret = (struct sockaddr *) addr;
1122 *len_ret = sizeof *addr;
1123 return 1;
1124 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00001125#endif
1126
Guido van Rossum30a685f1991-06-27 15:51:29 +00001127 /* More cases here... */
1128
1129 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001130 PyErr_SetString(socket_error, "getsockaddrarg: bad family");
Guido van Rossum30a685f1991-06-27 15:51:29 +00001131 return 0;
1132
1133 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001134}
1135
Guido van Rossum30a685f1991-06-27 15:51:29 +00001136
Guido van Rossum48a680c2001-03-02 06:34:14 +00001137/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +00001138 Return 1 if the family is known, 0 otherwise. The length is returned
1139 through len_ret. */
1140
1141static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +00001142getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +00001143{
1144 switch (s->sock_family) {
1145
Andrew MacIntyre34d3e2d2003-01-02 12:45:34 +00001146#if defined(AF_UNIX) && !defined(PYOS_OS2)
Guido van Rossum710e1df1992-06-12 10:39:36 +00001147 case AF_UNIX:
1148 {
1149 *len_ret = sizeof (struct sockaddr_un);
1150 return 1;
1151 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001152#endif /* AF_UNIX */
Guido van Rossum710e1df1992-06-12 10:39:36 +00001153
1154 case AF_INET:
1155 {
1156 *len_ret = sizeof (struct sockaddr_in);
1157 return 1;
1158 }
1159
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001160#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001161 case AF_INET6:
1162 {
1163 *len_ret = sizeof (struct sockaddr_in6);
1164 return 1;
1165 }
1166#endif
1167
Hye-Shik Chang81268602004-02-02 06:05:24 +00001168#ifdef USE_BLUETOOTH
Martin v. Löwis12af0482004-01-31 12:34:17 +00001169 case AF_BLUETOOTH:
1170 {
1171 switch(s->sock_proto)
1172 {
1173 case BTPROTO_L2CAP:
1174 {
1175 *len_ret = sizeof (struct sockaddr_l2);
1176 return 1;
1177 }
1178 case BTPROTO_RFCOMM:
1179 {
1180 *len_ret = sizeof (struct sockaddr_rc);
1181 return 1;
1182 }
Hye-Shik Chang81268602004-02-02 06:05:24 +00001183#if !defined(__FreeBSD__)
Martin v. Löwis12af0482004-01-31 12:34:17 +00001184 case BTPROTO_SCO:
1185 {
1186 *len_ret = sizeof (struct sockaddr_sco);
1187 return 1;
1188 }
Hye-Shik Chang81268602004-02-02 06:05:24 +00001189#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00001190 default:
1191 {
1192 PyErr_SetString(socket_error, "getsockaddrlen: unknown BT protocol");
1193 return 0;
1194 }
1195 }
1196 }
1197#endif
1198
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00001199#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +00001200 case AF_PACKET:
1201 {
1202 *len_ret = sizeof (struct sockaddr_ll);
1203 return 1;
1204 }
1205#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001206
Guido van Rossum710e1df1992-06-12 10:39:36 +00001207 /* More cases here... */
1208
1209 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001210 PyErr_SetString(socket_error, "getsockaddrlen: bad family");
Guido van Rossum710e1df1992-06-12 10:39:36 +00001211 return 0;
1212
1213 }
1214}
1215
1216
Guido van Rossum30a685f1991-06-27 15:51:29 +00001217/* s.accept() method */
1218
Guido van Rossum73624e91994-10-10 17:59:00 +00001219static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001220sock_accept(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001221{
1222 char addrbuf[256];
Fred Drakea04eaad2000-06-30 02:46:07 +00001223 SOCKET_T newfd;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001224 socklen_t addrlen;
Barry Warsaw752300b1997-01-03 17:18:10 +00001225 PyObject *sock = NULL;
1226 PyObject *addr = NULL;
1227 PyObject *res = NULL;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001228 int timeout;
Barry Warsaw752300b1997-01-03 17:18:10 +00001229
Guido van Rossum710e1df1992-06-12 10:39:36 +00001230 if (!getsockaddrlen(s, &addrlen))
1231 return NULL;
Fred Drakefd168342001-05-09 19:11:33 +00001232 memset(addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001233
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001234#ifdef MS_WINDOWS
1235 newfd = INVALID_SOCKET;
1236#else
1237 newfd = -1;
1238#endif
1239
Guido van Rossum73624e91994-10-10 17:59:00 +00001240 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001241 timeout = internal_select(s, 0);
1242 if (!timeout)
1243 newfd = accept(s->sock_fd, (struct sockaddr *) addrbuf,
1244 &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001245 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001246
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001247 if (timeout) {
1248 PyErr_SetString(socket_timeout, "timed out");
1249 return NULL;
1250 }
1251
Fred Drakea04eaad2000-06-30 02:46:07 +00001252#ifdef MS_WINDOWS
1253 if (newfd == INVALID_SOCKET)
1254#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001255 if (newfd < 0)
Fred Drakea04eaad2000-06-30 02:46:07 +00001256#endif
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001257 return s->errorhandler();
Barry Warsaw752300b1997-01-03 17:18:10 +00001258
Guido van Rossum30a685f1991-06-27 15:51:29 +00001259 /* Create the new object with unspecified family,
1260 to avoid calls to bind() etc. on it. */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001261 sock = (PyObject *) new_sockobject(newfd,
1262 s->sock_family,
1263 s->sock_type,
1264 s->sock_proto);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001265
Barry Warsaw752300b1997-01-03 17:18:10 +00001266 if (sock == NULL) {
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001267 SOCKETCLOSE(newfd);
Barry Warsaw752300b1997-01-03 17:18:10 +00001268 goto finally;
1269 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00001270 addr = makesockaddr(s->sock_fd, (struct sockaddr *)addrbuf,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001271 addrlen);
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001272 if (addr == NULL)
Barry Warsaw752300b1997-01-03 17:18:10 +00001273 goto finally;
1274
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001275 res = PyTuple_Pack(2, sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00001276
Guido van Rossum67f7a382002-06-06 21:08:16 +00001277finally:
Guido van Rossum73624e91994-10-10 17:59:00 +00001278 Py_XDECREF(sock);
1279 Py_XDECREF(addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001280 return res;
1281}
1282
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001283PyDoc_STRVAR(accept_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001284"accept() -> (socket object, address info)\n\
1285\n\
1286Wait for an incoming connection. Return a new socket representing the\n\
1287connection, and the address of the client. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001288info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001289
Guido van Rossum11ba0942002-06-13 15:07:44 +00001290/* s.setblocking(flag) method. Argument:
1291 False -- non-blocking mode; same as settimeout(0)
1292 True -- blocking mode; same as settimeout(None)
1293*/
Guido van Rossume4485b01994-09-07 14:32:49 +00001294
Guido van Rossum73624e91994-10-10 17:59:00 +00001295static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001296sock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00001297{
1298 int block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001299
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001300 block = PyInt_AsLong(arg);
1301 if (block == -1 && PyErr_Occurred())
Guido van Rossume4485b01994-09-07 14:32:49 +00001302 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001303
Guido van Rossum11ba0942002-06-13 15:07:44 +00001304 s->sock_timeout = block ? -1.0 : 0.0;
Guido van Rossume8008f02002-06-07 03:36:20 +00001305 internal_setblocking(s, block);
Guido van Rossume4485b01994-09-07 14:32:49 +00001306
Guido van Rossum73624e91994-10-10 17:59:00 +00001307 Py_INCREF(Py_None);
1308 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +00001309}
Guido van Rossume4485b01994-09-07 14:32:49 +00001310
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001311PyDoc_STRVAR(setblocking_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001312"setblocking(flag)\n\
1313\n\
1314Set the socket to blocking (flag is true) or non-blocking (false).\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00001315setblocking(True) is equivalent to settimeout(None);\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001316setblocking(False) is equivalent to settimeout(0.0).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001317
Guido van Rossum11ba0942002-06-13 15:07:44 +00001318/* s.settimeout(timeout) method. Argument:
1319 None -- no timeout, blocking mode; same as setblocking(True)
1320 0.0 -- non-blocking mode; same as setblocking(False)
1321 > 0 -- timeout mode; operations time out after timeout seconds
1322 < 0 -- illegal; raises an exception
1323*/
Guido van Rossum67f7a382002-06-06 21:08:16 +00001324static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001325sock_settimeout(PySocketSockObject *s, PyObject *arg)
Guido van Rossum67f7a382002-06-06 21:08:16 +00001326{
Guido van Rossum11ba0942002-06-13 15:07:44 +00001327 double timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001328
1329 if (arg == Py_None)
Guido van Rossum11ba0942002-06-13 15:07:44 +00001330 timeout = -1.0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001331 else {
Guido van Rossum11ba0942002-06-13 15:07:44 +00001332 timeout = PyFloat_AsDouble(arg);
1333 if (timeout < 0.0) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00001334 if (!PyErr_Occurred())
1335 PyErr_SetString(PyExc_ValueError,
Guido van Rossum11ba0942002-06-13 15:07:44 +00001336 "Timeout value out of range");
Guido van Rossum67f7a382002-06-06 21:08:16 +00001337 return NULL;
1338 }
1339 }
1340
Guido van Rossum11ba0942002-06-13 15:07:44 +00001341 s->sock_timeout = timeout;
1342 internal_setblocking(s, timeout < 0.0);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001343
1344 Py_INCREF(Py_None);
1345 return Py_None;
1346}
1347
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001348PyDoc_STRVAR(settimeout_doc,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001349"settimeout(timeout)\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00001350\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00001351Set a timeout on socket operations. 'timeout' can be a float,\n\
1352giving in seconds, or None. Setting a timeout of None disables\n\
1353the timeout feature and is equivalent to setblocking(1).\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001354Setting a timeout of zero is the same as setblocking(0).");
Guido van Rossum67f7a382002-06-06 21:08:16 +00001355
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001356/* s.gettimeout() method.
1357 Returns the timeout associated with a socket. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00001358static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001359sock_gettimeout(PySocketSockObject *s)
Guido van Rossum67f7a382002-06-06 21:08:16 +00001360{
1361 if (s->sock_timeout < 0.0) {
1362 Py_INCREF(Py_None);
1363 return Py_None;
1364 }
1365 else
1366 return PyFloat_FromDouble(s->sock_timeout);
1367}
1368
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001369PyDoc_STRVAR(gettimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00001370"gettimeout() -> timeout\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00001371\n\
1372Returns the timeout in floating seconds associated with socket \n\
1373operations. A timeout of None indicates that timeouts on socket \n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001374operations are disabled.");
Guido van Rossume4485b01994-09-07 14:32:49 +00001375
Guido van Rossum48a680c2001-03-02 06:34:14 +00001376#ifdef RISCOS
1377/* s.sleeptaskw(1 | 0) method */
1378
1379static PyObject *
Martin v. Löwisa94568a2003-05-10 07:36:56 +00001380sock_sleeptaskw(PySocketSockObject *s,PyObject *arg)
Guido van Rossum48a680c2001-03-02 06:34:14 +00001381{
Guido van Rossum67f7a382002-06-06 21:08:16 +00001382 int block;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00001383 block = PyInt_AsLong(arg);
1384 if (block == -1 && PyErr_Occurred())
Guido van Rossum67f7a382002-06-06 21:08:16 +00001385 return NULL;
1386 Py_BEGIN_ALLOW_THREADS
1387 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
1388 Py_END_ALLOW_THREADS
Guido van Rossum48a680c2001-03-02 06:34:14 +00001389
Guido van Rossum67f7a382002-06-06 21:08:16 +00001390 Py_INCREF(Py_None);
1391 return Py_None;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001392}
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001393PyDoc_STRVAR(sleeptaskw_doc,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001394"sleeptaskw(flag)\n\
1395\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001396Allow sleeps in taskwindows.");
Guido van Rossum48a680c2001-03-02 06:34:14 +00001397#endif
1398
1399
Guido van Rossumaee08791992-09-08 09:05:33 +00001400/* s.setsockopt() method.
1401 With an integer third argument, sets an integer option.
1402 With a string third argument, sets an option from a buffer;
1403 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001404
Guido van Rossum73624e91994-10-10 17:59:00 +00001405static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001406sock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001407{
1408 int level;
1409 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001410 int res;
Guido van Rossumaee08791992-09-08 09:05:33 +00001411 char *buf;
1412 int buflen;
1413 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001414
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001415 if (PyArg_ParseTuple(args, "iii:setsockopt",
1416 &level, &optname, &flag)) {
Guido van Rossumaee08791992-09-08 09:05:33 +00001417 buf = (char *) &flag;
1418 buflen = sizeof flag;
1419 }
1420 else {
Guido van Rossum73624e91994-10-10 17:59:00 +00001421 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001422 if (!PyArg_ParseTuple(args, "iis#:setsockopt",
1423 &level, &optname, &buf, &buflen))
Guido van Rossumaee08791992-09-08 09:05:33 +00001424 return NULL;
1425 }
Thomas Wouters334fb892000-07-25 12:56:38 +00001426 res = setsockopt(s->sock_fd, level, optname, (void *)buf, buflen);
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001427 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001428 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001429 Py_INCREF(Py_None);
1430 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001431}
1432
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001433PyDoc_STRVAR(setsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001434"setsockopt(level, option, value)\n\
1435\n\
1436Set a socket option. See the Unix manual for level and option.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001437The value argument can either be an integer or a string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001438
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001439
Guido van Rossumaee08791992-09-08 09:05:33 +00001440/* s.getsockopt() method.
1441 With two arguments, retrieves an integer option.
1442 With a third integer argument, retrieves a string buffer of that size;
1443 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001444
Guido van Rossum73624e91994-10-10 17:59:00 +00001445static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001446sock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001447{
1448 int level;
1449 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001450 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +00001451 PyObject *buf;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001452 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001453
Guido van Rossumbcc20741998-08-04 22:53:56 +00001454#ifdef __BEOS__
Fred Drake564a6cc2001-05-11 20:12:26 +00001455 /* We have incomplete socket support. */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001456 PyErr_SetString(socket_error, "getsockopt not supported");
Guido van Rossumbcc20741998-08-04 22:53:56 +00001457 return NULL;
1458#else
1459
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001460 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
1461 &level, &optname, &buflen))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001462 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001463
Guido van Rossumbe32c891996-06-20 16:25:29 +00001464 if (buflen == 0) {
Guido van Rossumaee08791992-09-08 09:05:33 +00001465 int flag = 0;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001466 socklen_t flagsize = sizeof flag;
Guido van Rossumb376a4a1993-11-23 17:53:17 +00001467 res = getsockopt(s->sock_fd, level, optname,
Thomas Wouters334fb892000-07-25 12:56:38 +00001468 (void *)&flag, &flagsize);
Guido van Rossumaee08791992-09-08 09:05:33 +00001469 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001470 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001471 return PyInt_FromLong(flag);
Guido van Rossumaee08791992-09-08 09:05:33 +00001472 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001473#ifdef __VMS
1474 if (buflen > 1024) {
1475#else
Guido van Rossumaee08791992-09-08 09:05:33 +00001476 if (buflen <= 0 || buflen > 1024) {
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001477#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001478 PyErr_SetString(socket_error,
Barry Warsaw752300b1997-01-03 17:18:10 +00001479 "getsockopt buflen out of range");
Guido van Rossumaee08791992-09-08 09:05:33 +00001480 return NULL;
1481 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001482 buf = PyString_FromStringAndSize((char *)NULL, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001483 if (buf == NULL)
1484 return NULL;
Guido van Rossumb376a4a1993-11-23 17:53:17 +00001485 res = getsockopt(s->sock_fd, level, optname,
Fred Drake564a6cc2001-05-11 20:12:26 +00001486 (void *)PyString_AS_STRING(buf), &buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001487 if (res < 0) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001488 Py_DECREF(buf);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001489 return s->errorhandler();
Guido van Rossumaee08791992-09-08 09:05:33 +00001490 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001491 _PyString_Resize(&buf, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001492 return buf;
Guido van Rossumbcc20741998-08-04 22:53:56 +00001493#endif /* __BEOS__ */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001494}
1495
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001496PyDoc_STRVAR(getsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001497"getsockopt(level, option[, buffersize]) -> value\n\
1498\n\
1499Get a socket option. See the Unix manual for level and option.\n\
1500If a nonzero buffersize argument is given, the return value is a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001501string of that length; otherwise it is an integer.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001502
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001503
Fred Drake728819a2000-07-01 03:40:12 +00001504/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001505
Guido van Rossum73624e91994-10-10 17:59:00 +00001506static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001507sock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001508{
1509 struct sockaddr *addr;
1510 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001511 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001512
Fred Drake728819a2000-07-01 03:40:12 +00001513 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001514 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001515 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001516 res = bind(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001517 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001518 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001519 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001520 Py_INCREF(Py_None);
1521 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001522}
1523
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001524PyDoc_STRVAR(bind_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001525"bind(address)\n\
1526\n\
1527Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00001528pair (host, port); the host must refer to the local host. For raw packet\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001529sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001530
Guido van Rossum30a685f1991-06-27 15:51:29 +00001531
1532/* s.close() method.
1533 Set the file descriptor to -1 so operations tried subsequently
1534 will surely fail. */
1535
Guido van Rossum73624e91994-10-10 17:59:00 +00001536static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001537sock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001538{
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001539 SOCKET_T fd;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001540
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001541 if ((fd = s->sock_fd) != -1) {
1542 s->sock_fd = -1;
Guido van Rossum08481461996-10-12 14:07:22 +00001543 Py_BEGIN_ALLOW_THREADS
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001544 (void) SOCKETCLOSE(fd);
Guido van Rossum08481461996-10-12 14:07:22 +00001545 Py_END_ALLOW_THREADS
1546 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001547 Py_INCREF(Py_None);
1548 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001549}
1550
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001551PyDoc_STRVAR(close_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001552"close()\n\
1553\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001554Close the socket. It cannot be used after this call.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001555
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001556static int
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001557internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen,
1558 int *timeoutp)
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001559{
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001560 int res, timeout;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001561
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001562 timeout = 0;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001563 res = connect(s->sock_fd, addr, addrlen);
1564
1565#ifdef MS_WINDOWS
1566
1567 if (s->sock_timeout > 0.0) {
1568 if (res < 0 && WSAGetLastError() == WSAEWOULDBLOCK) {
Guido van Rossumb76bdf82003-02-19 17:50:16 +00001569 /* This is a mess. Best solution: trust select */
1570 fd_set fds;
1571 struct timeval tv;
1572 tv.tv_sec = (int)s->sock_timeout;
1573 tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6);
1574 FD_ZERO(&fds);
1575 FD_SET(s->sock_fd, &fds);
1576 res = select(s->sock_fd+1, NULL, &fds, NULL, &tv);
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001577 if (res == 0) {
Guido van Rossumb76bdf82003-02-19 17:50:16 +00001578 res = WSAEWOULDBLOCK;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001579 timeout = 1;
1580 } else if (res > 0)
Guido van Rossumb76bdf82003-02-19 17:50:16 +00001581 res = 0;
1582 /* else if (res < 0) an error occurred */
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001583 }
1584 }
1585
1586 if (res < 0)
1587 res = WSAGetLastError();
1588
1589#else
1590
1591 if (s->sock_timeout > 0.0) {
1592 if (res < 0 && errno == EINPROGRESS) {
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001593 timeout = internal_select(s, 1);
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001594 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum12e3c712002-08-08 20:39:30 +00001595 if (res < 0 && errno == EISCONN)
1596 res = 0;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001597 }
1598 }
1599
1600 if (res < 0)
1601 res = errno;
1602
1603#endif
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001604 *timeoutp = timeout;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001605
1606 return res;
1607}
Guido van Rossum30a685f1991-06-27 15:51:29 +00001608
Fred Drake728819a2000-07-01 03:40:12 +00001609/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001610
Guido van Rossum73624e91994-10-10 17:59:00 +00001611static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001612sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001613{
1614 struct sockaddr *addr;
1615 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001616 int res;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001617 int timeout;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001618
Fred Drake728819a2000-07-01 03:40:12 +00001619 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001620 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001621
Guido van Rossum73624e91994-10-10 17:59:00 +00001622 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001623 res = internal_connect(s, addr, addrlen, &timeout);
Guido van Rossum11ba0942002-06-13 15:07:44 +00001624 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001625
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001626 if (timeout) {
1627 PyErr_SetString(socket_timeout, "timed out");
1628 return NULL;
1629 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001630 if (res != 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001631 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001632 Py_INCREF(Py_None);
1633 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001634}
1635
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001636PyDoc_STRVAR(connect_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001637"connect(address)\n\
1638\n\
1639Connect the socket to a remote address. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001640is a pair (host, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001641
Guido van Rossum30a685f1991-06-27 15:51:29 +00001642
Fred Drake728819a2000-07-01 03:40:12 +00001643/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001644
1645static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001646sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001647{
1648 struct sockaddr *addr;
1649 int addrlen;
1650 int res;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001651 int timeout;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001652
Fred Drake728819a2000-07-01 03:40:12 +00001653 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001654 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001655
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001656 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001657 res = internal_connect(s, addr, addrlen, &timeout);
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001658 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001659
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001660 return PyInt_FromLong((long) res);
1661}
1662
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001663PyDoc_STRVAR(connect_ex_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00001664"connect_ex(address) -> errno\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00001665\n\
1666This is like connect(address), but returns an error code (the errno value)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001667instead of raising an exception when an error occurs.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001668
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001669
Guido van Rossumed233a51992-06-23 09:07:03 +00001670/* s.fileno() method */
1671
Guido van Rossum73624e91994-10-10 17:59:00 +00001672static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001673sock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00001674{
Fred Drakea04eaad2000-06-30 02:46:07 +00001675#if SIZEOF_SOCKET_T <= SIZEOF_LONG
Guido van Rossum73624e91994-10-10 17:59:00 +00001676 return PyInt_FromLong((long) s->sock_fd);
Fred Drakea04eaad2000-06-30 02:46:07 +00001677#else
Martin v. Löwisb9a0f912003-03-29 10:06:18 +00001678 return PyLong_FromLongLong((PY_LONG_LONG)s->sock_fd);
Fred Drakea04eaad2000-06-30 02:46:07 +00001679#endif
Guido van Rossumed233a51992-06-23 09:07:03 +00001680}
1681
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001682PyDoc_STRVAR(fileno_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001683"fileno() -> integer\n\
1684\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001685Return the integer file descriptor of the socket.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001686
Guido van Rossumed233a51992-06-23 09:07:03 +00001687
Guido van Rossumbe32c891996-06-20 16:25:29 +00001688#ifndef NO_DUP
1689/* s.dup() method */
1690
1691static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001692sock_dup(PySocketSockObject *s)
Guido van Rossumbe32c891996-06-20 16:25:29 +00001693{
Fred Drakea04eaad2000-06-30 02:46:07 +00001694 SOCKET_T newfd;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001695 PyObject *sock;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001696
Guido van Rossumbe32c891996-06-20 16:25:29 +00001697 newfd = dup(s->sock_fd);
1698 if (newfd < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001699 return s->errorhandler();
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001700 sock = (PyObject *) new_sockobject(newfd,
1701 s->sock_family,
1702 s->sock_type,
1703 s->sock_proto);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001704 if (sock == NULL)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001705 SOCKETCLOSE(newfd);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001706 return sock;
1707}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001708
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001709PyDoc_STRVAR(dup_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001710"dup() -> socket object\n\
1711\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001712Return a new socket object connected to the same system resource.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001713
Guido van Rossumbe32c891996-06-20 16:25:29 +00001714#endif
1715
1716
Guido van Rossumc89705d1992-11-26 08:54:07 +00001717/* s.getsockname() method */
1718
Guido van Rossum73624e91994-10-10 17:59:00 +00001719static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001720sock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001721{
1722 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001723 int res;
1724 socklen_t addrlen;
1725
Guido van Rossumc89705d1992-11-26 08:54:07 +00001726 if (!getsockaddrlen(s, &addrlen))
1727 return NULL;
Guido van Rossumca42b161996-01-12 01:36:05 +00001728 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001729 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001730 res = getsockname(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001731 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001732 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001733 return s->errorhandler();
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001734 return makesockaddr(s->sock_fd, (struct sockaddr *) addrbuf, addrlen);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001735}
1736
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001737PyDoc_STRVAR(getsockname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001738"getsockname() -> address info\n\
1739\n\
1740Return the address of the local endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001741info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001742
Guido van Rossumc89705d1992-11-26 08:54:07 +00001743
Guido van Rossumb6775db1994-08-01 11:34:53 +00001744#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001745/* s.getpeername() method */
1746
Guido van Rossum73624e91994-10-10 17:59:00 +00001747static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001748sock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001749{
1750 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001751 int res;
1752 socklen_t addrlen;
1753
Guido van Rossumc89705d1992-11-26 08:54:07 +00001754 if (!getsockaddrlen(s, &addrlen))
1755 return NULL;
Fred Drakefd168342001-05-09 19:11:33 +00001756 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001757 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001758 res = getpeername(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001759 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001760 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001761 return s->errorhandler();
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001762 return makesockaddr(s->sock_fd, (struct sockaddr *) addrbuf, addrlen);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001763}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001764
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001765PyDoc_STRVAR(getpeername_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001766"getpeername() -> address info\n\
1767\n\
1768Return the address of the remote endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001769info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001770
Guido van Rossumb6775db1994-08-01 11:34:53 +00001771#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001772
1773
Guido van Rossum30a685f1991-06-27 15:51:29 +00001774/* s.listen(n) method */
1775
Guido van Rossum73624e91994-10-10 17:59:00 +00001776static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001777sock_listen(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001778{
1779 int backlog;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001780 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001781
1782 backlog = PyInt_AsLong(arg);
1783 if (backlog == -1 && PyErr_Occurred())
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001784 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001785 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +00001786 if (backlog < 1)
1787 backlog = 1;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001788 res = listen(s->sock_fd, backlog);
Guido van Rossum73624e91994-10-10 17:59:00 +00001789 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001790 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001791 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001792 Py_INCREF(Py_None);
1793 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001794}
1795
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001796PyDoc_STRVAR(listen_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001797"listen(backlog)\n\
1798\n\
1799Enable a server to accept connections. The backlog argument must be at\n\
1800least 1; it specifies the number of unaccepted connection that the system\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001801will allow before refusing new connections.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001802
1803
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001804#ifndef NO_DUP
Guido van Rossum30a685f1991-06-27 15:51:29 +00001805/* s.makefile(mode) method.
1806 Create a new open file object referring to a dupped version of
1807 the socket's file descriptor. (The dup() call is necessary so
1808 that the open file and socket objects may be closed independent
1809 of each other.)
1810 The mode argument specifies 'r' or 'w' passed to fdopen(). */
1811
Guido van Rossum73624e91994-10-10 17:59:00 +00001812static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001813sock_makefile(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001814{
Tim Petersdbd9ba62000-07-09 03:09:57 +00001815 extern int fclose(FILE *);
Guido van Rossum6b144911995-03-14 15:05:13 +00001816 char *mode = "r";
1817 int bufsize = -1;
Fred Drakea04eaad2000-06-30 02:46:07 +00001818#ifdef MS_WIN32
Tim Peters79248aa2001-08-29 21:37:10 +00001819 Py_intptr_t fd;
Fred Drakea04eaad2000-06-30 02:46:07 +00001820#else
Guido van Rossum30a685f1991-06-27 15:51:29 +00001821 int fd;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001822#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001823 FILE *fp;
Guido van Rossum6b144911995-03-14 15:05:13 +00001824 PyObject *f;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001825#ifdef __VMS
1826 char *mode_r = "r";
1827 char *mode_w = "w";
1828#endif
Guido van Rossum6b144911995-03-14 15:05:13 +00001829
Guido van Rossum43713e52000-02-29 13:59:29 +00001830 if (!PyArg_ParseTuple(args, "|si:makefile", &mode, &bufsize))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001831 return NULL;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001832#ifdef __VMS
1833 if (strcmp(mode,"rb") == 0) {
1834 mode = mode_r;
1835 }
1836 else {
1837 if (strcmp(mode,"wb") == 0) {
1838 mode = mode_w;
1839 }
1840 }
1841#endif
Guido van Rossum8d665e61996-06-26 18:22:49 +00001842#ifdef MS_WIN32
Guido van Rossum82a5c661998-07-07 20:45:43 +00001843 if (((fd = _open_osfhandle(s->sock_fd, _O_BINARY)) < 0) ||
1844 ((fd = dup(fd)) < 0) || ((fp = fdopen(fd, mode)) == NULL))
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001845#else
Guido van Rossum82a5c661998-07-07 20:45:43 +00001846 if ((fd = dup(s->sock_fd)) < 0 || (fp = fdopen(fd, mode)) == NULL)
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001847#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001848 {
Guido van Rossum6b144911995-03-14 15:05:13 +00001849 if (fd >= 0)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001850 SOCKETCLOSE(fd);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001851 return s->errorhandler();
Guido van Rossum6b144911995-03-14 15:05:13 +00001852 }
1853 f = PyFile_FromFile(fp, "<socket>", mode, fclose);
1854 if (f != NULL)
1855 PyFile_SetBufSize(f, bufsize);
1856 return f;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001857}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001858
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001859PyDoc_STRVAR(makefile_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001860"makefile([mode[, buffersize]]) -> file object\n\
1861\n\
1862Return a regular file object corresponding to the socket.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001863The mode and buffersize arguments are as for the built-in open() function.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001864
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001865#endif /* NO_DUP */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001866
Guido van Rossum48a680c2001-03-02 06:34:14 +00001867
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001868/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001869
Guido van Rossum73624e91994-10-10 17:59:00 +00001870static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001871sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001872{
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001873 int len, n = 0, flags = 0, timeout;
Guido van Rossum73624e91994-10-10 17:59:00 +00001874 PyObject *buf;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001875#ifdef __VMS
1876 int read_length;
1877 char *read_buf;
1878#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00001879
Guido van Rossum43713e52000-02-29 13:59:29 +00001880 if (!PyArg_ParseTuple(args, "i|i:recv", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001881 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001882
1883 if (len < 0) {
Martin v. Löwisfba64e12001-11-19 10:41:26 +00001884 PyErr_SetString(PyExc_ValueError,
Guido van Rossum11ba0942002-06-13 15:07:44 +00001885 "negative buffersize in recv");
Martin v. Löwisfba64e12001-11-19 10:41:26 +00001886 return NULL;
1887 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00001888
Guido van Rossum73624e91994-10-10 17:59:00 +00001889 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001890 if (buf == NULL)
1891 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001892
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001893#ifndef __VMS
Guido van Rossum73624e91994-10-10 17:59:00 +00001894 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001895 timeout = internal_select(s, 0);
1896 if (!timeout)
1897 n = recv(s->sock_fd, PyString_AS_STRING(buf), len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001898 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001899
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001900 if (timeout) {
1901 Py_DECREF(buf);
1902 PyErr_SetString(socket_timeout, "timed out");
1903 return NULL;
1904 }
Guido van Rossum7c53b771995-09-13 18:39:47 +00001905 if (n < 0) {
1906 Py_DECREF(buf);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001907 return s->errorhandler();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001908 }
Tim Peters5de98422002-04-27 18:44:32 +00001909 if (n != len)
1910 _PyString_Resize(&buf, n);
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001911#else
1912 read_buf = PyString_AsString(buf);
1913 read_length = len;
1914 while (read_length != 0) {
1915 unsigned int segment;
1916
1917 segment = read_length /SEGMENT_SIZE;
1918 if (segment != 0) {
1919 segment = SEGMENT_SIZE;
1920 }
1921 else {
1922 segment = read_length;
1923 }
1924
1925 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001926 timeout = internal_select(s, 0);
1927 if (!timeout)
1928 n = recv(s->sock_fd, read_buf, segment, flags);
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001929 Py_END_ALLOW_THREADS
1930
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001931 if (timeout) {
1932 Py_DECREF(buf);
1933 PyErr_SetString(socket_timeout, "timed out");
1934 return NULL;
1935 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001936 if (n < 0) {
1937 Py_DECREF(buf);
1938 return s->errorhandler();
1939 }
1940 if (n != read_length) {
1941 read_buf += n;
1942 break;
1943 }
1944
1945 read_length -= segment;
1946 read_buf += segment;
1947 }
1948 if (_PyString_Resize(&buf, (read_buf - PyString_AsString(buf))) < 0)
1949 {
1950 return NULL;
1951 }
1952#endif /* !__VMS */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001953 return buf;
1954}
1955
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001956PyDoc_STRVAR(recv_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001957"recv(buffersize[, flags]) -> data\n\
1958\n\
1959Receive up to buffersize bytes from the socket. For the optional flags\n\
1960argument, see the Unix manual. When no data is available, block until\n\
1961at least one byte is available or until the remote end is closed. When\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001962the remote end is closed and all data is read, return the empty string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001963
Guido van Rossum30a685f1991-06-27 15:51:29 +00001964
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001965/* s.recvfrom(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001966
Guido van Rossum73624e91994-10-10 17:59:00 +00001967static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001968sock_recvfrom(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001969{
1970 char addrbuf[256];
Barry Warsaw752300b1997-01-03 17:18:10 +00001971 PyObject *buf = NULL;
1972 PyObject *addr = NULL;
1973 PyObject *ret = NULL;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001974 int len, n = 0, flags = 0, timeout;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001975 socklen_t addrlen;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001976
Guido van Rossum43713e52000-02-29 13:59:29 +00001977 if (!PyArg_ParseTuple(args, "i|i:recvfrom", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001978 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001979
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001980 if (!getsockaddrlen(s, &addrlen))
1981 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001982 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001983 if (buf == NULL)
1984 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001985
Guido van Rossum73624e91994-10-10 17:59:00 +00001986 Py_BEGIN_ALLOW_THREADS
Fred Drakefd168342001-05-09 19:11:33 +00001987 memset(addrbuf, 0, addrlen);
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001988 timeout = internal_select(s, 0);
1989 if (!timeout)
1990 n = recvfrom(s->sock_fd, PyString_AS_STRING(buf), len, flags,
Guido van Rossum8d665e61996-06-26 18:22:49 +00001991#ifndef MS_WINDOWS
Andrew MacIntyreba43e872002-03-03 03:03:52 +00001992#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001993 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001994#else
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001995 (void *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001996#endif
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001997#else
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001998 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001999#endif
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002000 );
Guido van Rossum73624e91994-10-10 17:59:00 +00002001 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002002
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002003 if (timeout) {
2004 Py_DECREF(buf);
2005 PyErr_SetString(socket_timeout, "timed out");
2006 return NULL;
2007 }
Guido van Rossum7c53b771995-09-13 18:39:47 +00002008 if (n < 0) {
2009 Py_DECREF(buf);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002010 return s->errorhandler();
Guido van Rossum7c53b771995-09-13 18:39:47 +00002011 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002012
Guido van Rossum53a9bf81996-06-11 18:35:24 +00002013 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002014 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002015
Guido van Rossum67f7a382002-06-06 21:08:16 +00002016 if (!(addr = makesockaddr(s->sock_fd, (struct sockaddr *)addrbuf,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002017 addrlen)))
Barry Warsaw752300b1997-01-03 17:18:10 +00002018 goto finally;
2019
Raymond Hettinger8ae46892003-10-12 19:09:37 +00002020 ret = PyTuple_Pack(2, buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002021
2022finally:
Guido van Rossum73624e91994-10-10 17:59:00 +00002023 Py_XDECREF(addr);
2024 Py_XDECREF(buf);
Guido van Rossum6f5afc91993-02-05 09:46:15 +00002025 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002026}
2027
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002028PyDoc_STRVAR(recvfrom_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002029"recvfrom(buffersize[, flags]) -> (data, address info)\n\
2030\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002031Like recv(buffersize, flags) but also return the sender's address info.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002032
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002033/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002034
Guido van Rossum73624e91994-10-10 17:59:00 +00002035static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002036sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002037{
Guido van Rossumff4949e1992-08-05 19:58:53 +00002038 char *buf;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002039 int len, n = 0, flags = 0, timeout;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002040#ifdef __VMS
2041 int send_length;
2042#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00002043
Guido van Rossum43713e52000-02-29 13:59:29 +00002044 if (!PyArg_ParseTuple(args, "s#|i:send", &buf, &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00002045 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002046
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002047#ifndef __VMS
Guido van Rossum73624e91994-10-10 17:59:00 +00002048 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002049 timeout = internal_select(s, 1);
2050 if (!timeout)
2051 n = send(s->sock_fd, buf, len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00002052 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002053
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002054 if (timeout) {
2055 PyErr_SetString(socket_timeout, "timed out");
2056 return NULL;
2057 }
Guido van Rossum30a685f1991-06-27 15:51:29 +00002058 if (n < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002059 return s->errorhandler();
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002060#else
2061 /* Divide packet into smaller segments for */
2062 /* TCP/IP Services for OpenVMS */
2063 send_length = len;
2064 while (send_length != 0) {
2065 unsigned int segment;
2066
2067 segment = send_length / SEGMENT_SIZE;
2068 if (segment != 0) {
2069 segment = SEGMENT_SIZE;
2070 }
2071 else {
2072 segment = send_length;
2073 }
2074 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002075 timeout = internal_select(s, 1);
2076 if (!timeout)
2077 n = send(s->sock_fd, buf, segment, flags);
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002078 Py_END_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002079 if (timeout) {
2080 PyErr_SetString(socket_timeout, "timed out");
2081 return NULL;
2082 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002083 if (n < 0) {
2084 return s->errorhandler();
2085 }
2086 send_length -= segment;
2087 buf += segment;
2088 } /* end while */
2089#endif /* !__VMS */
Guido van Rossum73624e91994-10-10 17:59:00 +00002090 return PyInt_FromLong((long)n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00002091}
2092
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002093PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002094"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002095\n\
2096Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002097argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002098sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002099
2100
2101/* s.sendall(data [,flags]) method */
2102
2103static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002104sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002105{
2106 char *buf;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002107 int len, n = 0, flags = 0, timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002108
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002109 if (!PyArg_ParseTuple(args, "s#|i:sendall", &buf, &len, &flags))
2110 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002111
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002112 Py_BEGIN_ALLOW_THREADS
2113 do {
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002114 timeout = internal_select(s, 1);
2115 if (timeout)
2116 break;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002117 n = send(s->sock_fd, buf, len, flags);
2118 if (n < 0)
2119 break;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002120 buf += n;
2121 len -= n;
2122 } while (len > 0);
2123 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002124
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002125 if (timeout) {
2126 PyErr_SetString(socket_timeout, "timed out");
2127 return NULL;
2128 }
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002129 if (n < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002130 return s->errorhandler();
Guido van Rossum67f7a382002-06-06 21:08:16 +00002131
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002132 Py_INCREF(Py_None);
2133 return Py_None;
2134}
2135
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002136PyDoc_STRVAR(sendall_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002137"sendall(data[, flags])\n\
2138\n\
2139Send a data string to the socket. For the optional flags\n\
2140argument, see the Unix manual. This calls send() repeatedly\n\
2141until all data is sent. If an error occurs, it's impossible\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002142to tell how much data has been sent.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002143
Guido van Rossum30a685f1991-06-27 15:51:29 +00002144
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002145/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002146
Guido van Rossum73624e91994-10-10 17:59:00 +00002147static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002148sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002149{
Guido van Rossum73624e91994-10-10 17:59:00 +00002150 PyObject *addro;
Guido van Rossumff4949e1992-08-05 19:58:53 +00002151 char *buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002152 struct sockaddr *addr;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002153 int addrlen, len, n = 0, flags, timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002154
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002155 flags = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002156 if (!PyArg_ParseTuple(args, "s#O:sendto", &buf, &len, &addro)) {
Guido van Rossum73624e91994-10-10 17:59:00 +00002157 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002158 if (!PyArg_ParseTuple(args, "s#iO:sendto",
2159 &buf, &len, &flags, &addro))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002160 return NULL;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002161 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002162
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002163 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002164 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002165
Guido van Rossum73624e91994-10-10 17:59:00 +00002166 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002167 timeout = internal_select(s, 1);
2168 if (!timeout)
2169 n = sendto(s->sock_fd, buf, len, flags, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00002170 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002171
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002172 if (timeout) {
2173 PyErr_SetString(socket_timeout, "timed out");
2174 return NULL;
2175 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002176 if (n < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002177 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00002178 return PyInt_FromLong((long)n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002179}
2180
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002181PyDoc_STRVAR(sendto_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002182"sendto(data[, flags], address) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002183\n\
2184Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002185For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002186
Guido van Rossum30a685f1991-06-27 15:51:29 +00002187
2188/* s.shutdown(how) method */
2189
Guido van Rossum73624e91994-10-10 17:59:00 +00002190static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002191sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002192{
2193 int how;
Guido van Rossumff4949e1992-08-05 19:58:53 +00002194 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002195
2196 how = PyInt_AsLong(arg);
2197 if (how == -1 && PyErr_Occurred())
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002198 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00002199 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002200 res = shutdown(s->sock_fd, how);
Guido van Rossum73624e91994-10-10 17:59:00 +00002201 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002202 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002203 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00002204 Py_INCREF(Py_None);
2205 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002206}
2207
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002208PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002209"shutdown(flag)\n\
2210\n\
Martin v. Löwis94681fc2003-11-27 19:40:22 +00002211Shut down the reading side of the socket (flag == SHUT_RD), the writing side\n\
2212of the socket (flag == SHUT_WR), or both ends (flag == SHUT_RDWR).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002213
Guido van Rossum30a685f1991-06-27 15:51:29 +00002214
2215/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002216
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002217static PyMethodDef sock_methods[] = {
2218 {"accept", (PyCFunction)sock_accept, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002219 accept_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002220 {"bind", (PyCFunction)sock_bind, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002221 bind_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002222 {"close", (PyCFunction)sock_close, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002223 close_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002224 {"connect", (PyCFunction)sock_connect, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002225 connect_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002226 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002227 connect_ex_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00002228#ifndef NO_DUP
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002229 {"dup", (PyCFunction)sock_dup, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002230 dup_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00002231#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002232 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002233 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00002234#ifdef HAVE_GETPEERNAME
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002235 {"getpeername", (PyCFunction)sock_getpeername,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002236 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00002237#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002238 {"getsockname", (PyCFunction)sock_getsockname,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002239 METH_NOARGS, getsockname_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002240 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002241 getsockopt_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002242 {"listen", (PyCFunction)sock_listen, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002243 listen_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002244#ifndef NO_DUP
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002245 {"makefile", (PyCFunction)sock_makefile, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002246 makefile_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002247#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002248 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002249 recv_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002250 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002251 recvfrom_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002252 {"send", (PyCFunction)sock_send, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002253 send_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002254 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002255 sendall_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002256 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002257 sendto_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002258 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002259 setblocking_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002260 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
Guido van Rossum67f7a382002-06-06 21:08:16 +00002261 settimeout_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002262 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
Guido van Rossum67f7a382002-06-06 21:08:16 +00002263 gettimeout_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002264 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002265 setsockopt_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002266 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002267 shutdown_doc},
2268#ifdef RISCOS
Martin v. Löwisa94568a2003-05-10 07:36:56 +00002269 {"sleeptaskw", (PyCFunction)sock_sleeptaskw, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002270 sleeptaskw_doc},
2271#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +00002272 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002273};
2274
Guido van Rossum30a685f1991-06-27 15:51:29 +00002275
Guido van Rossum73624e91994-10-10 17:59:00 +00002276/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00002277 First close the file description. */
2278
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002279static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002280sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002281{
Guido van Rossumfa972c92000-04-10 12:45:45 +00002282 if (s->sock_fd != -1)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00002283 (void) SOCKETCLOSE(s->sock_fd);
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002284 s->ob_type->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002285}
2286
Guido van Rossum30a685f1991-06-27 15:51:29 +00002287
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002288static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002289sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002290{
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002291 char buf[512];
Fred Drakea04eaad2000-06-30 02:46:07 +00002292#if SIZEOF_SOCKET_T > SIZEOF_LONG
2293 if (s->sock_fd > LONG_MAX) {
2294 /* this can occur on Win64, and actually there is a special
2295 ugly printf formatter for decimal pointer length integer
2296 printing, only bother if necessary*/
2297 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002298 "no printf formatter to display "
2299 "the socket descriptor in decimal");
Fred Drakea04eaad2000-06-30 02:46:07 +00002300 return NULL;
2301 }
2302#endif
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002303 PyOS_snprintf(
2304 buf, sizeof(buf),
2305 "<socket object, fd=%ld, family=%d, type=%d, protocol=%d>",
2306 (long)s->sock_fd, s->sock_family,
2307 s->sock_type,
2308 s->sock_proto);
Guido van Rossumdc1c64a1996-02-27 15:21:19 +00002309 return PyString_FromString(buf);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002310}
2311
2312
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002313/* Create a new, uninitialized socket object. */
2314
2315static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002316sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002317{
2318 PyObject *new;
2319
2320 new = type->tp_alloc(type, 0);
Guido van Rossume1c478f2002-06-06 20:08:25 +00002321 if (new != NULL) {
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002322 ((PySocketSockObject *)new)->sock_fd = -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002323 ((PySocketSockObject *)new)->sock_timeout = -1.0;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002324 ((PySocketSockObject *)new)->errorhandler = &set_error;
Guido van Rossume1c478f2002-06-06 20:08:25 +00002325 }
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002326 return new;
2327}
2328
2329
2330/* Initialize a new socket object. */
2331
2332/*ARGSUSED*/
2333static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00002334sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002335{
2336 PySocketSockObject *s = (PySocketSockObject *)self;
2337 SOCKET_T fd;
2338 int family = AF_INET, type = SOCK_STREAM, proto = 0;
2339 static char *keywords[] = {"family", "type", "proto", 0};
2340
2341 if (!PyArg_ParseTupleAndKeywords(args, kwds,
2342 "|iii:socket", keywords,
2343 &family, &type, &proto))
2344 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002345
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002346 Py_BEGIN_ALLOW_THREADS
2347 fd = socket(family, type, proto);
2348 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002349
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002350#ifdef MS_WINDOWS
2351 if (fd == INVALID_SOCKET)
2352#else
2353 if (fd < 0)
2354#endif
2355 {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002356 set_error();
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002357 return -1;
2358 }
2359 init_sockobject(s, fd, family, type, proto);
2360 /* From now on, ignore SIGPIPE and let the error checking
2361 do the work. */
2362#ifdef SIGPIPE
2363 (void) signal(SIGPIPE, SIG_IGN);
2364#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00002365
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002366 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002367
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002368}
2369
2370
Guido van Rossumb6775db1994-08-01 11:34:53 +00002371/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002372
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002373static PyTypeObject sock_type = {
Guido van Rossum55558541996-05-23 22:54:50 +00002374 PyObject_HEAD_INIT(0) /* Must fill in type value later */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002375 0, /* ob_size */
Guido van Rossumca6dfa52001-10-28 12:31:33 +00002376 "_socket.socket", /* tp_name */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002377 sizeof(PySocketSockObject), /* tp_basicsize */
2378 0, /* tp_itemsize */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002379 (destructor)sock_dealloc, /* tp_dealloc */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002380 0, /* tp_print */
2381 0, /* tp_getattr */
2382 0, /* tp_setattr */
2383 0, /* tp_compare */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002384 (reprfunc)sock_repr, /* tp_repr */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002385 0, /* tp_as_number */
2386 0, /* tp_as_sequence */
2387 0, /* tp_as_mapping */
2388 0, /* tp_hash */
2389 0, /* tp_call */
2390 0, /* tp_str */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002391 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002392 0, /* tp_setattro */
2393 0, /* tp_as_buffer */
2394 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002395 sock_doc, /* tp_doc */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002396 0, /* tp_traverse */
2397 0, /* tp_clear */
2398 0, /* tp_richcompare */
2399 0, /* tp_weaklistoffset */
2400 0, /* tp_iter */
2401 0, /* tp_iternext */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002402 sock_methods, /* tp_methods */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002403 0, /* tp_members */
2404 0, /* tp_getset */
2405 0, /* tp_base */
2406 0, /* tp_dict */
2407 0, /* tp_descr_get */
2408 0, /* tp_descr_set */
2409 0, /* tp_dictoffset */
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00002410 sock_initobj, /* tp_init */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002411 PyType_GenericAlloc, /* tp_alloc */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002412 sock_new, /* tp_new */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002413 PyObject_Del, /* tp_free */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002414};
2415
Guido van Rossum30a685f1991-06-27 15:51:29 +00002416
Guido van Rossum81194471991-07-27 21:42:02 +00002417/* Python interface to gethostname(). */
2418
2419/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002420static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002421socket_gethostname(PyObject *self, PyObject *args)
Guido van Rossum81194471991-07-27 21:42:02 +00002422{
2423 char buf[1024];
Guido van Rossumff4949e1992-08-05 19:58:53 +00002424 int res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002425 if (!PyArg_ParseTuple(args, ":gethostname"))
Guido van Rossum81194471991-07-27 21:42:02 +00002426 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00002427 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002428 res = gethostname(buf, (int) sizeof buf - 1);
Guido van Rossum73624e91994-10-10 17:59:00 +00002429 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002430 if (res < 0)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002431 return set_error();
Guido van Rossum81194471991-07-27 21:42:02 +00002432 buf[sizeof buf - 1] = '\0';
Guido van Rossum73624e91994-10-10 17:59:00 +00002433 return PyString_FromString(buf);
Guido van Rossum81194471991-07-27 21:42:02 +00002434}
Guido van Rossumff4949e1992-08-05 19:58:53 +00002435
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002436PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002437"gethostname() -> string\n\
2438\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002439Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002440
Guido van Rossumff4949e1992-08-05 19:58:53 +00002441
Guido van Rossum30a685f1991-06-27 15:51:29 +00002442/* Python interface to gethostbyname(name). */
2443
2444/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002445static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002446socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002447{
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002448 char *name;
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00002449#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002450 struct sockaddr_storage addrbuf;
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00002451#else
2452 struct sockaddr_in addrbuf;
2453#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002454
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002455 if (!PyArg_ParseTuple(args, "s:gethostbyname", &name))
Guido van Rossum30a685f1991-06-27 15:51:29 +00002456 return NULL;
Martin v. Löwisddc6f472002-07-28 16:10:31 +00002457 if (setipaddr(name, (struct sockaddr *)&addrbuf, sizeof(addrbuf), AF_INET) < 0)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002458 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002459 return makeipaddr((struct sockaddr *)&addrbuf,
2460 sizeof(struct sockaddr_in));
Guido van Rossum30a685f1991-06-27 15:51:29 +00002461}
2462
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002463PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002464"gethostbyname(host) -> address\n\
2465\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002466Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002467
2468
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002469/* Convenience function common to gethostbyname_ex and gethostbyaddr */
2470
2471static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002472gethost_common(struct hostent *h, struct sockaddr *addr, int alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002473{
2474 char **pch;
2475 PyObject *rtn_tuple = (PyObject *)NULL;
2476 PyObject *name_list = (PyObject *)NULL;
2477 PyObject *addr_list = (PyObject *)NULL;
2478 PyObject *tmp;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002479
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002480 if (h == NULL) {
Guido van Rossum48a680c2001-03-02 06:34:14 +00002481 /* Let's get real error message to return */
Guido van Rossume2ae77b2001-10-24 20:42:55 +00002482#ifndef RISCOS
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002483 set_herror(h_errno);
Guido van Rossume2ae77b2001-10-24 20:42:55 +00002484#else
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002485 PyErr_SetString(socket_error, "host not found");
Guido van Rossume2ae77b2001-10-24 20:42:55 +00002486#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002487 return NULL;
2488 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002489
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002490 if (h->h_addrtype != af) {
2491#ifdef HAVE_STRERROR
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002492 /* Let's get real error message to return */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002493 PyErr_SetString(socket_error,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002494 (char *)strerror(EAFNOSUPPORT));
2495#else
2496 PyErr_SetString(
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002497 socket_error,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002498 "Address family not supported by protocol family");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002499#endif
2500 return NULL;
2501 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002502
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002503 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00002504
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002505 case AF_INET:
2506 if (alen < sizeof(struct sockaddr_in))
2507 return NULL;
2508 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002509
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002510#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002511 case AF_INET6:
2512 if (alen < sizeof(struct sockaddr_in6))
2513 return NULL;
2514 break;
2515#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00002516
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002517 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002518
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002519 if ((name_list = PyList_New(0)) == NULL)
2520 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002521
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002522 if ((addr_list = PyList_New(0)) == NULL)
2523 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002524
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002525 for (pch = h->h_aliases; *pch != NULL; pch++) {
2526 int status;
2527 tmp = PyString_FromString(*pch);
2528 if (tmp == NULL)
2529 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002530
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002531 status = PyList_Append(name_list, tmp);
2532 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002533
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002534 if (status)
2535 goto err;
2536 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002537
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002538 for (pch = h->h_addr_list; *pch != NULL; pch++) {
2539 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002540
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002541 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00002542
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002543 case AF_INET:
2544 {
2545 struct sockaddr_in sin;
2546 memset(&sin, 0, sizeof(sin));
2547 sin.sin_family = af;
2548#ifdef HAVE_SOCKADDR_SA_LEN
2549 sin.sin_len = sizeof(sin);
2550#endif
2551 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
2552 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
Guido van Rossum67f7a382002-06-06 21:08:16 +00002553
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002554 if (pch == h->h_addr_list && alen >= sizeof(sin))
2555 memcpy((char *) addr, &sin, sizeof(sin));
2556 break;
2557 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002558
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002559#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002560 case AF_INET6:
2561 {
2562 struct sockaddr_in6 sin6;
2563 memset(&sin6, 0, sizeof(sin6));
2564 sin6.sin6_family = af;
2565#ifdef HAVE_SOCKADDR_SA_LEN
2566 sin6.sin6_len = sizeof(sin6);
2567#endif
2568 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
2569 tmp = makeipaddr((struct sockaddr *)&sin6,
2570 sizeof(sin6));
Guido van Rossum67f7a382002-06-06 21:08:16 +00002571
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002572 if (pch == h->h_addr_list && alen >= sizeof(sin6))
2573 memcpy((char *) addr, &sin6, sizeof(sin6));
2574 break;
2575 }
2576#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00002577
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002578 default: /* can't happen */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002579 PyErr_SetString(socket_error,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002580 "unsupported address family");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002581 return NULL;
2582 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002583
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002584 if (tmp == NULL)
2585 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002586
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002587 status = PyList_Append(addr_list, tmp);
2588 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002589
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002590 if (status)
2591 goto err;
2592 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002593
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002594 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002595
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002596 err:
2597 Py_XDECREF(name_list);
2598 Py_XDECREF(addr_list);
2599 return rtn_tuple;
2600}
2601
2602
2603/* Python interface to gethostbyname_ex(name). */
2604
2605/*ARGSUSED*/
2606static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002607socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002608{
2609 char *name;
2610 struct hostent *h;
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00002611#ifdef ENABLE_IPV6
2612 struct sockaddr_storage addr;
2613#else
2614 struct sockaddr_in addr;
2615#endif
Martin v. Löwis9db2f572001-07-23 01:30:10 +00002616 struct sockaddr *sa;
Guido van Rossum955becc1999-03-22 20:14:53 +00002617 PyObject *ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002618#ifdef HAVE_GETHOSTBYNAME_R
2619 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002620#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
2621 struct hostent_data data;
2622#else
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002623 char buf[16384];
2624 int buf_len = (sizeof buf) - 1;
2625 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002626#endif
2627#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002628 int result;
2629#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002630#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002631
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002632 if (!PyArg_ParseTuple(args, "s:gethostbyname_ex", &name))
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002633 return NULL;
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00002634 if (setipaddr(name, (struct sockaddr *)&addr, sizeof(addr), AF_INET) < 0)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002635 return NULL;
2636 Py_BEGIN_ALLOW_THREADS
2637#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002638#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002639 result = gethostbyname_r(name, &hp_allocated, buf, buf_len,
2640 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002641#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002642 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002643#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00002644 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002645 result = gethostbyname_r(name, &hp_allocated, &data);
2646 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002647#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002648#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00002649#ifdef USE_GETHOSTBYNAME_LOCK
Just van Rossum1040d2c2003-05-09 07:53:18 +00002650 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002651#endif
2652 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002653#endif /* HAVE_GETHOSTBYNAME_R */
2654 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002655 /* Some C libraries would require addr.__ss_family instead of
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002656 addr.ss_family.
2657 Therefore, we cast the sockaddr_storage into sockaddr to
2658 access sa_family. */
Martin v. Löwis9db2f572001-07-23 01:30:10 +00002659 sa = (struct sockaddr*)&addr;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002660 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr),
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002661 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00002662#ifdef USE_GETHOSTBYNAME_LOCK
Just van Rossum1040d2c2003-05-09 07:53:18 +00002663 PyThread_release_lock(netdb_lock);
Guido van Rossum955becc1999-03-22 20:14:53 +00002664#endif
2665 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002666}
2667
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002668PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002669"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
2670\n\
2671Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002672for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002673
2674
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002675/* Python interface to gethostbyaddr(IP). */
2676
2677/*ARGSUSED*/
2678static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002679socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002680{
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002681#ifdef ENABLE_IPV6
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002682 struct sockaddr_storage addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002683#else
Guido van Rossum48a680c2001-03-02 06:34:14 +00002684 struct sockaddr_in addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002685#endif
2686 struct sockaddr *sa = (struct sockaddr *)&addr;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002687 char *ip_num;
2688 struct hostent *h;
Guido van Rossum3baaa131999-03-22 21:44:51 +00002689 PyObject *ret;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002690#ifdef HAVE_GETHOSTBYNAME_R
2691 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002692#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
2693 struct hostent_data data;
2694#else
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002695 char buf[16384];
2696 int buf_len = (sizeof buf) - 1;
2697 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002698#endif
2699#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002700 int result;
2701#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002702#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002703 char *ap;
2704 int al;
2705 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002706
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002707 if (!PyArg_ParseTuple(args, "s:gethostbyaddr", &ip_num))
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002708 return NULL;
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00002709 af = AF_UNSPEC;
Martin v. Löwisddc6f472002-07-28 16:10:31 +00002710 if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002711 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002712 af = sa->sa_family;
2713 ap = NULL;
2714 al = 0;
2715 switch (af) {
2716 case AF_INET:
2717 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
2718 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
2719 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002720#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002721 case AF_INET6:
2722 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
2723 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
2724 break;
2725#endif
2726 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002727 PyErr_SetString(socket_error, "unsupported address family");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002728 return NULL;
2729 }
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002730 Py_BEGIN_ALLOW_THREADS
2731#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002732#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002733 result = gethostbyaddr_r(ap, al, af,
2734 &hp_allocated, buf, buf_len,
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002735 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002736#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002737 h = gethostbyaddr_r(ap, al, af,
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002738 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002739#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00002740 memset((void *) &data, '\0', sizeof(data));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002741 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002742 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002743#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002744#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00002745#ifdef USE_GETHOSTBYNAME_LOCK
Just van Rossum1040d2c2003-05-09 07:53:18 +00002746 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002747#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002748 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002749#endif /* HAVE_GETHOSTBYNAME_R */
2750 Py_END_ALLOW_THREADS
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002751 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00002752#ifdef USE_GETHOSTBYNAME_LOCK
Just van Rossum1040d2c2003-05-09 07:53:18 +00002753 PyThread_release_lock(netdb_lock);
Guido van Rossum3baaa131999-03-22 21:44:51 +00002754#endif
2755 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002756}
2757
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002758PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002759"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
2760\n\
2761Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002762for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002763
Guido van Rossum30a685f1991-06-27 15:51:29 +00002764
2765/* Python interface to getservbyname(name).
2766 This only returns the port number, since the other info is already
2767 known or not useful (like the list of aliases). */
2768
2769/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002770static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002771socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002772{
Guido van Rossumff4949e1992-08-05 19:58:53 +00002773 char *name, *proto;
Guido van Rossum30a685f1991-06-27 15:51:29 +00002774 struct servent *sp;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002775 if (!PyArg_ParseTuple(args, "ss:getservbyname", &name, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +00002776 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00002777 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002778 sp = getservbyname(name, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00002779 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00002780 if (sp == NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002781 PyErr_SetString(socket_error, "service/proto not found");
Guido van Rossum30a685f1991-06-27 15:51:29 +00002782 return NULL;
2783 }
Guido van Rossum73624e91994-10-10 17:59:00 +00002784 return PyInt_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00002785}
2786
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002787PyDoc_STRVAR(getservbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002788"getservbyname(servicename, protocolname) -> integer\n\
2789\n\
2790Return a port number from a service name and protocol name.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002791The protocol name should be 'tcp' or 'udp'.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002792
Guido van Rossum30a685f1991-06-27 15:51:29 +00002793
Guido van Rossum3901d851996-12-19 16:35:04 +00002794/* Python interface to getprotobyname(name).
2795 This only returns the protocol number, since the other info is
2796 already known or not useful (like the list of aliases). */
2797
2798/*ARGSUSED*/
2799static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002800socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00002801{
2802 char *name;
2803 struct protoent *sp;
Guido van Rossumbcc20741998-08-04 22:53:56 +00002804#ifdef __BEOS__
2805/* Not available in BeOS yet. - [cjh] */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002806 PyErr_SetString(socket_error, "getprotobyname not supported");
Guido van Rossumbcc20741998-08-04 22:53:56 +00002807 return NULL;
2808#else
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002809 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
Guido van Rossum3901d851996-12-19 16:35:04 +00002810 return NULL;
2811 Py_BEGIN_ALLOW_THREADS
2812 sp = getprotobyname(name);
2813 Py_END_ALLOW_THREADS
2814 if (sp == NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002815 PyErr_SetString(socket_error, "protocol not found");
Guido van Rossum3901d851996-12-19 16:35:04 +00002816 return NULL;
2817 }
2818 return PyInt_FromLong((long) sp->p_proto);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002819#endif
Guido van Rossum3901d851996-12-19 16:35:04 +00002820}
2821
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002822PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002823"getprotobyname(name) -> integer\n\
2824\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002825Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002826
Guido van Rossum3901d851996-12-19 16:35:04 +00002827
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002828#ifndef NO_DUP
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002829/* Create a socket object from a numeric file description.
2830 Useful e.g. if stdin is a socket.
2831 Additional arguments as for socket(). */
2832
2833/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002834static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002835socket_fromfd(PyObject *self, PyObject *args)
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002836{
Guido van Rossum73624e91994-10-10 17:59:00 +00002837 PySocketSockObject *s;
Fred Drakea04eaad2000-06-30 02:46:07 +00002838 SOCKET_T fd;
2839 int family, type, proto = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002840 if (!PyArg_ParseTuple(args, "iii|i:fromfd",
2841 &fd, &family, &type, &proto))
Guido van Rossumbe32c891996-06-20 16:25:29 +00002842 return NULL;
Guido van Rossum5f59d601992-12-14 16:59:51 +00002843 /* Dup the fd so it and the socket can be closed independently */
2844 fd = dup(fd);
2845 if (fd < 0)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002846 return set_error();
2847 s = new_sockobject(fd, family, type, proto);
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002848 /* From now on, ignore SIGPIPE and let the error checking
2849 do the work. */
Guido van Rossum48a680c2001-03-02 06:34:14 +00002850#ifdef SIGPIPE
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002851 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum48a680c2001-03-02 06:34:14 +00002852#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00002853 return (PyObject *) s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002854}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002855
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002856PyDoc_STRVAR(fromfd_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002857"fromfd(fd, family, type[, proto]) -> socket object\n\
2858\n\
2859Create a socket object from the given file descriptor.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002860The remaining arguments are the same as for socket().");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002861
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002862#endif /* NO_DUP */
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002863
Guido van Rossum82a5c661998-07-07 20:45:43 +00002864
Guido van Rossum006bf911996-06-12 04:04:55 +00002865static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002866socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002867{
2868 int x1, x2;
2869
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002870 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002871 return NULL;
2872 }
2873 x2 = (int)ntohs((short)x1);
2874 return PyInt_FromLong(x2);
2875}
2876
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002877PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002878"ntohs(integer) -> integer\n\
2879\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002880Convert a 16-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002881
2882
Guido van Rossum006bf911996-06-12 04:04:55 +00002883static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002884socket_ntohl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00002885{
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002886 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00002887
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002888 if (PyInt_Check(arg)) {
2889 x = PyInt_AS_LONG(arg);
Jeremy Hylton825e47b2002-07-25 16:37:51 +00002890 if (x == (unsigned long) -1 && PyErr_Occurred())
2891 return NULL;
Guido van Rossum006bf911996-06-12 04:04:55 +00002892 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002893 else if (PyLong_Check(arg)) {
2894 x = PyLong_AsUnsignedLong(arg);
Jeremy Hylton825e47b2002-07-25 16:37:51 +00002895 if (x == (unsigned long) -1 && PyErr_Occurred())
2896 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002897#if SIZEOF_LONG > 4
2898 {
2899 unsigned long y;
2900 /* only want the trailing 32 bits */
2901 y = x & 0xFFFFFFFFUL;
2902 if (y ^ x)
2903 return PyErr_Format(PyExc_OverflowError,
2904 "long int larger than 32 bits");
2905 x = y;
Tim Peters58141872002-08-06 22:25:02 +00002906 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002907#endif
2908 }
2909 else
Tim Peters58141872002-08-06 22:25:02 +00002910 return PyErr_Format(PyExc_TypeError,
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002911 "expected int/long, %s found",
2912 arg->ob_type->tp_name);
2913 if (x == (unsigned long) -1 && PyErr_Occurred())
2914 return NULL;
2915 return PyInt_FromLong(ntohl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00002916}
2917
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002918PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002919"ntohl(integer) -> integer\n\
2920\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002921Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002922
2923
Guido van Rossum006bf911996-06-12 04:04:55 +00002924static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002925socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002926{
Hye-Shik Changa7b673f2003-12-17 09:40:23 +00002927 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00002928
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002929 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002930 return NULL;
2931 }
2932 x2 = (int)htons((short)x1);
2933 return PyInt_FromLong(x2);
2934}
2935
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002936PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002937"htons(integer) -> integer\n\
2938\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002939Convert a 16-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002940
2941
Guido van Rossum006bf911996-06-12 04:04:55 +00002942static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002943socket_htonl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00002944{
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002945 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00002946
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002947 if (PyInt_Check(arg)) {
2948 x = PyInt_AS_LONG(arg);
Jeremy Hylton825e47b2002-07-25 16:37:51 +00002949 if (x == (unsigned long) -1 && PyErr_Occurred())
2950 return NULL;
Guido van Rossum006bf911996-06-12 04:04:55 +00002951 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002952 else if (PyLong_Check(arg)) {
2953 x = PyLong_AsUnsignedLong(arg);
Jeremy Hylton825e47b2002-07-25 16:37:51 +00002954 if (x == (unsigned long) -1 && PyErr_Occurred())
2955 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002956#if SIZEOF_LONG > 4
2957 {
2958 unsigned long y;
2959 /* only want the trailing 32 bits */
2960 y = x & 0xFFFFFFFFUL;
2961 if (y ^ x)
2962 return PyErr_Format(PyExc_OverflowError,
2963 "long int larger than 32 bits");
2964 x = y;
Tim Peters58141872002-08-06 22:25:02 +00002965 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002966#endif
2967 }
2968 else
Tim Peters58141872002-08-06 22:25:02 +00002969 return PyErr_Format(PyExc_TypeError,
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002970 "expected int/long, %s found",
2971 arg->ob_type->tp_name);
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002972 return PyInt_FromLong(htonl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00002973}
2974
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002975PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002976"htonl(integer) -> integer\n\
2977\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002978Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002979
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002980/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002981
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002982PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002983"inet_aton(string) -> packed 32-bit IP representation\n\
2984\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002985Convert 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 +00002986binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002987
2988static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002989socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002990{
Guido van Rossuma2e48551999-09-09 15:42:59 +00002991#ifndef INADDR_NONE
2992#define INADDR_NONE (-1)
2993#endif
Neal Norwitz88f115b2003-02-13 02:15:42 +00002994#ifdef HAVE_INET_ATON
Guido van Rossumad05cdf2003-02-12 23:08:22 +00002995 struct in_addr buf;
Tim Peters1df9fdd2003-02-13 03:13:40 +00002996#else
2997 /* Have to use inet_addr() instead */
2998 unsigned long packed_addr;
2999#endif
3000 char *ip_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003001
Tim Peters1df9fdd2003-02-13 03:13:40 +00003002 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003003 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003004
Tim Peters1df9fdd2003-02-13 03:13:40 +00003005
3006#ifdef HAVE_INET_ATON
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003007 if (inet_aton(ip_addr, &buf))
3008 return PyString_FromStringAndSize((char *)(&buf),
3009 sizeof(buf));
3010
3011 PyErr_SetString(socket_error,
3012 "illegal IP address string passed to inet_aton");
3013 return NULL;
3014
Tim Peters1df9fdd2003-02-13 03:13:40 +00003015#else /* ! HAVE_INET_ATON */
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003016 /* XXX Problem here: inet_aton('255.255.255.255') raises
3017 an exception while it should be a valid address. */
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003018 packed_addr = inet_addr(ip_addr);
3019
3020 if (packed_addr == INADDR_NONE) { /* invalid address */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003021 PyErr_SetString(socket_error,
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003022 "illegal IP address string passed to inet_aton");
3023 return NULL;
3024 }
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003025 return PyString_FromStringAndSize((char *) &packed_addr,
3026 sizeof(packed_addr));
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003027#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003028}
3029
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003030PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00003031"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003032\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003033Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003034
3035static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003036socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003037{
3038 char *packed_str;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003039 int addr_len;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003040 struct in_addr packed_addr;
3041
Guido van Rossum27fc3c02000-03-24 20:56:56 +00003042 if (!PyArg_ParseTuple(args, "s#:inet_ntoa", &packed_str, &addr_len)) {
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003043 return NULL;
3044 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00003045
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003046 if (addr_len != sizeof(packed_addr)) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003047 PyErr_SetString(socket_error,
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003048 "packed IP wrong length for inet_ntoa");
3049 return NULL;
3050 }
3051
3052 memcpy(&packed_addr, packed_str, addr_len);
3053
3054 return PyString_FromString(inet_ntoa(packed_addr));
3055}
Guido van Rossum82a5c661998-07-07 20:45:43 +00003056
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003057#ifdef HAVE_INET_PTON
3058
3059PyDoc_STRVAR(inet_pton_doc,
3060"inet_pton(af, ip) -> packed IP address string\n\
3061\n\
3062Convert an IP address from string format to a packed string suitable\n\
3063for use with low-level network functions.");
3064
3065static PyObject *
3066socket_inet_pton(PyObject *self, PyObject *args)
3067{
3068 int af;
3069 char* ip;
3070 int retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003071#ifdef ENABLE_IPV6
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003072 char packed[MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003073#else
3074 char packed[sizeof(struct in_addr)];
3075#endif
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003076 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
3077 return NULL;
3078 }
3079
Martin v. Löwis10649092003-08-05 06:25:06 +00003080#ifndef ENABLE_IPV6
3081 if(af == AF_INET6) {
3082 PyErr_SetString(socket_error,
3083 "can't use AF_INET6, IPv6 is disabled");
3084 return NULL;
3085 }
3086#endif
3087
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003088 retval = inet_pton(af, ip, packed);
3089 if (retval < 0) {
3090 PyErr_SetFromErrno(socket_error);
3091 return NULL;
3092 } else if (retval == 0) {
3093 PyErr_SetString(socket_error,
3094 "illegal IP address string passed to inet_pton");
3095 return NULL;
3096 } else if (af == AF_INET) {
3097 return PyString_FromStringAndSize(packed,
3098 sizeof(struct in_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003099#ifdef ENABLE_IPV6
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003100 } else if (af == AF_INET6) {
3101 return PyString_FromStringAndSize(packed,
3102 sizeof(struct in6_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003103#endif
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003104 } else {
3105 PyErr_SetString(socket_error, "unknown address family");
3106 return NULL;
3107 }
3108}
3109
3110PyDoc_STRVAR(inet_ntop_doc,
3111"inet_ntop(af, packed_ip) -> string formatted IP address\n\
3112\n\
3113Convert a packed IP address of the given family to string format.");
3114
3115static PyObject *
3116socket_inet_ntop(PyObject *self, PyObject *args)
3117{
3118 int af;
3119 char* packed;
3120 int len;
3121 const char* retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003122#ifdef ENABLE_IPV6
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003123 char ip[MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003124#else
3125 char ip[INET_ADDRSTRLEN + 1];
3126#endif
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003127
3128 /* Guarantee NUL-termination for PyString_FromString() below */
3129 memset((void *) &ip[0], '\0', sizeof(ip) + 1);
3130
3131 if (!PyArg_ParseTuple(args, "is#:inet_ntop", &af, &packed, &len)) {
3132 return NULL;
3133 }
3134
3135 if (af == AF_INET) {
3136 if (len != sizeof(struct in_addr)) {
3137 PyErr_SetString(PyExc_ValueError,
3138 "invalid length of packed IP address string");
3139 return NULL;
3140 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003141#ifdef ENABLE_IPV6
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003142 } else if (af == AF_INET6) {
3143 if (len != sizeof(struct in6_addr)) {
3144 PyErr_SetString(PyExc_ValueError,
3145 "invalid length of packed IP address string");
3146 return NULL;
3147 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003148#endif
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003149 } else {
3150 PyErr_Format(PyExc_ValueError,
3151 "unknown address family %d", af);
3152 return NULL;
3153 }
3154
3155 retval = inet_ntop(af, packed, ip, sizeof(ip));
3156 if (!retval) {
3157 PyErr_SetFromErrno(socket_error);
3158 return NULL;
3159 } else {
3160 return PyString_FromString(retval);
3161 }
3162
3163 /* NOTREACHED */
3164 PyErr_SetString(PyExc_RuntimeError, "invalid handling of inet_ntop");
3165 return NULL;
3166}
3167
3168#endif /* HAVE_INET_PTON */
3169
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003170/* Python interface to getaddrinfo(host, port). */
3171
3172/*ARGSUSED*/
3173static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003174socket_getaddrinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003175{
Martin v. Löwisf0b11d22001-11-07 08:31:03 +00003176 struct addrinfo hints, *res;
3177 struct addrinfo *res0 = NULL;
Martin v. Löwis2548c732003-04-18 10:39:54 +00003178 PyObject *hobj = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003179 PyObject *pobj = (PyObject *)NULL;
Martin v. Löwisf65b1a12001-08-12 09:28:40 +00003180 char pbuf[30];
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003181 char *hptr, *pptr;
3182 int family, socktype, protocol, flags;
3183 int error;
3184 PyObject *all = (PyObject *)NULL;
3185 PyObject *single = (PyObject *)NULL;
Martin v. Löwis2548c732003-04-18 10:39:54 +00003186 PyObject *idna = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003187
3188 family = socktype = protocol = flags = 0;
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00003189 family = AF_UNSPEC;
Martin v. Löwis2548c732003-04-18 10:39:54 +00003190 if (!PyArg_ParseTuple(args, "OO|iiii:getaddrinfo",
3191 &hobj, &pobj, &family, &socktype,
3192 &protocol, &flags)) {
3193 return NULL;
3194 }
3195 if (hobj == Py_None) {
3196 hptr = NULL;
3197 } else if (PyUnicode_Check(hobj)) {
3198 idna = PyObject_CallMethod(hobj, "encode", "s", "idna");
3199 if (!idna)
3200 return NULL;
3201 hptr = PyString_AsString(idna);
3202 } else if (PyString_Check(hobj)) {
3203 hptr = PyString_AsString(hobj);
3204 } else {
3205 PyErr_SetString(PyExc_TypeError,
3206 "getaddrinfo() argument 1 must be string or None");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003207 return NULL;
3208 }
3209 if (PyInt_Check(pobj)) {
Marc-André Lemburg03d1b182001-07-31 18:05:33 +00003210 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", PyInt_AsLong(pobj));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003211 pptr = pbuf;
3212 } else if (PyString_Check(pobj)) {
3213 pptr = PyString_AsString(pobj);
3214 } else if (pobj == Py_None) {
3215 pptr = (char *)NULL;
3216 } else {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003217 PyErr_SetString(socket_error, "Int or String expected");
Martin v. Löwis5db099a2003-08-07 11:55:15 +00003218 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003219 }
3220 memset(&hints, 0, sizeof(hints));
3221 hints.ai_family = family;
3222 hints.ai_socktype = socktype;
3223 hints.ai_protocol = protocol;
3224 hints.ai_flags = flags;
Just van Rossum1040d2c2003-05-09 07:53:18 +00003225 Py_BEGIN_ALLOW_THREADS
3226 ACQUIRE_GETADDRINFO_LOCK
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003227 error = getaddrinfo(hptr, pptr, &hints, &res0);
Just van Rossum1040d2c2003-05-09 07:53:18 +00003228 Py_END_ALLOW_THREADS
3229 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003230 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003231 set_gaierror(error);
Martin v. Löwis5db099a2003-08-07 11:55:15 +00003232 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003233 }
3234
3235 if ((all = PyList_New(0)) == NULL)
3236 goto err;
3237 for (res = res0; res; res = res->ai_next) {
Guido van Rossum716aac02001-10-12 18:59:27 +00003238 PyObject *addr =
3239 makesockaddr(-1, res->ai_addr, res->ai_addrlen);
3240 if (addr == NULL)
3241 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003242 single = Py_BuildValue("iiisO", res->ai_family,
3243 res->ai_socktype, res->ai_protocol,
3244 res->ai_canonname ? res->ai_canonname : "",
Guido van Rossum716aac02001-10-12 18:59:27 +00003245 addr);
3246 Py_DECREF(addr);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003247 if (single == NULL)
3248 goto err;
3249
3250 if (PyList_Append(all, single))
3251 goto err;
3252 Py_XDECREF(single);
3253 }
Martin v. Löwis2548c732003-04-18 10:39:54 +00003254 Py_XDECREF(idna);
Neal Norwitz90128ba2002-08-09 03:37:42 +00003255 if (res0)
3256 freeaddrinfo(res0);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003257 return all;
3258 err:
3259 Py_XDECREF(single);
3260 Py_XDECREF(all);
Martin v. Löwis2548c732003-04-18 10:39:54 +00003261 Py_XDECREF(idna);
Martin v. Löwisf0b11d22001-11-07 08:31:03 +00003262 if (res0)
3263 freeaddrinfo(res0);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003264 return (PyObject *)NULL;
3265}
3266
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003267PyDoc_STRVAR(getaddrinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003268"getaddrinfo(host, port [, family, socktype, proto, flags])\n\
3269 -> list of (family, socktype, proto, canonname, sockaddr)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003270\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003271Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003272
3273/* Python interface to getnameinfo(sa, flags). */
3274
3275/*ARGSUSED*/
3276static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003277socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003278{
3279 PyObject *sa = (PyObject *)NULL;
3280 int flags;
3281 char *hostp;
Martin v. Löwis06b1d212001-11-02 23:34:52 +00003282 int port, flowinfo, scope_id;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003283 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
3284 struct addrinfo hints, *res = NULL;
3285 int error;
3286 PyObject *ret = (PyObject *)NULL;
3287
3288 flags = flowinfo = scope_id = 0;
Martin v. Löwis06b1d212001-11-02 23:34:52 +00003289 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003290 return NULL;
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003291 if (!PyArg_ParseTuple(sa, "si|ii",
3292 &hostp, &port, &flowinfo, &scope_id))
Martin v. Löwis06b1d212001-11-02 23:34:52 +00003293 return NULL;
Marc-André Lemburg03d1b182001-07-31 18:05:33 +00003294 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003295 memset(&hints, 0, sizeof(hints));
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00003296 hints.ai_family = AF_UNSPEC;
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003297 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Just van Rossum1040d2c2003-05-09 07:53:18 +00003298 Py_BEGIN_ALLOW_THREADS
3299 ACQUIRE_GETADDRINFO_LOCK
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003300 error = getaddrinfo(hostp, pbuf, &hints, &res);
Just van Rossum1040d2c2003-05-09 07:53:18 +00003301 Py_END_ALLOW_THREADS
3302 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003303 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003304 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003305 goto fail;
3306 }
3307 if (res->ai_next) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003308 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003309 "sockaddr resolved to multiple addresses");
3310 goto fail;
3311 }
3312 switch (res->ai_family) {
3313 case AF_INET:
3314 {
3315 char *t1;
3316 int t2;
3317 if (PyArg_ParseTuple(sa, "si", &t1, &t2) == 0) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003318 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003319 "IPv4 sockaddr must be 2 tuple");
3320 goto fail;
3321 }
3322 break;
3323 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00003324#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003325 case AF_INET6:
3326 {
3327 struct sockaddr_in6 *sin6;
3328 sin6 = (struct sockaddr_in6 *)res->ai_addr;
3329 sin6->sin6_flowinfo = flowinfo;
3330 sin6->sin6_scope_id = scope_id;
3331 break;
3332 }
3333#endif
3334 }
3335 error = getnameinfo(res->ai_addr, res->ai_addrlen,
3336 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
3337 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003338 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003339 goto fail;
3340 }
3341 ret = Py_BuildValue("ss", hbuf, pbuf);
3342
3343fail:
3344 if (res)
3345 freeaddrinfo(res);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003346 return ret;
3347}
3348
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003349PyDoc_STRVAR(getnameinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003350"getnameinfo(sockaddr, flags) --> (host, port)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003351\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003352Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003353
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00003354
3355/* Python API to getting and setting the default timeout value. */
3356
3357static PyObject *
3358socket_getdefaulttimeout(PyObject *self)
3359{
3360 if (defaulttimeout < 0.0) {
3361 Py_INCREF(Py_None);
3362 return Py_None;
3363 }
3364 else
3365 return PyFloat_FromDouble(defaulttimeout);
3366}
3367
3368PyDoc_STRVAR(getdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003369"getdefaulttimeout() -> timeout\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00003370\n\
3371Returns the default timeout in floating seconds for new socket objects.\n\
3372A value of None indicates that new socket objects have no timeout.\n\
3373When the socket module is first imported, the default is None.");
3374
3375static PyObject *
3376socket_setdefaulttimeout(PyObject *self, PyObject *arg)
3377{
3378 double timeout;
3379
3380 if (arg == Py_None)
3381 timeout = -1.0;
3382 else {
3383 timeout = PyFloat_AsDouble(arg);
3384 if (timeout < 0.0) {
3385 if (!PyErr_Occurred())
3386 PyErr_SetString(PyExc_ValueError,
3387 "Timeout value out of range");
3388 return NULL;
3389 }
3390 }
3391
3392 defaulttimeout = timeout;
3393
3394 Py_INCREF(Py_None);
3395 return Py_None;
3396}
3397
3398PyDoc_STRVAR(setdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003399"setdefaulttimeout(timeout)\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00003400\n\
3401Set the default timeout in floating seconds for new socket objects.\n\
3402A value of None indicates that new socket objects have no timeout.\n\
3403When the socket module is first imported, the default is None.");
3404
3405
Guido van Rossum30a685f1991-06-27 15:51:29 +00003406/* List of functions exported by this module. */
3407
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003408static PyMethodDef socket_methods[] = {
3409 {"gethostbyname", socket_gethostbyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003410 METH_VARARGS, gethostbyname_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003411 {"gethostbyname_ex", socket_gethostbyname_ex,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003412 METH_VARARGS, ghbn_ex_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003413 {"gethostbyaddr", socket_gethostbyaddr,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003414 METH_VARARGS, gethostbyaddr_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003415 {"gethostname", socket_gethostname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003416 METH_VARARGS, gethostname_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003417 {"getservbyname", socket_getservbyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003418 METH_VARARGS, getservbyname_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003419 {"getprotobyname", socket_getprotobyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003420 METH_VARARGS,getprotobyname_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00003421#ifndef NO_DUP
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003422 {"fromfd", socket_fromfd,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003423 METH_VARARGS, fromfd_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00003424#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003425 {"ntohs", socket_ntohs,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003426 METH_VARARGS, ntohs_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003427 {"ntohl", socket_ntohl,
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003428 METH_O, ntohl_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003429 {"htons", socket_htons,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003430 METH_VARARGS, htons_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003431 {"htonl", socket_htonl,
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003432 METH_O, htonl_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003433 {"inet_aton", socket_inet_aton,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003434 METH_VARARGS, inet_aton_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003435 {"inet_ntoa", socket_inet_ntoa,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003436 METH_VARARGS, inet_ntoa_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003437#ifdef HAVE_INET_PTON
3438 {"inet_pton", socket_inet_pton,
3439 METH_VARARGS, inet_pton_doc},
3440 {"inet_ntop", socket_inet_ntop,
3441 METH_VARARGS, inet_ntop_doc},
3442#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003443 {"getaddrinfo", socket_getaddrinfo,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003444 METH_VARARGS, getaddrinfo_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003445 {"getnameinfo", socket_getnameinfo,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003446 METH_VARARGS, getnameinfo_doc},
Guido van Rossum1693ba82002-07-18 21:11:26 +00003447 {"getdefaulttimeout", (PyCFunction)socket_getdefaulttimeout,
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00003448 METH_NOARGS, getdefaulttimeout_doc},
3449 {"setdefaulttimeout", socket_setdefaulttimeout,
3450 METH_O, setdefaulttimeout_doc},
Guido van Rossum30a685f1991-06-27 15:51:29 +00003451 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003452};
3453
Guido van Rossum30a685f1991-06-27 15:51:29 +00003454
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003455#ifdef RISCOS
3456#define OS_INIT_DEFINED
Guido van Rossumbe32c891996-06-20 16:25:29 +00003457
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003458static int
3459os_init(void)
3460{
3461 _kernel_swi_regs r;
3462
3463 r.r[0] = 0;
3464 _kernel_swi(0x43380, &r, &r);
3465 taskwindow = r.r[0];
3466
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003467 return 1;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003468}
3469
3470#endif /* RISCOS */
3471
3472
3473#ifdef MS_WINDOWS
3474#define OS_INIT_DEFINED
3475
3476/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00003477
3478static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003479os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00003480{
3481 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00003482}
3483
3484static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003485os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00003486{
3487 WSADATA WSAData;
3488 int ret;
3489 char buf[100];
3490 ret = WSAStartup(0x0101, &WSAData);
3491 switch (ret) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003492 case 0: /* No error */
Mark Hammond14350ab2003-07-09 04:57:46 +00003493 Py_AtExit(os_cleanup);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003494 return 1; /* Success */
Guido van Rossumbe32c891996-06-20 16:25:29 +00003495 case WSASYSNOTREADY:
3496 PyErr_SetString(PyExc_ImportError,
3497 "WSAStartup failed: network not ready");
3498 break;
3499 case WSAVERNOTSUPPORTED:
3500 case WSAEINVAL:
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003501 PyErr_SetString(
3502 PyExc_ImportError,
3503 "WSAStartup failed: requested version not supported");
Guido van Rossumbe32c891996-06-20 16:25:29 +00003504 break;
3505 default:
Tim Peters885d4572001-11-28 20:27:42 +00003506 PyOS_snprintf(buf, sizeof(buf),
3507 "WSAStartup failed: error code %d", ret);
Guido van Rossumbe32c891996-06-20 16:25:29 +00003508 PyErr_SetString(PyExc_ImportError, buf);
3509 break;
3510 }
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003511 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00003512}
3513
Guido van Rossum8d665e61996-06-26 18:22:49 +00003514#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00003515
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003516
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003517#ifdef PYOS_OS2
3518#define OS_INIT_DEFINED
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003519
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003520/* Additional initialization for OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003521
3522static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003523os_init(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003524{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003525#ifndef PYCC_GCC
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003526 char reason[64];
3527 int rc = sock_init();
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003528
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003529 if (rc == 0) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003530 return 1; /* Success */
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003531 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003532
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003533 PyOS_snprintf(reason, sizeof(reason),
3534 "OS/2 TCP/IP Error# %d", sock_errno());
3535 PyErr_SetString(PyExc_ImportError, reason);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003536
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003537 return 0; /* Failure */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00003538#else
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003539 /* No need to initialise sockets with GCC/EMX */
3540 return 1; /* Success */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00003541#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003542}
3543
3544#endif /* PYOS_OS2 */
3545
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003546
3547#ifndef OS_INIT_DEFINED
3548static int
3549os_init(void)
3550{
3551 return 1; /* Success */
3552}
3553#endif
3554
3555
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00003556/* C API table - always add new things to the end for binary
3557 compatibility. */
3558static
3559PySocketModule_APIObject PySocketModuleAPI =
3560{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003561 &sock_type,
Brett Cannon06c34792004-03-23 23:16:54 +00003562 NULL
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00003563};
3564
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003565
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003566/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003567
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003568 This module is actually called "_socket", and there's a wrapper
3569 "socket.py" which implements some additional functionality. On some
3570 platforms (e.g. Windows and OS/2), socket.py also implements a
3571 wrapper for the socket type that provides missing functionality such
3572 as makefile(), dup() and fromfd(). The import of "_socket" may fail
3573 with an ImportError exception if os-specific initialization fails.
3574 On Windows, this does WINSOCK initialization. When WINSOCK is
3575 initialized succesfully, a call to WSACleanup() is scheduled to be
3576 made at exit time.
3577*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003578
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003579PyDoc_STRVAR(socket_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003580"Implementation module for socket operations.\n\
3581\n\
3582See the socket module for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003583
Mark Hammondfe51c6d2002-08-02 02:27:13 +00003584PyMODINIT_FUNC
Thomas Wouters1e0c2f42000-07-24 16:06:23 +00003585init_socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003586{
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003587 PyObject *m, *has_ipv6;
Fred Drake4baedc12002-04-01 14:53:37 +00003588
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003589 if (!os_init())
Guido van Rossum0cb96de1997-10-01 04:29:29 +00003590 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003591
3592 sock_type.ob_type = &PyType_Type;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003593 m = Py_InitModule3(PySocket_MODULE_NAME,
3594 socket_methods,
3595 socket_doc);
3596
3597 socket_error = PyErr_NewException("socket.error", NULL, NULL);
3598 if (socket_error == NULL)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003599 return;
Brett Cannon06c34792004-03-23 23:16:54 +00003600 PySocketModuleAPI.error = socket_error;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003601 Py_INCREF(socket_error);
3602 PyModule_AddObject(m, "error", socket_error);
3603 socket_herror = PyErr_NewException("socket.herror",
3604 socket_error, NULL);
3605 if (socket_herror == NULL)
3606 return;
3607 Py_INCREF(socket_herror);
3608 PyModule_AddObject(m, "herror", socket_herror);
3609 socket_gaierror = PyErr_NewException("socket.gaierror", socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003610 NULL);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003611 if (socket_gaierror == NULL)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003612 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003613 Py_INCREF(socket_gaierror);
3614 PyModule_AddObject(m, "gaierror", socket_gaierror);
Raymond Hettingeref7343c2003-06-29 03:08:05 +00003615 socket_timeout = PyErr_NewException("socket.timeout",
3616 socket_error, NULL);
3617 if (socket_timeout == NULL)
3618 return;
3619 Py_INCREF(socket_timeout);
3620 PyModule_AddObject(m, "timeout", socket_timeout);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003621 Py_INCREF((PyObject *)&sock_type);
Fred Drake4baedc12002-04-01 14:53:37 +00003622 if (PyModule_AddObject(m, "SocketType",
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003623 (PyObject *)&sock_type) != 0)
Guido van Rossum0cb96de1997-10-01 04:29:29 +00003624 return;
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, "socket",
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003627 (PyObject *)&sock_type) != 0)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003628 return;
Guido van Rossum09be4091999-08-09 14:40:40 +00003629
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003630#ifdef ENABLE_IPV6
3631 has_ipv6 = Py_True;
3632#else
3633 has_ipv6 = Py_False;
3634#endif
3635 Py_INCREF(has_ipv6);
3636 PyModule_AddObject(m, "has_ipv6", has_ipv6);
3637
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00003638 /* Export C API */
Fred Drake4baedc12002-04-01 14:53:37 +00003639 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00003640 PyCObject_FromVoidPtr((void *)&PySocketModuleAPI, NULL)
3641 ) != 0)
3642 return;
3643
Guido van Rossum09be4091999-08-09 14:40:40 +00003644 /* Address families (we only support AF_INET and AF_UNIX) */
3645#ifdef AF_UNSPEC
Fred Drake4baedc12002-04-01 14:53:37 +00003646 PyModule_AddIntConstant(m, "AF_UNSPEC", AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00003647#endif
Fred Drake4baedc12002-04-01 14:53:37 +00003648 PyModule_AddIntConstant(m, "AF_INET", AF_INET);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003649#ifdef AF_INET6
Fred Drake4baedc12002-04-01 14:53:37 +00003650 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003651#endif /* AF_INET6 */
Andrew MacIntyre34d3e2d2003-01-02 12:45:34 +00003652#if defined(AF_UNIX) && !defined(PYOS_OS2)
Fred Drake4baedc12002-04-01 14:53:37 +00003653 PyModule_AddIntConstant(m, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00003654#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00003655#ifdef AF_AX25
Fred Drake4baedc12002-04-01 14:53:37 +00003656 /* Amateur Radio AX.25 */
3657 PyModule_AddIntConstant(m, "AF_AX25", AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00003658#endif
3659#ifdef AF_IPX
Fred Drake4baedc12002-04-01 14:53:37 +00003660 PyModule_AddIntConstant(m, "AF_IPX", AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00003661#endif
3662#ifdef AF_APPLETALK
Fred Drake4baedc12002-04-01 14:53:37 +00003663 /* Appletalk DDP */
3664 PyModule_AddIntConstant(m, "AF_APPLETALK", AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00003665#endif
3666#ifdef AF_NETROM
Fred Drake4baedc12002-04-01 14:53:37 +00003667 /* Amateur radio NetROM */
3668 PyModule_AddIntConstant(m, "AF_NETROM", AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00003669#endif
3670#ifdef AF_BRIDGE
Fred Drake4baedc12002-04-01 14:53:37 +00003671 /* Multiprotocol bridge */
3672 PyModule_AddIntConstant(m, "AF_BRIDGE", AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00003673#endif
3674#ifdef AF_AAL5
Fred Drake4baedc12002-04-01 14:53:37 +00003675 /* Reserved for Werner's ATM */
3676 PyModule_AddIntConstant(m, "AF_AAL5", AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00003677#endif
3678#ifdef AF_X25
Fred Drake4baedc12002-04-01 14:53:37 +00003679 /* Reserved for X.25 project */
3680 PyModule_AddIntConstant(m, "AF_X25", AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00003681#endif
3682#ifdef AF_INET6
Fred Drake4baedc12002-04-01 14:53:37 +00003683 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00003684#endif
3685#ifdef AF_ROSE
Fred Drake4baedc12002-04-01 14:53:37 +00003686 /* Amateur Radio X.25 PLP */
3687 PyModule_AddIntConstant(m, "AF_ROSE", AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00003688#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00003689
Hye-Shik Chang81268602004-02-02 06:05:24 +00003690#ifdef USE_BLUETOOTH
Martin v. Löwis12af0482004-01-31 12:34:17 +00003691 PyModule_AddIntConstant(m, "AF_BLUETOOTH", AF_BLUETOOTH);
3692 PyModule_AddIntConstant(m, "BTPROTO_L2CAP", BTPROTO_L2CAP);
Hye-Shik Chang81268602004-02-02 06:05:24 +00003693#if !defined(__FreeBSD__)
Martin v. Löwis12af0482004-01-31 12:34:17 +00003694 PyModule_AddIntConstant(m, "BTPROTO_SCO", BTPROTO_SCO);
Hye-Shik Chang81268602004-02-02 06:05:24 +00003695#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00003696 PyModule_AddIntConstant(m, "BTPROTO_RFCOMM", BTPROTO_RFCOMM);
3697 PyModule_AddObject(m, "BDADDR_ANY", Py_BuildValue( "iiiiii", 0,0,0,0,0,0 ) );
3698 PyModule_AddObject(m, "BDADDR_LOCAL", Py_BuildValue( "iiiiii", 0,0,0,0xff,0xff,0xff ) );
3699#endif
3700
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00003701#ifdef HAVE_NETPACKET_PACKET_H
Fred Drake4baedc12002-04-01 14:53:37 +00003702 PyModule_AddIntConstant(m, "AF_PACKET", AF_PACKET);
3703 PyModule_AddIntConstant(m, "PF_PACKET", PF_PACKET);
3704 PyModule_AddIntConstant(m, "PACKET_HOST", PACKET_HOST);
3705 PyModule_AddIntConstant(m, "PACKET_BROADCAST", PACKET_BROADCAST);
3706 PyModule_AddIntConstant(m, "PACKET_MULTICAST", PACKET_MULTICAST);
3707 PyModule_AddIntConstant(m, "PACKET_OTHERHOST", PACKET_OTHERHOST);
3708 PyModule_AddIntConstant(m, "PACKET_OUTGOING", PACKET_OUTGOING);
3709 PyModule_AddIntConstant(m, "PACKET_LOOPBACK", PACKET_LOOPBACK);
3710 PyModule_AddIntConstant(m, "PACKET_FASTROUTE", PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00003711#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00003712
3713 /* Socket types */
Fred Drake4baedc12002-04-01 14:53:37 +00003714 PyModule_AddIntConstant(m, "SOCK_STREAM", SOCK_STREAM);
3715 PyModule_AddIntConstant(m, "SOCK_DGRAM", SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00003716#ifndef __BEOS__
3717/* We have incomplete socket support. */
Fred Drake4baedc12002-04-01 14:53:37 +00003718 PyModule_AddIntConstant(m, "SOCK_RAW", SOCK_RAW);
3719 PyModule_AddIntConstant(m, "SOCK_SEQPACKET", SOCK_SEQPACKET);
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00003720#if defined(SOCK_RDM)
Fred Drake4baedc12002-04-01 14:53:37 +00003721 PyModule_AddIntConstant(m, "SOCK_RDM", SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00003722#endif
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00003723#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003724
3725#ifdef SO_DEBUG
Fred Drake4baedc12002-04-01 14:53:37 +00003726 PyModule_AddIntConstant(m, "SO_DEBUG", SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003727#endif
3728#ifdef SO_ACCEPTCONN
Fred Drake4baedc12002-04-01 14:53:37 +00003729 PyModule_AddIntConstant(m, "SO_ACCEPTCONN", SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003730#endif
3731#ifdef SO_REUSEADDR
Fred Drake4baedc12002-04-01 14:53:37 +00003732 PyModule_AddIntConstant(m, "SO_REUSEADDR", SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003733#endif
3734#ifdef SO_KEEPALIVE
Fred Drake4baedc12002-04-01 14:53:37 +00003735 PyModule_AddIntConstant(m, "SO_KEEPALIVE", SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003736#endif
3737#ifdef SO_DONTROUTE
Fred Drake4baedc12002-04-01 14:53:37 +00003738 PyModule_AddIntConstant(m, "SO_DONTROUTE", SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003739#endif
3740#ifdef SO_BROADCAST
Fred Drake4baedc12002-04-01 14:53:37 +00003741 PyModule_AddIntConstant(m, "SO_BROADCAST", SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003742#endif
3743#ifdef SO_USELOOPBACK
Fred Drake4baedc12002-04-01 14:53:37 +00003744 PyModule_AddIntConstant(m, "SO_USELOOPBACK", SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003745#endif
3746#ifdef SO_LINGER
Fred Drake4baedc12002-04-01 14:53:37 +00003747 PyModule_AddIntConstant(m, "SO_LINGER", SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003748#endif
3749#ifdef SO_OOBINLINE
Fred Drake4baedc12002-04-01 14:53:37 +00003750 PyModule_AddIntConstant(m, "SO_OOBINLINE", SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003751#endif
3752#ifdef SO_REUSEPORT
Fred Drake4baedc12002-04-01 14:53:37 +00003753 PyModule_AddIntConstant(m, "SO_REUSEPORT", SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003754#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003755#ifdef SO_SNDBUF
Fred Drake4baedc12002-04-01 14:53:37 +00003756 PyModule_AddIntConstant(m, "SO_SNDBUF", SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003757#endif
3758#ifdef SO_RCVBUF
Fred Drake4baedc12002-04-01 14:53:37 +00003759 PyModule_AddIntConstant(m, "SO_RCVBUF", SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003760#endif
3761#ifdef SO_SNDLOWAT
Fred Drake4baedc12002-04-01 14:53:37 +00003762 PyModule_AddIntConstant(m, "SO_SNDLOWAT", SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003763#endif
3764#ifdef SO_RCVLOWAT
Fred Drake4baedc12002-04-01 14:53:37 +00003765 PyModule_AddIntConstant(m, "SO_RCVLOWAT", SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003766#endif
3767#ifdef SO_SNDTIMEO
Fred Drake4baedc12002-04-01 14:53:37 +00003768 PyModule_AddIntConstant(m, "SO_SNDTIMEO", SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003769#endif
3770#ifdef SO_RCVTIMEO
Fred Drake4baedc12002-04-01 14:53:37 +00003771 PyModule_AddIntConstant(m, "SO_RCVTIMEO", SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003772#endif
3773#ifdef SO_ERROR
Fred Drake4baedc12002-04-01 14:53:37 +00003774 PyModule_AddIntConstant(m, "SO_ERROR", SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003775#endif
3776#ifdef SO_TYPE
Fred Drake4baedc12002-04-01 14:53:37 +00003777 PyModule_AddIntConstant(m, "SO_TYPE", SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003778#endif
3779
3780 /* Maximum number of connections for "listen" */
3781#ifdef SOMAXCONN
Fred Drake4baedc12002-04-01 14:53:37 +00003782 PyModule_AddIntConstant(m, "SOMAXCONN", SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003783#else
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003784 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003785#endif
3786
3787 /* Flags for send, recv */
3788#ifdef MSG_OOB
Fred Drake4baedc12002-04-01 14:53:37 +00003789 PyModule_AddIntConstant(m, "MSG_OOB", MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003790#endif
3791#ifdef MSG_PEEK
Fred Drake4baedc12002-04-01 14:53:37 +00003792 PyModule_AddIntConstant(m, "MSG_PEEK", MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003793#endif
3794#ifdef MSG_DONTROUTE
Fred Drake4baedc12002-04-01 14:53:37 +00003795 PyModule_AddIntConstant(m, "MSG_DONTROUTE", MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003796#endif
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00003797#ifdef MSG_DONTWAIT
Fred Drake4baedc12002-04-01 14:53:37 +00003798 PyModule_AddIntConstant(m, "MSG_DONTWAIT", MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00003799#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003800#ifdef MSG_EOR
Fred Drake4baedc12002-04-01 14:53:37 +00003801 PyModule_AddIntConstant(m, "MSG_EOR", MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003802#endif
3803#ifdef MSG_TRUNC
Fred Drake4baedc12002-04-01 14:53:37 +00003804 PyModule_AddIntConstant(m, "MSG_TRUNC", MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003805#endif
3806#ifdef MSG_CTRUNC
Fred Drake4baedc12002-04-01 14:53:37 +00003807 PyModule_AddIntConstant(m, "MSG_CTRUNC", MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003808#endif
3809#ifdef MSG_WAITALL
Fred Drake4baedc12002-04-01 14:53:37 +00003810 PyModule_AddIntConstant(m, "MSG_WAITALL", MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003811#endif
3812#ifdef MSG_BTAG
Fred Drake4baedc12002-04-01 14:53:37 +00003813 PyModule_AddIntConstant(m, "MSG_BTAG", MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003814#endif
3815#ifdef MSG_ETAG
Fred Drake4baedc12002-04-01 14:53:37 +00003816 PyModule_AddIntConstant(m, "MSG_ETAG", MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003817#endif
3818
3819 /* Protocol level and numbers, usable for [gs]etsockopt */
3820#ifdef SOL_SOCKET
Fred Drake4baedc12002-04-01 14:53:37 +00003821 PyModule_AddIntConstant(m, "SOL_SOCKET", SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003822#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00003823#ifdef SOL_IP
Fred Drake4baedc12002-04-01 14:53:37 +00003824 PyModule_AddIntConstant(m, "SOL_IP", SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00003825#else
Fred Drake4baedc12002-04-01 14:53:37 +00003826 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00003827#endif
3828#ifdef SOL_IPX
Fred Drake4baedc12002-04-01 14:53:37 +00003829 PyModule_AddIntConstant(m, "SOL_IPX", SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00003830#endif
3831#ifdef SOL_AX25
Fred Drake4baedc12002-04-01 14:53:37 +00003832 PyModule_AddIntConstant(m, "SOL_AX25", SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00003833#endif
3834#ifdef SOL_ATALK
Fred Drake4baedc12002-04-01 14:53:37 +00003835 PyModule_AddIntConstant(m, "SOL_ATALK", SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00003836#endif
3837#ifdef SOL_NETROM
Fred Drake4baedc12002-04-01 14:53:37 +00003838 PyModule_AddIntConstant(m, "SOL_NETROM", SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00003839#endif
3840#ifdef SOL_ROSE
Fred Drake4baedc12002-04-01 14:53:37 +00003841 PyModule_AddIntConstant(m, "SOL_ROSE", SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00003842#endif
3843#ifdef SOL_TCP
Fred Drake4baedc12002-04-01 14:53:37 +00003844 PyModule_AddIntConstant(m, "SOL_TCP", SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00003845#else
Fred Drake4baedc12002-04-01 14:53:37 +00003846 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00003847#endif
3848#ifdef SOL_UDP
Fred Drake4baedc12002-04-01 14:53:37 +00003849 PyModule_AddIntConstant(m, "SOL_UDP", SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00003850#else
Fred Drake4baedc12002-04-01 14:53:37 +00003851 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00003852#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003853#ifdef IPPROTO_IP
Fred Drake4baedc12002-04-01 14:53:37 +00003854 PyModule_AddIntConstant(m, "IPPROTO_IP", IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00003855#else
Fred Drake4baedc12002-04-01 14:53:37 +00003856 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003857#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003858#ifdef IPPROTO_HOPOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00003859 PyModule_AddIntConstant(m, "IPPROTO_HOPOPTS", IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003860#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003861#ifdef IPPROTO_ICMP
Fred Drake4baedc12002-04-01 14:53:37 +00003862 PyModule_AddIntConstant(m, "IPPROTO_ICMP", IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00003863#else
Fred Drake4baedc12002-04-01 14:53:37 +00003864 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003865#endif
3866#ifdef IPPROTO_IGMP
Fred Drake4baedc12002-04-01 14:53:37 +00003867 PyModule_AddIntConstant(m, "IPPROTO_IGMP", IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003868#endif
3869#ifdef IPPROTO_GGP
Fred Drake4baedc12002-04-01 14:53:37 +00003870 PyModule_AddIntConstant(m, "IPPROTO_GGP", IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003871#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003872#ifdef IPPROTO_IPV4
Fred Drake4baedc12002-04-01 14:53:37 +00003873 PyModule_AddIntConstant(m, "IPPROTO_IPV4", IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003874#endif
Martin v. Löwisa0f17342003-10-03 13:56:20 +00003875#ifdef IPPROTO_IPV6
3876 PyModule_AddIntConstant(m, "IPPROTO_IPV6", IPPROTO_IPV6);
3877#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003878#ifdef IPPROTO_IPIP
Fred Drake4baedc12002-04-01 14:53:37 +00003879 PyModule_AddIntConstant(m, "IPPROTO_IPIP", IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003880#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003881#ifdef IPPROTO_TCP
Fred Drake4baedc12002-04-01 14:53:37 +00003882 PyModule_AddIntConstant(m, "IPPROTO_TCP", IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00003883#else
Fred Drake4baedc12002-04-01 14:53:37 +00003884 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003885#endif
3886#ifdef IPPROTO_EGP
Fred Drake4baedc12002-04-01 14:53:37 +00003887 PyModule_AddIntConstant(m, "IPPROTO_EGP", IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003888#endif
3889#ifdef IPPROTO_PUP
Fred Drake4baedc12002-04-01 14:53:37 +00003890 PyModule_AddIntConstant(m, "IPPROTO_PUP", IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003891#endif
3892#ifdef IPPROTO_UDP
Fred Drake4baedc12002-04-01 14:53:37 +00003893 PyModule_AddIntConstant(m, "IPPROTO_UDP", IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00003894#else
Fred Drake4baedc12002-04-01 14:53:37 +00003895 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003896#endif
3897#ifdef IPPROTO_IDP
Fred Drake4baedc12002-04-01 14:53:37 +00003898 PyModule_AddIntConstant(m, "IPPROTO_IDP", IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003899#endif
3900#ifdef IPPROTO_HELLO
Fred Drake4baedc12002-04-01 14:53:37 +00003901 PyModule_AddIntConstant(m, "IPPROTO_HELLO", IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003902#endif
3903#ifdef IPPROTO_ND
Fred Drake4baedc12002-04-01 14:53:37 +00003904 PyModule_AddIntConstant(m, "IPPROTO_ND", IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003905#endif
3906#ifdef IPPROTO_TP
Fred Drake4baedc12002-04-01 14:53:37 +00003907 PyModule_AddIntConstant(m, "IPPROTO_TP", IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003908#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003909#ifdef IPPROTO_IPV6
Fred Drake4baedc12002-04-01 14:53:37 +00003910 PyModule_AddIntConstant(m, "IPPROTO_IPV6", IPPROTO_IPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003911#endif
3912#ifdef IPPROTO_ROUTING
Fred Drake4baedc12002-04-01 14:53:37 +00003913 PyModule_AddIntConstant(m, "IPPROTO_ROUTING", IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003914#endif
3915#ifdef IPPROTO_FRAGMENT
Fred Drake4baedc12002-04-01 14:53:37 +00003916 PyModule_AddIntConstant(m, "IPPROTO_FRAGMENT", IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003917#endif
3918#ifdef IPPROTO_RSVP
Fred Drake4baedc12002-04-01 14:53:37 +00003919 PyModule_AddIntConstant(m, "IPPROTO_RSVP", IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003920#endif
3921#ifdef IPPROTO_GRE
Fred Drake4baedc12002-04-01 14:53:37 +00003922 PyModule_AddIntConstant(m, "IPPROTO_GRE", IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003923#endif
3924#ifdef IPPROTO_ESP
Fred Drake4baedc12002-04-01 14:53:37 +00003925 PyModule_AddIntConstant(m, "IPPROTO_ESP", IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003926#endif
3927#ifdef IPPROTO_AH
Fred Drake4baedc12002-04-01 14:53:37 +00003928 PyModule_AddIntConstant(m, "IPPROTO_AH", IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003929#endif
3930#ifdef IPPROTO_MOBILE
Fred Drake4baedc12002-04-01 14:53:37 +00003931 PyModule_AddIntConstant(m, "IPPROTO_MOBILE", IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003932#endif
3933#ifdef IPPROTO_ICMPV6
Fred Drake4baedc12002-04-01 14:53:37 +00003934 PyModule_AddIntConstant(m, "IPPROTO_ICMPV6", IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003935#endif
3936#ifdef IPPROTO_NONE
Fred Drake4baedc12002-04-01 14:53:37 +00003937 PyModule_AddIntConstant(m, "IPPROTO_NONE", IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003938#endif
3939#ifdef IPPROTO_DSTOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00003940 PyModule_AddIntConstant(m, "IPPROTO_DSTOPTS", IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003941#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003942#ifdef IPPROTO_XTP
Fred Drake4baedc12002-04-01 14:53:37 +00003943 PyModule_AddIntConstant(m, "IPPROTO_XTP", IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003944#endif
3945#ifdef IPPROTO_EON
Fred Drake4baedc12002-04-01 14:53:37 +00003946 PyModule_AddIntConstant(m, "IPPROTO_EON", IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003947#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003948#ifdef IPPROTO_PIM
Fred Drake4baedc12002-04-01 14:53:37 +00003949 PyModule_AddIntConstant(m, "IPPROTO_PIM", IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003950#endif
3951#ifdef IPPROTO_IPCOMP
Fred Drake4baedc12002-04-01 14:53:37 +00003952 PyModule_AddIntConstant(m, "IPPROTO_IPCOMP", IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003953#endif
3954#ifdef IPPROTO_VRRP
Fred Drake4baedc12002-04-01 14:53:37 +00003955 PyModule_AddIntConstant(m, "IPPROTO_VRRP", IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003956#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003957#ifdef IPPROTO_BIP
Fred Drake4baedc12002-04-01 14:53:37 +00003958 PyModule_AddIntConstant(m, "IPPROTO_BIP", IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003959#endif
3960/**/
3961#ifdef IPPROTO_RAW
Fred Drake4baedc12002-04-01 14:53:37 +00003962 PyModule_AddIntConstant(m, "IPPROTO_RAW", IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00003963#else
Fred Drake4baedc12002-04-01 14:53:37 +00003964 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003965#endif
3966#ifdef IPPROTO_MAX
Fred Drake4baedc12002-04-01 14:53:37 +00003967 PyModule_AddIntConstant(m, "IPPROTO_MAX", IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003968#endif
3969
3970 /* Some port configuration */
3971#ifdef IPPORT_RESERVED
Fred Drake4baedc12002-04-01 14:53:37 +00003972 PyModule_AddIntConstant(m, "IPPORT_RESERVED", IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003973#else
Fred Drake4baedc12002-04-01 14:53:37 +00003974 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003975#endif
3976#ifdef IPPORT_USERRESERVED
Fred Drake4baedc12002-04-01 14:53:37 +00003977 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003978#else
Fred Drake4baedc12002-04-01 14:53:37 +00003979 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003980#endif
3981
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003982 /* Some reserved IP v.4 addresses */
3983#ifdef INADDR_ANY
Fred Drake4baedc12002-04-01 14:53:37 +00003984 PyModule_AddIntConstant(m, "INADDR_ANY", INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003985#else
Fred Drake4baedc12002-04-01 14:53:37 +00003986 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003987#endif
3988#ifdef INADDR_BROADCAST
Fred Drake4baedc12002-04-01 14:53:37 +00003989 PyModule_AddIntConstant(m, "INADDR_BROADCAST", INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003990#else
Fred Drake4baedc12002-04-01 14:53:37 +00003991 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003992#endif
3993#ifdef INADDR_LOOPBACK
Fred Drake4baedc12002-04-01 14:53:37 +00003994 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003995#else
Fred Drake4baedc12002-04-01 14:53:37 +00003996 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003997#endif
3998#ifdef INADDR_UNSPEC_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00003999 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004000#else
Fred Drake4baedc12002-04-01 14:53:37 +00004001 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004002#endif
4003#ifdef INADDR_ALLHOSTS_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00004004 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
4005 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004006#else
Fred Drake4baedc12002-04-01 14:53:37 +00004007 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004008#endif
4009#ifdef INADDR_MAX_LOCAL_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00004010 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP",
4011 INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004012#else
Fred Drake4baedc12002-04-01 14:53:37 +00004013 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004014#endif
4015#ifdef INADDR_NONE
Fred Drake4baedc12002-04-01 14:53:37 +00004016 PyModule_AddIntConstant(m, "INADDR_NONE", INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004017#else
Fred Drake4baedc12002-04-01 14:53:37 +00004018 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004019#endif
4020
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004021 /* IPv4 [gs]etsockopt options */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004022#ifdef IP_OPTIONS
Fred Drake4baedc12002-04-01 14:53:37 +00004023 PyModule_AddIntConstant(m, "IP_OPTIONS", IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004024#endif
4025#ifdef IP_HDRINCL
Fred Drake4baedc12002-04-01 14:53:37 +00004026 PyModule_AddIntConstant(m, "IP_HDRINCL", IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004027#endif
4028#ifdef IP_TOS
Fred Drake4baedc12002-04-01 14:53:37 +00004029 PyModule_AddIntConstant(m, "IP_TOS", IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004030#endif
4031#ifdef IP_TTL
Fred Drake4baedc12002-04-01 14:53:37 +00004032 PyModule_AddIntConstant(m, "IP_TTL", IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004033#endif
4034#ifdef IP_RECVOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00004035 PyModule_AddIntConstant(m, "IP_RECVOPTS", IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004036#endif
4037#ifdef IP_RECVRETOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00004038 PyModule_AddIntConstant(m, "IP_RECVRETOPTS", IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004039#endif
4040#ifdef IP_RECVDSTADDR
Fred Drake4baedc12002-04-01 14:53:37 +00004041 PyModule_AddIntConstant(m, "IP_RECVDSTADDR", IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004042#endif
4043#ifdef IP_RETOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00004044 PyModule_AddIntConstant(m, "IP_RETOPTS", IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004045#endif
4046#ifdef IP_MULTICAST_IF
Fred Drake4baedc12002-04-01 14:53:37 +00004047 PyModule_AddIntConstant(m, "IP_MULTICAST_IF", IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004048#endif
4049#ifdef IP_MULTICAST_TTL
Fred Drake4baedc12002-04-01 14:53:37 +00004050 PyModule_AddIntConstant(m, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004051#endif
4052#ifdef IP_MULTICAST_LOOP
Fred Drake4baedc12002-04-01 14:53:37 +00004053 PyModule_AddIntConstant(m, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004054#endif
4055#ifdef IP_ADD_MEMBERSHIP
Fred Drake4baedc12002-04-01 14:53:37 +00004056 PyModule_AddIntConstant(m, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004057#endif
4058#ifdef IP_DROP_MEMBERSHIP
Fred Drake4baedc12002-04-01 14:53:37 +00004059 PyModule_AddIntConstant(m, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004060#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00004061#ifdef IP_DEFAULT_MULTICAST_TTL
Fred Drake4baedc12002-04-01 14:53:37 +00004062 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_TTL",
4063 IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00004064#endif
4065#ifdef IP_DEFAULT_MULTICAST_LOOP
Fred Drake4baedc12002-04-01 14:53:37 +00004066 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_LOOP",
4067 IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00004068#endif
4069#ifdef IP_MAX_MEMBERSHIPS
Fred Drake4baedc12002-04-01 14:53:37 +00004070 PyModule_AddIntConstant(m, "IP_MAX_MEMBERSHIPS", IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00004071#endif
4072
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004073 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
4074#ifdef IPV6_JOIN_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00004075 PyModule_AddIntConstant(m, "IPV6_JOIN_GROUP", IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004076#endif
4077#ifdef IPV6_LEAVE_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00004078 PyModule_AddIntConstant(m, "IPV6_LEAVE_GROUP", IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004079#endif
4080#ifdef IPV6_MULTICAST_HOPS
Fred Drake4baedc12002-04-01 14:53:37 +00004081 PyModule_AddIntConstant(m, "IPV6_MULTICAST_HOPS", IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004082#endif
4083#ifdef IPV6_MULTICAST_IF
Fred Drake4baedc12002-04-01 14:53:37 +00004084 PyModule_AddIntConstant(m, "IPV6_MULTICAST_IF", IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004085#endif
4086#ifdef IPV6_MULTICAST_LOOP
Fred Drake4baedc12002-04-01 14:53:37 +00004087 PyModule_AddIntConstant(m, "IPV6_MULTICAST_LOOP", IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004088#endif
4089#ifdef IPV6_UNICAST_HOPS
Fred Drake4baedc12002-04-01 14:53:37 +00004090 PyModule_AddIntConstant(m, "IPV6_UNICAST_HOPS", IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004091#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00004092 /* Additional IPV6 socket options, defined in RFC 3493 */
4093#ifdef IPV6_V6ONLY
4094 PyModule_AddIntConstant(m, "IPV6_V6ONLY", IPV6_V6ONLY);
4095#endif
4096 /* Advanced IPV6 socket options, from RFC 3542 */
4097#ifdef IPV6_CHECKSUM
4098 PyModule_AddIntConstant(m, "IPV6_CHECKSUM", IPV6_CHECKSUM);
4099#endif
4100#ifdef IPV6_DONTFRAG
4101 PyModule_AddIntConstant(m, "IPV6_DONTFRAG", IPV6_DONTFRAG);
4102#endif
4103#ifdef IPV6_DSTOPTS
4104 PyModule_AddIntConstant(m, "IPV6_DSTOPTS", IPV6_DSTOPTS);
4105#endif
4106#ifdef IPV6_HOPLIMIT
4107 PyModule_AddIntConstant(m, "IPV6_HOPLIMIT", IPV6_HOPLIMIT);
4108#endif
4109#ifdef IPV6_HOPOPTS
4110 PyModule_AddIntConstant(m, "IPV6_HOPOPTS", IPV6_HOPOPTS);
4111#endif
4112#ifdef IPV6_NEXTHOP
4113 PyModule_AddIntConstant(m, "IPV6_NEXTHOP", IPV6_NEXTHOP);
4114#endif
4115#ifdef IPV6_PATHMTU
4116 PyModule_AddIntConstant(m, "IPV6_PATHMTU", IPV6_PATHMTU);
4117#endif
4118#ifdef IPV6_PKTINFO
4119 PyModule_AddIntConstant(m, "IPV6_PKTINFO", IPV6_PKTINFO);
4120#endif
4121#ifdef IPV6_RECVDSTOPTS
4122 PyModule_AddIntConstant(m, "IPV6_RECVDSTOPTS", IPV6_RECVDSTOPTS);
4123#endif
4124#ifdef IPV6_RECVHOPLIMIT
4125 PyModule_AddIntConstant(m, "IPV6_RECVHOPLIMIT", IPV6_RECVHOPLIMIT);
4126#endif
4127#ifdef IPV6_RECVHOPOPTS
4128 PyModule_AddIntConstant(m, "IPV6_RECVHOPOPTS", IPV6_RECVHOPOPTS);
4129#endif
4130#ifdef IPV6_RECVPKTINFO
4131 PyModule_AddIntConstant(m, "IPV6_RECVPKTINFO", IPV6_RECVPKTINFO);
4132#endif
4133#ifdef IPV6_RECVRTHDR
4134 PyModule_AddIntConstant(m, "IPV6_RECVRTHDR", IPV6_RECVRTHDR);
4135#endif
4136#ifdef IPV6_RECVTCLASS
4137 PyModule_AddIntConstant(m, "IPV6_RECVTCLASS", IPV6_RECVTCLASS);
4138#endif
4139#ifdef IPV6_RTHDR
4140 PyModule_AddIntConstant(m, "IPV6_RTHDR", IPV6_RTHDR);
4141#endif
4142#ifdef IPV6_RTHDRDSTOPTS
4143 PyModule_AddIntConstant(m, "IPV6_RTHDRDSTOPTS", IPV6_RTHDRDSTOPTS);
4144#endif
4145#ifdef IPV6_RTHDR_TYPE_0
4146 PyModule_AddIntConstant(m, "IPV6_RTHDR_TYPE_0", IPV6_RTHDR_TYPE_0);
4147#endif
4148#ifdef IPV6_RECVPATHMTU
4149 PyModule_AddIntConstant(m, "IPV6_RECVPATHMTU", IPV6_RECVPATHMTU);
4150#endif
4151#ifdef IPV6_TCLASS
4152 PyModule_AddIntConstant(m, "IPV6_TCLASS", IPV6_TCLASS);
4153#endif
4154#ifdef IPV6_USE_MIN_MTU
4155 PyModule_AddIntConstant(m, "IPV6_USE_MIN_MTU", IPV6_USE_MIN_MTU);
4156#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004157
Guido van Rossum09be4091999-08-09 14:40:40 +00004158 /* TCP options */
4159#ifdef TCP_NODELAY
Fred Drake4baedc12002-04-01 14:53:37 +00004160 PyModule_AddIntConstant(m, "TCP_NODELAY", TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00004161#endif
4162#ifdef TCP_MAXSEG
Fred Drake4baedc12002-04-01 14:53:37 +00004163 PyModule_AddIntConstant(m, "TCP_MAXSEG", TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00004164#endif
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004165#ifdef TCP_CORK
Fred Drake4baedc12002-04-01 14:53:37 +00004166 PyModule_AddIntConstant(m, "TCP_CORK", TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004167#endif
4168#ifdef TCP_KEEPIDLE
Fred Drake4baedc12002-04-01 14:53:37 +00004169 PyModule_AddIntConstant(m, "TCP_KEEPIDLE", TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004170#endif
4171#ifdef TCP_KEEPINTVL
Fred Drake4baedc12002-04-01 14:53:37 +00004172 PyModule_AddIntConstant(m, "TCP_KEEPINTVL", TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004173#endif
4174#ifdef TCP_KEEPCNT
Fred Drake4baedc12002-04-01 14:53:37 +00004175 PyModule_AddIntConstant(m, "TCP_KEEPCNT", TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004176#endif
4177#ifdef TCP_SYNCNT
Fred Drake4baedc12002-04-01 14:53:37 +00004178 PyModule_AddIntConstant(m, "TCP_SYNCNT", TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004179#endif
4180#ifdef TCP_LINGER2
Fred Drake4baedc12002-04-01 14:53:37 +00004181 PyModule_AddIntConstant(m, "TCP_LINGER2", TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004182#endif
4183#ifdef TCP_DEFER_ACCEPT
Fred Drake4baedc12002-04-01 14:53:37 +00004184 PyModule_AddIntConstant(m, "TCP_DEFER_ACCEPT", TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004185#endif
4186#ifdef TCP_WINDOW_CLAMP
Fred Drake4baedc12002-04-01 14:53:37 +00004187 PyModule_AddIntConstant(m, "TCP_WINDOW_CLAMP", TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004188#endif
4189#ifdef TCP_INFO
Fred Drake4baedc12002-04-01 14:53:37 +00004190 PyModule_AddIntConstant(m, "TCP_INFO", TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004191#endif
4192#ifdef TCP_QUICKACK
Fred Drake4baedc12002-04-01 14:53:37 +00004193 PyModule_AddIntConstant(m, "TCP_QUICKACK", TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004194#endif
4195
Guido van Rossum09be4091999-08-09 14:40:40 +00004196
4197 /* IPX options */
4198#ifdef IPX_TYPE
Fred Drake4baedc12002-04-01 14:53:37 +00004199 PyModule_AddIntConstant(m, "IPX_TYPE", IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00004200#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004201
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004202 /* get{addr,name}info parameters */
4203#ifdef EAI_ADDRFAMILY
Fred Drake4baedc12002-04-01 14:53:37 +00004204 PyModule_AddIntConstant(m, "EAI_ADDRFAMILY", EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004205#endif
4206#ifdef EAI_AGAIN
Fred Drake4baedc12002-04-01 14:53:37 +00004207 PyModule_AddIntConstant(m, "EAI_AGAIN", EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004208#endif
4209#ifdef EAI_BADFLAGS
Fred Drake4baedc12002-04-01 14:53:37 +00004210 PyModule_AddIntConstant(m, "EAI_BADFLAGS", EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004211#endif
4212#ifdef EAI_FAIL
Fred Drake4baedc12002-04-01 14:53:37 +00004213 PyModule_AddIntConstant(m, "EAI_FAIL", EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004214#endif
4215#ifdef EAI_FAMILY
Fred Drake4baedc12002-04-01 14:53:37 +00004216 PyModule_AddIntConstant(m, "EAI_FAMILY", EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004217#endif
4218#ifdef EAI_MEMORY
Fred Drake4baedc12002-04-01 14:53:37 +00004219 PyModule_AddIntConstant(m, "EAI_MEMORY", EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004220#endif
4221#ifdef EAI_NODATA
Fred Drake4baedc12002-04-01 14:53:37 +00004222 PyModule_AddIntConstant(m, "EAI_NODATA", EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004223#endif
4224#ifdef EAI_NONAME
Fred Drake4baedc12002-04-01 14:53:37 +00004225 PyModule_AddIntConstant(m, "EAI_NONAME", EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004226#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00004227#ifdef EAI_OVERFLOW
4228 PyModule_AddIntConstant(m, "EAI_OVERFLOW", EAI_OVERFLOW);
4229#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004230#ifdef EAI_SERVICE
Fred Drake4baedc12002-04-01 14:53:37 +00004231 PyModule_AddIntConstant(m, "EAI_SERVICE", EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004232#endif
4233#ifdef EAI_SOCKTYPE
Fred Drake4baedc12002-04-01 14:53:37 +00004234 PyModule_AddIntConstant(m, "EAI_SOCKTYPE", EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004235#endif
4236#ifdef EAI_SYSTEM
Fred Drake4baedc12002-04-01 14:53:37 +00004237 PyModule_AddIntConstant(m, "EAI_SYSTEM", EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004238#endif
4239#ifdef EAI_BADHINTS
Fred Drake4baedc12002-04-01 14:53:37 +00004240 PyModule_AddIntConstant(m, "EAI_BADHINTS", EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004241#endif
4242#ifdef EAI_PROTOCOL
Fred Drake4baedc12002-04-01 14:53:37 +00004243 PyModule_AddIntConstant(m, "EAI_PROTOCOL", EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004244#endif
4245#ifdef EAI_MAX
Fred Drake4baedc12002-04-01 14:53:37 +00004246 PyModule_AddIntConstant(m, "EAI_MAX", EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004247#endif
4248#ifdef AI_PASSIVE
Fred Drake4baedc12002-04-01 14:53:37 +00004249 PyModule_AddIntConstant(m, "AI_PASSIVE", AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004250#endif
4251#ifdef AI_CANONNAME
Fred Drake4baedc12002-04-01 14:53:37 +00004252 PyModule_AddIntConstant(m, "AI_CANONNAME", AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004253#endif
4254#ifdef AI_NUMERICHOST
Fred Drake4baedc12002-04-01 14:53:37 +00004255 PyModule_AddIntConstant(m, "AI_NUMERICHOST", AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004256#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00004257#ifdef AI_NUMERICSERV
4258 PyModule_AddIntConstant(m, "AI_NUMERICSERV", AI_NUMERICSERV);
4259#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004260#ifdef AI_MASK
Fred Drake4baedc12002-04-01 14:53:37 +00004261 PyModule_AddIntConstant(m, "AI_MASK", AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004262#endif
4263#ifdef AI_ALL
Fred Drake4baedc12002-04-01 14:53:37 +00004264 PyModule_AddIntConstant(m, "AI_ALL", AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004265#endif
4266#ifdef AI_V4MAPPED_CFG
Fred Drake4baedc12002-04-01 14:53:37 +00004267 PyModule_AddIntConstant(m, "AI_V4MAPPED_CFG", AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004268#endif
4269#ifdef AI_ADDRCONFIG
Fred Drake4baedc12002-04-01 14:53:37 +00004270 PyModule_AddIntConstant(m, "AI_ADDRCONFIG", AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004271#endif
4272#ifdef AI_V4MAPPED
Fred Drake4baedc12002-04-01 14:53:37 +00004273 PyModule_AddIntConstant(m, "AI_V4MAPPED", AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004274#endif
4275#ifdef AI_DEFAULT
Fred Drake4baedc12002-04-01 14:53:37 +00004276 PyModule_AddIntConstant(m, "AI_DEFAULT", AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004277#endif
4278#ifdef NI_MAXHOST
Fred Drake4baedc12002-04-01 14:53:37 +00004279 PyModule_AddIntConstant(m, "NI_MAXHOST", NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004280#endif
4281#ifdef NI_MAXSERV
Fred Drake4baedc12002-04-01 14:53:37 +00004282 PyModule_AddIntConstant(m, "NI_MAXSERV", NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004283#endif
4284#ifdef NI_NOFQDN
Fred Drake4baedc12002-04-01 14:53:37 +00004285 PyModule_AddIntConstant(m, "NI_NOFQDN", NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004286#endif
4287#ifdef NI_NUMERICHOST
Fred Drake4baedc12002-04-01 14:53:37 +00004288 PyModule_AddIntConstant(m, "NI_NUMERICHOST", NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004289#endif
4290#ifdef NI_NAMEREQD
Fred Drake4baedc12002-04-01 14:53:37 +00004291 PyModule_AddIntConstant(m, "NI_NAMEREQD", NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004292#endif
4293#ifdef NI_NUMERICSERV
Fred Drake4baedc12002-04-01 14:53:37 +00004294 PyModule_AddIntConstant(m, "NI_NUMERICSERV", NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004295#endif
4296#ifdef NI_DGRAM
Fred Drake4baedc12002-04-01 14:53:37 +00004297 PyModule_AddIntConstant(m, "NI_DGRAM", NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004298#endif
4299
Martin v. Löwis94681fc2003-11-27 19:40:22 +00004300 /* shutdown() parameters */
4301#ifdef SHUT_RD
4302 PyModule_AddIntConstant(m, "SHUT_RD", SHUT_RD);
4303#elif defined(SD_RECEIVE)
4304 PyModule_AddIntConstant(m, "SHUT_RD", SD_RECEIVE);
4305#else
4306 PyModule_AddIntConstant(m, "SHUT_RD", 0);
4307#endif
4308#ifdef SHUT_WR
4309 PyModule_AddIntConstant(m, "SHUT_WR", SHUT_WR);
4310#elif defined(SD_SEND)
4311 PyModule_AddIntConstant(m, "SHUT_WR", SD_SEND);
4312#else
4313 PyModule_AddIntConstant(m, "SHUT_WR", 1);
4314#endif
4315#ifdef SHUT_RDWR
4316 PyModule_AddIntConstant(m, "SHUT_RDWR", SHUT_RDWR);
4317#elif defined(SD_BOTH)
4318 PyModule_AddIntConstant(m, "SHUT_RDWR", SD_BOTH);
4319#else
4320 PyModule_AddIntConstant(m, "SHUT_RDWR", 2);
4321#endif
4322
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004323 /* Initialize gethostbyname lock */
Just van Rossum1040d2c2003-05-09 07:53:18 +00004324#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
4325 netdb_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004326#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004327}
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004328
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004329
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004330#ifndef HAVE_INET_PTON
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004331
4332/* Simplistic emulation code for inet_pton that only works for IPv4 */
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004333/* These are not exposed because they do not set errno properly */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004334
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004335int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004336inet_pton(int af, const char *src, void *dst)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004337{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004338 if (af == AF_INET) {
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004339 long packed_addr;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004340 packed_addr = inet_addr(src);
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004341 if (packed_addr == INADDR_NONE)
4342 return 0;
4343 memcpy(dst, &packed_addr, 4);
4344 return 1;
4345 }
4346 /* Should set errno to EAFNOSUPPORT */
4347 return -1;
4348}
4349
Martin v. Löwisc925b1532001-07-21 09:42:15 +00004350const char *
4351inet_ntop(int af, const void *src, char *dst, socklen_t size)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004352{
4353 if (af == AF_INET) {
4354 struct in_addr packed_addr;
4355 if (size < 16)
4356 /* Should set errno to ENOSPC. */
4357 return NULL;
4358 memcpy(&packed_addr, src, sizeof(packed_addr));
4359 return strncpy(dst, inet_ntoa(packed_addr), size);
4360 }
4361 /* Should set errno to EAFNOSUPPORT */
4362 return NULL;
4363}
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004364
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004365#endif