blob: c897f65052c021aabd1621682299978f3973649d [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
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000250#ifdef HAVE_STDDEF_H
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000251# include <stddef.h>
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000252#endif
253
254#ifndef offsetof
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000255# define offsetof(type, member) ((size_t)(&((type *)0)->member))
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000256#endif
257
Neal Norwitz39d22e52002-11-02 19:55:21 +0000258#ifndef O_NONBLOCK
259# define O_NONBLOCK O_NDELAY
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000260#endif
261
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000262#include "addrinfo.h"
263
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000264#ifndef HAVE_INET_PTON
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000265int inet_pton(int af, const char *src, void *dst);
Martin v. Löwisc925b1532001-07-21 09:42:15 +0000266const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000267#endif
268
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000269#ifdef __APPLE__
270/* On OS X, getaddrinfo returns no error indication of lookup
271 failure, so we must use the emulation instead of the libinfo
272 implementation. Unfortunately, performing an autoconf test
273 for this bug would require DNS access for the machine performing
274 the configuration, which is not acceptable. Therefore, we
275 determine the bug just by checking for __APPLE__. If this bug
276 gets ever fixed, perhaps checking for sys/version.h would be
277 appropriate, which is 10/0 on the system with the bug. */
Jack Jansen84262fb2002-07-02 14:40:42 +0000278#ifndef HAVE_GETNAMEINFO
279/* This bug seems to be fixed in Jaguar. Ths easiest way I could
280 Find to check for Jaguar is that it has getnameinfo(), which
281 older releases don't have */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000282#undef HAVE_GETADDRINFO
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000283#endif
Jack Jansen84262fb2002-07-02 14:40:42 +0000284#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000285
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000286/* I know this is a bad practice, but it is the easiest... */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000287#if !defined(HAVE_GETADDRINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000288/* avoid clashes with the C library definition of the symbol. */
289#define getaddrinfo fake_getaddrinfo
290#define gai_strerror fake_gai_strerror
291#define freeaddrinfo fake_freeaddrinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000292#include "getaddrinfo.c"
293#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000294#if !defined(HAVE_GETNAMEINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000295#define getnameinfo fake_getnameinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000296#include "getnameinfo.c"
297#endif
298
Guido van Rossumbcc20741998-08-04 22:53:56 +0000299#if defined(MS_WINDOWS) || defined(__BEOS__)
300/* BeOS suffers from the same socket dichotomy as Win32... - [cjh] */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000301/* seem to be a few differences in the API */
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000302#define SOCKETCLOSE closesocket
Guido van Rossumbe32c891996-06-20 16:25:29 +0000303#define NO_DUP /* Actually it exists on NT 3.5, but what the heck... */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000304#endif
305
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000306#ifdef MS_WIN32
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000307#define EAFNOSUPPORT WSAEAFNOSUPPORT
308#define snprintf _snprintf
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000309#endif
Fred Drakea04eaad2000-06-30 02:46:07 +0000310
Andrew MacIntyreba43e872002-03-03 03:03:52 +0000311#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000312#define SOCKETCLOSE soclose
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000313#define NO_DUP /* Sockets are Not Actual File Handles under OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000314#endif
315
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000316#ifndef SOCKETCLOSE
317#define SOCKETCLOSE close
318#endif
319
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000320#ifdef __VMS
321/* TCP/IP Services for VMS uses a maximum send/revc buffer length of 65535 */
322#define SEGMENT_SIZE 65535
323#endif
324
Hye-Shik Chang81268602004-02-02 06:05:24 +0000325#if defined(HAVE_BLUETOOTH_H) || defined(HAVE_BLUETOOTH_BLUETOOTH_H)
326#define USE_BLUETOOTH 1
327#if defined(__FreeBSD__)
328#define BTPROTO_L2CAP BLUETOOTH_PROTO_L2CAP
329#define BTPROTO_RFCOMM BLUETOOTH_PROTO_RFCOMM
330#define sockaddr_l2 sockaddr_l2cap
331#define sockaddr_rc sockaddr_rfcomm
332#define _BT_SOCKADDR_MEMB(s, proto) &((s)->sock_addr)
333#define _BT_L2_MEMB(sa, memb) ((sa)->l2cap_##memb)
334#define _BT_RC_MEMB(sa, memb) ((sa)->rfcomm_##memb)
335#else
336#define _BT_SOCKADDRMEMB(s, proto) (&((s)->sock_addr).bt_##proto)
337#define _BT_L2_MEMB(sa, memb) ((sa)->l2_##memb)
338#define _BT_RC_MEMB(sa, memb) ((sa)->rc_##memb)
339#define _BT_SCO_MEMB(sa, memb) ((sa)->sco_##memb)
340#endif
341#endif
342
Martin v. Löwise9416172003-05-03 10:12:45 +0000343/*
344 * Constants for getnameinfo()
345 */
346#if !defined(NI_MAXHOST)
347#define NI_MAXHOST 1025
348#endif
349#if !defined(NI_MAXSERV)
350#define NI_MAXSERV 32
351#endif
352
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000353/* XXX There's a problem here: *static* functions are not supposed to have
354 a Py prefix (or use CapitalizedWords). Later... */
355
Guido van Rossum30a685f1991-06-27 15:51:29 +0000356/* Global variable holding the exception type for errors detected
357 by this module (but not argument type or memory errors, etc.). */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000358static PyObject *socket_error;
359static PyObject *socket_herror;
360static PyObject *socket_gaierror;
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000361static PyObject *socket_timeout;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000362
Guido van Rossum48a680c2001-03-02 06:34:14 +0000363#ifdef RISCOS
364/* Global variable which is !=0 if Python is running in a RISC OS taskwindow */
365static int taskwindow;
366#endif
367
Tim Peters643a7fc2002-02-17 04:13:21 +0000368/* A forward reference to the socket type object.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000369 The sock_type variable contains pointers to various functions,
370 some of which call new_sockobject(), which uses sock_type, so
Tim Peters643a7fc2002-02-17 04:13:21 +0000371 there has to be a circular reference. */
Jeremy Hylton938ace62002-07-17 16:30:39 +0000372static PyTypeObject sock_type;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000373
Guido van Rossum30a685f1991-06-27 15:51:29 +0000374/* Convenience function to raise an error according to errno
375 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000376
Guido van Rossum73624e91994-10-10 17:59:00 +0000377static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000378set_error(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000379{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000380#ifdef MS_WINDOWS
Mark Hammond46a733d2000-07-24 01:45:11 +0000381 int err_no = WSAGetLastError();
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000382 static struct {
383 int no;
384 const char *msg;
385 } *msgp, msgs[] = {
386 {WSAEINTR, "Interrupted system call"},
387 {WSAEBADF, "Bad file descriptor"},
388 {WSAEACCES, "Permission denied"},
389 {WSAEFAULT, "Bad address"},
390 {WSAEINVAL, "Invalid argument"},
391 {WSAEMFILE, "Too many open files"},
392 {WSAEWOULDBLOCK,
393 "The socket operation could not complete "
394 "without blocking"},
395 {WSAEINPROGRESS, "Operation now in progress"},
396 {WSAEALREADY, "Operation already in progress"},
397 {WSAENOTSOCK, "Socket operation on non-socket"},
398 {WSAEDESTADDRREQ, "Destination address required"},
399 {WSAEMSGSIZE, "Message too long"},
400 {WSAEPROTOTYPE, "Protocol wrong type for socket"},
401 {WSAENOPROTOOPT, "Protocol not available"},
402 {WSAEPROTONOSUPPORT, "Protocol not supported"},
403 {WSAESOCKTNOSUPPORT, "Socket type not supported"},
404 {WSAEOPNOTSUPP, "Operation not supported"},
405 {WSAEPFNOSUPPORT, "Protocol family not supported"},
406 {WSAEAFNOSUPPORT, "Address family not supported"},
407 {WSAEADDRINUSE, "Address already in use"},
408 {WSAEADDRNOTAVAIL, "Can't assign requested address"},
409 {WSAENETDOWN, "Network is down"},
410 {WSAENETUNREACH, "Network is unreachable"},
411 {WSAENETRESET, "Network dropped connection on reset"},
412 {WSAECONNABORTED, "Software caused connection abort"},
413 {WSAECONNRESET, "Connection reset by peer"},
414 {WSAENOBUFS, "No buffer space available"},
415 {WSAEISCONN, "Socket is already connected"},
416 {WSAENOTCONN, "Socket is not connected"},
417 {WSAESHUTDOWN, "Can't send after socket shutdown"},
418 {WSAETOOMANYREFS, "Too many references: can't splice"},
419 {WSAETIMEDOUT, "Operation timed out"},
420 {WSAECONNREFUSED, "Connection refused"},
421 {WSAELOOP, "Too many levels of symbolic links"},
422 {WSAENAMETOOLONG, "File name too long"},
423 {WSAEHOSTDOWN, "Host is down"},
424 {WSAEHOSTUNREACH, "No route to host"},
425 {WSAENOTEMPTY, "Directory not empty"},
426 {WSAEPROCLIM, "Too many processes"},
427 {WSAEUSERS, "Too many users"},
428 {WSAEDQUOT, "Disc quota exceeded"},
429 {WSAESTALE, "Stale NFS file handle"},
430 {WSAEREMOTE, "Too many levels of remote in path"},
431 {WSASYSNOTREADY, "Network subsystem is unvailable"},
432 {WSAVERNOTSUPPORTED, "WinSock version is not supported"},
433 {WSANOTINITIALISED,
434 "Successful WSAStartup() not yet performed"},
435 {WSAEDISCON, "Graceful shutdown in progress"},
436 /* Resolver errors */
437 {WSAHOST_NOT_FOUND, "No such host is known"},
438 {WSATRY_AGAIN, "Host not found, or server failed"},
439 {WSANO_RECOVERY, "Unexpected server error encountered"},
440 {WSANO_DATA, "Valid name without requested data"},
441 {WSANO_ADDRESS, "No address, look for MX record"},
442 {0, NULL}
443 };
Mark Hammond46a733d2000-07-24 01:45:11 +0000444 if (err_no) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000445 PyObject *v;
Mark Hammond46a733d2000-07-24 01:45:11 +0000446 const char *msg = "winsock error";
Guido van Rossum48a680c2001-03-02 06:34:14 +0000447
Mark Hammond46a733d2000-07-24 01:45:11 +0000448 for (msgp = msgs; msgp->msg; msgp++) {
449 if (err_no == msgp->no) {
450 msg = msgp->msg;
451 break;
452 }
453 }
454
455 v = Py_BuildValue("(is)", err_no, msg);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000456 if (v != NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000457 PyErr_SetObject(socket_error, v);
Guido van Rossum73624e91994-10-10 17:59:00 +0000458 Py_DECREF(v);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000459 }
460 return NULL;
461 }
462 else
463#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000464
Andrew MacIntyreba43e872002-03-03 03:03:52 +0000465#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000466 if (sock_errno() != NO_ERROR) {
467 APIRET rc;
468 ULONG msglen;
469 char outbuf[100];
470 int myerrorcode = sock_errno();
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000471
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000472 /* Retrieve socket-related error message from MPTN.MSG file */
473 rc = DosGetMessage(NULL, 0, outbuf, sizeof(outbuf),
474 myerrorcode - SOCBASEERR + 26,
475 "mptn.msg",
476 &msglen);
477 if (rc == NO_ERROR) {
478 PyObject *v;
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000479
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000480 /* OS/2 doesn't guarantee a terminator */
481 outbuf[msglen] = '\0';
482 if (strlen(outbuf) > 0) {
483 /* If non-empty msg, trim CRLF */
484 char *lastc = &outbuf[ strlen(outbuf)-1 ];
485 while (lastc > outbuf && isspace(*lastc)) {
486 /* Trim trailing whitespace (CRLF) */
487 *lastc-- = '\0';
488 }
489 }
490 v = Py_BuildValue("(is)", myerrorcode, outbuf);
491 if (v != NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000492 PyErr_SetObject(socket_error, v);
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000493 Py_DECREF(v);
494 }
495 return NULL;
496 }
497 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000498#endif
499
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000500#if defined(RISCOS)
501 if (_inet_error.errnum != NULL) {
502 PyObject *v;
503 v = Py_BuildValue("(is)", errno, _inet_err());
504 if (v != NULL) {
505 PyErr_SetObject(socket_error, v);
506 Py_DECREF(v);
507 }
508 return NULL;
509 }
510#endif
511
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000512 return PyErr_SetFromErrno(socket_error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000513}
514
Guido van Rossum30a685f1991-06-27 15:51:29 +0000515
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000516static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000517set_herror(int h_error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000518{
519 PyObject *v;
520
521#ifdef HAVE_HSTRERROR
522 v = Py_BuildValue("(is)", h_error, (char *)hstrerror(h_error));
523#else
524 v = Py_BuildValue("(is)", h_error, "host not found");
525#endif
526 if (v != NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000527 PyErr_SetObject(socket_herror, v);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000528 Py_DECREF(v);
529 }
530
531 return NULL;
532}
533
534
535static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000536set_gaierror(int error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000537{
538 PyObject *v;
539
Martin v. Löwis272cb402002-03-01 08:31:07 +0000540#ifdef EAI_SYSTEM
541 /* EAI_SYSTEM is not available on Windows XP. */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000542 if (error == EAI_SYSTEM)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000543 return set_error();
Martin v. Löwis272cb402002-03-01 08:31:07 +0000544#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000545
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000546#ifdef HAVE_GAI_STRERROR
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000547 v = Py_BuildValue("(is)", error, gai_strerror(error));
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000548#else
549 v = Py_BuildValue("(is)", error, "getaddrinfo failed");
550#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000551 if (v != NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000552 PyErr_SetObject(socket_gaierror, v);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000553 Py_DECREF(v);
554 }
555
556 return NULL;
557}
558
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000559/* Function to perform the setting of socket blocking mode
560 internally. block = (1 | 0). */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000561static int
562internal_setblocking(PySocketSockObject *s, int block)
563{
564#ifndef RISCOS
565#ifndef MS_WINDOWS
566 int delay_flag;
567#endif
568#endif
569
570 Py_BEGIN_ALLOW_THREADS
571#ifdef __BEOS__
572 block = !block;
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000573 setsockopt(s->sock_fd, SOL_SOCKET, SO_NONBLOCK,
574 (void *)(&block), sizeof(int));
Guido van Rossum67f7a382002-06-06 21:08:16 +0000575#else
576#ifndef RISCOS
577#ifndef MS_WINDOWS
578#if defined(PYOS_OS2) && !defined(PYCC_GCC)
579 block = !block;
580 ioctl(s->sock_fd, FIONBIO, (caddr_t)&block, sizeof(block));
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000581#elif defined(__VMS)
582 block = !block;
583 ioctl(s->sock_fd, FIONBIO, (char *)&block);
584#else /* !PYOS_OS2 && !_VMS */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000585 delay_flag = fcntl(s->sock_fd, F_GETFL, 0);
586 if (block)
Neal Norwitz39d22e52002-11-02 19:55:21 +0000587 delay_flag &= (~O_NONBLOCK);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000588 else
Neal Norwitz39d22e52002-11-02 19:55:21 +0000589 delay_flag |= O_NONBLOCK;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000590 fcntl(s->sock_fd, F_SETFL, delay_flag);
591#endif /* !PYOS_OS2 */
592#else /* MS_WINDOWS */
593 block = !block;
594 ioctlsocket(s->sock_fd, FIONBIO, (u_long*)&block);
595#endif /* MS_WINDOWS */
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000596#else /* RISCOS */
597 block = !block;
598 socketioctl(s->sock_fd, FIONBIO, (u_long*)&block);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000599#endif /* RISCOS */
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000600#endif /* __BEOS__ */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000601 Py_END_ALLOW_THREADS
602
603 /* Since these don't return anything */
604 return 1;
605}
606
Guido van Rossum11ba0942002-06-13 15:07:44 +0000607/* Do a select() on the socket, if necessary (sock_timeout > 0).
608 The argument writing indicates the direction.
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000609 This does not raise an exception; we'll let our caller do that
610 after they've reacquired the interpreter lock.
611 Returns 1 on timeout, 0 otherwise. */
612static int
Guido van Rossumb9e916a2002-06-07 01:42:47 +0000613internal_select(PySocketSockObject *s, int writing)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000614{
615 fd_set fds;
616 struct timeval tv;
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000617 int n;
Guido van Rossum11ba0942002-06-13 15:07:44 +0000618
Guido van Rossumad654902002-07-19 12:44:59 +0000619 /* Nothing to do unless we're in timeout mode (not non-blocking) */
Guido van Rossum11ba0942002-06-13 15:07:44 +0000620 if (s->sock_timeout <= 0.0)
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000621 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000622
Guido van Rossumad654902002-07-19 12:44:59 +0000623 /* Guard against closed socket */
624 if (s->sock_fd < 0)
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000625 return 0;
Guido van Rossumad654902002-07-19 12:44:59 +0000626
Guido van Rossum67f7a382002-06-06 21:08:16 +0000627 /* Construct the arguments to select */
628 tv.tv_sec = (int)s->sock_timeout;
Guido van Rossumb9e916a2002-06-07 01:42:47 +0000629 tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000630 FD_ZERO(&fds);
631 FD_SET(s->sock_fd, &fds);
632
633 /* See if the socket is ready */
Guido van Rossumb9e916a2002-06-07 01:42:47 +0000634 if (writing)
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000635 n = select(s->sock_fd+1, NULL, &fds, NULL, &tv);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000636 else
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000637 n = select(s->sock_fd+1, &fds, NULL, NULL, &tv);
638 if (n == 0)
639 return 1;
640 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000641}
642
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000643/* Initialize a new socket object. */
644
Tim Petersa12b4cf2002-07-18 22:38:44 +0000645static double defaulttimeout = -1.0; /* Default timeout for new sockets */
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000646
Mark Hammond62b1ab12002-07-23 06:31:15 +0000647PyMODINIT_FUNC
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000648init_sockobject(PySocketSockObject *s,
649 SOCKET_T fd, int family, int type, int proto)
650{
651#ifdef RISCOS
652 int block = 1;
653#endif
654 s->sock_fd = fd;
655 s->sock_family = family;
656 s->sock_type = type;
657 s->sock_proto = proto;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000658 s->sock_timeout = defaulttimeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000659
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000660 s->errorhandler = &set_error;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000661
662 if (defaulttimeout >= 0.0)
663 internal_setblocking(s, 0);
664
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000665#ifdef RISCOS
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000666 if (taskwindow)
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000667 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000668#endif
669}
670
671
Guido van Rossum30a685f1991-06-27 15:51:29 +0000672/* Create a new socket object.
673 This just creates the object and initializes it.
674 If the creation fails, return NULL and set an exception (implicit
675 in NEWOBJ()). */
676
Guido van Rossum73624e91994-10-10 17:59:00 +0000677static PySocketSockObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000678new_sockobject(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000679{
Guido van Rossum73624e91994-10-10 17:59:00 +0000680 PySocketSockObject *s;
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000681 s = (PySocketSockObject *)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000682 PyType_GenericNew(&sock_type, NULL, NULL);
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000683 if (s != NULL)
684 init_sockobject(s, fd, family, type, proto);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000685 return s;
686}
687
Guido van Rossum30a685f1991-06-27 15:51:29 +0000688
Guido van Rossum48a680c2001-03-02 06:34:14 +0000689/* Lock to allow python interpreter to continue, but only allow one
Just van Rossum1040d2c2003-05-09 07:53:18 +0000690 thread to be in gethostbyname or getaddrinfo */
691#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
692PyThread_type_lock netdb_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000693#endif
694
695
Guido van Rossum30a685f1991-06-27 15:51:29 +0000696/* Convert a string specifying a host name or one of a few symbolic
697 names to a numeric IP address. This usually calls gethostbyname()
698 to do the work; the names "" and "<broadcast>" are special.
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000699 Return the length (IPv4 should be 4 bytes), or negative if
Guido van Rossum30a685f1991-06-27 15:51:29 +0000700 an error occurred; then an exception is raised. */
701
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000702static int
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000703setipaddr(char *name, struct sockaddr *addr_ret, size_t addr_ret_size, int af)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000704{
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000705 struct addrinfo hints, *res;
706 int error;
Anthony Baxter0e85f9d2003-05-02 15:40:46 +0000707 int d1, d2, d3, d4;
708 char ch;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000709
Guido van Rossuma376cc51996-12-05 23:43:35 +0000710 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
Guido van Rossum30a685f1991-06-27 15:51:29 +0000711 if (name[0] == '\0') {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000712 int siz;
713 memset(&hints, 0, sizeof(hints));
714 hints.ai_family = af;
715 hints.ai_socktype = SOCK_DGRAM; /*dummy*/
716 hints.ai_flags = AI_PASSIVE;
Just van Rossum1040d2c2003-05-09 07:53:18 +0000717 Py_BEGIN_ALLOW_THREADS
718 ACQUIRE_GETADDRINFO_LOCK
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000719 error = getaddrinfo(NULL, "0", &hints, &res);
Just van Rossum1040d2c2003-05-09 07:53:18 +0000720 Py_END_ALLOW_THREADS
721 /* We assume that those thread-unsafe getaddrinfo() versions
722 *are* safe regarding their return value, ie. that a
723 subsequent call to getaddrinfo() does not destroy the
724 outcome of the first call. */
725 RELEASE_GETADDRINFO_LOCK
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000726 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000727 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000728 return -1;
729 }
730 switch (res->ai_family) {
731 case AF_INET:
732 siz = 4;
733 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000734#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000735 case AF_INET6:
736 siz = 16;
737 break;
738#endif
739 default:
740 freeaddrinfo(res);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000741 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000742 "unsupported address family");
743 return -1;
744 }
745 if (res->ai_next) {
Martin v. Löwisf0b11d22001-11-07 08:31:03 +0000746 freeaddrinfo(res);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000747 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000748 "wildcard resolved to multiple address");
749 return -1;
750 }
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000751 if (res->ai_addrlen < addr_ret_size)
752 addr_ret_size = res->ai_addrlen;
753 memcpy(addr_ret, res->ai_addr, addr_ret_size);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000754 freeaddrinfo(res);
755 return siz;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000756 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000757 if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000758 struct sockaddr_in *sin;
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +0000759 if (af != AF_INET && af != AF_UNSPEC) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000760 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000761 "address family mismatched");
762 return -1;
763 }
764 sin = (struct sockaddr_in *)addr_ret;
765 memset((void *) sin, '\0', sizeof(*sin));
766 sin->sin_family = AF_INET;
767#ifdef HAVE_SOCKADDR_SA_LEN
768 sin->sin_len = sizeof(*sin);
769#endif
770 sin->sin_addr.s_addr = INADDR_BROADCAST;
771 return sizeof(sin->sin_addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000772 }
Anthony Baxter0e85f9d2003-05-02 15:40:46 +0000773 if (sscanf(name, "%d.%d.%d.%d%c", &d1, &d2, &d3, &d4, &ch) == 4 &&
774 0 <= d1 && d1 <= 255 && 0 <= d2 && d2 <= 255 &&
775 0 <= d3 && d3 <= 255 && 0 <= d4 && d4 <= 255) {
776 struct sockaddr_in *sin;
777 sin = (struct sockaddr_in *)addr_ret;
778 sin->sin_addr.s_addr = htonl(
779 ((long) d1 << 24) | ((long) d2 << 16) |
780 ((long) d3 << 8) | ((long) d4 << 0));
781 sin->sin_family = AF_INET;
782#ifdef HAVE_SOCKADDR_SA_LEN
783 sin->sin_len = sizeof(*sin);
784#endif
785 return 4;
786 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000787 memset(&hints, 0, sizeof(hints));
788 hints.ai_family = af;
Just van Rossum1040d2c2003-05-09 07:53:18 +0000789 Py_BEGIN_ALLOW_THREADS
790 ACQUIRE_GETADDRINFO_LOCK
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000791 error = getaddrinfo(name, NULL, &hints, &res);
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000792#if defined(__digital__) && defined(__unix__)
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000793 if (error == EAI_NONAME && af == AF_UNSPEC) {
794 /* On Tru64 V5.1, numeric-to-addr conversion fails
795 if no address family is given. Assume IPv4 for now.*/
796 hints.ai_family = AF_INET;
797 error = getaddrinfo(name, NULL, &hints, &res);
798 }
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000799#endif
Just van Rossum1040d2c2003-05-09 07:53:18 +0000800 Py_END_ALLOW_THREADS
801 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000802 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000803 set_gaierror(error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000804 return -1;
805 }
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000806 if (res->ai_addrlen < addr_ret_size)
807 addr_ret_size = res->ai_addrlen;
808 memcpy((char *) addr_ret, res->ai_addr, addr_ret_size);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000809 freeaddrinfo(res);
810 switch (addr_ret->sa_family) {
811 case AF_INET:
812 return 4;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000813#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000814 case AF_INET6:
815 return 16;
Guido van Rossum955becc1999-03-22 20:14:53 +0000816#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000817 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000818 PyErr_SetString(socket_error, "unknown address family");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000819 return -1;
820 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000821}
822
Guido van Rossum30a685f1991-06-27 15:51:29 +0000823
Guido van Rossum30a685f1991-06-27 15:51:29 +0000824/* Create a string object representing an IP address.
825 This is always a string of the form 'dd.dd.dd.dd' (with variable
826 size numbers). */
827
Guido van Rossum73624e91994-10-10 17:59:00 +0000828static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000829makeipaddr(struct sockaddr *addr, int addrlen)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000830{
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000831 char buf[NI_MAXHOST];
832 int error;
833
834 error = getnameinfo(addr, addrlen, buf, sizeof(buf), NULL, 0,
835 NI_NUMERICHOST);
836 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000837 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000838 return NULL;
839 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000840 return PyString_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000841}
842
843
844/* Create an object representing the given socket address,
845 suitable for passing it back to bind(), connect() etc.
846 The family field of the sockaddr structure is inspected
847 to determine what kind of address it really is. */
848
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000849/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000850static PyObject *
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000851makesockaddr(int sockfd, struct sockaddr *addr, int addrlen)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000852{
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000853 if (addrlen == 0) {
854 /* No address -- may be recvfrom() from known socket */
Guido van Rossum73624e91994-10-10 17:59:00 +0000855 Py_INCREF(Py_None);
856 return Py_None;
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000857 }
858
Guido van Rossumbcc20741998-08-04 22:53:56 +0000859#ifdef __BEOS__
Guido van Rossum2c8bcb82000-04-25 21:34:53 +0000860 /* XXX: BeOS version of accept() doesn't set family correctly */
Guido van Rossumbcc20741998-08-04 22:53:56 +0000861 addr->sa_family = AF_INET;
862#endif
863
Guido van Rossum30a685f1991-06-27 15:51:29 +0000864 switch (addr->sa_family) {
865
866 case AF_INET:
867 {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000868 struct sockaddr_in *a;
869 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
Barry Warsaw752300b1997-01-03 17:18:10 +0000870 PyObject *ret = NULL;
871 if (addrobj) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000872 a = (struct sockaddr_in *)addr;
Barry Warsaw752300b1997-01-03 17:18:10 +0000873 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
874 Py_DECREF(addrobj);
875 }
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000876 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000877 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000878
Andrew MacIntyre34d3e2d2003-01-02 12:45:34 +0000879#if defined(AF_UNIX) && !defined(PYOS_OS2)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000880 case AF_UNIX:
881 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000882 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000883 return PyString_FromString(a->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000884 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000885#endif /* AF_UNIX */
886
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000887#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000888 case AF_INET6:
889 {
890 struct sockaddr_in6 *a;
891 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
892 PyObject *ret = NULL;
893 if (addrobj) {
894 a = (struct sockaddr_in6 *)addr;
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000895 ret = Py_BuildValue("Oiii",
896 addrobj,
897 ntohs(a->sin6_port),
898 a->sin6_flowinfo,
899 a->sin6_scope_id);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000900 Py_DECREF(addrobj);
901 }
902 return ret;
903 }
Jeremy Hylton22308652001-02-02 03:23:09 +0000904#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +0000905
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +0000906#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +0000907 case AF_PACKET:
908 {
909 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
910 char *ifname = "";
911 struct ifreq ifr;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000912 /* need to look up interface name give index */
913 if (a->sll_ifindex) {
Jeremy Hylton22308652001-02-02 03:23:09 +0000914 ifr.ifr_ifindex = a->sll_ifindex;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000915 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
Jeremy Hylton22308652001-02-02 03:23:09 +0000916 ifname = ifr.ifr_name;
Jeremy Hylton22308652001-02-02 03:23:09 +0000917 }
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000918 return Py_BuildValue("shbhs#",
919 ifname,
920 ntohs(a->sll_protocol),
921 a->sll_pkttype,
922 a->sll_hatype,
923 a->sll_addr,
924 a->sll_halen);
Jeremy Hylton22308652001-02-02 03:23:09 +0000925 }
926#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000927
Guido van Rossum30a685f1991-06-27 15:51:29 +0000928 /* More cases here... */
929
930 default:
Guido van Rossumaa948df1997-05-07 17:41:48 +0000931 /* If we don't know the address family, don't raise an
932 exception -- return it as a tuple. */
933 return Py_BuildValue("is#",
934 addr->sa_family,
935 addr->sa_data,
936 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000937
Guido van Rossum30a685f1991-06-27 15:51:29 +0000938 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000939}
940
Guido van Rossum30a685f1991-06-27 15:51:29 +0000941
942/* Parse a socket address argument according to the socket object's
943 address family. Return 1 if the address was in the proper format,
944 0 of not. The address is returned through addr_ret, its length
945 through len_ret. */
946
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000947static int
Guido van Rossum48a680c2001-03-02 06:34:14 +0000948getsockaddrarg(PySocketSockObject *s, PyObject *args,
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000949 struct sockaddr **addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000950{
Guido van Rossum30a685f1991-06-27 15:51:29 +0000951 switch (s->sock_family) {
952
Andrew MacIntyre34d3e2d2003-01-02 12:45:34 +0000953#if defined(AF_UNIX) && !defined(PYOS_OS2)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000954 case AF_UNIX:
955 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000956 struct sockaddr_un* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000957 char *path;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000958 int len;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000959 addr = (struct sockaddr_un*)&(s->sock_addr).un;
Guido van Rossum7e488981998-10-08 02:25:24 +0000960 if (!PyArg_Parse(args, "t#", &path, &len))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000961 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000962 if (len > sizeof addr->sun_path) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000963 PyErr_SetString(socket_error,
Barry Warsaw752300b1997-01-03 17:18:10 +0000964 "AF_UNIX path too long");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000965 return 0;
966 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000967 addr->sun_family = s->sock_family;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000968 memcpy(addr->sun_path, path, len);
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000969 addr->sun_path[len] = 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000970 *addr_ret = (struct sockaddr *) addr;
Guido van Rossum65af28a1996-06-11 18:36:33 +0000971 *len_ret = len + sizeof(*addr) - sizeof(addr->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000972 return 1;
973 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000974#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000975
Guido van Rossum30a685f1991-06-27 15:51:29 +0000976 case AF_INET:
977 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000978 struct sockaddr_in* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000979 char *host;
Martin v. Löwis5db099a2003-08-07 11:55:15 +0000980 int port, result;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000981 addr=(struct sockaddr_in*)&(s->sock_addr).in;
Guido van Rossume4dad902000-12-01 13:13:11 +0000982 if (!PyTuple_Check(args)) {
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000983 PyErr_Format(
984 PyExc_TypeError,
985 "getsockaddrarg: "
986 "AF_INET address must be tuple, not %.500s",
987 args->ob_type->tp_name);
Guido van Rossume4dad902000-12-01 13:13:11 +0000988 return 0;
989 }
Martin v. Löwis2548c732003-04-18 10:39:54 +0000990 if (!PyArg_ParseTuple(args, "eti:getsockaddrarg",
991 "idna", &host, &port))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000992 return 0;
Martin v. Löwis5db099a2003-08-07 11:55:15 +0000993 result = setipaddr(host, (struct sockaddr *)addr,
994 sizeof(*addr), AF_INET);
995 PyMem_Free(host);
996 if (result < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000997 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000998 addr->sin_family = AF_INET;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000999 addr->sin_port = htons((short)port);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001000 *addr_ret = (struct sockaddr *) addr;
1001 *len_ret = sizeof *addr;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001002 return 1;
1003 }
1004
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001005#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001006 case AF_INET6:
1007 {
1008 struct sockaddr_in6* addr;
1009 char *host;
Martin v. Löwis5db099a2003-08-07 11:55:15 +00001010 int port, flowinfo, scope_id, result;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001011 addr = (struct sockaddr_in6*)&(s->sock_addr).in6;
1012 flowinfo = scope_id = 0;
Martin v. Löwis2548c732003-04-18 10:39:54 +00001013 if (!PyArg_ParseTuple(args, "eti|ii",
1014 "idna", &host, &port, &flowinfo,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001015 &scope_id)) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001016 return 0;
1017 }
Martin v. Löwis5db099a2003-08-07 11:55:15 +00001018 result = setipaddr(host, (struct sockaddr *)addr,
1019 sizeof(*addr), AF_INET6);
1020 PyMem_Free(host);
1021 if (result < 0)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001022 return 0;
1023 addr->sin6_family = s->sock_family;
1024 addr->sin6_port = htons((short)port);
1025 addr->sin6_flowinfo = flowinfo;
1026 addr->sin6_scope_id = scope_id;
1027 *addr_ret = (struct sockaddr *) addr;
1028 *len_ret = sizeof *addr;
1029 return 1;
1030 }
1031#endif
1032
Hye-Shik Chang81268602004-02-02 06:05:24 +00001033#ifdef USE_BLUETOOTH
Martin v. Löwis12af0482004-01-31 12:34:17 +00001034 case AF_BLUETOOTH:
1035 {
1036 switch( s->sock_proto )
1037 {
1038 case BTPROTO_L2CAP:
1039 {
Hye-Shik Chang81268602004-02-02 06:05:24 +00001040 struct sockaddr_l2* addr = (struct sockaddr_l2*)_BT_SOCKADDR_MEMB(s, l2);
1041 bdaddr_t* bdaddr = &_BT_L2_MEMB(addr, bdaddr);
Martin v. Löwis12af0482004-01-31 12:34:17 +00001042
Hye-Shik Chang81268602004-02-02 06:05:24 +00001043 _BT_L2_MEMB(addr, family) = AF_BLUETOOTH;
1044 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 +00001045 {
1046 PyErr_SetString(socket_error, "getsockaddrarg: wrong format");
1047 return 0;
1048 }
1049
1050 *addr_ret = (struct sockaddr *) addr;
1051 *len_ret = sizeof *addr;
1052 return 1;
1053 }
1054 case BTPROTO_RFCOMM:
1055 {
Hye-Shik Chang81268602004-02-02 06:05:24 +00001056 struct sockaddr_rc* addr = (struct sockaddr_rc*)_BT_SOCKADDR_MEMB(s, rc);
1057 bdaddr_t* bdaddr = &_BT_RC_MEMB(addr, bdaddr);
Martin v. Löwis12af0482004-01-31 12:34:17 +00001058
Hye-Shik Chang81268602004-02-02 06:05:24 +00001059 _BT_RC_MEMB(addr, family) = AF_BLUETOOTH;
1060 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 +00001061 {
1062 PyErr_SetString(socket_error, "getsockaddrarg: wrong format");
1063 return 0;
1064 }
1065
1066 *addr_ret = (struct sockaddr *) addr;
1067 *len_ret = sizeof *addr;
1068 return 1;
1069 }
Hye-Shik Chang81268602004-02-02 06:05:24 +00001070#if !defined(__FreeBSD__)
Martin v. Löwis12af0482004-01-31 12:34:17 +00001071 case BTPROTO_SCO:
1072 {
Hye-Shik Chang81268602004-02-02 06:05:24 +00001073 struct sockaddr_sco* addr = (struct sockaddr_sco*)_BT_SOCKADDR_MEMB(s, sco);
1074 bdaddr_t* bdaddr = &_BT_SCO_MEMB(addr, bdaddr);
Martin v. Löwis12af0482004-01-31 12:34:17 +00001075
Hye-Shik Chang81268602004-02-02 06:05:24 +00001076 _BT_SCO_MEMB(addr, family) = AF_BLUETOOTH;
Martin v. Löwis12af0482004-01-31 12:34:17 +00001077 if( !PyArg_ParseTuple(args, "iiiiii", &bdaddr->b[0], &bdaddr->b[1], &bdaddr->b[2], &bdaddr->b[3], &bdaddr->b[4], &bdaddr->b[5]) )
1078 {
1079 PyErr_SetString(socket_error, "getsockaddrarg: wrong format");
1080 return 0;
1081 }
1082
1083 *addr_ret = (struct sockaddr *) addr;
1084 *len_ret = sizeof *addr;
1085 return 1;
1086 }
Hye-Shik Chang81268602004-02-02 06:05:24 +00001087#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00001088 default:
1089 {
1090 PyErr_SetString(socket_error, "getsockaddrarg: unknown Bluetooth protocol");
1091 return 0;
1092 }
1093 }
1094 }
1095#endif
1096
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00001097#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +00001098 case AF_PACKET:
1099 {
1100 struct sockaddr_ll* addr;
1101 struct ifreq ifr;
1102 char *interfaceName;
1103 int protoNumber;
1104 int hatype = 0;
1105 int pkttype = 0;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001106 char *haddr;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001107
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001108 if (!PyArg_ParseTuple(args, "si|iis", &interfaceName,
1109 &protoNumber, &pkttype, &hatype, &haddr))
Jeremy Hylton22308652001-02-02 03:23:09 +00001110 return 0;
1111 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
1112 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001113 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001114 s->errorhandler();
Jeremy Hylton22308652001-02-02 03:23:09 +00001115 return 0;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001116 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001117 addr = &(s->sock_addr.ll);
1118 addr->sll_family = AF_PACKET;
1119 addr->sll_protocol = htons((short)protoNumber);
1120 addr->sll_ifindex = ifr.ifr_ifindex;
1121 addr->sll_pkttype = pkttype;
1122 addr->sll_hatype = hatype;
1123 *addr_ret = (struct sockaddr *) addr;
1124 *len_ret = sizeof *addr;
1125 return 1;
1126 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00001127#endif
1128
Guido van Rossum30a685f1991-06-27 15:51:29 +00001129 /* More cases here... */
1130
1131 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001132 PyErr_SetString(socket_error, "getsockaddrarg: bad family");
Guido van Rossum30a685f1991-06-27 15:51:29 +00001133 return 0;
1134
1135 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001136}
1137
Guido van Rossum30a685f1991-06-27 15:51:29 +00001138
Guido van Rossum48a680c2001-03-02 06:34:14 +00001139/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +00001140 Return 1 if the family is known, 0 otherwise. The length is returned
1141 through len_ret. */
1142
1143static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +00001144getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +00001145{
1146 switch (s->sock_family) {
1147
Andrew MacIntyre34d3e2d2003-01-02 12:45:34 +00001148#if defined(AF_UNIX) && !defined(PYOS_OS2)
Guido van Rossum710e1df1992-06-12 10:39:36 +00001149 case AF_UNIX:
1150 {
1151 *len_ret = sizeof (struct sockaddr_un);
1152 return 1;
1153 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001154#endif /* AF_UNIX */
Guido van Rossum710e1df1992-06-12 10:39:36 +00001155
1156 case AF_INET:
1157 {
1158 *len_ret = sizeof (struct sockaddr_in);
1159 return 1;
1160 }
1161
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001162#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001163 case AF_INET6:
1164 {
1165 *len_ret = sizeof (struct sockaddr_in6);
1166 return 1;
1167 }
1168#endif
1169
Hye-Shik Chang81268602004-02-02 06:05:24 +00001170#ifdef USE_BLUETOOTH
Martin v. Löwis12af0482004-01-31 12:34:17 +00001171 case AF_BLUETOOTH:
1172 {
1173 switch(s->sock_proto)
1174 {
1175 case BTPROTO_L2CAP:
1176 {
1177 *len_ret = sizeof (struct sockaddr_l2);
1178 return 1;
1179 }
1180 case BTPROTO_RFCOMM:
1181 {
1182 *len_ret = sizeof (struct sockaddr_rc);
1183 return 1;
1184 }
Hye-Shik Chang81268602004-02-02 06:05:24 +00001185#if !defined(__FreeBSD__)
Martin v. Löwis12af0482004-01-31 12:34:17 +00001186 case BTPROTO_SCO:
1187 {
1188 *len_ret = sizeof (struct sockaddr_sco);
1189 return 1;
1190 }
Hye-Shik Chang81268602004-02-02 06:05:24 +00001191#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00001192 default:
1193 {
1194 PyErr_SetString(socket_error, "getsockaddrlen: unknown BT protocol");
1195 return 0;
1196 }
1197 }
1198 }
1199#endif
1200
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00001201#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +00001202 case AF_PACKET:
1203 {
1204 *len_ret = sizeof (struct sockaddr_ll);
1205 return 1;
1206 }
1207#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001208
Guido van Rossum710e1df1992-06-12 10:39:36 +00001209 /* More cases here... */
1210
1211 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001212 PyErr_SetString(socket_error, "getsockaddrlen: bad family");
Guido van Rossum710e1df1992-06-12 10:39:36 +00001213 return 0;
1214
1215 }
1216}
1217
1218
Guido van Rossum30a685f1991-06-27 15:51:29 +00001219/* s.accept() method */
1220
Guido van Rossum73624e91994-10-10 17:59:00 +00001221static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001222sock_accept(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001223{
1224 char addrbuf[256];
Fred Drakea04eaad2000-06-30 02:46:07 +00001225 SOCKET_T newfd;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001226 socklen_t addrlen;
Barry Warsaw752300b1997-01-03 17:18:10 +00001227 PyObject *sock = NULL;
1228 PyObject *addr = NULL;
1229 PyObject *res = NULL;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001230 int timeout;
Barry Warsaw752300b1997-01-03 17:18:10 +00001231
Guido van Rossum710e1df1992-06-12 10:39:36 +00001232 if (!getsockaddrlen(s, &addrlen))
1233 return NULL;
Fred Drakefd168342001-05-09 19:11:33 +00001234 memset(addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001235
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001236#ifdef MS_WINDOWS
1237 newfd = INVALID_SOCKET;
1238#else
1239 newfd = -1;
1240#endif
1241
Guido van Rossum73624e91994-10-10 17:59:00 +00001242 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001243 timeout = internal_select(s, 0);
1244 if (!timeout)
1245 newfd = accept(s->sock_fd, (struct sockaddr *) addrbuf,
1246 &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001247 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001248
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001249 if (timeout) {
1250 PyErr_SetString(socket_timeout, "timed out");
1251 return NULL;
1252 }
1253
Fred Drakea04eaad2000-06-30 02:46:07 +00001254#ifdef MS_WINDOWS
1255 if (newfd == INVALID_SOCKET)
1256#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001257 if (newfd < 0)
Fred Drakea04eaad2000-06-30 02:46:07 +00001258#endif
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001259 return s->errorhandler();
Barry Warsaw752300b1997-01-03 17:18:10 +00001260
Guido van Rossum30a685f1991-06-27 15:51:29 +00001261 /* Create the new object with unspecified family,
1262 to avoid calls to bind() etc. on it. */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001263 sock = (PyObject *) new_sockobject(newfd,
1264 s->sock_family,
1265 s->sock_type,
1266 s->sock_proto);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001267
Barry Warsaw752300b1997-01-03 17:18:10 +00001268 if (sock == NULL) {
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001269 SOCKETCLOSE(newfd);
Barry Warsaw752300b1997-01-03 17:18:10 +00001270 goto finally;
1271 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00001272 addr = makesockaddr(s->sock_fd, (struct sockaddr *)addrbuf,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001273 addrlen);
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001274 if (addr == NULL)
Barry Warsaw752300b1997-01-03 17:18:10 +00001275 goto finally;
1276
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001277 res = PyTuple_Pack(2, sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00001278
Guido van Rossum67f7a382002-06-06 21:08:16 +00001279finally:
Guido van Rossum73624e91994-10-10 17:59:00 +00001280 Py_XDECREF(sock);
1281 Py_XDECREF(addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001282 return res;
1283}
1284
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001285PyDoc_STRVAR(accept_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001286"accept() -> (socket object, address info)\n\
1287\n\
1288Wait for an incoming connection. Return a new socket representing the\n\
1289connection, and the address of the client. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001290info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001291
Guido van Rossum11ba0942002-06-13 15:07:44 +00001292/* s.setblocking(flag) method. Argument:
1293 False -- non-blocking mode; same as settimeout(0)
1294 True -- blocking mode; same as settimeout(None)
1295*/
Guido van Rossume4485b01994-09-07 14:32:49 +00001296
Guido van Rossum73624e91994-10-10 17:59:00 +00001297static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001298sock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00001299{
1300 int block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001301
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001302 block = PyInt_AsLong(arg);
1303 if (block == -1 && PyErr_Occurred())
Guido van Rossume4485b01994-09-07 14:32:49 +00001304 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001305
Guido van Rossum11ba0942002-06-13 15:07:44 +00001306 s->sock_timeout = block ? -1.0 : 0.0;
Guido van Rossume8008f02002-06-07 03:36:20 +00001307 internal_setblocking(s, block);
Guido van Rossume4485b01994-09-07 14:32:49 +00001308
Guido van Rossum73624e91994-10-10 17:59:00 +00001309 Py_INCREF(Py_None);
1310 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +00001311}
Guido van Rossume4485b01994-09-07 14:32:49 +00001312
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001313PyDoc_STRVAR(setblocking_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001314"setblocking(flag)\n\
1315\n\
1316Set the socket to blocking (flag is true) or non-blocking (false).\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00001317setblocking(True) is equivalent to settimeout(None);\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001318setblocking(False) is equivalent to settimeout(0.0).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001319
Guido van Rossum11ba0942002-06-13 15:07:44 +00001320/* s.settimeout(timeout) method. Argument:
1321 None -- no timeout, blocking mode; same as setblocking(True)
1322 0.0 -- non-blocking mode; same as setblocking(False)
1323 > 0 -- timeout mode; operations time out after timeout seconds
1324 < 0 -- illegal; raises an exception
1325*/
Guido van Rossum67f7a382002-06-06 21:08:16 +00001326static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001327sock_settimeout(PySocketSockObject *s, PyObject *arg)
Guido van Rossum67f7a382002-06-06 21:08:16 +00001328{
Guido van Rossum11ba0942002-06-13 15:07:44 +00001329 double timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001330
1331 if (arg == Py_None)
Guido van Rossum11ba0942002-06-13 15:07:44 +00001332 timeout = -1.0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001333 else {
Guido van Rossum11ba0942002-06-13 15:07:44 +00001334 timeout = PyFloat_AsDouble(arg);
1335 if (timeout < 0.0) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00001336 if (!PyErr_Occurred())
1337 PyErr_SetString(PyExc_ValueError,
Guido van Rossum11ba0942002-06-13 15:07:44 +00001338 "Timeout value out of range");
Guido van Rossum67f7a382002-06-06 21:08:16 +00001339 return NULL;
1340 }
1341 }
1342
Guido van Rossum11ba0942002-06-13 15:07:44 +00001343 s->sock_timeout = timeout;
1344 internal_setblocking(s, timeout < 0.0);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001345
1346 Py_INCREF(Py_None);
1347 return Py_None;
1348}
1349
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001350PyDoc_STRVAR(settimeout_doc,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001351"settimeout(timeout)\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00001352\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00001353Set a timeout on socket operations. 'timeout' can be a float,\n\
1354giving in seconds, or None. Setting a timeout of None disables\n\
1355the timeout feature and is equivalent to setblocking(1).\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001356Setting a timeout of zero is the same as setblocking(0).");
Guido van Rossum67f7a382002-06-06 21:08:16 +00001357
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001358/* s.gettimeout() method.
1359 Returns the timeout associated with a socket. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00001360static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001361sock_gettimeout(PySocketSockObject *s)
Guido van Rossum67f7a382002-06-06 21:08:16 +00001362{
1363 if (s->sock_timeout < 0.0) {
1364 Py_INCREF(Py_None);
1365 return Py_None;
1366 }
1367 else
1368 return PyFloat_FromDouble(s->sock_timeout);
1369}
1370
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001371PyDoc_STRVAR(gettimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00001372"gettimeout() -> timeout\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00001373\n\
1374Returns the timeout in floating seconds associated with socket \n\
1375operations. A timeout of None indicates that timeouts on socket \n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001376operations are disabled.");
Guido van Rossume4485b01994-09-07 14:32:49 +00001377
Guido van Rossum48a680c2001-03-02 06:34:14 +00001378#ifdef RISCOS
1379/* s.sleeptaskw(1 | 0) method */
1380
1381static PyObject *
Martin v. Löwisa94568a2003-05-10 07:36:56 +00001382sock_sleeptaskw(PySocketSockObject *s,PyObject *arg)
Guido van Rossum48a680c2001-03-02 06:34:14 +00001383{
Guido van Rossum67f7a382002-06-06 21:08:16 +00001384 int block;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00001385 block = PyInt_AsLong(arg);
1386 if (block == -1 && PyErr_Occurred())
Guido van Rossum67f7a382002-06-06 21:08:16 +00001387 return NULL;
1388 Py_BEGIN_ALLOW_THREADS
1389 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
1390 Py_END_ALLOW_THREADS
Guido van Rossum48a680c2001-03-02 06:34:14 +00001391
Guido van Rossum67f7a382002-06-06 21:08:16 +00001392 Py_INCREF(Py_None);
1393 return Py_None;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001394}
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001395PyDoc_STRVAR(sleeptaskw_doc,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001396"sleeptaskw(flag)\n\
1397\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001398Allow sleeps in taskwindows.");
Guido van Rossum48a680c2001-03-02 06:34:14 +00001399#endif
1400
1401
Guido van Rossumaee08791992-09-08 09:05:33 +00001402/* s.setsockopt() method.
1403 With an integer third argument, sets an integer option.
1404 With a string third argument, sets an option from a buffer;
1405 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001406
Guido van Rossum73624e91994-10-10 17:59:00 +00001407static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001408sock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001409{
1410 int level;
1411 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001412 int res;
Guido van Rossumaee08791992-09-08 09:05:33 +00001413 char *buf;
1414 int buflen;
1415 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001416
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001417 if (PyArg_ParseTuple(args, "iii:setsockopt",
1418 &level, &optname, &flag)) {
Guido van Rossumaee08791992-09-08 09:05:33 +00001419 buf = (char *) &flag;
1420 buflen = sizeof flag;
1421 }
1422 else {
Guido van Rossum73624e91994-10-10 17:59:00 +00001423 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001424 if (!PyArg_ParseTuple(args, "iis#:setsockopt",
1425 &level, &optname, &buf, &buflen))
Guido van Rossumaee08791992-09-08 09:05:33 +00001426 return NULL;
1427 }
Thomas Wouters334fb892000-07-25 12:56:38 +00001428 res = setsockopt(s->sock_fd, level, optname, (void *)buf, buflen);
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001429 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001430 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001431 Py_INCREF(Py_None);
1432 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001433}
1434
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001435PyDoc_STRVAR(setsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001436"setsockopt(level, option, value)\n\
1437\n\
1438Set a socket option. See the Unix manual for level and option.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001439The value argument can either be an integer or a string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001440
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001441
Guido van Rossumaee08791992-09-08 09:05:33 +00001442/* s.getsockopt() method.
1443 With two arguments, retrieves an integer option.
1444 With a third integer argument, retrieves a string buffer of that size;
1445 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001446
Guido van Rossum73624e91994-10-10 17:59:00 +00001447static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001448sock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001449{
1450 int level;
1451 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001452 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +00001453 PyObject *buf;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001454 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001455
Guido van Rossumbcc20741998-08-04 22:53:56 +00001456#ifdef __BEOS__
Fred Drake564a6cc2001-05-11 20:12:26 +00001457 /* We have incomplete socket support. */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001458 PyErr_SetString(socket_error, "getsockopt not supported");
Guido van Rossumbcc20741998-08-04 22:53:56 +00001459 return NULL;
1460#else
1461
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001462 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
1463 &level, &optname, &buflen))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001464 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001465
Guido van Rossumbe32c891996-06-20 16:25:29 +00001466 if (buflen == 0) {
Guido van Rossumaee08791992-09-08 09:05:33 +00001467 int flag = 0;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001468 socklen_t flagsize = sizeof flag;
Guido van Rossumb376a4a1993-11-23 17:53:17 +00001469 res = getsockopt(s->sock_fd, level, optname,
Thomas Wouters334fb892000-07-25 12:56:38 +00001470 (void *)&flag, &flagsize);
Guido van Rossumaee08791992-09-08 09:05:33 +00001471 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001472 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001473 return PyInt_FromLong(flag);
Guido van Rossumaee08791992-09-08 09:05:33 +00001474 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001475#ifdef __VMS
1476 if (buflen > 1024) {
1477#else
Guido van Rossumaee08791992-09-08 09:05:33 +00001478 if (buflen <= 0 || buflen > 1024) {
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001479#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001480 PyErr_SetString(socket_error,
Barry Warsaw752300b1997-01-03 17:18:10 +00001481 "getsockopt buflen out of range");
Guido van Rossumaee08791992-09-08 09:05:33 +00001482 return NULL;
1483 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001484 buf = PyString_FromStringAndSize((char *)NULL, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001485 if (buf == NULL)
1486 return NULL;
Guido van Rossumb376a4a1993-11-23 17:53:17 +00001487 res = getsockopt(s->sock_fd, level, optname,
Fred Drake564a6cc2001-05-11 20:12:26 +00001488 (void *)PyString_AS_STRING(buf), &buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001489 if (res < 0) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001490 Py_DECREF(buf);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001491 return s->errorhandler();
Guido van Rossumaee08791992-09-08 09:05:33 +00001492 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001493 _PyString_Resize(&buf, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001494 return buf;
Guido van Rossumbcc20741998-08-04 22:53:56 +00001495#endif /* __BEOS__ */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001496}
1497
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001498PyDoc_STRVAR(getsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001499"getsockopt(level, option[, buffersize]) -> value\n\
1500\n\
1501Get a socket option. See the Unix manual for level and option.\n\
1502If a nonzero buffersize argument is given, the return value is a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001503string of that length; otherwise it is an integer.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001504
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001505
Fred Drake728819a2000-07-01 03:40:12 +00001506/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001507
Guido van Rossum73624e91994-10-10 17:59:00 +00001508static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001509sock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001510{
1511 struct sockaddr *addr;
1512 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001513 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001514
Fred Drake728819a2000-07-01 03:40:12 +00001515 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001516 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001517 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001518 res = bind(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001519 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001520 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001521 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001522 Py_INCREF(Py_None);
1523 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001524}
1525
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001526PyDoc_STRVAR(bind_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001527"bind(address)\n\
1528\n\
1529Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00001530pair (host, port); the host must refer to the local host. For raw packet\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001531sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001532
Guido van Rossum30a685f1991-06-27 15:51:29 +00001533
1534/* s.close() method.
1535 Set the file descriptor to -1 so operations tried subsequently
1536 will surely fail. */
1537
Guido van Rossum73624e91994-10-10 17:59:00 +00001538static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001539sock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001540{
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001541 SOCKET_T fd;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001542
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001543 if ((fd = s->sock_fd) != -1) {
1544 s->sock_fd = -1;
Guido van Rossum08481461996-10-12 14:07:22 +00001545 Py_BEGIN_ALLOW_THREADS
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001546 (void) SOCKETCLOSE(fd);
Guido van Rossum08481461996-10-12 14:07:22 +00001547 Py_END_ALLOW_THREADS
1548 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001549 Py_INCREF(Py_None);
1550 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001551}
1552
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001553PyDoc_STRVAR(close_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001554"close()\n\
1555\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001556Close the socket. It cannot be used after this call.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001557
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001558static int
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001559internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen,
1560 int *timeoutp)
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001561{
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001562 int res, timeout;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001563
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001564 timeout = 0;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001565 res = connect(s->sock_fd, addr, addrlen);
1566
1567#ifdef MS_WINDOWS
1568
1569 if (s->sock_timeout > 0.0) {
1570 if (res < 0 && WSAGetLastError() == WSAEWOULDBLOCK) {
Guido van Rossumb76bdf82003-02-19 17:50:16 +00001571 /* This is a mess. Best solution: trust select */
1572 fd_set fds;
1573 struct timeval tv;
1574 tv.tv_sec = (int)s->sock_timeout;
1575 tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6);
1576 FD_ZERO(&fds);
1577 FD_SET(s->sock_fd, &fds);
1578 res = select(s->sock_fd+1, NULL, &fds, NULL, &tv);
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001579 if (res == 0) {
Guido van Rossumb76bdf82003-02-19 17:50:16 +00001580 res = WSAEWOULDBLOCK;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001581 timeout = 1;
1582 } else if (res > 0)
Guido van Rossumb76bdf82003-02-19 17:50:16 +00001583 res = 0;
1584 /* else if (res < 0) an error occurred */
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001585 }
1586 }
1587
1588 if (res < 0)
1589 res = WSAGetLastError();
1590
1591#else
1592
1593 if (s->sock_timeout > 0.0) {
1594 if (res < 0 && errno == EINPROGRESS) {
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001595 timeout = internal_select(s, 1);
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001596 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum12e3c712002-08-08 20:39:30 +00001597 if (res < 0 && errno == EISCONN)
1598 res = 0;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001599 }
1600 }
1601
1602 if (res < 0)
1603 res = errno;
1604
1605#endif
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001606 *timeoutp = timeout;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001607
1608 return res;
1609}
Guido van Rossum30a685f1991-06-27 15:51:29 +00001610
Fred Drake728819a2000-07-01 03:40:12 +00001611/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001612
Guido van Rossum73624e91994-10-10 17:59:00 +00001613static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001614sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001615{
1616 struct sockaddr *addr;
1617 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001618 int res;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001619 int timeout;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001620
Fred Drake728819a2000-07-01 03:40:12 +00001621 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001622 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001623
Guido van Rossum73624e91994-10-10 17:59:00 +00001624 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001625 res = internal_connect(s, addr, addrlen, &timeout);
Guido van Rossum11ba0942002-06-13 15:07:44 +00001626 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001627
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001628 if (timeout) {
1629 PyErr_SetString(socket_timeout, "timed out");
1630 return NULL;
1631 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001632 if (res != 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001633 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001634 Py_INCREF(Py_None);
1635 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001636}
1637
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001638PyDoc_STRVAR(connect_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001639"connect(address)\n\
1640\n\
1641Connect the socket to a remote address. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001642is a pair (host, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001643
Guido van Rossum30a685f1991-06-27 15:51:29 +00001644
Fred Drake728819a2000-07-01 03:40:12 +00001645/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001646
1647static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001648sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001649{
1650 struct sockaddr *addr;
1651 int addrlen;
1652 int res;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001653 int timeout;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001654
Fred Drake728819a2000-07-01 03:40:12 +00001655 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001656 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001657
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001658 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001659 res = internal_connect(s, addr, addrlen, &timeout);
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001660 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001661
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001662 return PyInt_FromLong((long) res);
1663}
1664
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001665PyDoc_STRVAR(connect_ex_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00001666"connect_ex(address) -> errno\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00001667\n\
1668This is like connect(address), but returns an error code (the errno value)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001669instead of raising an exception when an error occurs.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001670
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001671
Guido van Rossumed233a51992-06-23 09:07:03 +00001672/* s.fileno() method */
1673
Guido van Rossum73624e91994-10-10 17:59:00 +00001674static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001675sock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00001676{
Fred Drakea04eaad2000-06-30 02:46:07 +00001677#if SIZEOF_SOCKET_T <= SIZEOF_LONG
Guido van Rossum73624e91994-10-10 17:59:00 +00001678 return PyInt_FromLong((long) s->sock_fd);
Fred Drakea04eaad2000-06-30 02:46:07 +00001679#else
Martin v. Löwisb9a0f912003-03-29 10:06:18 +00001680 return PyLong_FromLongLong((PY_LONG_LONG)s->sock_fd);
Fred Drakea04eaad2000-06-30 02:46:07 +00001681#endif
Guido van Rossumed233a51992-06-23 09:07:03 +00001682}
1683
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001684PyDoc_STRVAR(fileno_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001685"fileno() -> integer\n\
1686\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001687Return the integer file descriptor of the socket.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001688
Guido van Rossumed233a51992-06-23 09:07:03 +00001689
Guido van Rossumbe32c891996-06-20 16:25:29 +00001690#ifndef NO_DUP
1691/* s.dup() method */
1692
1693static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001694sock_dup(PySocketSockObject *s)
Guido van Rossumbe32c891996-06-20 16:25:29 +00001695{
Fred Drakea04eaad2000-06-30 02:46:07 +00001696 SOCKET_T newfd;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001697 PyObject *sock;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001698
Guido van Rossumbe32c891996-06-20 16:25:29 +00001699 newfd = dup(s->sock_fd);
1700 if (newfd < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001701 return s->errorhandler();
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001702 sock = (PyObject *) new_sockobject(newfd,
1703 s->sock_family,
1704 s->sock_type,
1705 s->sock_proto);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001706 if (sock == NULL)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001707 SOCKETCLOSE(newfd);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001708 return sock;
1709}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001710
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001711PyDoc_STRVAR(dup_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001712"dup() -> socket object\n\
1713\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001714Return a new socket object connected to the same system resource.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001715
Guido van Rossumbe32c891996-06-20 16:25:29 +00001716#endif
1717
1718
Guido van Rossumc89705d1992-11-26 08:54:07 +00001719/* s.getsockname() method */
1720
Guido van Rossum73624e91994-10-10 17:59:00 +00001721static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001722sock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001723{
1724 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001725 int res;
1726 socklen_t addrlen;
1727
Guido van Rossumc89705d1992-11-26 08:54:07 +00001728 if (!getsockaddrlen(s, &addrlen))
1729 return NULL;
Guido van Rossumca42b161996-01-12 01:36:05 +00001730 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001731 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001732 res = getsockname(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001733 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001734 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001735 return s->errorhandler();
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001736 return makesockaddr(s->sock_fd, (struct sockaddr *) addrbuf, addrlen);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001737}
1738
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001739PyDoc_STRVAR(getsockname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001740"getsockname() -> address info\n\
1741\n\
1742Return the address of the local endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001743info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001744
Guido van Rossumc89705d1992-11-26 08:54:07 +00001745
Guido van Rossumb6775db1994-08-01 11:34:53 +00001746#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001747/* s.getpeername() method */
1748
Guido van Rossum73624e91994-10-10 17:59:00 +00001749static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001750sock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001751{
1752 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001753 int res;
1754 socklen_t addrlen;
1755
Guido van Rossumc89705d1992-11-26 08:54:07 +00001756 if (!getsockaddrlen(s, &addrlen))
1757 return NULL;
Fred Drakefd168342001-05-09 19:11:33 +00001758 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001759 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001760 res = getpeername(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001761 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001762 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001763 return s->errorhandler();
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001764 return makesockaddr(s->sock_fd, (struct sockaddr *) addrbuf, addrlen);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001765}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001766
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001767PyDoc_STRVAR(getpeername_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001768"getpeername() -> address info\n\
1769\n\
1770Return the address of the remote endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001771info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001772
Guido van Rossumb6775db1994-08-01 11:34:53 +00001773#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001774
1775
Guido van Rossum30a685f1991-06-27 15:51:29 +00001776/* s.listen(n) method */
1777
Guido van Rossum73624e91994-10-10 17:59:00 +00001778static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001779sock_listen(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001780{
1781 int backlog;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001782 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001783
1784 backlog = PyInt_AsLong(arg);
1785 if (backlog == -1 && PyErr_Occurred())
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001786 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001787 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +00001788 if (backlog < 1)
1789 backlog = 1;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001790 res = listen(s->sock_fd, backlog);
Guido van Rossum73624e91994-10-10 17:59:00 +00001791 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001792 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001793 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001794 Py_INCREF(Py_None);
1795 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001796}
1797
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001798PyDoc_STRVAR(listen_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001799"listen(backlog)\n\
1800\n\
1801Enable a server to accept connections. The backlog argument must be at\n\
1802least 1; it specifies the number of unaccepted connection that the system\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001803will allow before refusing new connections.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001804
1805
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001806#ifndef NO_DUP
Guido van Rossum30a685f1991-06-27 15:51:29 +00001807/* s.makefile(mode) method.
1808 Create a new open file object referring to a dupped version of
1809 the socket's file descriptor. (The dup() call is necessary so
1810 that the open file and socket objects may be closed independent
1811 of each other.)
1812 The mode argument specifies 'r' or 'w' passed to fdopen(). */
1813
Guido van Rossum73624e91994-10-10 17:59:00 +00001814static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001815sock_makefile(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001816{
Tim Petersdbd9ba62000-07-09 03:09:57 +00001817 extern int fclose(FILE *);
Guido van Rossum6b144911995-03-14 15:05:13 +00001818 char *mode = "r";
1819 int bufsize = -1;
Fred Drakea04eaad2000-06-30 02:46:07 +00001820#ifdef MS_WIN32
Tim Peters79248aa2001-08-29 21:37:10 +00001821 Py_intptr_t fd;
Fred Drakea04eaad2000-06-30 02:46:07 +00001822#else
Guido van Rossum30a685f1991-06-27 15:51:29 +00001823 int fd;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001824#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001825 FILE *fp;
Guido van Rossum6b144911995-03-14 15:05:13 +00001826 PyObject *f;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001827#ifdef __VMS
1828 char *mode_r = "r";
1829 char *mode_w = "w";
1830#endif
Guido van Rossum6b144911995-03-14 15:05:13 +00001831
Guido van Rossum43713e52000-02-29 13:59:29 +00001832 if (!PyArg_ParseTuple(args, "|si:makefile", &mode, &bufsize))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001833 return NULL;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001834#ifdef __VMS
1835 if (strcmp(mode,"rb") == 0) {
1836 mode = mode_r;
1837 }
1838 else {
1839 if (strcmp(mode,"wb") == 0) {
1840 mode = mode_w;
1841 }
1842 }
1843#endif
Guido van Rossum8d665e61996-06-26 18:22:49 +00001844#ifdef MS_WIN32
Guido van Rossum82a5c661998-07-07 20:45:43 +00001845 if (((fd = _open_osfhandle(s->sock_fd, _O_BINARY)) < 0) ||
1846 ((fd = dup(fd)) < 0) || ((fp = fdopen(fd, mode)) == NULL))
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001847#else
Guido van Rossum82a5c661998-07-07 20:45:43 +00001848 if ((fd = dup(s->sock_fd)) < 0 || (fp = fdopen(fd, mode)) == NULL)
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001849#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001850 {
Guido van Rossum6b144911995-03-14 15:05:13 +00001851 if (fd >= 0)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001852 SOCKETCLOSE(fd);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001853 return s->errorhandler();
Guido van Rossum6b144911995-03-14 15:05:13 +00001854 }
1855 f = PyFile_FromFile(fp, "<socket>", mode, fclose);
1856 if (f != NULL)
1857 PyFile_SetBufSize(f, bufsize);
1858 return f;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001859}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001860
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001861PyDoc_STRVAR(makefile_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001862"makefile([mode[, buffersize]]) -> file object\n\
1863\n\
1864Return a regular file object corresponding to the socket.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001865The mode and buffersize arguments are as for the built-in open() function.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001866
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001867#endif /* NO_DUP */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001868
Guido van Rossum48a680c2001-03-02 06:34:14 +00001869
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001870/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001871
Guido van Rossum73624e91994-10-10 17:59:00 +00001872static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001873sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001874{
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001875 int len, n = 0, flags = 0, timeout;
Guido van Rossum73624e91994-10-10 17:59:00 +00001876 PyObject *buf;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001877#ifdef __VMS
1878 int read_length;
1879 char *read_buf;
1880#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00001881
Guido van Rossum43713e52000-02-29 13:59:29 +00001882 if (!PyArg_ParseTuple(args, "i|i:recv", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001883 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001884
1885 if (len < 0) {
Martin v. Löwisfba64e12001-11-19 10:41:26 +00001886 PyErr_SetString(PyExc_ValueError,
Guido van Rossum11ba0942002-06-13 15:07:44 +00001887 "negative buffersize in recv");
Martin v. Löwisfba64e12001-11-19 10:41:26 +00001888 return NULL;
1889 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00001890
Guido van Rossum73624e91994-10-10 17:59:00 +00001891 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001892 if (buf == NULL)
1893 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001894
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001895#ifndef __VMS
Guido van Rossum73624e91994-10-10 17:59:00 +00001896 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001897 timeout = internal_select(s, 0);
1898 if (!timeout)
1899 n = recv(s->sock_fd, PyString_AS_STRING(buf), len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001900 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001901
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001902 if (timeout) {
1903 Py_DECREF(buf);
1904 PyErr_SetString(socket_timeout, "timed out");
1905 return NULL;
1906 }
Guido van Rossum7c53b771995-09-13 18:39:47 +00001907 if (n < 0) {
1908 Py_DECREF(buf);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001909 return s->errorhandler();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001910 }
Tim Peters5de98422002-04-27 18:44:32 +00001911 if (n != len)
1912 _PyString_Resize(&buf, n);
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001913#else
1914 read_buf = PyString_AsString(buf);
1915 read_length = len;
1916 while (read_length != 0) {
1917 unsigned int segment;
1918
1919 segment = read_length /SEGMENT_SIZE;
1920 if (segment != 0) {
1921 segment = SEGMENT_SIZE;
1922 }
1923 else {
1924 segment = read_length;
1925 }
1926
1927 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001928 timeout = internal_select(s, 0);
1929 if (!timeout)
1930 n = recv(s->sock_fd, read_buf, segment, flags);
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001931 Py_END_ALLOW_THREADS
1932
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001933 if (timeout) {
1934 Py_DECREF(buf);
1935 PyErr_SetString(socket_timeout, "timed out");
1936 return NULL;
1937 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001938 if (n < 0) {
1939 Py_DECREF(buf);
1940 return s->errorhandler();
1941 }
1942 if (n != read_length) {
1943 read_buf += n;
1944 break;
1945 }
1946
1947 read_length -= segment;
1948 read_buf += segment;
1949 }
1950 if (_PyString_Resize(&buf, (read_buf - PyString_AsString(buf))) < 0)
1951 {
1952 return NULL;
1953 }
1954#endif /* !__VMS */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001955 return buf;
1956}
1957
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001958PyDoc_STRVAR(recv_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001959"recv(buffersize[, flags]) -> data\n\
1960\n\
1961Receive up to buffersize bytes from the socket. For the optional flags\n\
1962argument, see the Unix manual. When no data is available, block until\n\
1963at least one byte is available or until the remote end is closed. When\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001964the remote end is closed and all data is read, return the empty string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001965
Guido van Rossum30a685f1991-06-27 15:51:29 +00001966
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001967/* s.recvfrom(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001968
Guido van Rossum73624e91994-10-10 17:59:00 +00001969static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001970sock_recvfrom(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001971{
1972 char addrbuf[256];
Barry Warsaw752300b1997-01-03 17:18:10 +00001973 PyObject *buf = NULL;
1974 PyObject *addr = NULL;
1975 PyObject *ret = NULL;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001976 int len, n = 0, flags = 0, timeout;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001977 socklen_t addrlen;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001978
Guido van Rossum43713e52000-02-29 13:59:29 +00001979 if (!PyArg_ParseTuple(args, "i|i:recvfrom", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001980 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001981
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001982 if (!getsockaddrlen(s, &addrlen))
1983 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001984 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001985 if (buf == NULL)
1986 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001987
Guido van Rossum73624e91994-10-10 17:59:00 +00001988 Py_BEGIN_ALLOW_THREADS
Fred Drakefd168342001-05-09 19:11:33 +00001989 memset(addrbuf, 0, addrlen);
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001990 timeout = internal_select(s, 0);
1991 if (!timeout)
1992 n = recvfrom(s->sock_fd, PyString_AS_STRING(buf), len, flags,
Guido van Rossum8d665e61996-06-26 18:22:49 +00001993#ifndef MS_WINDOWS
Andrew MacIntyreba43e872002-03-03 03:03:52 +00001994#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001995 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001996#else
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001997 (void *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001998#endif
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001999#else
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002000 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002001#endif
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002002 );
Guido van Rossum73624e91994-10-10 17:59:00 +00002003 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002004
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002005 if (timeout) {
2006 Py_DECREF(buf);
2007 PyErr_SetString(socket_timeout, "timed out");
2008 return NULL;
2009 }
Guido van Rossum7c53b771995-09-13 18:39:47 +00002010 if (n < 0) {
2011 Py_DECREF(buf);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002012 return s->errorhandler();
Guido van Rossum7c53b771995-09-13 18:39:47 +00002013 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002014
Guido van Rossum53a9bf81996-06-11 18:35:24 +00002015 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002016 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002017
Guido van Rossum67f7a382002-06-06 21:08:16 +00002018 if (!(addr = makesockaddr(s->sock_fd, (struct sockaddr *)addrbuf,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002019 addrlen)))
Barry Warsaw752300b1997-01-03 17:18:10 +00002020 goto finally;
2021
Raymond Hettinger8ae46892003-10-12 19:09:37 +00002022 ret = PyTuple_Pack(2, buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002023
2024finally:
Guido van Rossum73624e91994-10-10 17:59:00 +00002025 Py_XDECREF(addr);
2026 Py_XDECREF(buf);
Guido van Rossum6f5afc91993-02-05 09:46:15 +00002027 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002028}
2029
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002030PyDoc_STRVAR(recvfrom_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002031"recvfrom(buffersize[, flags]) -> (data, address info)\n\
2032\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002033Like recv(buffersize, flags) but also return the sender's address info.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002034
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002035/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002036
Guido van Rossum73624e91994-10-10 17:59:00 +00002037static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002038sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002039{
Guido van Rossumff4949e1992-08-05 19:58:53 +00002040 char *buf;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002041 int len, n = 0, flags = 0, timeout;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002042#ifdef __VMS
2043 int send_length;
2044#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00002045
Guido van Rossum43713e52000-02-29 13:59:29 +00002046 if (!PyArg_ParseTuple(args, "s#|i:send", &buf, &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00002047 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002048
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002049#ifndef __VMS
Guido van Rossum73624e91994-10-10 17:59:00 +00002050 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002051 timeout = internal_select(s, 1);
2052 if (!timeout)
2053 n = send(s->sock_fd, buf, len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00002054 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002055
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002056 if (timeout) {
2057 PyErr_SetString(socket_timeout, "timed out");
2058 return NULL;
2059 }
Guido van Rossum30a685f1991-06-27 15:51:29 +00002060 if (n < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002061 return s->errorhandler();
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002062#else
2063 /* Divide packet into smaller segments for */
2064 /* TCP/IP Services for OpenVMS */
2065 send_length = len;
2066 while (send_length != 0) {
2067 unsigned int segment;
2068
2069 segment = send_length / SEGMENT_SIZE;
2070 if (segment != 0) {
2071 segment = SEGMENT_SIZE;
2072 }
2073 else {
2074 segment = send_length;
2075 }
2076 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002077 timeout = internal_select(s, 1);
2078 if (!timeout)
2079 n = send(s->sock_fd, buf, segment, flags);
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002080 Py_END_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002081 if (timeout) {
2082 PyErr_SetString(socket_timeout, "timed out");
2083 return NULL;
2084 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002085 if (n < 0) {
2086 return s->errorhandler();
2087 }
2088 send_length -= segment;
2089 buf += segment;
2090 } /* end while */
2091#endif /* !__VMS */
Guido van Rossum73624e91994-10-10 17:59:00 +00002092 return PyInt_FromLong((long)n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00002093}
2094
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002095PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002096"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002097\n\
2098Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002099argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002100sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002101
2102
2103/* s.sendall(data [,flags]) method */
2104
2105static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002106sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002107{
2108 char *buf;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002109 int len, n = 0, flags = 0, timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002110
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002111 if (!PyArg_ParseTuple(args, "s#|i:sendall", &buf, &len, &flags))
2112 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002113
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002114 Py_BEGIN_ALLOW_THREADS
2115 do {
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002116 timeout = internal_select(s, 1);
2117 if (timeout)
2118 break;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002119 n = send(s->sock_fd, buf, len, flags);
2120 if (n < 0)
2121 break;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002122 buf += n;
2123 len -= n;
2124 } while (len > 0);
2125 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002126
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002127 if (timeout) {
2128 PyErr_SetString(socket_timeout, "timed out");
2129 return NULL;
2130 }
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002131 if (n < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002132 return s->errorhandler();
Guido van Rossum67f7a382002-06-06 21:08:16 +00002133
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002134 Py_INCREF(Py_None);
2135 return Py_None;
2136}
2137
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002138PyDoc_STRVAR(sendall_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002139"sendall(data[, flags])\n\
2140\n\
2141Send a data string to the socket. For the optional flags\n\
2142argument, see the Unix manual. This calls send() repeatedly\n\
2143until all data is sent. If an error occurs, it's impossible\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002144to tell how much data has been sent.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002145
Guido van Rossum30a685f1991-06-27 15:51:29 +00002146
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002147/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002148
Guido van Rossum73624e91994-10-10 17:59:00 +00002149static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002150sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002151{
Guido van Rossum73624e91994-10-10 17:59:00 +00002152 PyObject *addro;
Guido van Rossumff4949e1992-08-05 19:58:53 +00002153 char *buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002154 struct sockaddr *addr;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002155 int addrlen, len, n = 0, flags, timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002156
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002157 flags = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002158 if (!PyArg_ParseTuple(args, "s#O:sendto", &buf, &len, &addro)) {
Guido van Rossum73624e91994-10-10 17:59:00 +00002159 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002160 if (!PyArg_ParseTuple(args, "s#iO:sendto",
2161 &buf, &len, &flags, &addro))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002162 return NULL;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002163 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002164
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002165 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002166 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002167
Guido van Rossum73624e91994-10-10 17:59:00 +00002168 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002169 timeout = internal_select(s, 1);
2170 if (!timeout)
2171 n = sendto(s->sock_fd, buf, len, flags, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00002172 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002173
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002174 if (timeout) {
2175 PyErr_SetString(socket_timeout, "timed out");
2176 return NULL;
2177 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002178 if (n < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002179 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00002180 return PyInt_FromLong((long)n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002181}
2182
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002183PyDoc_STRVAR(sendto_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002184"sendto(data[, flags], address) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002185\n\
2186Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002187For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002188
Guido van Rossum30a685f1991-06-27 15:51:29 +00002189
2190/* s.shutdown(how) method */
2191
Guido van Rossum73624e91994-10-10 17:59:00 +00002192static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002193sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002194{
2195 int how;
Guido van Rossumff4949e1992-08-05 19:58:53 +00002196 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002197
2198 how = PyInt_AsLong(arg);
2199 if (how == -1 && PyErr_Occurred())
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002200 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00002201 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002202 res = shutdown(s->sock_fd, how);
Guido van Rossum73624e91994-10-10 17:59:00 +00002203 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002204 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002205 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00002206 Py_INCREF(Py_None);
2207 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002208}
2209
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002210PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002211"shutdown(flag)\n\
2212\n\
Martin v. Löwis94681fc2003-11-27 19:40:22 +00002213Shut down the reading side of the socket (flag == SHUT_RD), the writing side\n\
2214of the socket (flag == SHUT_WR), or both ends (flag == SHUT_RDWR).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002215
Guido van Rossum30a685f1991-06-27 15:51:29 +00002216
2217/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002218
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002219static PyMethodDef sock_methods[] = {
2220 {"accept", (PyCFunction)sock_accept, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002221 accept_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002222 {"bind", (PyCFunction)sock_bind, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002223 bind_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002224 {"close", (PyCFunction)sock_close, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002225 close_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002226 {"connect", (PyCFunction)sock_connect, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002227 connect_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002228 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002229 connect_ex_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00002230#ifndef NO_DUP
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002231 {"dup", (PyCFunction)sock_dup, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002232 dup_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00002233#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002234 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002235 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00002236#ifdef HAVE_GETPEERNAME
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002237 {"getpeername", (PyCFunction)sock_getpeername,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002238 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00002239#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002240 {"getsockname", (PyCFunction)sock_getsockname,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002241 METH_NOARGS, getsockname_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002242 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002243 getsockopt_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002244 {"listen", (PyCFunction)sock_listen, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002245 listen_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002246#ifndef NO_DUP
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002247 {"makefile", (PyCFunction)sock_makefile, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002248 makefile_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002249#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002250 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002251 recv_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002252 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002253 recvfrom_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002254 {"send", (PyCFunction)sock_send, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002255 send_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002256 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002257 sendall_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002258 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002259 sendto_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002260 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002261 setblocking_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002262 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
Guido van Rossum67f7a382002-06-06 21:08:16 +00002263 settimeout_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002264 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
Guido van Rossum67f7a382002-06-06 21:08:16 +00002265 gettimeout_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002266 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002267 setsockopt_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002268 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002269 shutdown_doc},
2270#ifdef RISCOS
Martin v. Löwisa94568a2003-05-10 07:36:56 +00002271 {"sleeptaskw", (PyCFunction)sock_sleeptaskw, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002272 sleeptaskw_doc},
2273#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +00002274 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002275};
2276
Guido van Rossum30a685f1991-06-27 15:51:29 +00002277
Guido van Rossum73624e91994-10-10 17:59:00 +00002278/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00002279 First close the file description. */
2280
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002281static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002282sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002283{
Guido van Rossumfa972c92000-04-10 12:45:45 +00002284 if (s->sock_fd != -1)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00002285 (void) SOCKETCLOSE(s->sock_fd);
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002286 s->ob_type->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002287}
2288
Guido van Rossum30a685f1991-06-27 15:51:29 +00002289
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002290static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002291sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002292{
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002293 char buf[512];
Fred Drakea04eaad2000-06-30 02:46:07 +00002294#if SIZEOF_SOCKET_T > SIZEOF_LONG
2295 if (s->sock_fd > LONG_MAX) {
2296 /* this can occur on Win64, and actually there is a special
2297 ugly printf formatter for decimal pointer length integer
2298 printing, only bother if necessary*/
2299 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002300 "no printf formatter to display "
2301 "the socket descriptor in decimal");
Fred Drakea04eaad2000-06-30 02:46:07 +00002302 return NULL;
2303 }
2304#endif
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002305 PyOS_snprintf(
2306 buf, sizeof(buf),
2307 "<socket object, fd=%ld, family=%d, type=%d, protocol=%d>",
2308 (long)s->sock_fd, s->sock_family,
2309 s->sock_type,
2310 s->sock_proto);
Guido van Rossumdc1c64a1996-02-27 15:21:19 +00002311 return PyString_FromString(buf);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002312}
2313
2314
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002315/* Create a new, uninitialized socket object. */
2316
2317static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002318sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002319{
2320 PyObject *new;
2321
2322 new = type->tp_alloc(type, 0);
Guido van Rossume1c478f2002-06-06 20:08:25 +00002323 if (new != NULL) {
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002324 ((PySocketSockObject *)new)->sock_fd = -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002325 ((PySocketSockObject *)new)->sock_timeout = -1.0;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002326 ((PySocketSockObject *)new)->errorhandler = &set_error;
Guido van Rossume1c478f2002-06-06 20:08:25 +00002327 }
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002328 return new;
2329}
2330
2331
2332/* Initialize a new socket object. */
2333
2334/*ARGSUSED*/
2335static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00002336sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002337{
2338 PySocketSockObject *s = (PySocketSockObject *)self;
2339 SOCKET_T fd;
2340 int family = AF_INET, type = SOCK_STREAM, proto = 0;
2341 static char *keywords[] = {"family", "type", "proto", 0};
2342
2343 if (!PyArg_ParseTupleAndKeywords(args, kwds,
2344 "|iii:socket", keywords,
2345 &family, &type, &proto))
2346 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002347
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002348 Py_BEGIN_ALLOW_THREADS
2349 fd = socket(family, type, proto);
2350 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002351
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002352#ifdef MS_WINDOWS
2353 if (fd == INVALID_SOCKET)
2354#else
2355 if (fd < 0)
2356#endif
2357 {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002358 set_error();
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002359 return -1;
2360 }
2361 init_sockobject(s, fd, family, type, proto);
2362 /* From now on, ignore SIGPIPE and let the error checking
2363 do the work. */
2364#ifdef SIGPIPE
2365 (void) signal(SIGPIPE, SIG_IGN);
2366#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00002367
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002368 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002369
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002370}
2371
2372
Guido van Rossumb6775db1994-08-01 11:34:53 +00002373/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002374
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002375static PyTypeObject sock_type = {
Guido van Rossum55558541996-05-23 22:54:50 +00002376 PyObject_HEAD_INIT(0) /* Must fill in type value later */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002377 0, /* ob_size */
Guido van Rossumca6dfa52001-10-28 12:31:33 +00002378 "_socket.socket", /* tp_name */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002379 sizeof(PySocketSockObject), /* tp_basicsize */
2380 0, /* tp_itemsize */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002381 (destructor)sock_dealloc, /* tp_dealloc */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002382 0, /* tp_print */
2383 0, /* tp_getattr */
2384 0, /* tp_setattr */
2385 0, /* tp_compare */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002386 (reprfunc)sock_repr, /* tp_repr */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002387 0, /* tp_as_number */
2388 0, /* tp_as_sequence */
2389 0, /* tp_as_mapping */
2390 0, /* tp_hash */
2391 0, /* tp_call */
2392 0, /* tp_str */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002393 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002394 0, /* tp_setattro */
2395 0, /* tp_as_buffer */
2396 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002397 sock_doc, /* tp_doc */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002398 0, /* tp_traverse */
2399 0, /* tp_clear */
2400 0, /* tp_richcompare */
2401 0, /* tp_weaklistoffset */
2402 0, /* tp_iter */
2403 0, /* tp_iternext */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002404 sock_methods, /* tp_methods */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002405 0, /* tp_members */
2406 0, /* tp_getset */
2407 0, /* tp_base */
2408 0, /* tp_dict */
2409 0, /* tp_descr_get */
2410 0, /* tp_descr_set */
2411 0, /* tp_dictoffset */
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00002412 sock_initobj, /* tp_init */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002413 PyType_GenericAlloc, /* tp_alloc */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002414 sock_new, /* tp_new */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002415 PyObject_Del, /* tp_free */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002416};
2417
Guido van Rossum30a685f1991-06-27 15:51:29 +00002418
Guido van Rossum81194471991-07-27 21:42:02 +00002419/* Python interface to gethostname(). */
2420
2421/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002422static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002423socket_gethostname(PyObject *self, PyObject *args)
Guido van Rossum81194471991-07-27 21:42:02 +00002424{
2425 char buf[1024];
Guido van Rossumff4949e1992-08-05 19:58:53 +00002426 int res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002427 if (!PyArg_ParseTuple(args, ":gethostname"))
Guido van Rossum81194471991-07-27 21:42:02 +00002428 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00002429 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002430 res = gethostname(buf, (int) sizeof buf - 1);
Guido van Rossum73624e91994-10-10 17:59:00 +00002431 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002432 if (res < 0)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002433 return set_error();
Guido van Rossum81194471991-07-27 21:42:02 +00002434 buf[sizeof buf - 1] = '\0';
Guido van Rossum73624e91994-10-10 17:59:00 +00002435 return PyString_FromString(buf);
Guido van Rossum81194471991-07-27 21:42:02 +00002436}
Guido van Rossumff4949e1992-08-05 19:58:53 +00002437
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002438PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002439"gethostname() -> string\n\
2440\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002441Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002442
Guido van Rossumff4949e1992-08-05 19:58:53 +00002443
Guido van Rossum30a685f1991-06-27 15:51:29 +00002444/* Python interface to gethostbyname(name). */
2445
2446/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002447static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002448socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002449{
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002450 char *name;
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00002451#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002452 struct sockaddr_storage addrbuf;
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00002453#else
2454 struct sockaddr_in addrbuf;
2455#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002456
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002457 if (!PyArg_ParseTuple(args, "s:gethostbyname", &name))
Guido van Rossum30a685f1991-06-27 15:51:29 +00002458 return NULL;
Martin v. Löwisddc6f472002-07-28 16:10:31 +00002459 if (setipaddr(name, (struct sockaddr *)&addrbuf, sizeof(addrbuf), AF_INET) < 0)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002460 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002461 return makeipaddr((struct sockaddr *)&addrbuf,
2462 sizeof(struct sockaddr_in));
Guido van Rossum30a685f1991-06-27 15:51:29 +00002463}
2464
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002465PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002466"gethostbyname(host) -> address\n\
2467\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002468Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002469
2470
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002471/* Convenience function common to gethostbyname_ex and gethostbyaddr */
2472
2473static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002474gethost_common(struct hostent *h, struct sockaddr *addr, int alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002475{
2476 char **pch;
2477 PyObject *rtn_tuple = (PyObject *)NULL;
2478 PyObject *name_list = (PyObject *)NULL;
2479 PyObject *addr_list = (PyObject *)NULL;
2480 PyObject *tmp;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002481
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002482 if (h == NULL) {
Guido van Rossum48a680c2001-03-02 06:34:14 +00002483 /* Let's get real error message to return */
Guido van Rossume2ae77b2001-10-24 20:42:55 +00002484#ifndef RISCOS
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002485 set_herror(h_errno);
Guido van Rossume2ae77b2001-10-24 20:42:55 +00002486#else
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002487 PyErr_SetString(socket_error, "host not found");
Guido van Rossume2ae77b2001-10-24 20:42:55 +00002488#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002489 return NULL;
2490 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002491
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002492 if (h->h_addrtype != af) {
2493#ifdef HAVE_STRERROR
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002494 /* Let's get real error message to return */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002495 PyErr_SetString(socket_error,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002496 (char *)strerror(EAFNOSUPPORT));
2497#else
2498 PyErr_SetString(
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002499 socket_error,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002500 "Address family not supported by protocol family");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002501#endif
2502 return NULL;
2503 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002504
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002505 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00002506
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002507 case AF_INET:
2508 if (alen < sizeof(struct sockaddr_in))
2509 return NULL;
2510 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002511
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002512#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002513 case AF_INET6:
2514 if (alen < sizeof(struct sockaddr_in6))
2515 return NULL;
2516 break;
2517#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00002518
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002519 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002520
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002521 if ((name_list = PyList_New(0)) == NULL)
2522 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002523
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002524 if ((addr_list = PyList_New(0)) == NULL)
2525 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002526
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002527 for (pch = h->h_aliases; *pch != NULL; pch++) {
2528 int status;
2529 tmp = PyString_FromString(*pch);
2530 if (tmp == NULL)
2531 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002532
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002533 status = PyList_Append(name_list, tmp);
2534 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002535
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002536 if (status)
2537 goto err;
2538 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002539
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002540 for (pch = h->h_addr_list; *pch != NULL; pch++) {
2541 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002542
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002543 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00002544
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002545 case AF_INET:
2546 {
2547 struct sockaddr_in sin;
2548 memset(&sin, 0, sizeof(sin));
2549 sin.sin_family = af;
2550#ifdef HAVE_SOCKADDR_SA_LEN
2551 sin.sin_len = sizeof(sin);
2552#endif
2553 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
2554 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
Guido van Rossum67f7a382002-06-06 21:08:16 +00002555
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002556 if (pch == h->h_addr_list && alen >= sizeof(sin))
2557 memcpy((char *) addr, &sin, sizeof(sin));
2558 break;
2559 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002560
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002561#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002562 case AF_INET6:
2563 {
2564 struct sockaddr_in6 sin6;
2565 memset(&sin6, 0, sizeof(sin6));
2566 sin6.sin6_family = af;
2567#ifdef HAVE_SOCKADDR_SA_LEN
2568 sin6.sin6_len = sizeof(sin6);
2569#endif
2570 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
2571 tmp = makeipaddr((struct sockaddr *)&sin6,
2572 sizeof(sin6));
Guido van Rossum67f7a382002-06-06 21:08:16 +00002573
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002574 if (pch == h->h_addr_list && alen >= sizeof(sin6))
2575 memcpy((char *) addr, &sin6, sizeof(sin6));
2576 break;
2577 }
2578#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00002579
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002580 default: /* can't happen */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002581 PyErr_SetString(socket_error,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002582 "unsupported address family");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002583 return NULL;
2584 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002585
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002586 if (tmp == NULL)
2587 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002588
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002589 status = PyList_Append(addr_list, tmp);
2590 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002591
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002592 if (status)
2593 goto err;
2594 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002595
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002596 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002597
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002598 err:
2599 Py_XDECREF(name_list);
2600 Py_XDECREF(addr_list);
2601 return rtn_tuple;
2602}
2603
2604
2605/* Python interface to gethostbyname_ex(name). */
2606
2607/*ARGSUSED*/
2608static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002609socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002610{
2611 char *name;
2612 struct hostent *h;
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00002613#ifdef ENABLE_IPV6
2614 struct sockaddr_storage addr;
2615#else
2616 struct sockaddr_in addr;
2617#endif
Martin v. Löwis9db2f572001-07-23 01:30:10 +00002618 struct sockaddr *sa;
Guido van Rossum955becc1999-03-22 20:14:53 +00002619 PyObject *ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002620#ifdef HAVE_GETHOSTBYNAME_R
2621 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002622#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
2623 struct hostent_data data;
2624#else
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002625 char buf[16384];
2626 int buf_len = (sizeof buf) - 1;
2627 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002628#endif
2629#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002630 int result;
2631#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002632#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002633
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002634 if (!PyArg_ParseTuple(args, "s:gethostbyname_ex", &name))
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002635 return NULL;
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00002636 if (setipaddr(name, (struct sockaddr *)&addr, sizeof(addr), AF_INET) < 0)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002637 return NULL;
2638 Py_BEGIN_ALLOW_THREADS
2639#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002640#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002641 result = gethostbyname_r(name, &hp_allocated, buf, buf_len,
2642 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002643#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002644 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002645#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00002646 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002647 result = gethostbyname_r(name, &hp_allocated, &data);
2648 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002649#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002650#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00002651#ifdef USE_GETHOSTBYNAME_LOCK
Just van Rossum1040d2c2003-05-09 07:53:18 +00002652 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002653#endif
2654 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002655#endif /* HAVE_GETHOSTBYNAME_R */
2656 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002657 /* Some C libraries would require addr.__ss_family instead of
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002658 addr.ss_family.
2659 Therefore, we cast the sockaddr_storage into sockaddr to
2660 access sa_family. */
Martin v. Löwis9db2f572001-07-23 01:30:10 +00002661 sa = (struct sockaddr*)&addr;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002662 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr),
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002663 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00002664#ifdef USE_GETHOSTBYNAME_LOCK
Just van Rossum1040d2c2003-05-09 07:53:18 +00002665 PyThread_release_lock(netdb_lock);
Guido van Rossum955becc1999-03-22 20:14:53 +00002666#endif
2667 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002668}
2669
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002670PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002671"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
2672\n\
2673Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002674for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002675
2676
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002677/* Python interface to gethostbyaddr(IP). */
2678
2679/*ARGSUSED*/
2680static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002681socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002682{
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002683#ifdef ENABLE_IPV6
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002684 struct sockaddr_storage addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002685#else
Guido van Rossum48a680c2001-03-02 06:34:14 +00002686 struct sockaddr_in addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002687#endif
2688 struct sockaddr *sa = (struct sockaddr *)&addr;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002689 char *ip_num;
2690 struct hostent *h;
Guido van Rossum3baaa131999-03-22 21:44:51 +00002691 PyObject *ret;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002692#ifdef HAVE_GETHOSTBYNAME_R
2693 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002694#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
2695 struct hostent_data data;
2696#else
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002697 char buf[16384];
2698 int buf_len = (sizeof buf) - 1;
2699 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002700#endif
2701#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002702 int result;
2703#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002704#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002705 char *ap;
2706 int al;
2707 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002708
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002709 if (!PyArg_ParseTuple(args, "s:gethostbyaddr", &ip_num))
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002710 return NULL;
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00002711 af = AF_UNSPEC;
Martin v. Löwisddc6f472002-07-28 16:10:31 +00002712 if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002713 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002714 af = sa->sa_family;
2715 ap = NULL;
2716 al = 0;
2717 switch (af) {
2718 case AF_INET:
2719 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
2720 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
2721 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002722#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002723 case AF_INET6:
2724 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
2725 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
2726 break;
2727#endif
2728 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002729 PyErr_SetString(socket_error, "unsupported address family");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002730 return NULL;
2731 }
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002732 Py_BEGIN_ALLOW_THREADS
2733#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002734#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002735 result = gethostbyaddr_r(ap, al, af,
2736 &hp_allocated, buf, buf_len,
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002737 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002738#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002739 h = gethostbyaddr_r(ap, al, af,
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002740 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002741#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00002742 memset((void *) &data, '\0', sizeof(data));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002743 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002744 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002745#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002746#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00002747#ifdef USE_GETHOSTBYNAME_LOCK
Just van Rossum1040d2c2003-05-09 07:53:18 +00002748 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002749#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002750 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002751#endif /* HAVE_GETHOSTBYNAME_R */
2752 Py_END_ALLOW_THREADS
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002753 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00002754#ifdef USE_GETHOSTBYNAME_LOCK
Just van Rossum1040d2c2003-05-09 07:53:18 +00002755 PyThread_release_lock(netdb_lock);
Guido van Rossum3baaa131999-03-22 21:44:51 +00002756#endif
2757 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002758}
2759
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002760PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002761"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
2762\n\
2763Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002764for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002765
Guido van Rossum30a685f1991-06-27 15:51:29 +00002766
2767/* Python interface to getservbyname(name).
2768 This only returns the port number, since the other info is already
2769 known or not useful (like the list of aliases). */
2770
2771/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002772static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002773socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002774{
Guido van Rossumff4949e1992-08-05 19:58:53 +00002775 char *name, *proto;
Guido van Rossum30a685f1991-06-27 15:51:29 +00002776 struct servent *sp;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002777 if (!PyArg_ParseTuple(args, "ss:getservbyname", &name, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +00002778 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00002779 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002780 sp = getservbyname(name, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00002781 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00002782 if (sp == NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002783 PyErr_SetString(socket_error, "service/proto not found");
Guido van Rossum30a685f1991-06-27 15:51:29 +00002784 return NULL;
2785 }
Guido van Rossum73624e91994-10-10 17:59:00 +00002786 return PyInt_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00002787}
2788
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002789PyDoc_STRVAR(getservbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002790"getservbyname(servicename, protocolname) -> integer\n\
2791\n\
2792Return a port number from a service name and protocol name.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002793The protocol name should be 'tcp' or 'udp'.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002794
Guido van Rossum30a685f1991-06-27 15:51:29 +00002795
Guido van Rossum3901d851996-12-19 16:35:04 +00002796/* Python interface to getprotobyname(name).
2797 This only returns the protocol number, since the other info is
2798 already known or not useful (like the list of aliases). */
2799
2800/*ARGSUSED*/
2801static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002802socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00002803{
2804 char *name;
2805 struct protoent *sp;
Guido van Rossumbcc20741998-08-04 22:53:56 +00002806#ifdef __BEOS__
2807/* Not available in BeOS yet. - [cjh] */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002808 PyErr_SetString(socket_error, "getprotobyname not supported");
Guido van Rossumbcc20741998-08-04 22:53:56 +00002809 return NULL;
2810#else
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002811 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
Guido van Rossum3901d851996-12-19 16:35:04 +00002812 return NULL;
2813 Py_BEGIN_ALLOW_THREADS
2814 sp = getprotobyname(name);
2815 Py_END_ALLOW_THREADS
2816 if (sp == NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002817 PyErr_SetString(socket_error, "protocol not found");
Guido van Rossum3901d851996-12-19 16:35:04 +00002818 return NULL;
2819 }
2820 return PyInt_FromLong((long) sp->p_proto);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002821#endif
Guido van Rossum3901d851996-12-19 16:35:04 +00002822}
2823
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002824PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002825"getprotobyname(name) -> integer\n\
2826\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002827Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002828
Guido van Rossum3901d851996-12-19 16:35:04 +00002829
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002830#ifndef NO_DUP
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002831/* Create a socket object from a numeric file description.
2832 Useful e.g. if stdin is a socket.
2833 Additional arguments as for socket(). */
2834
2835/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002836static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002837socket_fromfd(PyObject *self, PyObject *args)
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002838{
Guido van Rossum73624e91994-10-10 17:59:00 +00002839 PySocketSockObject *s;
Fred Drakea04eaad2000-06-30 02:46:07 +00002840 SOCKET_T fd;
2841 int family, type, proto = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002842 if (!PyArg_ParseTuple(args, "iii|i:fromfd",
2843 &fd, &family, &type, &proto))
Guido van Rossumbe32c891996-06-20 16:25:29 +00002844 return NULL;
Guido van Rossum5f59d601992-12-14 16:59:51 +00002845 /* Dup the fd so it and the socket can be closed independently */
2846 fd = dup(fd);
2847 if (fd < 0)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002848 return set_error();
2849 s = new_sockobject(fd, family, type, proto);
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002850 /* From now on, ignore SIGPIPE and let the error checking
2851 do the work. */
Guido van Rossum48a680c2001-03-02 06:34:14 +00002852#ifdef SIGPIPE
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002853 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum48a680c2001-03-02 06:34:14 +00002854#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00002855 return (PyObject *) s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002856}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002857
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002858PyDoc_STRVAR(fromfd_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002859"fromfd(fd, family, type[, proto]) -> socket object\n\
2860\n\
2861Create a socket object from the given file descriptor.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002862The remaining arguments are the same as for socket().");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002863
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002864#endif /* NO_DUP */
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002865
Guido van Rossum82a5c661998-07-07 20:45:43 +00002866
Guido van Rossum006bf911996-06-12 04:04:55 +00002867static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002868socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002869{
2870 int x1, x2;
2871
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002872 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002873 return NULL;
2874 }
2875 x2 = (int)ntohs((short)x1);
2876 return PyInt_FromLong(x2);
2877}
2878
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002879PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002880"ntohs(integer) -> integer\n\
2881\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002882Convert a 16-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002883
2884
Guido van Rossum006bf911996-06-12 04:04:55 +00002885static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002886socket_ntohl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00002887{
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002888 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00002889
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002890 if (PyInt_Check(arg)) {
2891 x = PyInt_AS_LONG(arg);
Jeremy Hylton825e47b2002-07-25 16:37:51 +00002892 if (x == (unsigned long) -1 && PyErr_Occurred())
2893 return NULL;
Guido van Rossum006bf911996-06-12 04:04:55 +00002894 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002895 else if (PyLong_Check(arg)) {
2896 x = PyLong_AsUnsignedLong(arg);
Jeremy Hylton825e47b2002-07-25 16:37:51 +00002897 if (x == (unsigned long) -1 && PyErr_Occurred())
2898 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002899#if SIZEOF_LONG > 4
2900 {
2901 unsigned long y;
2902 /* only want the trailing 32 bits */
2903 y = x & 0xFFFFFFFFUL;
2904 if (y ^ x)
2905 return PyErr_Format(PyExc_OverflowError,
2906 "long int larger than 32 bits");
2907 x = y;
Tim Peters58141872002-08-06 22:25:02 +00002908 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002909#endif
2910 }
2911 else
Tim Peters58141872002-08-06 22:25:02 +00002912 return PyErr_Format(PyExc_TypeError,
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002913 "expected int/long, %s found",
2914 arg->ob_type->tp_name);
2915 if (x == (unsigned long) -1 && PyErr_Occurred())
2916 return NULL;
2917 return PyInt_FromLong(ntohl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00002918}
2919
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002920PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002921"ntohl(integer) -> integer\n\
2922\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002923Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002924
2925
Guido van Rossum006bf911996-06-12 04:04:55 +00002926static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002927socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002928{
Hye-Shik Changa7b673f2003-12-17 09:40:23 +00002929 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00002930
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002931 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002932 return NULL;
2933 }
2934 x2 = (int)htons((short)x1);
2935 return PyInt_FromLong(x2);
2936}
2937
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002938PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002939"htons(integer) -> integer\n\
2940\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002941Convert a 16-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002942
2943
Guido van Rossum006bf911996-06-12 04:04:55 +00002944static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002945socket_htonl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00002946{
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002947 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00002948
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002949 if (PyInt_Check(arg)) {
2950 x = PyInt_AS_LONG(arg);
Jeremy Hylton825e47b2002-07-25 16:37:51 +00002951 if (x == (unsigned long) -1 && PyErr_Occurred())
2952 return NULL;
Guido van Rossum006bf911996-06-12 04:04:55 +00002953 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002954 else if (PyLong_Check(arg)) {
2955 x = PyLong_AsUnsignedLong(arg);
Jeremy Hylton825e47b2002-07-25 16:37:51 +00002956 if (x == (unsigned long) -1 && PyErr_Occurred())
2957 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002958#if SIZEOF_LONG > 4
2959 {
2960 unsigned long y;
2961 /* only want the trailing 32 bits */
2962 y = x & 0xFFFFFFFFUL;
2963 if (y ^ x)
2964 return PyErr_Format(PyExc_OverflowError,
2965 "long int larger than 32 bits");
2966 x = y;
Tim Peters58141872002-08-06 22:25:02 +00002967 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002968#endif
2969 }
2970 else
Tim Peters58141872002-08-06 22:25:02 +00002971 return PyErr_Format(PyExc_TypeError,
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002972 "expected int/long, %s found",
2973 arg->ob_type->tp_name);
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002974 return PyInt_FromLong(htonl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00002975}
2976
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002977PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002978"htonl(integer) -> integer\n\
2979\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002980Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002981
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002982/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002983
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002984PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002985"inet_aton(string) -> packed 32-bit IP representation\n\
2986\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002987Convert 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 +00002988binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002989
2990static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002991socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002992{
Guido van Rossuma2e48551999-09-09 15:42:59 +00002993#ifndef INADDR_NONE
2994#define INADDR_NONE (-1)
2995#endif
Neal Norwitz88f115b2003-02-13 02:15:42 +00002996#ifdef HAVE_INET_ATON
Guido van Rossumad05cdf2003-02-12 23:08:22 +00002997 struct in_addr buf;
Tim Peters1df9fdd2003-02-13 03:13:40 +00002998#else
2999 /* Have to use inet_addr() instead */
3000 unsigned long packed_addr;
3001#endif
3002 char *ip_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003003
Tim Peters1df9fdd2003-02-13 03:13:40 +00003004 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003005 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003006
Tim Peters1df9fdd2003-02-13 03:13:40 +00003007
3008#ifdef HAVE_INET_ATON
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003009 if (inet_aton(ip_addr, &buf))
3010 return PyString_FromStringAndSize((char *)(&buf),
3011 sizeof(buf));
3012
3013 PyErr_SetString(socket_error,
3014 "illegal IP address string passed to inet_aton");
3015 return NULL;
3016
Tim Peters1df9fdd2003-02-13 03:13:40 +00003017#else /* ! HAVE_INET_ATON */
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003018 /* XXX Problem here: inet_aton('255.255.255.255') raises
3019 an exception while it should be a valid address. */
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003020 packed_addr = inet_addr(ip_addr);
3021
3022 if (packed_addr == INADDR_NONE) { /* invalid address */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003023 PyErr_SetString(socket_error,
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003024 "illegal IP address string passed to inet_aton");
3025 return NULL;
3026 }
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003027 return PyString_FromStringAndSize((char *) &packed_addr,
3028 sizeof(packed_addr));
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003029#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003030}
3031
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003032PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00003033"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003034\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003035Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003036
3037static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003038socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003039{
3040 char *packed_str;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003041 int addr_len;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003042 struct in_addr packed_addr;
3043
Guido van Rossum27fc3c02000-03-24 20:56:56 +00003044 if (!PyArg_ParseTuple(args, "s#:inet_ntoa", &packed_str, &addr_len)) {
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003045 return NULL;
3046 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00003047
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003048 if (addr_len != sizeof(packed_addr)) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003049 PyErr_SetString(socket_error,
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003050 "packed IP wrong length for inet_ntoa");
3051 return NULL;
3052 }
3053
3054 memcpy(&packed_addr, packed_str, addr_len);
3055
3056 return PyString_FromString(inet_ntoa(packed_addr));
3057}
Guido van Rossum82a5c661998-07-07 20:45:43 +00003058
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003059#ifdef HAVE_INET_PTON
3060
3061PyDoc_STRVAR(inet_pton_doc,
3062"inet_pton(af, ip) -> packed IP address string\n\
3063\n\
3064Convert an IP address from string format to a packed string suitable\n\
3065for use with low-level network functions.");
3066
3067static PyObject *
3068socket_inet_pton(PyObject *self, PyObject *args)
3069{
3070 int af;
3071 char* ip;
3072 int retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003073#ifdef ENABLE_IPV6
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003074 char packed[MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003075#else
3076 char packed[sizeof(struct in_addr)];
3077#endif
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003078 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
3079 return NULL;
3080 }
3081
Martin v. Löwis10649092003-08-05 06:25:06 +00003082#ifndef ENABLE_IPV6
3083 if(af == AF_INET6) {
3084 PyErr_SetString(socket_error,
3085 "can't use AF_INET6, IPv6 is disabled");
3086 return NULL;
3087 }
3088#endif
3089
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003090 retval = inet_pton(af, ip, packed);
3091 if (retval < 0) {
3092 PyErr_SetFromErrno(socket_error);
3093 return NULL;
3094 } else if (retval == 0) {
3095 PyErr_SetString(socket_error,
3096 "illegal IP address string passed to inet_pton");
3097 return NULL;
3098 } else if (af == AF_INET) {
3099 return PyString_FromStringAndSize(packed,
3100 sizeof(struct in_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003101#ifdef ENABLE_IPV6
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003102 } else if (af == AF_INET6) {
3103 return PyString_FromStringAndSize(packed,
3104 sizeof(struct in6_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003105#endif
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003106 } else {
3107 PyErr_SetString(socket_error, "unknown address family");
3108 return NULL;
3109 }
3110}
3111
3112PyDoc_STRVAR(inet_ntop_doc,
3113"inet_ntop(af, packed_ip) -> string formatted IP address\n\
3114\n\
3115Convert a packed IP address of the given family to string format.");
3116
3117static PyObject *
3118socket_inet_ntop(PyObject *self, PyObject *args)
3119{
3120 int af;
3121 char* packed;
3122 int len;
3123 const char* retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003124#ifdef ENABLE_IPV6
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003125 char ip[MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003126#else
3127 char ip[INET_ADDRSTRLEN + 1];
3128#endif
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003129
3130 /* Guarantee NUL-termination for PyString_FromString() below */
3131 memset((void *) &ip[0], '\0', sizeof(ip) + 1);
3132
3133 if (!PyArg_ParseTuple(args, "is#:inet_ntop", &af, &packed, &len)) {
3134 return NULL;
3135 }
3136
3137 if (af == AF_INET) {
3138 if (len != sizeof(struct in_addr)) {
3139 PyErr_SetString(PyExc_ValueError,
3140 "invalid length of packed IP address string");
3141 return NULL;
3142 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003143#ifdef ENABLE_IPV6
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003144 } else if (af == AF_INET6) {
3145 if (len != sizeof(struct in6_addr)) {
3146 PyErr_SetString(PyExc_ValueError,
3147 "invalid length of packed IP address string");
3148 return NULL;
3149 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003150#endif
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003151 } else {
3152 PyErr_Format(PyExc_ValueError,
3153 "unknown address family %d", af);
3154 return NULL;
3155 }
3156
3157 retval = inet_ntop(af, packed, ip, sizeof(ip));
3158 if (!retval) {
3159 PyErr_SetFromErrno(socket_error);
3160 return NULL;
3161 } else {
3162 return PyString_FromString(retval);
3163 }
3164
3165 /* NOTREACHED */
3166 PyErr_SetString(PyExc_RuntimeError, "invalid handling of inet_ntop");
3167 return NULL;
3168}
3169
3170#endif /* HAVE_INET_PTON */
3171
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003172/* Python interface to getaddrinfo(host, port). */
3173
3174/*ARGSUSED*/
3175static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003176socket_getaddrinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003177{
Martin v. Löwisf0b11d22001-11-07 08:31:03 +00003178 struct addrinfo hints, *res;
3179 struct addrinfo *res0 = NULL;
Martin v. Löwis2548c732003-04-18 10:39:54 +00003180 PyObject *hobj = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003181 PyObject *pobj = (PyObject *)NULL;
Martin v. Löwisf65b1a12001-08-12 09:28:40 +00003182 char pbuf[30];
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003183 char *hptr, *pptr;
3184 int family, socktype, protocol, flags;
3185 int error;
3186 PyObject *all = (PyObject *)NULL;
3187 PyObject *single = (PyObject *)NULL;
Martin v. Löwis2548c732003-04-18 10:39:54 +00003188 PyObject *idna = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003189
3190 family = socktype = protocol = flags = 0;
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00003191 family = AF_UNSPEC;
Martin v. Löwis2548c732003-04-18 10:39:54 +00003192 if (!PyArg_ParseTuple(args, "OO|iiii:getaddrinfo",
3193 &hobj, &pobj, &family, &socktype,
3194 &protocol, &flags)) {
3195 return NULL;
3196 }
3197 if (hobj == Py_None) {
3198 hptr = NULL;
3199 } else if (PyUnicode_Check(hobj)) {
3200 idna = PyObject_CallMethod(hobj, "encode", "s", "idna");
3201 if (!idna)
3202 return NULL;
3203 hptr = PyString_AsString(idna);
3204 } else if (PyString_Check(hobj)) {
3205 hptr = PyString_AsString(hobj);
3206 } else {
3207 PyErr_SetString(PyExc_TypeError,
3208 "getaddrinfo() argument 1 must be string or None");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003209 return NULL;
3210 }
3211 if (PyInt_Check(pobj)) {
Marc-André Lemburg03d1b182001-07-31 18:05:33 +00003212 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", PyInt_AsLong(pobj));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003213 pptr = pbuf;
3214 } else if (PyString_Check(pobj)) {
3215 pptr = PyString_AsString(pobj);
3216 } else if (pobj == Py_None) {
3217 pptr = (char *)NULL;
3218 } else {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003219 PyErr_SetString(socket_error, "Int or String expected");
Martin v. Löwis5db099a2003-08-07 11:55:15 +00003220 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003221 }
3222 memset(&hints, 0, sizeof(hints));
3223 hints.ai_family = family;
3224 hints.ai_socktype = socktype;
3225 hints.ai_protocol = protocol;
3226 hints.ai_flags = flags;
Just van Rossum1040d2c2003-05-09 07:53:18 +00003227 Py_BEGIN_ALLOW_THREADS
3228 ACQUIRE_GETADDRINFO_LOCK
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003229 error = getaddrinfo(hptr, pptr, &hints, &res0);
Just van Rossum1040d2c2003-05-09 07:53:18 +00003230 Py_END_ALLOW_THREADS
3231 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003232 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003233 set_gaierror(error);
Martin v. Löwis5db099a2003-08-07 11:55:15 +00003234 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003235 }
3236
3237 if ((all = PyList_New(0)) == NULL)
3238 goto err;
3239 for (res = res0; res; res = res->ai_next) {
Guido van Rossum716aac02001-10-12 18:59:27 +00003240 PyObject *addr =
3241 makesockaddr(-1, res->ai_addr, res->ai_addrlen);
3242 if (addr == NULL)
3243 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003244 single = Py_BuildValue("iiisO", res->ai_family,
3245 res->ai_socktype, res->ai_protocol,
3246 res->ai_canonname ? res->ai_canonname : "",
Guido van Rossum716aac02001-10-12 18:59:27 +00003247 addr);
3248 Py_DECREF(addr);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003249 if (single == NULL)
3250 goto err;
3251
3252 if (PyList_Append(all, single))
3253 goto err;
3254 Py_XDECREF(single);
3255 }
Martin v. Löwis2548c732003-04-18 10:39:54 +00003256 Py_XDECREF(idna);
Neal Norwitz90128ba2002-08-09 03:37:42 +00003257 if (res0)
3258 freeaddrinfo(res0);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003259 return all;
3260 err:
3261 Py_XDECREF(single);
3262 Py_XDECREF(all);
Martin v. Löwis2548c732003-04-18 10:39:54 +00003263 Py_XDECREF(idna);
Martin v. Löwisf0b11d22001-11-07 08:31:03 +00003264 if (res0)
3265 freeaddrinfo(res0);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003266 return (PyObject *)NULL;
3267}
3268
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003269PyDoc_STRVAR(getaddrinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003270"getaddrinfo(host, port [, family, socktype, proto, flags])\n\
3271 -> list of (family, socktype, proto, canonname, sockaddr)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003272\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003273Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003274
3275/* Python interface to getnameinfo(sa, flags). */
3276
3277/*ARGSUSED*/
3278static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003279socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003280{
3281 PyObject *sa = (PyObject *)NULL;
3282 int flags;
3283 char *hostp;
Martin v. Löwis06b1d212001-11-02 23:34:52 +00003284 int port, flowinfo, scope_id;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003285 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
3286 struct addrinfo hints, *res = NULL;
3287 int error;
3288 PyObject *ret = (PyObject *)NULL;
3289
3290 flags = flowinfo = scope_id = 0;
Martin v. Löwis06b1d212001-11-02 23:34:52 +00003291 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003292 return NULL;
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003293 if (!PyArg_ParseTuple(sa, "si|ii",
3294 &hostp, &port, &flowinfo, &scope_id))
Martin v. Löwis06b1d212001-11-02 23:34:52 +00003295 return NULL;
Marc-André Lemburg03d1b182001-07-31 18:05:33 +00003296 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003297 memset(&hints, 0, sizeof(hints));
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00003298 hints.ai_family = AF_UNSPEC;
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003299 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Just van Rossum1040d2c2003-05-09 07:53:18 +00003300 Py_BEGIN_ALLOW_THREADS
3301 ACQUIRE_GETADDRINFO_LOCK
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003302 error = getaddrinfo(hostp, pbuf, &hints, &res);
Just van Rossum1040d2c2003-05-09 07:53:18 +00003303 Py_END_ALLOW_THREADS
3304 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003305 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003306 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003307 goto fail;
3308 }
3309 if (res->ai_next) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003310 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003311 "sockaddr resolved to multiple addresses");
3312 goto fail;
3313 }
3314 switch (res->ai_family) {
3315 case AF_INET:
3316 {
3317 char *t1;
3318 int t2;
3319 if (PyArg_ParseTuple(sa, "si", &t1, &t2) == 0) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003320 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003321 "IPv4 sockaddr must be 2 tuple");
3322 goto fail;
3323 }
3324 break;
3325 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00003326#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003327 case AF_INET6:
3328 {
3329 struct sockaddr_in6 *sin6;
3330 sin6 = (struct sockaddr_in6 *)res->ai_addr;
3331 sin6->sin6_flowinfo = flowinfo;
3332 sin6->sin6_scope_id = scope_id;
3333 break;
3334 }
3335#endif
3336 }
3337 error = getnameinfo(res->ai_addr, res->ai_addrlen,
3338 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
3339 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003340 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003341 goto fail;
3342 }
3343 ret = Py_BuildValue("ss", hbuf, pbuf);
3344
3345fail:
3346 if (res)
3347 freeaddrinfo(res);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003348 return ret;
3349}
3350
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003351PyDoc_STRVAR(getnameinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003352"getnameinfo(sockaddr, flags) --> (host, port)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003353\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003354Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003355
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00003356
3357/* Python API to getting and setting the default timeout value. */
3358
3359static PyObject *
3360socket_getdefaulttimeout(PyObject *self)
3361{
3362 if (defaulttimeout < 0.0) {
3363 Py_INCREF(Py_None);
3364 return Py_None;
3365 }
3366 else
3367 return PyFloat_FromDouble(defaulttimeout);
3368}
3369
3370PyDoc_STRVAR(getdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003371"getdefaulttimeout() -> timeout\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00003372\n\
3373Returns the default timeout in floating seconds for new socket objects.\n\
3374A value of None indicates that new socket objects have no timeout.\n\
3375When the socket module is first imported, the default is None.");
3376
3377static PyObject *
3378socket_setdefaulttimeout(PyObject *self, PyObject *arg)
3379{
3380 double timeout;
3381
3382 if (arg == Py_None)
3383 timeout = -1.0;
3384 else {
3385 timeout = PyFloat_AsDouble(arg);
3386 if (timeout < 0.0) {
3387 if (!PyErr_Occurred())
3388 PyErr_SetString(PyExc_ValueError,
3389 "Timeout value out of range");
3390 return NULL;
3391 }
3392 }
3393
3394 defaulttimeout = timeout;
3395
3396 Py_INCREF(Py_None);
3397 return Py_None;
3398}
3399
3400PyDoc_STRVAR(setdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003401"setdefaulttimeout(timeout)\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00003402\n\
3403Set the default timeout in floating seconds for new socket objects.\n\
3404A value of None indicates that new socket objects have no timeout.\n\
3405When the socket module is first imported, the default is None.");
3406
3407
Guido van Rossum30a685f1991-06-27 15:51:29 +00003408/* List of functions exported by this module. */
3409
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003410static PyMethodDef socket_methods[] = {
3411 {"gethostbyname", socket_gethostbyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003412 METH_VARARGS, gethostbyname_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003413 {"gethostbyname_ex", socket_gethostbyname_ex,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003414 METH_VARARGS, ghbn_ex_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003415 {"gethostbyaddr", socket_gethostbyaddr,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003416 METH_VARARGS, gethostbyaddr_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003417 {"gethostname", socket_gethostname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003418 METH_VARARGS, gethostname_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003419 {"getservbyname", socket_getservbyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003420 METH_VARARGS, getservbyname_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003421 {"getprotobyname", socket_getprotobyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003422 METH_VARARGS,getprotobyname_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00003423#ifndef NO_DUP
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003424 {"fromfd", socket_fromfd,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003425 METH_VARARGS, fromfd_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00003426#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003427 {"ntohs", socket_ntohs,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003428 METH_VARARGS, ntohs_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003429 {"ntohl", socket_ntohl,
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003430 METH_O, ntohl_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003431 {"htons", socket_htons,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003432 METH_VARARGS, htons_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003433 {"htonl", socket_htonl,
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003434 METH_O, htonl_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003435 {"inet_aton", socket_inet_aton,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003436 METH_VARARGS, inet_aton_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003437 {"inet_ntoa", socket_inet_ntoa,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003438 METH_VARARGS, inet_ntoa_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003439#ifdef HAVE_INET_PTON
3440 {"inet_pton", socket_inet_pton,
3441 METH_VARARGS, inet_pton_doc},
3442 {"inet_ntop", socket_inet_ntop,
3443 METH_VARARGS, inet_ntop_doc},
3444#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003445 {"getaddrinfo", socket_getaddrinfo,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003446 METH_VARARGS, getaddrinfo_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003447 {"getnameinfo", socket_getnameinfo,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003448 METH_VARARGS, getnameinfo_doc},
Guido van Rossum1693ba82002-07-18 21:11:26 +00003449 {"getdefaulttimeout", (PyCFunction)socket_getdefaulttimeout,
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00003450 METH_NOARGS, getdefaulttimeout_doc},
3451 {"setdefaulttimeout", socket_setdefaulttimeout,
3452 METH_O, setdefaulttimeout_doc},
Guido van Rossum30a685f1991-06-27 15:51:29 +00003453 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003454};
3455
Guido van Rossum30a685f1991-06-27 15:51:29 +00003456
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003457#ifdef RISCOS
3458#define OS_INIT_DEFINED
Guido van Rossumbe32c891996-06-20 16:25:29 +00003459
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003460static int
3461os_init(void)
3462{
3463 _kernel_swi_regs r;
3464
3465 r.r[0] = 0;
3466 _kernel_swi(0x43380, &r, &r);
3467 taskwindow = r.r[0];
3468
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003469 return 1;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003470}
3471
3472#endif /* RISCOS */
3473
3474
3475#ifdef MS_WINDOWS
3476#define OS_INIT_DEFINED
3477
3478/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00003479
3480static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003481os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00003482{
3483 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00003484}
3485
3486static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003487os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00003488{
3489 WSADATA WSAData;
3490 int ret;
3491 char buf[100];
3492 ret = WSAStartup(0x0101, &WSAData);
3493 switch (ret) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003494 case 0: /* No error */
Mark Hammond14350ab2003-07-09 04:57:46 +00003495 Py_AtExit(os_cleanup);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003496 return 1; /* Success */
Guido van Rossumbe32c891996-06-20 16:25:29 +00003497 case WSASYSNOTREADY:
3498 PyErr_SetString(PyExc_ImportError,
3499 "WSAStartup failed: network not ready");
3500 break;
3501 case WSAVERNOTSUPPORTED:
3502 case WSAEINVAL:
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003503 PyErr_SetString(
3504 PyExc_ImportError,
3505 "WSAStartup failed: requested version not supported");
Guido van Rossumbe32c891996-06-20 16:25:29 +00003506 break;
3507 default:
Tim Peters885d4572001-11-28 20:27:42 +00003508 PyOS_snprintf(buf, sizeof(buf),
3509 "WSAStartup failed: error code %d", ret);
Guido van Rossumbe32c891996-06-20 16:25:29 +00003510 PyErr_SetString(PyExc_ImportError, buf);
3511 break;
3512 }
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003513 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00003514}
3515
Guido van Rossum8d665e61996-06-26 18:22:49 +00003516#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00003517
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003518
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003519#ifdef PYOS_OS2
3520#define OS_INIT_DEFINED
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003521
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003522/* Additional initialization for OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003523
3524static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003525os_init(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003526{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003527#ifndef PYCC_GCC
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003528 char reason[64];
3529 int rc = sock_init();
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003530
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003531 if (rc == 0) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003532 return 1; /* Success */
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003533 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003534
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003535 PyOS_snprintf(reason, sizeof(reason),
3536 "OS/2 TCP/IP Error# %d", sock_errno());
3537 PyErr_SetString(PyExc_ImportError, reason);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003538
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003539 return 0; /* Failure */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00003540#else
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003541 /* No need to initialise sockets with GCC/EMX */
3542 return 1; /* Success */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00003543#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003544}
3545
3546#endif /* PYOS_OS2 */
3547
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003548
3549#ifndef OS_INIT_DEFINED
3550static int
3551os_init(void)
3552{
3553 return 1; /* Success */
3554}
3555#endif
3556
3557
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00003558/* C API table - always add new things to the end for binary
3559 compatibility. */
3560static
3561PySocketModule_APIObject PySocketModuleAPI =
3562{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003563 &sock_type,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00003564};
3565
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003566
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003567/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003568
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003569 This module is actually called "_socket", and there's a wrapper
3570 "socket.py" which implements some additional functionality. On some
3571 platforms (e.g. Windows and OS/2), socket.py also implements a
3572 wrapper for the socket type that provides missing functionality such
3573 as makefile(), dup() and fromfd(). The import of "_socket" may fail
3574 with an ImportError exception if os-specific initialization fails.
3575 On Windows, this does WINSOCK initialization. When WINSOCK is
3576 initialized succesfully, a call to WSACleanup() is scheduled to be
3577 made at exit time.
3578*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003579
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003580PyDoc_STRVAR(socket_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003581"Implementation module for socket operations.\n\
3582\n\
3583See the socket module for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003584
Mark Hammondfe51c6d2002-08-02 02:27:13 +00003585PyMODINIT_FUNC
Thomas Wouters1e0c2f42000-07-24 16:06:23 +00003586init_socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003587{
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003588 PyObject *m, *has_ipv6;
Fred Drake4baedc12002-04-01 14:53:37 +00003589
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003590 if (!os_init())
Guido van Rossum0cb96de1997-10-01 04:29:29 +00003591 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003592
3593 sock_type.ob_type = &PyType_Type;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003594 m = Py_InitModule3(PySocket_MODULE_NAME,
3595 socket_methods,
3596 socket_doc);
3597
3598 socket_error = PyErr_NewException("socket.error", NULL, NULL);
3599 if (socket_error == NULL)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003600 return;
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