blob: 28e9877ea23f6e9ffe7e8f33fd5d7dc81a8028b5 [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
Martin v. Löwise9416172003-05-03 10:12:45 +0000325/*
326 * Constants for getnameinfo()
327 */
328#if !defined(NI_MAXHOST)
329#define NI_MAXHOST 1025
330#endif
331#if !defined(NI_MAXSERV)
332#define NI_MAXSERV 32
333#endif
334
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000335/* XXX There's a problem here: *static* functions are not supposed to have
336 a Py prefix (or use CapitalizedWords). Later... */
337
Guido van Rossum30a685f1991-06-27 15:51:29 +0000338/* Global variable holding the exception type for errors detected
339 by this module (but not argument type or memory errors, etc.). */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000340static PyObject *socket_error;
341static PyObject *socket_herror;
342static PyObject *socket_gaierror;
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000343static PyObject *socket_timeout;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000344
Guido van Rossum48a680c2001-03-02 06:34:14 +0000345#ifdef RISCOS
346/* Global variable which is !=0 if Python is running in a RISC OS taskwindow */
347static int taskwindow;
348#endif
349
Tim Peters643a7fc2002-02-17 04:13:21 +0000350/* A forward reference to the socket type object.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000351 The sock_type variable contains pointers to various functions,
352 some of which call new_sockobject(), which uses sock_type, so
Tim Peters643a7fc2002-02-17 04:13:21 +0000353 there has to be a circular reference. */
Jeremy Hylton938ace62002-07-17 16:30:39 +0000354static PyTypeObject sock_type;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000355
Guido van Rossum30a685f1991-06-27 15:51:29 +0000356/* Convenience function to raise an error according to errno
357 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000358
Guido van Rossum73624e91994-10-10 17:59:00 +0000359static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000360set_error(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000361{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000362#ifdef MS_WINDOWS
Mark Hammond46a733d2000-07-24 01:45:11 +0000363 int err_no = WSAGetLastError();
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000364 static struct {
365 int no;
366 const char *msg;
367 } *msgp, msgs[] = {
368 {WSAEINTR, "Interrupted system call"},
369 {WSAEBADF, "Bad file descriptor"},
370 {WSAEACCES, "Permission denied"},
371 {WSAEFAULT, "Bad address"},
372 {WSAEINVAL, "Invalid argument"},
373 {WSAEMFILE, "Too many open files"},
374 {WSAEWOULDBLOCK,
375 "The socket operation could not complete "
376 "without blocking"},
377 {WSAEINPROGRESS, "Operation now in progress"},
378 {WSAEALREADY, "Operation already in progress"},
379 {WSAENOTSOCK, "Socket operation on non-socket"},
380 {WSAEDESTADDRREQ, "Destination address required"},
381 {WSAEMSGSIZE, "Message too long"},
382 {WSAEPROTOTYPE, "Protocol wrong type for socket"},
383 {WSAENOPROTOOPT, "Protocol not available"},
384 {WSAEPROTONOSUPPORT, "Protocol not supported"},
385 {WSAESOCKTNOSUPPORT, "Socket type not supported"},
386 {WSAEOPNOTSUPP, "Operation not supported"},
387 {WSAEPFNOSUPPORT, "Protocol family not supported"},
388 {WSAEAFNOSUPPORT, "Address family not supported"},
389 {WSAEADDRINUSE, "Address already in use"},
390 {WSAEADDRNOTAVAIL, "Can't assign requested address"},
391 {WSAENETDOWN, "Network is down"},
392 {WSAENETUNREACH, "Network is unreachable"},
393 {WSAENETRESET, "Network dropped connection on reset"},
394 {WSAECONNABORTED, "Software caused connection abort"},
395 {WSAECONNRESET, "Connection reset by peer"},
396 {WSAENOBUFS, "No buffer space available"},
397 {WSAEISCONN, "Socket is already connected"},
398 {WSAENOTCONN, "Socket is not connected"},
399 {WSAESHUTDOWN, "Can't send after socket shutdown"},
400 {WSAETOOMANYREFS, "Too many references: can't splice"},
401 {WSAETIMEDOUT, "Operation timed out"},
402 {WSAECONNREFUSED, "Connection refused"},
403 {WSAELOOP, "Too many levels of symbolic links"},
404 {WSAENAMETOOLONG, "File name too long"},
405 {WSAEHOSTDOWN, "Host is down"},
406 {WSAEHOSTUNREACH, "No route to host"},
407 {WSAENOTEMPTY, "Directory not empty"},
408 {WSAEPROCLIM, "Too many processes"},
409 {WSAEUSERS, "Too many users"},
410 {WSAEDQUOT, "Disc quota exceeded"},
411 {WSAESTALE, "Stale NFS file handle"},
412 {WSAEREMOTE, "Too many levels of remote in path"},
413 {WSASYSNOTREADY, "Network subsystem is unvailable"},
414 {WSAVERNOTSUPPORTED, "WinSock version is not supported"},
415 {WSANOTINITIALISED,
416 "Successful WSAStartup() not yet performed"},
417 {WSAEDISCON, "Graceful shutdown in progress"},
418 /* Resolver errors */
419 {WSAHOST_NOT_FOUND, "No such host is known"},
420 {WSATRY_AGAIN, "Host not found, or server failed"},
421 {WSANO_RECOVERY, "Unexpected server error encountered"},
422 {WSANO_DATA, "Valid name without requested data"},
423 {WSANO_ADDRESS, "No address, look for MX record"},
424 {0, NULL}
425 };
Mark Hammond46a733d2000-07-24 01:45:11 +0000426 if (err_no) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000427 PyObject *v;
Mark Hammond46a733d2000-07-24 01:45:11 +0000428 const char *msg = "winsock error";
Guido van Rossum48a680c2001-03-02 06:34:14 +0000429
Mark Hammond46a733d2000-07-24 01:45:11 +0000430 for (msgp = msgs; msgp->msg; msgp++) {
431 if (err_no == msgp->no) {
432 msg = msgp->msg;
433 break;
434 }
435 }
436
437 v = Py_BuildValue("(is)", err_no, msg);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000438 if (v != NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000439 PyErr_SetObject(socket_error, v);
Guido van Rossum73624e91994-10-10 17:59:00 +0000440 Py_DECREF(v);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000441 }
442 return NULL;
443 }
444 else
445#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000446
Andrew MacIntyreba43e872002-03-03 03:03:52 +0000447#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000448 if (sock_errno() != NO_ERROR) {
449 APIRET rc;
450 ULONG msglen;
451 char outbuf[100];
452 int myerrorcode = sock_errno();
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000453
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000454 /* Retrieve socket-related error message from MPTN.MSG file */
455 rc = DosGetMessage(NULL, 0, outbuf, sizeof(outbuf),
456 myerrorcode - SOCBASEERR + 26,
457 "mptn.msg",
458 &msglen);
459 if (rc == NO_ERROR) {
460 PyObject *v;
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000461
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000462 /* OS/2 doesn't guarantee a terminator */
463 outbuf[msglen] = '\0';
464 if (strlen(outbuf) > 0) {
465 /* If non-empty msg, trim CRLF */
466 char *lastc = &outbuf[ strlen(outbuf)-1 ];
467 while (lastc > outbuf && isspace(*lastc)) {
468 /* Trim trailing whitespace (CRLF) */
469 *lastc-- = '\0';
470 }
471 }
472 v = Py_BuildValue("(is)", myerrorcode, outbuf);
473 if (v != NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000474 PyErr_SetObject(socket_error, v);
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000475 Py_DECREF(v);
476 }
477 return NULL;
478 }
479 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000480#endif
481
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000482#if defined(RISCOS)
483 if (_inet_error.errnum != NULL) {
484 PyObject *v;
485 v = Py_BuildValue("(is)", errno, _inet_err());
486 if (v != NULL) {
487 PyErr_SetObject(socket_error, v);
488 Py_DECREF(v);
489 }
490 return NULL;
491 }
492#endif
493
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000494 return PyErr_SetFromErrno(socket_error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000495}
496
Guido van Rossum30a685f1991-06-27 15:51:29 +0000497
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000498static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000499set_herror(int h_error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000500{
501 PyObject *v;
502
503#ifdef HAVE_HSTRERROR
504 v = Py_BuildValue("(is)", h_error, (char *)hstrerror(h_error));
505#else
506 v = Py_BuildValue("(is)", h_error, "host not found");
507#endif
508 if (v != NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000509 PyErr_SetObject(socket_herror, v);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000510 Py_DECREF(v);
511 }
512
513 return NULL;
514}
515
516
517static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000518set_gaierror(int error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000519{
520 PyObject *v;
521
Martin v. Löwis272cb402002-03-01 08:31:07 +0000522#ifdef EAI_SYSTEM
523 /* EAI_SYSTEM is not available on Windows XP. */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000524 if (error == EAI_SYSTEM)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000525 return set_error();
Martin v. Löwis272cb402002-03-01 08:31:07 +0000526#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000527
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000528#ifdef HAVE_GAI_STRERROR
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000529 v = Py_BuildValue("(is)", error, gai_strerror(error));
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000530#else
531 v = Py_BuildValue("(is)", error, "getaddrinfo failed");
532#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000533 if (v != NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000534 PyErr_SetObject(socket_gaierror, v);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000535 Py_DECREF(v);
536 }
537
538 return NULL;
539}
540
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000541/* Function to perform the setting of socket blocking mode
542 internally. block = (1 | 0). */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000543static int
544internal_setblocking(PySocketSockObject *s, int block)
545{
546#ifndef RISCOS
547#ifndef MS_WINDOWS
548 int delay_flag;
549#endif
550#endif
551
552 Py_BEGIN_ALLOW_THREADS
553#ifdef __BEOS__
554 block = !block;
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000555 setsockopt(s->sock_fd, SOL_SOCKET, SO_NONBLOCK,
556 (void *)(&block), sizeof(int));
Guido van Rossum67f7a382002-06-06 21:08:16 +0000557#else
558#ifndef RISCOS
559#ifndef MS_WINDOWS
560#if defined(PYOS_OS2) && !defined(PYCC_GCC)
561 block = !block;
562 ioctl(s->sock_fd, FIONBIO, (caddr_t)&block, sizeof(block));
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000563#elif defined(__VMS)
564 block = !block;
565 ioctl(s->sock_fd, FIONBIO, (char *)&block);
566#else /* !PYOS_OS2 && !_VMS */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000567 delay_flag = fcntl(s->sock_fd, F_GETFL, 0);
568 if (block)
Neal Norwitz39d22e52002-11-02 19:55:21 +0000569 delay_flag &= (~O_NONBLOCK);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000570 else
Neal Norwitz39d22e52002-11-02 19:55:21 +0000571 delay_flag |= O_NONBLOCK;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000572 fcntl(s->sock_fd, F_SETFL, delay_flag);
573#endif /* !PYOS_OS2 */
574#else /* MS_WINDOWS */
575 block = !block;
576 ioctlsocket(s->sock_fd, FIONBIO, (u_long*)&block);
577#endif /* MS_WINDOWS */
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000578#else /* RISCOS */
579 block = !block;
580 socketioctl(s->sock_fd, FIONBIO, (u_long*)&block);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000581#endif /* RISCOS */
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000582#endif /* __BEOS__ */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000583 Py_END_ALLOW_THREADS
584
585 /* Since these don't return anything */
586 return 1;
587}
588
Guido van Rossum11ba0942002-06-13 15:07:44 +0000589/* Do a select() on the socket, if necessary (sock_timeout > 0).
590 The argument writing indicates the direction.
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000591 This does not raise an exception; we'll let our caller do that
592 after they've reacquired the interpreter lock.
593 Returns 1 on timeout, 0 otherwise. */
594static int
Guido van Rossumb9e916a2002-06-07 01:42:47 +0000595internal_select(PySocketSockObject *s, int writing)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000596{
597 fd_set fds;
598 struct timeval tv;
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000599 int n;
Guido van Rossum11ba0942002-06-13 15:07:44 +0000600
Guido van Rossumad654902002-07-19 12:44:59 +0000601 /* Nothing to do unless we're in timeout mode (not non-blocking) */
Guido van Rossum11ba0942002-06-13 15:07:44 +0000602 if (s->sock_timeout <= 0.0)
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000603 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000604
Guido van Rossumad654902002-07-19 12:44:59 +0000605 /* Guard against closed socket */
606 if (s->sock_fd < 0)
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000607 return 0;
Guido van Rossumad654902002-07-19 12:44:59 +0000608
Guido van Rossum67f7a382002-06-06 21:08:16 +0000609 /* Construct the arguments to select */
610 tv.tv_sec = (int)s->sock_timeout;
Guido van Rossumb9e916a2002-06-07 01:42:47 +0000611 tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000612 FD_ZERO(&fds);
613 FD_SET(s->sock_fd, &fds);
614
615 /* See if the socket is ready */
Guido van Rossumb9e916a2002-06-07 01:42:47 +0000616 if (writing)
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000617 n = select(s->sock_fd+1, NULL, &fds, NULL, &tv);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000618 else
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000619 n = select(s->sock_fd+1, &fds, NULL, NULL, &tv);
620 if (n == 0)
621 return 1;
622 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000623}
624
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000625/* Initialize a new socket object. */
626
Tim Petersa12b4cf2002-07-18 22:38:44 +0000627static double defaulttimeout = -1.0; /* Default timeout for new sockets */
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000628
Mark Hammond62b1ab12002-07-23 06:31:15 +0000629PyMODINIT_FUNC
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000630init_sockobject(PySocketSockObject *s,
631 SOCKET_T fd, int family, int type, int proto)
632{
633#ifdef RISCOS
634 int block = 1;
635#endif
636 s->sock_fd = fd;
637 s->sock_family = family;
638 s->sock_type = type;
639 s->sock_proto = proto;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000640 s->sock_timeout = defaulttimeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000641
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000642 s->errorhandler = &set_error;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000643
644 if (defaulttimeout >= 0.0)
645 internal_setblocking(s, 0);
646
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000647#ifdef RISCOS
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000648 if (taskwindow)
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000649 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000650#endif
651}
652
653
Guido van Rossum30a685f1991-06-27 15:51:29 +0000654/* Create a new socket object.
655 This just creates the object and initializes it.
656 If the creation fails, return NULL and set an exception (implicit
657 in NEWOBJ()). */
658
Guido van Rossum73624e91994-10-10 17:59:00 +0000659static PySocketSockObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000660new_sockobject(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000661{
Guido van Rossum73624e91994-10-10 17:59:00 +0000662 PySocketSockObject *s;
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000663 s = (PySocketSockObject *)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000664 PyType_GenericNew(&sock_type, NULL, NULL);
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000665 if (s != NULL)
666 init_sockobject(s, fd, family, type, proto);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000667 return s;
668}
669
Guido van Rossum30a685f1991-06-27 15:51:29 +0000670
Guido van Rossum48a680c2001-03-02 06:34:14 +0000671/* Lock to allow python interpreter to continue, but only allow one
Just van Rossum1040d2c2003-05-09 07:53:18 +0000672 thread to be in gethostbyname or getaddrinfo */
673#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
674PyThread_type_lock netdb_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000675#endif
676
677
Guido van Rossum30a685f1991-06-27 15:51:29 +0000678/* Convert a string specifying a host name or one of a few symbolic
679 names to a numeric IP address. This usually calls gethostbyname()
680 to do the work; the names "" and "<broadcast>" are special.
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000681 Return the length (IPv4 should be 4 bytes), or negative if
Guido van Rossum30a685f1991-06-27 15:51:29 +0000682 an error occurred; then an exception is raised. */
683
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000684static int
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000685setipaddr(char *name, struct sockaddr *addr_ret, size_t addr_ret_size, int af)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000686{
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000687 struct addrinfo hints, *res;
688 int error;
Anthony Baxter0e85f9d2003-05-02 15:40:46 +0000689 int d1, d2, d3, d4;
690 char ch;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000691
Guido van Rossuma376cc51996-12-05 23:43:35 +0000692 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
Guido van Rossum30a685f1991-06-27 15:51:29 +0000693 if (name[0] == '\0') {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000694 int siz;
695 memset(&hints, 0, sizeof(hints));
696 hints.ai_family = af;
697 hints.ai_socktype = SOCK_DGRAM; /*dummy*/
698 hints.ai_flags = AI_PASSIVE;
Just van Rossum1040d2c2003-05-09 07:53:18 +0000699 Py_BEGIN_ALLOW_THREADS
700 ACQUIRE_GETADDRINFO_LOCK
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000701 error = getaddrinfo(NULL, "0", &hints, &res);
Just van Rossum1040d2c2003-05-09 07:53:18 +0000702 Py_END_ALLOW_THREADS
703 /* We assume that those thread-unsafe getaddrinfo() versions
704 *are* safe regarding their return value, ie. that a
705 subsequent call to getaddrinfo() does not destroy the
706 outcome of the first call. */
707 RELEASE_GETADDRINFO_LOCK
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000708 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000709 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000710 return -1;
711 }
712 switch (res->ai_family) {
713 case AF_INET:
714 siz = 4;
715 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000716#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000717 case AF_INET6:
718 siz = 16;
719 break;
720#endif
721 default:
722 freeaddrinfo(res);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000723 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000724 "unsupported address family");
725 return -1;
726 }
727 if (res->ai_next) {
Martin v. Löwisf0b11d22001-11-07 08:31:03 +0000728 freeaddrinfo(res);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000729 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000730 "wildcard resolved to multiple address");
731 return -1;
732 }
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000733 if (res->ai_addrlen < addr_ret_size)
734 addr_ret_size = res->ai_addrlen;
735 memcpy(addr_ret, res->ai_addr, addr_ret_size);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000736 freeaddrinfo(res);
737 return siz;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000738 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000739 if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000740 struct sockaddr_in *sin;
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +0000741 if (af != AF_INET && af != AF_UNSPEC) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000742 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000743 "address family mismatched");
744 return -1;
745 }
746 sin = (struct sockaddr_in *)addr_ret;
747 memset((void *) sin, '\0', sizeof(*sin));
748 sin->sin_family = AF_INET;
749#ifdef HAVE_SOCKADDR_SA_LEN
750 sin->sin_len = sizeof(*sin);
751#endif
752 sin->sin_addr.s_addr = INADDR_BROADCAST;
753 return sizeof(sin->sin_addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000754 }
Anthony Baxter0e85f9d2003-05-02 15:40:46 +0000755 if (sscanf(name, "%d.%d.%d.%d%c", &d1, &d2, &d3, &d4, &ch) == 4 &&
756 0 <= d1 && d1 <= 255 && 0 <= d2 && d2 <= 255 &&
757 0 <= d3 && d3 <= 255 && 0 <= d4 && d4 <= 255) {
758 struct sockaddr_in *sin;
759 sin = (struct sockaddr_in *)addr_ret;
760 sin->sin_addr.s_addr = htonl(
761 ((long) d1 << 24) | ((long) d2 << 16) |
762 ((long) d3 << 8) | ((long) d4 << 0));
763 sin->sin_family = AF_INET;
764#ifdef HAVE_SOCKADDR_SA_LEN
765 sin->sin_len = sizeof(*sin);
766#endif
767 return 4;
768 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000769 memset(&hints, 0, sizeof(hints));
770 hints.ai_family = af;
Just van Rossum1040d2c2003-05-09 07:53:18 +0000771 Py_BEGIN_ALLOW_THREADS
772 ACQUIRE_GETADDRINFO_LOCK
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000773 error = getaddrinfo(name, NULL, &hints, &res);
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000774#if defined(__digital__) && defined(__unix__)
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000775 if (error == EAI_NONAME && af == AF_UNSPEC) {
776 /* On Tru64 V5.1, numeric-to-addr conversion fails
777 if no address family is given. Assume IPv4 for now.*/
778 hints.ai_family = AF_INET;
779 error = getaddrinfo(name, NULL, &hints, &res);
780 }
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000781#endif
Just van Rossum1040d2c2003-05-09 07:53:18 +0000782 Py_END_ALLOW_THREADS
783 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000784 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000785 set_gaierror(error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000786 return -1;
787 }
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000788 if (res->ai_addrlen < addr_ret_size)
789 addr_ret_size = res->ai_addrlen;
790 memcpy((char *) addr_ret, res->ai_addr, addr_ret_size);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000791 freeaddrinfo(res);
792 switch (addr_ret->sa_family) {
793 case AF_INET:
794 return 4;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000795#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000796 case AF_INET6:
797 return 16;
Guido van Rossum955becc1999-03-22 20:14:53 +0000798#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000799 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000800 PyErr_SetString(socket_error, "unknown address family");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000801 return -1;
802 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000803}
804
Guido van Rossum30a685f1991-06-27 15:51:29 +0000805
Guido van Rossum30a685f1991-06-27 15:51:29 +0000806/* Create a string object representing an IP address.
807 This is always a string of the form 'dd.dd.dd.dd' (with variable
808 size numbers). */
809
Guido van Rossum73624e91994-10-10 17:59:00 +0000810static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000811makeipaddr(struct sockaddr *addr, int addrlen)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000812{
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000813 char buf[NI_MAXHOST];
814 int error;
815
816 error = getnameinfo(addr, addrlen, buf, sizeof(buf), NULL, 0,
817 NI_NUMERICHOST);
818 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000819 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000820 return NULL;
821 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000822 return PyString_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000823}
824
825
826/* Create an object representing the given socket address,
827 suitable for passing it back to bind(), connect() etc.
828 The family field of the sockaddr structure is inspected
829 to determine what kind of address it really is. */
830
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000831/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000832static PyObject *
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000833makesockaddr(int sockfd, struct sockaddr *addr, int addrlen)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000834{
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000835 if (addrlen == 0) {
836 /* No address -- may be recvfrom() from known socket */
Guido van Rossum73624e91994-10-10 17:59:00 +0000837 Py_INCREF(Py_None);
838 return Py_None;
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000839 }
840
Guido van Rossumbcc20741998-08-04 22:53:56 +0000841#ifdef __BEOS__
Guido van Rossum2c8bcb82000-04-25 21:34:53 +0000842 /* XXX: BeOS version of accept() doesn't set family correctly */
Guido van Rossumbcc20741998-08-04 22:53:56 +0000843 addr->sa_family = AF_INET;
844#endif
845
Guido van Rossum30a685f1991-06-27 15:51:29 +0000846 switch (addr->sa_family) {
847
848 case AF_INET:
849 {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000850 struct sockaddr_in *a;
851 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
Barry Warsaw752300b1997-01-03 17:18:10 +0000852 PyObject *ret = NULL;
853 if (addrobj) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000854 a = (struct sockaddr_in *)addr;
Barry Warsaw752300b1997-01-03 17:18:10 +0000855 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
856 Py_DECREF(addrobj);
857 }
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000858 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000859 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000860
Andrew MacIntyre34d3e2d2003-01-02 12:45:34 +0000861#if defined(AF_UNIX) && !defined(PYOS_OS2)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000862 case AF_UNIX:
863 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000864 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000865 return PyString_FromString(a->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000866 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000867#endif /* AF_UNIX */
868
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000869#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000870 case AF_INET6:
871 {
872 struct sockaddr_in6 *a;
873 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
874 PyObject *ret = NULL;
875 if (addrobj) {
876 a = (struct sockaddr_in6 *)addr;
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000877 ret = Py_BuildValue("Oiii",
878 addrobj,
879 ntohs(a->sin6_port),
880 a->sin6_flowinfo,
881 a->sin6_scope_id);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000882 Py_DECREF(addrobj);
883 }
884 return ret;
885 }
Jeremy Hylton22308652001-02-02 03:23:09 +0000886#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +0000887
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +0000888#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +0000889 case AF_PACKET:
890 {
891 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
892 char *ifname = "";
893 struct ifreq ifr;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000894 /* need to look up interface name give index */
895 if (a->sll_ifindex) {
Jeremy Hylton22308652001-02-02 03:23:09 +0000896 ifr.ifr_ifindex = a->sll_ifindex;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000897 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
Jeremy Hylton22308652001-02-02 03:23:09 +0000898 ifname = ifr.ifr_name;
Jeremy Hylton22308652001-02-02 03:23:09 +0000899 }
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000900 return Py_BuildValue("shbhs#",
901 ifname,
902 ntohs(a->sll_protocol),
903 a->sll_pkttype,
904 a->sll_hatype,
905 a->sll_addr,
906 a->sll_halen);
Jeremy Hylton22308652001-02-02 03:23:09 +0000907 }
908#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000909
Guido van Rossum30a685f1991-06-27 15:51:29 +0000910 /* More cases here... */
911
912 default:
Guido van Rossumaa948df1997-05-07 17:41:48 +0000913 /* If we don't know the address family, don't raise an
914 exception -- return it as a tuple. */
915 return Py_BuildValue("is#",
916 addr->sa_family,
917 addr->sa_data,
918 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000919
Guido van Rossum30a685f1991-06-27 15:51:29 +0000920 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000921}
922
Guido van Rossum30a685f1991-06-27 15:51:29 +0000923
924/* Parse a socket address argument according to the socket object's
925 address family. Return 1 if the address was in the proper format,
926 0 of not. The address is returned through addr_ret, its length
927 through len_ret. */
928
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000929static int
Guido van Rossum48a680c2001-03-02 06:34:14 +0000930getsockaddrarg(PySocketSockObject *s, PyObject *args,
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000931 struct sockaddr **addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000932{
Guido van Rossum30a685f1991-06-27 15:51:29 +0000933 switch (s->sock_family) {
934
Andrew MacIntyre34d3e2d2003-01-02 12:45:34 +0000935#if defined(AF_UNIX) && !defined(PYOS_OS2)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000936 case AF_UNIX:
937 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000938 struct sockaddr_un* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000939 char *path;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000940 int len;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000941 addr = (struct sockaddr_un*)&(s->sock_addr).un;
Guido van Rossum7e488981998-10-08 02:25:24 +0000942 if (!PyArg_Parse(args, "t#", &path, &len))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000943 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000944 if (len > sizeof addr->sun_path) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000945 PyErr_SetString(socket_error,
Barry Warsaw752300b1997-01-03 17:18:10 +0000946 "AF_UNIX path too long");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000947 return 0;
948 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000949 addr->sun_family = s->sock_family;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000950 memcpy(addr->sun_path, path, len);
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000951 addr->sun_path[len] = 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000952 *addr_ret = (struct sockaddr *) addr;
Guido van Rossum65af28a1996-06-11 18:36:33 +0000953 *len_ret = len + sizeof(*addr) - sizeof(addr->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000954 return 1;
955 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000956#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000957
Guido van Rossum30a685f1991-06-27 15:51:29 +0000958 case AF_INET:
959 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000960 struct sockaddr_in* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000961 char *host;
Martin v. Löwis5db099a2003-08-07 11:55:15 +0000962 int port, result;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000963 addr=(struct sockaddr_in*)&(s->sock_addr).in;
Guido van Rossume4dad902000-12-01 13:13:11 +0000964 if (!PyTuple_Check(args)) {
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000965 PyErr_Format(
966 PyExc_TypeError,
967 "getsockaddrarg: "
968 "AF_INET address must be tuple, not %.500s",
969 args->ob_type->tp_name);
Guido van Rossume4dad902000-12-01 13:13:11 +0000970 return 0;
971 }
Martin v. Löwis2548c732003-04-18 10:39:54 +0000972 if (!PyArg_ParseTuple(args, "eti:getsockaddrarg",
973 "idna", &host, &port))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000974 return 0;
Martin v. Löwis5db099a2003-08-07 11:55:15 +0000975 result = setipaddr(host, (struct sockaddr *)addr,
976 sizeof(*addr), AF_INET);
977 PyMem_Free(host);
978 if (result < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000979 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000980 addr->sin_family = AF_INET;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000981 addr->sin_port = htons((short)port);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000982 *addr_ret = (struct sockaddr *) addr;
983 *len_ret = sizeof *addr;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000984 return 1;
985 }
986
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000987#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000988 case AF_INET6:
989 {
990 struct sockaddr_in6* addr;
991 char *host;
Martin v. Löwis5db099a2003-08-07 11:55:15 +0000992 int port, flowinfo, scope_id, result;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000993 addr = (struct sockaddr_in6*)&(s->sock_addr).in6;
994 flowinfo = scope_id = 0;
Martin v. Löwis2548c732003-04-18 10:39:54 +0000995 if (!PyArg_ParseTuple(args, "eti|ii",
996 "idna", &host, &port, &flowinfo,
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000997 &scope_id)) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000998 return 0;
999 }
Martin v. Löwis5db099a2003-08-07 11:55:15 +00001000 result = setipaddr(host, (struct sockaddr *)addr,
1001 sizeof(*addr), AF_INET6);
1002 PyMem_Free(host);
1003 if (result < 0)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001004 return 0;
1005 addr->sin6_family = s->sock_family;
1006 addr->sin6_port = htons((short)port);
1007 addr->sin6_flowinfo = flowinfo;
1008 addr->sin6_scope_id = scope_id;
1009 *addr_ret = (struct sockaddr *) addr;
1010 *len_ret = sizeof *addr;
1011 return 1;
1012 }
1013#endif
1014
Martin v. Löwis12af0482004-01-31 12:34:17 +00001015#ifdef HAVE_BLUETOOTH_BLUETOOTH_H
1016 case AF_BLUETOOTH:
1017 {
1018 switch( s->sock_proto )
1019 {
1020 case BTPROTO_L2CAP:
1021 {
1022 struct sockaddr_l2* addr = (struct sockaddr_l2*) &(s->sock_addr).bt_l2;
1023 bdaddr_t* bdaddr = &(addr->l2_bdaddr);
1024
1025 addr->l2_family = AF_BLUETOOTH;
1026 if( !PyArg_ParseTuple(args, "(iiiiii)i", &bdaddr->b[0], &bdaddr->b[1], &bdaddr->b[2], &bdaddr->b[3], &bdaddr->b[4], &bdaddr->b[5], &addr->l2_psm) )
1027 {
1028 PyErr_SetString(socket_error, "getsockaddrarg: wrong format");
1029 return 0;
1030 }
1031
1032 *addr_ret = (struct sockaddr *) addr;
1033 *len_ret = sizeof *addr;
1034 return 1;
1035 }
1036 case BTPROTO_RFCOMM:
1037 {
1038 struct sockaddr_rc* addr = (struct sockaddr_rc*) &(s->sock_addr).bt_rc;
1039 bdaddr_t* bdaddr = &(addr->rc_bdaddr);
1040
1041 addr->rc_family = AF_BLUETOOTH;
1042 if( !PyArg_ParseTuple(args, "(iiiiii)i", &bdaddr->b[0], &bdaddr->b[1], &bdaddr->b[2], &bdaddr->b[3], &bdaddr->b[4], &bdaddr->b[5], &addr->rc_channel) )
1043 {
1044 PyErr_SetString(socket_error, "getsockaddrarg: wrong format");
1045 return 0;
1046 }
1047
1048 *addr_ret = (struct sockaddr *) addr;
1049 *len_ret = sizeof *addr;
1050 return 1;
1051 }
1052 case BTPROTO_SCO:
1053 {
1054 struct sockaddr_sco* addr = (struct sockaddr_sco*) &(s->sock_addr).bt_sco;
1055 bdaddr_t* bdaddr = &(addr->sco_bdaddr);
1056
1057 addr->sco_family = AF_BLUETOOTH;
1058 if( !PyArg_ParseTuple(args, "iiiiii", &bdaddr->b[0], &bdaddr->b[1], &bdaddr->b[2], &bdaddr->b[3], &bdaddr->b[4], &bdaddr->b[5]) )
1059 {
1060 PyErr_SetString(socket_error, "getsockaddrarg: wrong format");
1061 return 0;
1062 }
1063
1064 *addr_ret = (struct sockaddr *) addr;
1065 *len_ret = sizeof *addr;
1066 return 1;
1067 }
1068 default:
1069 {
1070 PyErr_SetString(socket_error, "getsockaddrarg: unknown Bluetooth protocol");
1071 return 0;
1072 }
1073 }
1074 }
1075#endif
1076
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00001077#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +00001078 case AF_PACKET:
1079 {
1080 struct sockaddr_ll* addr;
1081 struct ifreq ifr;
1082 char *interfaceName;
1083 int protoNumber;
1084 int hatype = 0;
1085 int pkttype = 0;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001086 char *haddr;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001087
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001088 if (!PyArg_ParseTuple(args, "si|iis", &interfaceName,
1089 &protoNumber, &pkttype, &hatype, &haddr))
Jeremy Hylton22308652001-02-02 03:23:09 +00001090 return 0;
1091 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
1092 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001093 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001094 s->errorhandler();
Jeremy Hylton22308652001-02-02 03:23:09 +00001095 return 0;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001096 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001097 addr = &(s->sock_addr.ll);
1098 addr->sll_family = AF_PACKET;
1099 addr->sll_protocol = htons((short)protoNumber);
1100 addr->sll_ifindex = ifr.ifr_ifindex;
1101 addr->sll_pkttype = pkttype;
1102 addr->sll_hatype = hatype;
1103 *addr_ret = (struct sockaddr *) addr;
1104 *len_ret = sizeof *addr;
1105 return 1;
1106 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00001107#endif
1108
Guido van Rossum30a685f1991-06-27 15:51:29 +00001109 /* More cases here... */
1110
1111 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001112 PyErr_SetString(socket_error, "getsockaddrarg: bad family");
Guido van Rossum30a685f1991-06-27 15:51:29 +00001113 return 0;
1114
1115 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001116}
1117
Guido van Rossum30a685f1991-06-27 15:51:29 +00001118
Guido van Rossum48a680c2001-03-02 06:34:14 +00001119/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +00001120 Return 1 if the family is known, 0 otherwise. The length is returned
1121 through len_ret. */
1122
1123static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +00001124getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +00001125{
1126 switch (s->sock_family) {
1127
Andrew MacIntyre34d3e2d2003-01-02 12:45:34 +00001128#if defined(AF_UNIX) && !defined(PYOS_OS2)
Guido van Rossum710e1df1992-06-12 10:39:36 +00001129 case AF_UNIX:
1130 {
1131 *len_ret = sizeof (struct sockaddr_un);
1132 return 1;
1133 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001134#endif /* AF_UNIX */
Guido van Rossum710e1df1992-06-12 10:39:36 +00001135
1136 case AF_INET:
1137 {
1138 *len_ret = sizeof (struct sockaddr_in);
1139 return 1;
1140 }
1141
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001142#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001143 case AF_INET6:
1144 {
1145 *len_ret = sizeof (struct sockaddr_in6);
1146 return 1;
1147 }
1148#endif
1149
Martin v. Löwis12af0482004-01-31 12:34:17 +00001150#ifdef HAVE_BLUETOOTH_BLUETOOTH_H
1151 case AF_BLUETOOTH:
1152 {
1153 switch(s->sock_proto)
1154 {
1155 case BTPROTO_L2CAP:
1156 {
1157 *len_ret = sizeof (struct sockaddr_l2);
1158 return 1;
1159 }
1160 case BTPROTO_RFCOMM:
1161 {
1162 *len_ret = sizeof (struct sockaddr_rc);
1163 return 1;
1164 }
1165 case BTPROTO_SCO:
1166 {
1167 *len_ret = sizeof (struct sockaddr_sco);
1168 return 1;
1169 }
1170 default:
1171 {
1172 PyErr_SetString(socket_error, "getsockaddrlen: unknown BT protocol");
1173 return 0;
1174 }
1175 }
1176 }
1177#endif
1178
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00001179#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +00001180 case AF_PACKET:
1181 {
1182 *len_ret = sizeof (struct sockaddr_ll);
1183 return 1;
1184 }
1185#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001186
Guido van Rossum710e1df1992-06-12 10:39:36 +00001187 /* More cases here... */
1188
1189 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001190 PyErr_SetString(socket_error, "getsockaddrlen: bad family");
Guido van Rossum710e1df1992-06-12 10:39:36 +00001191 return 0;
1192
1193 }
1194}
1195
1196
Guido van Rossum30a685f1991-06-27 15:51:29 +00001197/* s.accept() method */
1198
Guido van Rossum73624e91994-10-10 17:59:00 +00001199static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001200sock_accept(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001201{
1202 char addrbuf[256];
Fred Drakea04eaad2000-06-30 02:46:07 +00001203 SOCKET_T newfd;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001204 socklen_t addrlen;
Barry Warsaw752300b1997-01-03 17:18:10 +00001205 PyObject *sock = NULL;
1206 PyObject *addr = NULL;
1207 PyObject *res = NULL;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001208 int timeout;
Barry Warsaw752300b1997-01-03 17:18:10 +00001209
Guido van Rossum710e1df1992-06-12 10:39:36 +00001210 if (!getsockaddrlen(s, &addrlen))
1211 return NULL;
Fred Drakefd168342001-05-09 19:11:33 +00001212 memset(addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001213
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001214#ifdef MS_WINDOWS
1215 newfd = INVALID_SOCKET;
1216#else
1217 newfd = -1;
1218#endif
1219
Guido van Rossum73624e91994-10-10 17:59:00 +00001220 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001221 timeout = internal_select(s, 0);
1222 if (!timeout)
1223 newfd = accept(s->sock_fd, (struct sockaddr *) addrbuf,
1224 &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001225 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001226
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001227 if (timeout) {
1228 PyErr_SetString(socket_timeout, "timed out");
1229 return NULL;
1230 }
1231
Fred Drakea04eaad2000-06-30 02:46:07 +00001232#ifdef MS_WINDOWS
1233 if (newfd == INVALID_SOCKET)
1234#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001235 if (newfd < 0)
Fred Drakea04eaad2000-06-30 02:46:07 +00001236#endif
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001237 return s->errorhandler();
Barry Warsaw752300b1997-01-03 17:18:10 +00001238
Guido van Rossum30a685f1991-06-27 15:51:29 +00001239 /* Create the new object with unspecified family,
1240 to avoid calls to bind() etc. on it. */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001241 sock = (PyObject *) new_sockobject(newfd,
1242 s->sock_family,
1243 s->sock_type,
1244 s->sock_proto);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001245
Barry Warsaw752300b1997-01-03 17:18:10 +00001246 if (sock == NULL) {
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001247 SOCKETCLOSE(newfd);
Barry Warsaw752300b1997-01-03 17:18:10 +00001248 goto finally;
1249 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00001250 addr = makesockaddr(s->sock_fd, (struct sockaddr *)addrbuf,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001251 addrlen);
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001252 if (addr == NULL)
Barry Warsaw752300b1997-01-03 17:18:10 +00001253 goto finally;
1254
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001255 res = PyTuple_Pack(2, sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00001256
Guido van Rossum67f7a382002-06-06 21:08:16 +00001257finally:
Guido van Rossum73624e91994-10-10 17:59:00 +00001258 Py_XDECREF(sock);
1259 Py_XDECREF(addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001260 return res;
1261}
1262
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001263PyDoc_STRVAR(accept_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001264"accept() -> (socket object, address info)\n\
1265\n\
1266Wait for an incoming connection. Return a new socket representing the\n\
1267connection, and the address of the client. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001268info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001269
Guido van Rossum11ba0942002-06-13 15:07:44 +00001270/* s.setblocking(flag) method. Argument:
1271 False -- non-blocking mode; same as settimeout(0)
1272 True -- blocking mode; same as settimeout(None)
1273*/
Guido van Rossume4485b01994-09-07 14:32:49 +00001274
Guido van Rossum73624e91994-10-10 17:59:00 +00001275static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001276sock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00001277{
1278 int block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001279
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001280 block = PyInt_AsLong(arg);
1281 if (block == -1 && PyErr_Occurred())
Guido van Rossume4485b01994-09-07 14:32:49 +00001282 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001283
Guido van Rossum11ba0942002-06-13 15:07:44 +00001284 s->sock_timeout = block ? -1.0 : 0.0;
Guido van Rossume8008f02002-06-07 03:36:20 +00001285 internal_setblocking(s, block);
Guido van Rossume4485b01994-09-07 14:32:49 +00001286
Guido van Rossum73624e91994-10-10 17:59:00 +00001287 Py_INCREF(Py_None);
1288 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +00001289}
Guido van Rossume4485b01994-09-07 14:32:49 +00001290
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001291PyDoc_STRVAR(setblocking_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001292"setblocking(flag)\n\
1293\n\
1294Set the socket to blocking (flag is true) or non-blocking (false).\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00001295setblocking(True) is equivalent to settimeout(None);\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001296setblocking(False) is equivalent to settimeout(0.0).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001297
Guido van Rossum11ba0942002-06-13 15:07:44 +00001298/* s.settimeout(timeout) method. Argument:
1299 None -- no timeout, blocking mode; same as setblocking(True)
1300 0.0 -- non-blocking mode; same as setblocking(False)
1301 > 0 -- timeout mode; operations time out after timeout seconds
1302 < 0 -- illegal; raises an exception
1303*/
Guido van Rossum67f7a382002-06-06 21:08:16 +00001304static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001305sock_settimeout(PySocketSockObject *s, PyObject *arg)
Guido van Rossum67f7a382002-06-06 21:08:16 +00001306{
Guido van Rossum11ba0942002-06-13 15:07:44 +00001307 double timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001308
1309 if (arg == Py_None)
Guido van Rossum11ba0942002-06-13 15:07:44 +00001310 timeout = -1.0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001311 else {
Guido van Rossum11ba0942002-06-13 15:07:44 +00001312 timeout = PyFloat_AsDouble(arg);
1313 if (timeout < 0.0) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00001314 if (!PyErr_Occurred())
1315 PyErr_SetString(PyExc_ValueError,
Guido van Rossum11ba0942002-06-13 15:07:44 +00001316 "Timeout value out of range");
Guido van Rossum67f7a382002-06-06 21:08:16 +00001317 return NULL;
1318 }
1319 }
1320
Guido van Rossum11ba0942002-06-13 15:07:44 +00001321 s->sock_timeout = timeout;
1322 internal_setblocking(s, timeout < 0.0);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001323
1324 Py_INCREF(Py_None);
1325 return Py_None;
1326}
1327
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001328PyDoc_STRVAR(settimeout_doc,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001329"settimeout(timeout)\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00001330\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00001331Set a timeout on socket operations. 'timeout' can be a float,\n\
1332giving in seconds, or None. Setting a timeout of None disables\n\
1333the timeout feature and is equivalent to setblocking(1).\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001334Setting a timeout of zero is the same as setblocking(0).");
Guido van Rossum67f7a382002-06-06 21:08:16 +00001335
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001336/* s.gettimeout() method.
1337 Returns the timeout associated with a socket. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00001338static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001339sock_gettimeout(PySocketSockObject *s)
Guido van Rossum67f7a382002-06-06 21:08:16 +00001340{
1341 if (s->sock_timeout < 0.0) {
1342 Py_INCREF(Py_None);
1343 return Py_None;
1344 }
1345 else
1346 return PyFloat_FromDouble(s->sock_timeout);
1347}
1348
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001349PyDoc_STRVAR(gettimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00001350"gettimeout() -> timeout\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00001351\n\
1352Returns the timeout in floating seconds associated with socket \n\
1353operations. A timeout of None indicates that timeouts on socket \n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001354operations are disabled.");
Guido van Rossume4485b01994-09-07 14:32:49 +00001355
Guido van Rossum48a680c2001-03-02 06:34:14 +00001356#ifdef RISCOS
1357/* s.sleeptaskw(1 | 0) method */
1358
1359static PyObject *
Martin v. Löwisa94568a2003-05-10 07:36:56 +00001360sock_sleeptaskw(PySocketSockObject *s,PyObject *arg)
Guido van Rossum48a680c2001-03-02 06:34:14 +00001361{
Guido van Rossum67f7a382002-06-06 21:08:16 +00001362 int block;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00001363 block = PyInt_AsLong(arg);
1364 if (block == -1 && PyErr_Occurred())
Guido van Rossum67f7a382002-06-06 21:08:16 +00001365 return NULL;
1366 Py_BEGIN_ALLOW_THREADS
1367 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
1368 Py_END_ALLOW_THREADS
Guido van Rossum48a680c2001-03-02 06:34:14 +00001369
Guido van Rossum67f7a382002-06-06 21:08:16 +00001370 Py_INCREF(Py_None);
1371 return Py_None;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001372}
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001373PyDoc_STRVAR(sleeptaskw_doc,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001374"sleeptaskw(flag)\n\
1375\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001376Allow sleeps in taskwindows.");
Guido van Rossum48a680c2001-03-02 06:34:14 +00001377#endif
1378
1379
Guido van Rossumaee08791992-09-08 09:05:33 +00001380/* s.setsockopt() method.
1381 With an integer third argument, sets an integer option.
1382 With a string third argument, sets an option from a buffer;
1383 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001384
Guido van Rossum73624e91994-10-10 17:59:00 +00001385static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001386sock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001387{
1388 int level;
1389 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001390 int res;
Guido van Rossumaee08791992-09-08 09:05:33 +00001391 char *buf;
1392 int buflen;
1393 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001394
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001395 if (PyArg_ParseTuple(args, "iii:setsockopt",
1396 &level, &optname, &flag)) {
Guido van Rossumaee08791992-09-08 09:05:33 +00001397 buf = (char *) &flag;
1398 buflen = sizeof flag;
1399 }
1400 else {
Guido van Rossum73624e91994-10-10 17:59:00 +00001401 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001402 if (!PyArg_ParseTuple(args, "iis#:setsockopt",
1403 &level, &optname, &buf, &buflen))
Guido van Rossumaee08791992-09-08 09:05:33 +00001404 return NULL;
1405 }
Thomas Wouters334fb892000-07-25 12:56:38 +00001406 res = setsockopt(s->sock_fd, level, optname, (void *)buf, buflen);
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001407 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001408 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001409 Py_INCREF(Py_None);
1410 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001411}
1412
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001413PyDoc_STRVAR(setsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001414"setsockopt(level, option, value)\n\
1415\n\
1416Set a socket option. See the Unix manual for level and option.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001417The value argument can either be an integer or a string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001418
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001419
Guido van Rossumaee08791992-09-08 09:05:33 +00001420/* s.getsockopt() method.
1421 With two arguments, retrieves an integer option.
1422 With a third integer argument, retrieves a string buffer of that size;
1423 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001424
Guido van Rossum73624e91994-10-10 17:59:00 +00001425static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001426sock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001427{
1428 int level;
1429 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001430 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +00001431 PyObject *buf;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001432 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001433
Guido van Rossumbcc20741998-08-04 22:53:56 +00001434#ifdef __BEOS__
Fred Drake564a6cc2001-05-11 20:12:26 +00001435 /* We have incomplete socket support. */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001436 PyErr_SetString(socket_error, "getsockopt not supported");
Guido van Rossumbcc20741998-08-04 22:53:56 +00001437 return NULL;
1438#else
1439
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001440 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
1441 &level, &optname, &buflen))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001442 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001443
Guido van Rossumbe32c891996-06-20 16:25:29 +00001444 if (buflen == 0) {
Guido van Rossumaee08791992-09-08 09:05:33 +00001445 int flag = 0;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001446 socklen_t flagsize = sizeof flag;
Guido van Rossumb376a4a1993-11-23 17:53:17 +00001447 res = getsockopt(s->sock_fd, level, optname,
Thomas Wouters334fb892000-07-25 12:56:38 +00001448 (void *)&flag, &flagsize);
Guido van Rossumaee08791992-09-08 09:05:33 +00001449 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001450 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001451 return PyInt_FromLong(flag);
Guido van Rossumaee08791992-09-08 09:05:33 +00001452 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001453#ifdef __VMS
1454 if (buflen > 1024) {
1455#else
Guido van Rossumaee08791992-09-08 09:05:33 +00001456 if (buflen <= 0 || buflen > 1024) {
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001457#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001458 PyErr_SetString(socket_error,
Barry Warsaw752300b1997-01-03 17:18:10 +00001459 "getsockopt buflen out of range");
Guido van Rossumaee08791992-09-08 09:05:33 +00001460 return NULL;
1461 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001462 buf = PyString_FromStringAndSize((char *)NULL, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001463 if (buf == NULL)
1464 return NULL;
Guido van Rossumb376a4a1993-11-23 17:53:17 +00001465 res = getsockopt(s->sock_fd, level, optname,
Fred Drake564a6cc2001-05-11 20:12:26 +00001466 (void *)PyString_AS_STRING(buf), &buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001467 if (res < 0) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001468 Py_DECREF(buf);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001469 return s->errorhandler();
Guido van Rossumaee08791992-09-08 09:05:33 +00001470 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001471 _PyString_Resize(&buf, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001472 return buf;
Guido van Rossumbcc20741998-08-04 22:53:56 +00001473#endif /* __BEOS__ */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001474}
1475
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001476PyDoc_STRVAR(getsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001477"getsockopt(level, option[, buffersize]) -> value\n\
1478\n\
1479Get a socket option. See the Unix manual for level and option.\n\
1480If a nonzero buffersize argument is given, the return value is a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001481string of that length; otherwise it is an integer.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001482
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001483
Fred Drake728819a2000-07-01 03:40:12 +00001484/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001485
Guido van Rossum73624e91994-10-10 17:59:00 +00001486static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001487sock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001488{
1489 struct sockaddr *addr;
1490 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001491 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001492
Fred Drake728819a2000-07-01 03:40:12 +00001493 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001494 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001495 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001496 res = bind(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001497 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001498 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001499 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001500 Py_INCREF(Py_None);
1501 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001502}
1503
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001504PyDoc_STRVAR(bind_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001505"bind(address)\n\
1506\n\
1507Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00001508pair (host, port); the host must refer to the local host. For raw packet\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001509sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001510
Guido van Rossum30a685f1991-06-27 15:51:29 +00001511
1512/* s.close() method.
1513 Set the file descriptor to -1 so operations tried subsequently
1514 will surely fail. */
1515
Guido van Rossum73624e91994-10-10 17:59:00 +00001516static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001517sock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001518{
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001519 SOCKET_T fd;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001520
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001521 if ((fd = s->sock_fd) != -1) {
1522 s->sock_fd = -1;
Guido van Rossum08481461996-10-12 14:07:22 +00001523 Py_BEGIN_ALLOW_THREADS
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001524 (void) SOCKETCLOSE(fd);
Guido van Rossum08481461996-10-12 14:07:22 +00001525 Py_END_ALLOW_THREADS
1526 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001527 Py_INCREF(Py_None);
1528 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001529}
1530
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001531PyDoc_STRVAR(close_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001532"close()\n\
1533\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001534Close the socket. It cannot be used after this call.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001535
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001536static int
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001537internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen,
1538 int *timeoutp)
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001539{
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001540 int res, timeout;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001541
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001542 timeout = 0;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001543 res = connect(s->sock_fd, addr, addrlen);
1544
1545#ifdef MS_WINDOWS
1546
1547 if (s->sock_timeout > 0.0) {
1548 if (res < 0 && WSAGetLastError() == WSAEWOULDBLOCK) {
Guido van Rossumb76bdf82003-02-19 17:50:16 +00001549 /* This is a mess. Best solution: trust select */
1550 fd_set fds;
1551 struct timeval tv;
1552 tv.tv_sec = (int)s->sock_timeout;
1553 tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6);
1554 FD_ZERO(&fds);
1555 FD_SET(s->sock_fd, &fds);
1556 res = select(s->sock_fd+1, NULL, &fds, NULL, &tv);
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001557 if (res == 0) {
Guido van Rossumb76bdf82003-02-19 17:50:16 +00001558 res = WSAEWOULDBLOCK;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001559 timeout = 1;
1560 } else if (res > 0)
Guido van Rossumb76bdf82003-02-19 17:50:16 +00001561 res = 0;
1562 /* else if (res < 0) an error occurred */
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001563 }
1564 }
1565
1566 if (res < 0)
1567 res = WSAGetLastError();
1568
1569#else
1570
1571 if (s->sock_timeout > 0.0) {
1572 if (res < 0 && errno == EINPROGRESS) {
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001573 timeout = internal_select(s, 1);
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001574 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum12e3c712002-08-08 20:39:30 +00001575 if (res < 0 && errno == EISCONN)
1576 res = 0;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001577 }
1578 }
1579
1580 if (res < 0)
1581 res = errno;
1582
1583#endif
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001584 *timeoutp = timeout;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001585
1586 return res;
1587}
Guido van Rossum30a685f1991-06-27 15:51:29 +00001588
Fred Drake728819a2000-07-01 03:40:12 +00001589/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001590
Guido van Rossum73624e91994-10-10 17:59:00 +00001591static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001592sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001593{
1594 struct sockaddr *addr;
1595 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001596 int res;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001597 int timeout;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001598
Fred Drake728819a2000-07-01 03:40:12 +00001599 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001600 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001601
Guido van Rossum73624e91994-10-10 17:59:00 +00001602 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001603 res = internal_connect(s, addr, addrlen, &timeout);
Guido van Rossum11ba0942002-06-13 15:07:44 +00001604 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001605
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001606 if (timeout) {
1607 PyErr_SetString(socket_timeout, "timed out");
1608 return NULL;
1609 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001610 if (res != 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001611 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001612 Py_INCREF(Py_None);
1613 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001614}
1615
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001616PyDoc_STRVAR(connect_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001617"connect(address)\n\
1618\n\
1619Connect the socket to a remote address. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001620is a pair (host, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001621
Guido van Rossum30a685f1991-06-27 15:51:29 +00001622
Fred Drake728819a2000-07-01 03:40:12 +00001623/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001624
1625static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001626sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001627{
1628 struct sockaddr *addr;
1629 int addrlen;
1630 int res;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001631 int timeout;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001632
Fred Drake728819a2000-07-01 03:40:12 +00001633 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001634 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001635
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001636 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001637 res = internal_connect(s, addr, addrlen, &timeout);
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001638 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001639
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001640 return PyInt_FromLong((long) res);
1641}
1642
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001643PyDoc_STRVAR(connect_ex_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00001644"connect_ex(address) -> errno\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00001645\n\
1646This is like connect(address), but returns an error code (the errno value)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001647instead of raising an exception when an error occurs.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001648
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001649
Guido van Rossumed233a51992-06-23 09:07:03 +00001650/* s.fileno() method */
1651
Guido van Rossum73624e91994-10-10 17:59:00 +00001652static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001653sock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00001654{
Fred Drakea04eaad2000-06-30 02:46:07 +00001655#if SIZEOF_SOCKET_T <= SIZEOF_LONG
Guido van Rossum73624e91994-10-10 17:59:00 +00001656 return PyInt_FromLong((long) s->sock_fd);
Fred Drakea04eaad2000-06-30 02:46:07 +00001657#else
Martin v. Löwisb9a0f912003-03-29 10:06:18 +00001658 return PyLong_FromLongLong((PY_LONG_LONG)s->sock_fd);
Fred Drakea04eaad2000-06-30 02:46:07 +00001659#endif
Guido van Rossumed233a51992-06-23 09:07:03 +00001660}
1661
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001662PyDoc_STRVAR(fileno_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001663"fileno() -> integer\n\
1664\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001665Return the integer file descriptor of the socket.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001666
Guido van Rossumed233a51992-06-23 09:07:03 +00001667
Guido van Rossumbe32c891996-06-20 16:25:29 +00001668#ifndef NO_DUP
1669/* s.dup() method */
1670
1671static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001672sock_dup(PySocketSockObject *s)
Guido van Rossumbe32c891996-06-20 16:25:29 +00001673{
Fred Drakea04eaad2000-06-30 02:46:07 +00001674 SOCKET_T newfd;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001675 PyObject *sock;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001676
Guido van Rossumbe32c891996-06-20 16:25:29 +00001677 newfd = dup(s->sock_fd);
1678 if (newfd < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001679 return s->errorhandler();
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001680 sock = (PyObject *) new_sockobject(newfd,
1681 s->sock_family,
1682 s->sock_type,
1683 s->sock_proto);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001684 if (sock == NULL)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001685 SOCKETCLOSE(newfd);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001686 return sock;
1687}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001688
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001689PyDoc_STRVAR(dup_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001690"dup() -> socket object\n\
1691\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001692Return a new socket object connected to the same system resource.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001693
Guido van Rossumbe32c891996-06-20 16:25:29 +00001694#endif
1695
1696
Guido van Rossumc89705d1992-11-26 08:54:07 +00001697/* s.getsockname() method */
1698
Guido van Rossum73624e91994-10-10 17:59:00 +00001699static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001700sock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001701{
1702 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001703 int res;
1704 socklen_t addrlen;
1705
Guido van Rossumc89705d1992-11-26 08:54:07 +00001706 if (!getsockaddrlen(s, &addrlen))
1707 return NULL;
Guido van Rossumca42b161996-01-12 01:36:05 +00001708 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001709 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001710 res = getsockname(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001711 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001712 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001713 return s->errorhandler();
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001714 return makesockaddr(s->sock_fd, (struct sockaddr *) addrbuf, addrlen);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001715}
1716
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001717PyDoc_STRVAR(getsockname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001718"getsockname() -> address info\n\
1719\n\
1720Return the address of the local endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001721info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001722
Guido van Rossumc89705d1992-11-26 08:54:07 +00001723
Guido van Rossumb6775db1994-08-01 11:34:53 +00001724#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001725/* s.getpeername() method */
1726
Guido van Rossum73624e91994-10-10 17:59:00 +00001727static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001728sock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001729{
1730 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001731 int res;
1732 socklen_t addrlen;
1733
Guido van Rossumc89705d1992-11-26 08:54:07 +00001734 if (!getsockaddrlen(s, &addrlen))
1735 return NULL;
Fred Drakefd168342001-05-09 19:11:33 +00001736 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001737 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001738 res = getpeername(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001739 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001740 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001741 return s->errorhandler();
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001742 return makesockaddr(s->sock_fd, (struct sockaddr *) addrbuf, addrlen);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001743}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001744
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001745PyDoc_STRVAR(getpeername_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001746"getpeername() -> address info\n\
1747\n\
1748Return the address of the remote endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001749info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001750
Guido van Rossumb6775db1994-08-01 11:34:53 +00001751#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001752
1753
Guido van Rossum30a685f1991-06-27 15:51:29 +00001754/* s.listen(n) method */
1755
Guido van Rossum73624e91994-10-10 17:59:00 +00001756static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001757sock_listen(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001758{
1759 int backlog;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001760 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001761
1762 backlog = PyInt_AsLong(arg);
1763 if (backlog == -1 && PyErr_Occurred())
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001764 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001765 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +00001766 if (backlog < 1)
1767 backlog = 1;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001768 res = listen(s->sock_fd, backlog);
Guido van Rossum73624e91994-10-10 17:59:00 +00001769 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001770 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001771 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001772 Py_INCREF(Py_None);
1773 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001774}
1775
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001776PyDoc_STRVAR(listen_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001777"listen(backlog)\n\
1778\n\
1779Enable a server to accept connections. The backlog argument must be at\n\
1780least 1; it specifies the number of unaccepted connection that the system\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001781will allow before refusing new connections.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001782
1783
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001784#ifndef NO_DUP
Guido van Rossum30a685f1991-06-27 15:51:29 +00001785/* s.makefile(mode) method.
1786 Create a new open file object referring to a dupped version of
1787 the socket's file descriptor. (The dup() call is necessary so
1788 that the open file and socket objects may be closed independent
1789 of each other.)
1790 The mode argument specifies 'r' or 'w' passed to fdopen(). */
1791
Guido van Rossum73624e91994-10-10 17:59:00 +00001792static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001793sock_makefile(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001794{
Tim Petersdbd9ba62000-07-09 03:09:57 +00001795 extern int fclose(FILE *);
Guido van Rossum6b144911995-03-14 15:05:13 +00001796 char *mode = "r";
1797 int bufsize = -1;
Fred Drakea04eaad2000-06-30 02:46:07 +00001798#ifdef MS_WIN32
Tim Peters79248aa2001-08-29 21:37:10 +00001799 Py_intptr_t fd;
Fred Drakea04eaad2000-06-30 02:46:07 +00001800#else
Guido van Rossum30a685f1991-06-27 15:51:29 +00001801 int fd;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001802#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001803 FILE *fp;
Guido van Rossum6b144911995-03-14 15:05:13 +00001804 PyObject *f;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001805#ifdef __VMS
1806 char *mode_r = "r";
1807 char *mode_w = "w";
1808#endif
Guido van Rossum6b144911995-03-14 15:05:13 +00001809
Guido van Rossum43713e52000-02-29 13:59:29 +00001810 if (!PyArg_ParseTuple(args, "|si:makefile", &mode, &bufsize))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001811 return NULL;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001812#ifdef __VMS
1813 if (strcmp(mode,"rb") == 0) {
1814 mode = mode_r;
1815 }
1816 else {
1817 if (strcmp(mode,"wb") == 0) {
1818 mode = mode_w;
1819 }
1820 }
1821#endif
Guido van Rossum8d665e61996-06-26 18:22:49 +00001822#ifdef MS_WIN32
Guido van Rossum82a5c661998-07-07 20:45:43 +00001823 if (((fd = _open_osfhandle(s->sock_fd, _O_BINARY)) < 0) ||
1824 ((fd = dup(fd)) < 0) || ((fp = fdopen(fd, mode)) == NULL))
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001825#else
Guido van Rossum82a5c661998-07-07 20:45:43 +00001826 if ((fd = dup(s->sock_fd)) < 0 || (fp = fdopen(fd, mode)) == NULL)
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001827#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001828 {
Guido van Rossum6b144911995-03-14 15:05:13 +00001829 if (fd >= 0)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001830 SOCKETCLOSE(fd);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001831 return s->errorhandler();
Guido van Rossum6b144911995-03-14 15:05:13 +00001832 }
1833 f = PyFile_FromFile(fp, "<socket>", mode, fclose);
1834 if (f != NULL)
1835 PyFile_SetBufSize(f, bufsize);
1836 return f;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001837}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001838
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001839PyDoc_STRVAR(makefile_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001840"makefile([mode[, buffersize]]) -> file object\n\
1841\n\
1842Return a regular file object corresponding to the socket.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001843The mode and buffersize arguments are as for the built-in open() function.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001844
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001845#endif /* NO_DUP */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001846
Guido van Rossum48a680c2001-03-02 06:34:14 +00001847
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001848/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001849
Guido van Rossum73624e91994-10-10 17:59:00 +00001850static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001851sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001852{
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001853 int len, n = 0, flags = 0, timeout;
Guido van Rossum73624e91994-10-10 17:59:00 +00001854 PyObject *buf;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001855#ifdef __VMS
1856 int read_length;
1857 char *read_buf;
1858#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00001859
Guido van Rossum43713e52000-02-29 13:59:29 +00001860 if (!PyArg_ParseTuple(args, "i|i:recv", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001861 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001862
1863 if (len < 0) {
Martin v. Löwisfba64e12001-11-19 10:41:26 +00001864 PyErr_SetString(PyExc_ValueError,
Guido van Rossum11ba0942002-06-13 15:07:44 +00001865 "negative buffersize in recv");
Martin v. Löwisfba64e12001-11-19 10:41:26 +00001866 return NULL;
1867 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00001868
Guido van Rossum73624e91994-10-10 17:59:00 +00001869 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001870 if (buf == NULL)
1871 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001872
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001873#ifndef __VMS
Guido van Rossum73624e91994-10-10 17:59:00 +00001874 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001875 timeout = internal_select(s, 0);
1876 if (!timeout)
1877 n = recv(s->sock_fd, PyString_AS_STRING(buf), len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001878 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001879
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001880 if (timeout) {
1881 Py_DECREF(buf);
1882 PyErr_SetString(socket_timeout, "timed out");
1883 return NULL;
1884 }
Guido van Rossum7c53b771995-09-13 18:39:47 +00001885 if (n < 0) {
1886 Py_DECREF(buf);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001887 return s->errorhandler();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001888 }
Tim Peters5de98422002-04-27 18:44:32 +00001889 if (n != len)
1890 _PyString_Resize(&buf, n);
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001891#else
1892 read_buf = PyString_AsString(buf);
1893 read_length = len;
1894 while (read_length != 0) {
1895 unsigned int segment;
1896
1897 segment = read_length /SEGMENT_SIZE;
1898 if (segment != 0) {
1899 segment = SEGMENT_SIZE;
1900 }
1901 else {
1902 segment = read_length;
1903 }
1904
1905 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001906 timeout = internal_select(s, 0);
1907 if (!timeout)
1908 n = recv(s->sock_fd, read_buf, segment, flags);
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001909 Py_END_ALLOW_THREADS
1910
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001911 if (timeout) {
1912 Py_DECREF(buf);
1913 PyErr_SetString(socket_timeout, "timed out");
1914 return NULL;
1915 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001916 if (n < 0) {
1917 Py_DECREF(buf);
1918 return s->errorhandler();
1919 }
1920 if (n != read_length) {
1921 read_buf += n;
1922 break;
1923 }
1924
1925 read_length -= segment;
1926 read_buf += segment;
1927 }
1928 if (_PyString_Resize(&buf, (read_buf - PyString_AsString(buf))) < 0)
1929 {
1930 return NULL;
1931 }
1932#endif /* !__VMS */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001933 return buf;
1934}
1935
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001936PyDoc_STRVAR(recv_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001937"recv(buffersize[, flags]) -> data\n\
1938\n\
1939Receive up to buffersize bytes from the socket. For the optional flags\n\
1940argument, see the Unix manual. When no data is available, block until\n\
1941at least one byte is available or until the remote end is closed. When\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001942the remote end is closed and all data is read, return the empty string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001943
Guido van Rossum30a685f1991-06-27 15:51:29 +00001944
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001945/* s.recvfrom(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001946
Guido van Rossum73624e91994-10-10 17:59:00 +00001947static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001948sock_recvfrom(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001949{
1950 char addrbuf[256];
Barry Warsaw752300b1997-01-03 17:18:10 +00001951 PyObject *buf = NULL;
1952 PyObject *addr = NULL;
1953 PyObject *ret = NULL;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001954 int len, n = 0, flags = 0, timeout;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001955 socklen_t addrlen;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001956
Guido van Rossum43713e52000-02-29 13:59:29 +00001957 if (!PyArg_ParseTuple(args, "i|i:recvfrom", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001958 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001959
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001960 if (!getsockaddrlen(s, &addrlen))
1961 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001962 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001963 if (buf == NULL)
1964 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001965
Guido van Rossum73624e91994-10-10 17:59:00 +00001966 Py_BEGIN_ALLOW_THREADS
Fred Drakefd168342001-05-09 19:11:33 +00001967 memset(addrbuf, 0, addrlen);
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001968 timeout = internal_select(s, 0);
1969 if (!timeout)
1970 n = recvfrom(s->sock_fd, PyString_AS_STRING(buf), len, flags,
Guido van Rossum8d665e61996-06-26 18:22:49 +00001971#ifndef MS_WINDOWS
Andrew MacIntyreba43e872002-03-03 03:03:52 +00001972#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001973 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001974#else
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001975 (void *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001976#endif
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001977#else
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001978 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001979#endif
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001980 );
Guido van Rossum73624e91994-10-10 17:59:00 +00001981 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001982
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001983 if (timeout) {
1984 Py_DECREF(buf);
1985 PyErr_SetString(socket_timeout, "timed out");
1986 return NULL;
1987 }
Guido van Rossum7c53b771995-09-13 18:39:47 +00001988 if (n < 0) {
1989 Py_DECREF(buf);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001990 return s->errorhandler();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001991 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00001992
Guido van Rossum53a9bf81996-06-11 18:35:24 +00001993 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001994 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001995
Guido van Rossum67f7a382002-06-06 21:08:16 +00001996 if (!(addr = makesockaddr(s->sock_fd, (struct sockaddr *)addrbuf,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001997 addrlen)))
Barry Warsaw752300b1997-01-03 17:18:10 +00001998 goto finally;
1999
Raymond Hettinger8ae46892003-10-12 19:09:37 +00002000 ret = PyTuple_Pack(2, buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002001
2002finally:
Guido van Rossum73624e91994-10-10 17:59:00 +00002003 Py_XDECREF(addr);
2004 Py_XDECREF(buf);
Guido van Rossum6f5afc91993-02-05 09:46:15 +00002005 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002006}
2007
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002008PyDoc_STRVAR(recvfrom_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002009"recvfrom(buffersize[, flags]) -> (data, address info)\n\
2010\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002011Like recv(buffersize, flags) but also return the sender's address info.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002012
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002013/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002014
Guido van Rossum73624e91994-10-10 17:59:00 +00002015static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002016sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002017{
Guido van Rossumff4949e1992-08-05 19:58:53 +00002018 char *buf;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002019 int len, n = 0, flags = 0, timeout;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002020#ifdef __VMS
2021 int send_length;
2022#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00002023
Guido van Rossum43713e52000-02-29 13:59:29 +00002024 if (!PyArg_ParseTuple(args, "s#|i:send", &buf, &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00002025 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002026
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002027#ifndef __VMS
Guido van Rossum73624e91994-10-10 17:59:00 +00002028 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002029 timeout = internal_select(s, 1);
2030 if (!timeout)
2031 n = send(s->sock_fd, buf, len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00002032 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002033
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002034 if (timeout) {
2035 PyErr_SetString(socket_timeout, "timed out");
2036 return NULL;
2037 }
Guido van Rossum30a685f1991-06-27 15:51:29 +00002038 if (n < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002039 return s->errorhandler();
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002040#else
2041 /* Divide packet into smaller segments for */
2042 /* TCP/IP Services for OpenVMS */
2043 send_length = len;
2044 while (send_length != 0) {
2045 unsigned int segment;
2046
2047 segment = send_length / SEGMENT_SIZE;
2048 if (segment != 0) {
2049 segment = SEGMENT_SIZE;
2050 }
2051 else {
2052 segment = send_length;
2053 }
2054 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002055 timeout = internal_select(s, 1);
2056 if (!timeout)
2057 n = send(s->sock_fd, buf, segment, flags);
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002058 Py_END_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002059 if (timeout) {
2060 PyErr_SetString(socket_timeout, "timed out");
2061 return NULL;
2062 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002063 if (n < 0) {
2064 return s->errorhandler();
2065 }
2066 send_length -= segment;
2067 buf += segment;
2068 } /* end while */
2069#endif /* !__VMS */
Guido van Rossum73624e91994-10-10 17:59:00 +00002070 return PyInt_FromLong((long)n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00002071}
2072
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002073PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002074"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002075\n\
2076Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002077argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002078sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002079
2080
2081/* s.sendall(data [,flags]) method */
2082
2083static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002084sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002085{
2086 char *buf;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002087 int len, n = 0, flags = 0, timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002088
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002089 if (!PyArg_ParseTuple(args, "s#|i:sendall", &buf, &len, &flags))
2090 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002091
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002092 Py_BEGIN_ALLOW_THREADS
2093 do {
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002094 timeout = internal_select(s, 1);
2095 if (timeout)
2096 break;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002097 n = send(s->sock_fd, buf, len, flags);
2098 if (n < 0)
2099 break;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002100 buf += n;
2101 len -= n;
2102 } while (len > 0);
2103 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002104
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002105 if (timeout) {
2106 PyErr_SetString(socket_timeout, "timed out");
2107 return NULL;
2108 }
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002109 if (n < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002110 return s->errorhandler();
Guido van Rossum67f7a382002-06-06 21:08:16 +00002111
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002112 Py_INCREF(Py_None);
2113 return Py_None;
2114}
2115
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002116PyDoc_STRVAR(sendall_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002117"sendall(data[, flags])\n\
2118\n\
2119Send a data string to the socket. For the optional flags\n\
2120argument, see the Unix manual. This calls send() repeatedly\n\
2121until all data is sent. If an error occurs, it's impossible\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002122to tell how much data has been sent.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002123
Guido van Rossum30a685f1991-06-27 15:51:29 +00002124
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002125/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002126
Guido van Rossum73624e91994-10-10 17:59:00 +00002127static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002128sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002129{
Guido van Rossum73624e91994-10-10 17:59:00 +00002130 PyObject *addro;
Guido van Rossumff4949e1992-08-05 19:58:53 +00002131 char *buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002132 struct sockaddr *addr;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002133 int addrlen, len, n = 0, flags, timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002134
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002135 flags = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002136 if (!PyArg_ParseTuple(args, "s#O:sendto", &buf, &len, &addro)) {
Guido van Rossum73624e91994-10-10 17:59:00 +00002137 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002138 if (!PyArg_ParseTuple(args, "s#iO:sendto",
2139 &buf, &len, &flags, &addro))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002140 return NULL;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002141 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002142
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002143 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002144 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002145
Guido van Rossum73624e91994-10-10 17:59:00 +00002146 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002147 timeout = internal_select(s, 1);
2148 if (!timeout)
2149 n = sendto(s->sock_fd, buf, len, flags, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00002150 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002151
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002152 if (timeout) {
2153 PyErr_SetString(socket_timeout, "timed out");
2154 return NULL;
2155 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002156 if (n < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002157 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00002158 return PyInt_FromLong((long)n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002159}
2160
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002161PyDoc_STRVAR(sendto_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002162"sendto(data[, flags], address) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002163\n\
2164Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002165For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002166
Guido van Rossum30a685f1991-06-27 15:51:29 +00002167
2168/* s.shutdown(how) method */
2169
Guido van Rossum73624e91994-10-10 17:59:00 +00002170static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002171sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002172{
2173 int how;
Guido van Rossumff4949e1992-08-05 19:58:53 +00002174 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002175
2176 how = PyInt_AsLong(arg);
2177 if (how == -1 && PyErr_Occurred())
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002178 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00002179 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002180 res = shutdown(s->sock_fd, how);
Guido van Rossum73624e91994-10-10 17:59:00 +00002181 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002182 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002183 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00002184 Py_INCREF(Py_None);
2185 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002186}
2187
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002188PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002189"shutdown(flag)\n\
2190\n\
Martin v. Löwis94681fc2003-11-27 19:40:22 +00002191Shut down the reading side of the socket (flag == SHUT_RD), the writing side\n\
2192of the socket (flag == SHUT_WR), or both ends (flag == SHUT_RDWR).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002193
Guido van Rossum30a685f1991-06-27 15:51:29 +00002194
2195/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002196
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002197static PyMethodDef sock_methods[] = {
2198 {"accept", (PyCFunction)sock_accept, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002199 accept_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002200 {"bind", (PyCFunction)sock_bind, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002201 bind_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002202 {"close", (PyCFunction)sock_close, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002203 close_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002204 {"connect", (PyCFunction)sock_connect, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002205 connect_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002206 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002207 connect_ex_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00002208#ifndef NO_DUP
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002209 {"dup", (PyCFunction)sock_dup, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002210 dup_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00002211#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002212 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002213 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00002214#ifdef HAVE_GETPEERNAME
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002215 {"getpeername", (PyCFunction)sock_getpeername,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002216 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00002217#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002218 {"getsockname", (PyCFunction)sock_getsockname,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002219 METH_NOARGS, getsockname_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002220 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002221 getsockopt_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002222 {"listen", (PyCFunction)sock_listen, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002223 listen_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002224#ifndef NO_DUP
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002225 {"makefile", (PyCFunction)sock_makefile, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002226 makefile_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002227#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002228 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002229 recv_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002230 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002231 recvfrom_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002232 {"send", (PyCFunction)sock_send, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002233 send_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002234 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002235 sendall_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002236 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002237 sendto_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002238 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002239 setblocking_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002240 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
Guido van Rossum67f7a382002-06-06 21:08:16 +00002241 settimeout_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002242 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
Guido van Rossum67f7a382002-06-06 21:08:16 +00002243 gettimeout_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002244 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002245 setsockopt_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002246 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002247 shutdown_doc},
2248#ifdef RISCOS
Martin v. Löwisa94568a2003-05-10 07:36:56 +00002249 {"sleeptaskw", (PyCFunction)sock_sleeptaskw, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002250 sleeptaskw_doc},
2251#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +00002252 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002253};
2254
Guido van Rossum30a685f1991-06-27 15:51:29 +00002255
Guido van Rossum73624e91994-10-10 17:59:00 +00002256/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00002257 First close the file description. */
2258
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002259static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002260sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002261{
Guido van Rossumfa972c92000-04-10 12:45:45 +00002262 if (s->sock_fd != -1)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00002263 (void) SOCKETCLOSE(s->sock_fd);
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002264 s->ob_type->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002265}
2266
Guido van Rossum30a685f1991-06-27 15:51:29 +00002267
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002268static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002269sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002270{
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002271 char buf[512];
Fred Drakea04eaad2000-06-30 02:46:07 +00002272#if SIZEOF_SOCKET_T > SIZEOF_LONG
2273 if (s->sock_fd > LONG_MAX) {
2274 /* this can occur on Win64, and actually there is a special
2275 ugly printf formatter for decimal pointer length integer
2276 printing, only bother if necessary*/
2277 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002278 "no printf formatter to display "
2279 "the socket descriptor in decimal");
Fred Drakea04eaad2000-06-30 02:46:07 +00002280 return NULL;
2281 }
2282#endif
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002283 PyOS_snprintf(
2284 buf, sizeof(buf),
2285 "<socket object, fd=%ld, family=%d, type=%d, protocol=%d>",
2286 (long)s->sock_fd, s->sock_family,
2287 s->sock_type,
2288 s->sock_proto);
Guido van Rossumdc1c64a1996-02-27 15:21:19 +00002289 return PyString_FromString(buf);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002290}
2291
2292
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002293/* Create a new, uninitialized socket object. */
2294
2295static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002296sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002297{
2298 PyObject *new;
2299
2300 new = type->tp_alloc(type, 0);
Guido van Rossume1c478f2002-06-06 20:08:25 +00002301 if (new != NULL) {
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002302 ((PySocketSockObject *)new)->sock_fd = -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002303 ((PySocketSockObject *)new)->sock_timeout = -1.0;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002304 ((PySocketSockObject *)new)->errorhandler = &set_error;
Guido van Rossume1c478f2002-06-06 20:08:25 +00002305 }
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002306 return new;
2307}
2308
2309
2310/* Initialize a new socket object. */
2311
2312/*ARGSUSED*/
2313static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00002314sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002315{
2316 PySocketSockObject *s = (PySocketSockObject *)self;
2317 SOCKET_T fd;
2318 int family = AF_INET, type = SOCK_STREAM, proto = 0;
2319 static char *keywords[] = {"family", "type", "proto", 0};
2320
2321 if (!PyArg_ParseTupleAndKeywords(args, kwds,
2322 "|iii:socket", keywords,
2323 &family, &type, &proto))
2324 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002325
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002326 Py_BEGIN_ALLOW_THREADS
2327 fd = socket(family, type, proto);
2328 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002329
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002330#ifdef MS_WINDOWS
2331 if (fd == INVALID_SOCKET)
2332#else
2333 if (fd < 0)
2334#endif
2335 {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002336 set_error();
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002337 return -1;
2338 }
2339 init_sockobject(s, fd, family, type, proto);
2340 /* From now on, ignore SIGPIPE and let the error checking
2341 do the work. */
2342#ifdef SIGPIPE
2343 (void) signal(SIGPIPE, SIG_IGN);
2344#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00002345
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002346 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002347
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002348}
2349
2350
Guido van Rossumb6775db1994-08-01 11:34:53 +00002351/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002352
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002353static PyTypeObject sock_type = {
Guido van Rossum55558541996-05-23 22:54:50 +00002354 PyObject_HEAD_INIT(0) /* Must fill in type value later */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002355 0, /* ob_size */
Guido van Rossumca6dfa52001-10-28 12:31:33 +00002356 "_socket.socket", /* tp_name */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002357 sizeof(PySocketSockObject), /* tp_basicsize */
2358 0, /* tp_itemsize */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002359 (destructor)sock_dealloc, /* tp_dealloc */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002360 0, /* tp_print */
2361 0, /* tp_getattr */
2362 0, /* tp_setattr */
2363 0, /* tp_compare */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002364 (reprfunc)sock_repr, /* tp_repr */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002365 0, /* tp_as_number */
2366 0, /* tp_as_sequence */
2367 0, /* tp_as_mapping */
2368 0, /* tp_hash */
2369 0, /* tp_call */
2370 0, /* tp_str */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002371 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002372 0, /* tp_setattro */
2373 0, /* tp_as_buffer */
2374 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002375 sock_doc, /* tp_doc */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002376 0, /* tp_traverse */
2377 0, /* tp_clear */
2378 0, /* tp_richcompare */
2379 0, /* tp_weaklistoffset */
2380 0, /* tp_iter */
2381 0, /* tp_iternext */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002382 sock_methods, /* tp_methods */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002383 0, /* tp_members */
2384 0, /* tp_getset */
2385 0, /* tp_base */
2386 0, /* tp_dict */
2387 0, /* tp_descr_get */
2388 0, /* tp_descr_set */
2389 0, /* tp_dictoffset */
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00002390 sock_initobj, /* tp_init */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002391 PyType_GenericAlloc, /* tp_alloc */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002392 sock_new, /* tp_new */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002393 PyObject_Del, /* tp_free */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002394};
2395
Guido van Rossum30a685f1991-06-27 15:51:29 +00002396
Guido van Rossum81194471991-07-27 21:42:02 +00002397/* Python interface to gethostname(). */
2398
2399/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002400static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002401socket_gethostname(PyObject *self, PyObject *args)
Guido van Rossum81194471991-07-27 21:42:02 +00002402{
2403 char buf[1024];
Guido van Rossumff4949e1992-08-05 19:58:53 +00002404 int res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002405 if (!PyArg_ParseTuple(args, ":gethostname"))
Guido van Rossum81194471991-07-27 21:42:02 +00002406 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00002407 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002408 res = gethostname(buf, (int) sizeof buf - 1);
Guido van Rossum73624e91994-10-10 17:59:00 +00002409 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002410 if (res < 0)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002411 return set_error();
Guido van Rossum81194471991-07-27 21:42:02 +00002412 buf[sizeof buf - 1] = '\0';
Guido van Rossum73624e91994-10-10 17:59:00 +00002413 return PyString_FromString(buf);
Guido van Rossum81194471991-07-27 21:42:02 +00002414}
Guido van Rossumff4949e1992-08-05 19:58:53 +00002415
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002416PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002417"gethostname() -> string\n\
2418\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002419Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002420
Guido van Rossumff4949e1992-08-05 19:58:53 +00002421
Guido van Rossum30a685f1991-06-27 15:51:29 +00002422/* Python interface to gethostbyname(name). */
2423
2424/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002425static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002426socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002427{
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002428 char *name;
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00002429#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002430 struct sockaddr_storage addrbuf;
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00002431#else
2432 struct sockaddr_in addrbuf;
2433#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002434
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002435 if (!PyArg_ParseTuple(args, "s:gethostbyname", &name))
Guido van Rossum30a685f1991-06-27 15:51:29 +00002436 return NULL;
Martin v. Löwisddc6f472002-07-28 16:10:31 +00002437 if (setipaddr(name, (struct sockaddr *)&addrbuf, sizeof(addrbuf), AF_INET) < 0)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002438 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002439 return makeipaddr((struct sockaddr *)&addrbuf,
2440 sizeof(struct sockaddr_in));
Guido van Rossum30a685f1991-06-27 15:51:29 +00002441}
2442
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002443PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002444"gethostbyname(host) -> address\n\
2445\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002446Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002447
2448
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002449/* Convenience function common to gethostbyname_ex and gethostbyaddr */
2450
2451static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002452gethost_common(struct hostent *h, struct sockaddr *addr, int alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002453{
2454 char **pch;
2455 PyObject *rtn_tuple = (PyObject *)NULL;
2456 PyObject *name_list = (PyObject *)NULL;
2457 PyObject *addr_list = (PyObject *)NULL;
2458 PyObject *tmp;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002459
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002460 if (h == NULL) {
Guido van Rossum48a680c2001-03-02 06:34:14 +00002461 /* Let's get real error message to return */
Guido van Rossume2ae77b2001-10-24 20:42:55 +00002462#ifndef RISCOS
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002463 set_herror(h_errno);
Guido van Rossume2ae77b2001-10-24 20:42:55 +00002464#else
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002465 PyErr_SetString(socket_error, "host not found");
Guido van Rossume2ae77b2001-10-24 20:42:55 +00002466#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002467 return NULL;
2468 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002469
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002470 if (h->h_addrtype != af) {
2471#ifdef HAVE_STRERROR
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002472 /* Let's get real error message to return */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002473 PyErr_SetString(socket_error,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002474 (char *)strerror(EAFNOSUPPORT));
2475#else
2476 PyErr_SetString(
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002477 socket_error,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002478 "Address family not supported by protocol family");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002479#endif
2480 return NULL;
2481 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002482
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002483 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00002484
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002485 case AF_INET:
2486 if (alen < sizeof(struct sockaddr_in))
2487 return NULL;
2488 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002489
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002490#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002491 case AF_INET6:
2492 if (alen < sizeof(struct sockaddr_in6))
2493 return NULL;
2494 break;
2495#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00002496
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002497 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002498
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002499 if ((name_list = PyList_New(0)) == NULL)
2500 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002501
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002502 if ((addr_list = PyList_New(0)) == NULL)
2503 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002504
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002505 for (pch = h->h_aliases; *pch != NULL; pch++) {
2506 int status;
2507 tmp = PyString_FromString(*pch);
2508 if (tmp == NULL)
2509 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002510
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002511 status = PyList_Append(name_list, tmp);
2512 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002513
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002514 if (status)
2515 goto err;
2516 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002517
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002518 for (pch = h->h_addr_list; *pch != NULL; pch++) {
2519 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002520
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002521 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00002522
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002523 case AF_INET:
2524 {
2525 struct sockaddr_in sin;
2526 memset(&sin, 0, sizeof(sin));
2527 sin.sin_family = af;
2528#ifdef HAVE_SOCKADDR_SA_LEN
2529 sin.sin_len = sizeof(sin);
2530#endif
2531 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
2532 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
Guido van Rossum67f7a382002-06-06 21:08:16 +00002533
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002534 if (pch == h->h_addr_list && alen >= sizeof(sin))
2535 memcpy((char *) addr, &sin, sizeof(sin));
2536 break;
2537 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002538
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002539#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002540 case AF_INET6:
2541 {
2542 struct sockaddr_in6 sin6;
2543 memset(&sin6, 0, sizeof(sin6));
2544 sin6.sin6_family = af;
2545#ifdef HAVE_SOCKADDR_SA_LEN
2546 sin6.sin6_len = sizeof(sin6);
2547#endif
2548 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
2549 tmp = makeipaddr((struct sockaddr *)&sin6,
2550 sizeof(sin6));
Guido van Rossum67f7a382002-06-06 21:08:16 +00002551
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002552 if (pch == h->h_addr_list && alen >= sizeof(sin6))
2553 memcpy((char *) addr, &sin6, sizeof(sin6));
2554 break;
2555 }
2556#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00002557
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002558 default: /* can't happen */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002559 PyErr_SetString(socket_error,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002560 "unsupported address family");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002561 return NULL;
2562 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002563
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002564 if (tmp == NULL)
2565 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002566
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002567 status = PyList_Append(addr_list, tmp);
2568 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002569
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002570 if (status)
2571 goto err;
2572 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002573
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002574 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002575
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002576 err:
2577 Py_XDECREF(name_list);
2578 Py_XDECREF(addr_list);
2579 return rtn_tuple;
2580}
2581
2582
2583/* Python interface to gethostbyname_ex(name). */
2584
2585/*ARGSUSED*/
2586static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002587socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002588{
2589 char *name;
2590 struct hostent *h;
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00002591#ifdef ENABLE_IPV6
2592 struct sockaddr_storage addr;
2593#else
2594 struct sockaddr_in addr;
2595#endif
Martin v. Löwis9db2f572001-07-23 01:30:10 +00002596 struct sockaddr *sa;
Guido van Rossum955becc1999-03-22 20:14:53 +00002597 PyObject *ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002598#ifdef HAVE_GETHOSTBYNAME_R
2599 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002600#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
2601 struct hostent_data data;
2602#else
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002603 char buf[16384];
2604 int buf_len = (sizeof buf) - 1;
2605 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002606#endif
2607#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002608 int result;
2609#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002610#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002611
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002612 if (!PyArg_ParseTuple(args, "s:gethostbyname_ex", &name))
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002613 return NULL;
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00002614 if (setipaddr(name, (struct sockaddr *)&addr, sizeof(addr), AF_INET) < 0)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002615 return NULL;
2616 Py_BEGIN_ALLOW_THREADS
2617#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002618#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002619 result = gethostbyname_r(name, &hp_allocated, buf, buf_len,
2620 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002621#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002622 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002623#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00002624 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002625 result = gethostbyname_r(name, &hp_allocated, &data);
2626 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002627#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002628#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00002629#ifdef USE_GETHOSTBYNAME_LOCK
Just van Rossum1040d2c2003-05-09 07:53:18 +00002630 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002631#endif
2632 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002633#endif /* HAVE_GETHOSTBYNAME_R */
2634 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002635 /* Some C libraries would require addr.__ss_family instead of
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002636 addr.ss_family.
2637 Therefore, we cast the sockaddr_storage into sockaddr to
2638 access sa_family. */
Martin v. Löwis9db2f572001-07-23 01:30:10 +00002639 sa = (struct sockaddr*)&addr;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002640 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr),
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002641 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00002642#ifdef USE_GETHOSTBYNAME_LOCK
Just van Rossum1040d2c2003-05-09 07:53:18 +00002643 PyThread_release_lock(netdb_lock);
Guido van Rossum955becc1999-03-22 20:14:53 +00002644#endif
2645 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002646}
2647
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002648PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002649"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
2650\n\
2651Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002652for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002653
2654
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002655/* Python interface to gethostbyaddr(IP). */
2656
2657/*ARGSUSED*/
2658static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002659socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002660{
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002661#ifdef ENABLE_IPV6
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002662 struct sockaddr_storage addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002663#else
Guido van Rossum48a680c2001-03-02 06:34:14 +00002664 struct sockaddr_in addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002665#endif
2666 struct sockaddr *sa = (struct sockaddr *)&addr;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002667 char *ip_num;
2668 struct hostent *h;
Guido van Rossum3baaa131999-03-22 21:44:51 +00002669 PyObject *ret;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002670#ifdef HAVE_GETHOSTBYNAME_R
2671 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002672#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
2673 struct hostent_data data;
2674#else
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002675 char buf[16384];
2676 int buf_len = (sizeof buf) - 1;
2677 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002678#endif
2679#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002680 int result;
2681#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002682#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002683 char *ap;
2684 int al;
2685 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002686
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002687 if (!PyArg_ParseTuple(args, "s:gethostbyaddr", &ip_num))
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002688 return NULL;
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00002689 af = AF_UNSPEC;
Martin v. Löwisddc6f472002-07-28 16:10:31 +00002690 if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002691 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002692 af = sa->sa_family;
2693 ap = NULL;
2694 al = 0;
2695 switch (af) {
2696 case AF_INET:
2697 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
2698 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
2699 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002700#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002701 case AF_INET6:
2702 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
2703 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
2704 break;
2705#endif
2706 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002707 PyErr_SetString(socket_error, "unsupported address family");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002708 return NULL;
2709 }
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002710 Py_BEGIN_ALLOW_THREADS
2711#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002712#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002713 result = gethostbyaddr_r(ap, al, af,
2714 &hp_allocated, buf, buf_len,
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002715 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002716#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002717 h = gethostbyaddr_r(ap, al, af,
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002718 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002719#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00002720 memset((void *) &data, '\0', sizeof(data));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002721 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002722 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002723#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002724#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00002725#ifdef USE_GETHOSTBYNAME_LOCK
Just van Rossum1040d2c2003-05-09 07:53:18 +00002726 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002727#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002728 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002729#endif /* HAVE_GETHOSTBYNAME_R */
2730 Py_END_ALLOW_THREADS
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002731 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00002732#ifdef USE_GETHOSTBYNAME_LOCK
Just van Rossum1040d2c2003-05-09 07:53:18 +00002733 PyThread_release_lock(netdb_lock);
Guido van Rossum3baaa131999-03-22 21:44:51 +00002734#endif
2735 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002736}
2737
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002738PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002739"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
2740\n\
2741Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002742for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002743
Guido van Rossum30a685f1991-06-27 15:51:29 +00002744
2745/* Python interface to getservbyname(name).
2746 This only returns the port number, since the other info is already
2747 known or not useful (like the list of aliases). */
2748
2749/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002750static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002751socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002752{
Guido van Rossumff4949e1992-08-05 19:58:53 +00002753 char *name, *proto;
Guido van Rossum30a685f1991-06-27 15:51:29 +00002754 struct servent *sp;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002755 if (!PyArg_ParseTuple(args, "ss:getservbyname", &name, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +00002756 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00002757 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002758 sp = getservbyname(name, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00002759 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00002760 if (sp == NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002761 PyErr_SetString(socket_error, "service/proto not found");
Guido van Rossum30a685f1991-06-27 15:51:29 +00002762 return NULL;
2763 }
Guido van Rossum73624e91994-10-10 17:59:00 +00002764 return PyInt_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00002765}
2766
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002767PyDoc_STRVAR(getservbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002768"getservbyname(servicename, protocolname) -> integer\n\
2769\n\
2770Return a port number from a service name and protocol name.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002771The protocol name should be 'tcp' or 'udp'.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002772
Guido van Rossum30a685f1991-06-27 15:51:29 +00002773
Guido van Rossum3901d851996-12-19 16:35:04 +00002774/* Python interface to getprotobyname(name).
2775 This only returns the protocol number, since the other info is
2776 already known or not useful (like the list of aliases). */
2777
2778/*ARGSUSED*/
2779static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002780socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00002781{
2782 char *name;
2783 struct protoent *sp;
Guido van Rossumbcc20741998-08-04 22:53:56 +00002784#ifdef __BEOS__
2785/* Not available in BeOS yet. - [cjh] */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002786 PyErr_SetString(socket_error, "getprotobyname not supported");
Guido van Rossumbcc20741998-08-04 22:53:56 +00002787 return NULL;
2788#else
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002789 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
Guido van Rossum3901d851996-12-19 16:35:04 +00002790 return NULL;
2791 Py_BEGIN_ALLOW_THREADS
2792 sp = getprotobyname(name);
2793 Py_END_ALLOW_THREADS
2794 if (sp == NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002795 PyErr_SetString(socket_error, "protocol not found");
Guido van Rossum3901d851996-12-19 16:35:04 +00002796 return NULL;
2797 }
2798 return PyInt_FromLong((long) sp->p_proto);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002799#endif
Guido van Rossum3901d851996-12-19 16:35:04 +00002800}
2801
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002802PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002803"getprotobyname(name) -> integer\n\
2804\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002805Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002806
Guido van Rossum3901d851996-12-19 16:35:04 +00002807
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002808#ifndef NO_DUP
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002809/* Create a socket object from a numeric file description.
2810 Useful e.g. if stdin is a socket.
2811 Additional arguments as for socket(). */
2812
2813/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002814static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002815socket_fromfd(PyObject *self, PyObject *args)
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002816{
Guido van Rossum73624e91994-10-10 17:59:00 +00002817 PySocketSockObject *s;
Fred Drakea04eaad2000-06-30 02:46:07 +00002818 SOCKET_T fd;
2819 int family, type, proto = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002820 if (!PyArg_ParseTuple(args, "iii|i:fromfd",
2821 &fd, &family, &type, &proto))
Guido van Rossumbe32c891996-06-20 16:25:29 +00002822 return NULL;
Guido van Rossum5f59d601992-12-14 16:59:51 +00002823 /* Dup the fd so it and the socket can be closed independently */
2824 fd = dup(fd);
2825 if (fd < 0)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002826 return set_error();
2827 s = new_sockobject(fd, family, type, proto);
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002828 /* From now on, ignore SIGPIPE and let the error checking
2829 do the work. */
Guido van Rossum48a680c2001-03-02 06:34:14 +00002830#ifdef SIGPIPE
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002831 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum48a680c2001-03-02 06:34:14 +00002832#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00002833 return (PyObject *) s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002834}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002835
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002836PyDoc_STRVAR(fromfd_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002837"fromfd(fd, family, type[, proto]) -> socket object\n\
2838\n\
2839Create a socket object from the given file descriptor.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002840The remaining arguments are the same as for socket().");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002841
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002842#endif /* NO_DUP */
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002843
Guido van Rossum82a5c661998-07-07 20:45:43 +00002844
Guido van Rossum006bf911996-06-12 04:04:55 +00002845static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002846socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002847{
2848 int x1, x2;
2849
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002850 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002851 return NULL;
2852 }
2853 x2 = (int)ntohs((short)x1);
2854 return PyInt_FromLong(x2);
2855}
2856
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002857PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002858"ntohs(integer) -> integer\n\
2859\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002860Convert a 16-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002861
2862
Guido van Rossum006bf911996-06-12 04:04:55 +00002863static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002864socket_ntohl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00002865{
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002866 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00002867
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002868 if (PyInt_Check(arg)) {
2869 x = PyInt_AS_LONG(arg);
Jeremy Hylton825e47b2002-07-25 16:37:51 +00002870 if (x == (unsigned long) -1 && PyErr_Occurred())
2871 return NULL;
Guido van Rossum006bf911996-06-12 04:04:55 +00002872 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002873 else if (PyLong_Check(arg)) {
2874 x = PyLong_AsUnsignedLong(arg);
Jeremy Hylton825e47b2002-07-25 16:37:51 +00002875 if (x == (unsigned long) -1 && PyErr_Occurred())
2876 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002877#if SIZEOF_LONG > 4
2878 {
2879 unsigned long y;
2880 /* only want the trailing 32 bits */
2881 y = x & 0xFFFFFFFFUL;
2882 if (y ^ x)
2883 return PyErr_Format(PyExc_OverflowError,
2884 "long int larger than 32 bits");
2885 x = y;
Tim Peters58141872002-08-06 22:25:02 +00002886 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002887#endif
2888 }
2889 else
Tim Peters58141872002-08-06 22:25:02 +00002890 return PyErr_Format(PyExc_TypeError,
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002891 "expected int/long, %s found",
2892 arg->ob_type->tp_name);
2893 if (x == (unsigned long) -1 && PyErr_Occurred())
2894 return NULL;
2895 return PyInt_FromLong(ntohl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00002896}
2897
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002898PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002899"ntohl(integer) -> integer\n\
2900\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002901Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002902
2903
Guido van Rossum006bf911996-06-12 04:04:55 +00002904static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002905socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002906{
Hye-Shik Changa7b673f2003-12-17 09:40:23 +00002907 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00002908
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002909 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002910 return NULL;
2911 }
2912 x2 = (int)htons((short)x1);
2913 return PyInt_FromLong(x2);
2914}
2915
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002916PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002917"htons(integer) -> integer\n\
2918\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002919Convert a 16-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002920
2921
Guido van Rossum006bf911996-06-12 04:04:55 +00002922static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002923socket_htonl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00002924{
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002925 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00002926
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002927 if (PyInt_Check(arg)) {
2928 x = PyInt_AS_LONG(arg);
Jeremy Hylton825e47b2002-07-25 16:37:51 +00002929 if (x == (unsigned long) -1 && PyErr_Occurred())
2930 return NULL;
Guido van Rossum006bf911996-06-12 04:04:55 +00002931 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002932 else if (PyLong_Check(arg)) {
2933 x = PyLong_AsUnsignedLong(arg);
Jeremy Hylton825e47b2002-07-25 16:37:51 +00002934 if (x == (unsigned long) -1 && PyErr_Occurred())
2935 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002936#if SIZEOF_LONG > 4
2937 {
2938 unsigned long y;
2939 /* only want the trailing 32 bits */
2940 y = x & 0xFFFFFFFFUL;
2941 if (y ^ x)
2942 return PyErr_Format(PyExc_OverflowError,
2943 "long int larger than 32 bits");
2944 x = y;
Tim Peters58141872002-08-06 22:25:02 +00002945 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002946#endif
2947 }
2948 else
Tim Peters58141872002-08-06 22:25:02 +00002949 return PyErr_Format(PyExc_TypeError,
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002950 "expected int/long, %s found",
2951 arg->ob_type->tp_name);
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002952 return PyInt_FromLong(htonl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00002953}
2954
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002955PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002956"htonl(integer) -> integer\n\
2957\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002958Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002959
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002960/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002961
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002962PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002963"inet_aton(string) -> packed 32-bit IP representation\n\
2964\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002965Convert 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 +00002966binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002967
2968static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002969socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002970{
Guido van Rossuma2e48551999-09-09 15:42:59 +00002971#ifndef INADDR_NONE
2972#define INADDR_NONE (-1)
2973#endif
Neal Norwitz88f115b2003-02-13 02:15:42 +00002974#ifdef HAVE_INET_ATON
Guido van Rossumad05cdf2003-02-12 23:08:22 +00002975 struct in_addr buf;
Tim Peters1df9fdd2003-02-13 03:13:40 +00002976#else
2977 /* Have to use inet_addr() instead */
2978 unsigned long packed_addr;
2979#endif
2980 char *ip_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002981
Tim Peters1df9fdd2003-02-13 03:13:40 +00002982 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002983 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00002984
Tim Peters1df9fdd2003-02-13 03:13:40 +00002985
2986#ifdef HAVE_INET_ATON
Guido van Rossumad05cdf2003-02-12 23:08:22 +00002987 if (inet_aton(ip_addr, &buf))
2988 return PyString_FromStringAndSize((char *)(&buf),
2989 sizeof(buf));
2990
2991 PyErr_SetString(socket_error,
2992 "illegal IP address string passed to inet_aton");
2993 return NULL;
2994
Tim Peters1df9fdd2003-02-13 03:13:40 +00002995#else /* ! HAVE_INET_ATON */
Guido van Rossumad05cdf2003-02-12 23:08:22 +00002996 /* XXX Problem here: inet_aton('255.255.255.255') raises
2997 an exception while it should be a valid address. */
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002998 packed_addr = inet_addr(ip_addr);
2999
3000 if (packed_addr == INADDR_NONE) { /* invalid address */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003001 PyErr_SetString(socket_error,
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003002 "illegal IP address string passed to inet_aton");
3003 return NULL;
3004 }
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003005 return PyString_FromStringAndSize((char *) &packed_addr,
3006 sizeof(packed_addr));
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003007#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003008}
3009
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003010PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00003011"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003012\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003013Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003014
3015static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003016socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003017{
3018 char *packed_str;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003019 int addr_len;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003020 struct in_addr packed_addr;
3021
Guido van Rossum27fc3c02000-03-24 20:56:56 +00003022 if (!PyArg_ParseTuple(args, "s#:inet_ntoa", &packed_str, &addr_len)) {
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003023 return NULL;
3024 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00003025
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003026 if (addr_len != sizeof(packed_addr)) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003027 PyErr_SetString(socket_error,
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003028 "packed IP wrong length for inet_ntoa");
3029 return NULL;
3030 }
3031
3032 memcpy(&packed_addr, packed_str, addr_len);
3033
3034 return PyString_FromString(inet_ntoa(packed_addr));
3035}
Guido van Rossum82a5c661998-07-07 20:45:43 +00003036
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003037#ifdef HAVE_INET_PTON
3038
3039PyDoc_STRVAR(inet_pton_doc,
3040"inet_pton(af, ip) -> packed IP address string\n\
3041\n\
3042Convert an IP address from string format to a packed string suitable\n\
3043for use with low-level network functions.");
3044
3045static PyObject *
3046socket_inet_pton(PyObject *self, PyObject *args)
3047{
3048 int af;
3049 char* ip;
3050 int retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003051#ifdef ENABLE_IPV6
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003052 char packed[MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003053#else
3054 char packed[sizeof(struct in_addr)];
3055#endif
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003056 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
3057 return NULL;
3058 }
3059
Martin v. Löwis10649092003-08-05 06:25:06 +00003060#ifndef ENABLE_IPV6
3061 if(af == AF_INET6) {
3062 PyErr_SetString(socket_error,
3063 "can't use AF_INET6, IPv6 is disabled");
3064 return NULL;
3065 }
3066#endif
3067
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003068 retval = inet_pton(af, ip, packed);
3069 if (retval < 0) {
3070 PyErr_SetFromErrno(socket_error);
3071 return NULL;
3072 } else if (retval == 0) {
3073 PyErr_SetString(socket_error,
3074 "illegal IP address string passed to inet_pton");
3075 return NULL;
3076 } else if (af == AF_INET) {
3077 return PyString_FromStringAndSize(packed,
3078 sizeof(struct in_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003079#ifdef ENABLE_IPV6
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003080 } else if (af == AF_INET6) {
3081 return PyString_FromStringAndSize(packed,
3082 sizeof(struct in6_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003083#endif
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003084 } else {
3085 PyErr_SetString(socket_error, "unknown address family");
3086 return NULL;
3087 }
3088}
3089
3090PyDoc_STRVAR(inet_ntop_doc,
3091"inet_ntop(af, packed_ip) -> string formatted IP address\n\
3092\n\
3093Convert a packed IP address of the given family to string format.");
3094
3095static PyObject *
3096socket_inet_ntop(PyObject *self, PyObject *args)
3097{
3098 int af;
3099 char* packed;
3100 int len;
3101 const char* retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003102#ifdef ENABLE_IPV6
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003103 char ip[MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003104#else
3105 char ip[INET_ADDRSTRLEN + 1];
3106#endif
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003107
3108 /* Guarantee NUL-termination for PyString_FromString() below */
3109 memset((void *) &ip[0], '\0', sizeof(ip) + 1);
3110
3111 if (!PyArg_ParseTuple(args, "is#:inet_ntop", &af, &packed, &len)) {
3112 return NULL;
3113 }
3114
3115 if (af == AF_INET) {
3116 if (len != sizeof(struct in_addr)) {
3117 PyErr_SetString(PyExc_ValueError,
3118 "invalid length of packed IP address string");
3119 return NULL;
3120 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003121#ifdef ENABLE_IPV6
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003122 } else if (af == AF_INET6) {
3123 if (len != sizeof(struct in6_addr)) {
3124 PyErr_SetString(PyExc_ValueError,
3125 "invalid length of packed IP address string");
3126 return NULL;
3127 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003128#endif
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003129 } else {
3130 PyErr_Format(PyExc_ValueError,
3131 "unknown address family %d", af);
3132 return NULL;
3133 }
3134
3135 retval = inet_ntop(af, packed, ip, sizeof(ip));
3136 if (!retval) {
3137 PyErr_SetFromErrno(socket_error);
3138 return NULL;
3139 } else {
3140 return PyString_FromString(retval);
3141 }
3142
3143 /* NOTREACHED */
3144 PyErr_SetString(PyExc_RuntimeError, "invalid handling of inet_ntop");
3145 return NULL;
3146}
3147
3148#endif /* HAVE_INET_PTON */
3149
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003150/* Python interface to getaddrinfo(host, port). */
3151
3152/*ARGSUSED*/
3153static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003154socket_getaddrinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003155{
Martin v. Löwisf0b11d22001-11-07 08:31:03 +00003156 struct addrinfo hints, *res;
3157 struct addrinfo *res0 = NULL;
Martin v. Löwis2548c732003-04-18 10:39:54 +00003158 PyObject *hobj = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003159 PyObject *pobj = (PyObject *)NULL;
Martin v. Löwisf65b1a12001-08-12 09:28:40 +00003160 char pbuf[30];
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003161 char *hptr, *pptr;
3162 int family, socktype, protocol, flags;
3163 int error;
3164 PyObject *all = (PyObject *)NULL;
3165 PyObject *single = (PyObject *)NULL;
Martin v. Löwis2548c732003-04-18 10:39:54 +00003166 PyObject *idna = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003167
3168 family = socktype = protocol = flags = 0;
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00003169 family = AF_UNSPEC;
Martin v. Löwis2548c732003-04-18 10:39:54 +00003170 if (!PyArg_ParseTuple(args, "OO|iiii:getaddrinfo",
3171 &hobj, &pobj, &family, &socktype,
3172 &protocol, &flags)) {
3173 return NULL;
3174 }
3175 if (hobj == Py_None) {
3176 hptr = NULL;
3177 } else if (PyUnicode_Check(hobj)) {
3178 idna = PyObject_CallMethod(hobj, "encode", "s", "idna");
3179 if (!idna)
3180 return NULL;
3181 hptr = PyString_AsString(idna);
3182 } else if (PyString_Check(hobj)) {
3183 hptr = PyString_AsString(hobj);
3184 } else {
3185 PyErr_SetString(PyExc_TypeError,
3186 "getaddrinfo() argument 1 must be string or None");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003187 return NULL;
3188 }
3189 if (PyInt_Check(pobj)) {
Marc-André Lemburg03d1b182001-07-31 18:05:33 +00003190 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", PyInt_AsLong(pobj));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003191 pptr = pbuf;
3192 } else if (PyString_Check(pobj)) {
3193 pptr = PyString_AsString(pobj);
3194 } else if (pobj == Py_None) {
3195 pptr = (char *)NULL;
3196 } else {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003197 PyErr_SetString(socket_error, "Int or String expected");
Martin v. Löwis5db099a2003-08-07 11:55:15 +00003198 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003199 }
3200 memset(&hints, 0, sizeof(hints));
3201 hints.ai_family = family;
3202 hints.ai_socktype = socktype;
3203 hints.ai_protocol = protocol;
3204 hints.ai_flags = flags;
Just van Rossum1040d2c2003-05-09 07:53:18 +00003205 Py_BEGIN_ALLOW_THREADS
3206 ACQUIRE_GETADDRINFO_LOCK
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003207 error = getaddrinfo(hptr, pptr, &hints, &res0);
Just van Rossum1040d2c2003-05-09 07:53:18 +00003208 Py_END_ALLOW_THREADS
3209 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003210 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003211 set_gaierror(error);
Martin v. Löwis5db099a2003-08-07 11:55:15 +00003212 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003213 }
3214
3215 if ((all = PyList_New(0)) == NULL)
3216 goto err;
3217 for (res = res0; res; res = res->ai_next) {
Guido van Rossum716aac02001-10-12 18:59:27 +00003218 PyObject *addr =
3219 makesockaddr(-1, res->ai_addr, res->ai_addrlen);
3220 if (addr == NULL)
3221 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003222 single = Py_BuildValue("iiisO", res->ai_family,
3223 res->ai_socktype, res->ai_protocol,
3224 res->ai_canonname ? res->ai_canonname : "",
Guido van Rossum716aac02001-10-12 18:59:27 +00003225 addr);
3226 Py_DECREF(addr);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003227 if (single == NULL)
3228 goto err;
3229
3230 if (PyList_Append(all, single))
3231 goto err;
3232 Py_XDECREF(single);
3233 }
Martin v. Löwis2548c732003-04-18 10:39:54 +00003234 Py_XDECREF(idna);
Neal Norwitz90128ba2002-08-09 03:37:42 +00003235 if (res0)
3236 freeaddrinfo(res0);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003237 return all;
3238 err:
3239 Py_XDECREF(single);
3240 Py_XDECREF(all);
Martin v. Löwis2548c732003-04-18 10:39:54 +00003241 Py_XDECREF(idna);
Martin v. Löwisf0b11d22001-11-07 08:31:03 +00003242 if (res0)
3243 freeaddrinfo(res0);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003244 return (PyObject *)NULL;
3245}
3246
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003247PyDoc_STRVAR(getaddrinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003248"getaddrinfo(host, port [, family, socktype, proto, flags])\n\
3249 -> list of (family, socktype, proto, canonname, sockaddr)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003250\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003251Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003252
3253/* Python interface to getnameinfo(sa, flags). */
3254
3255/*ARGSUSED*/
3256static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003257socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003258{
3259 PyObject *sa = (PyObject *)NULL;
3260 int flags;
3261 char *hostp;
Martin v. Löwis06b1d212001-11-02 23:34:52 +00003262 int port, flowinfo, scope_id;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003263 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
3264 struct addrinfo hints, *res = NULL;
3265 int error;
3266 PyObject *ret = (PyObject *)NULL;
3267
3268 flags = flowinfo = scope_id = 0;
Martin v. Löwis06b1d212001-11-02 23:34:52 +00003269 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003270 return NULL;
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003271 if (!PyArg_ParseTuple(sa, "si|ii",
3272 &hostp, &port, &flowinfo, &scope_id))
Martin v. Löwis06b1d212001-11-02 23:34:52 +00003273 return NULL;
Marc-André Lemburg03d1b182001-07-31 18:05:33 +00003274 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003275 memset(&hints, 0, sizeof(hints));
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00003276 hints.ai_family = AF_UNSPEC;
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003277 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Just van Rossum1040d2c2003-05-09 07:53:18 +00003278 Py_BEGIN_ALLOW_THREADS
3279 ACQUIRE_GETADDRINFO_LOCK
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003280 error = getaddrinfo(hostp, pbuf, &hints, &res);
Just van Rossum1040d2c2003-05-09 07:53:18 +00003281 Py_END_ALLOW_THREADS
3282 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003283 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003284 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003285 goto fail;
3286 }
3287 if (res->ai_next) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003288 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003289 "sockaddr resolved to multiple addresses");
3290 goto fail;
3291 }
3292 switch (res->ai_family) {
3293 case AF_INET:
3294 {
3295 char *t1;
3296 int t2;
3297 if (PyArg_ParseTuple(sa, "si", &t1, &t2) == 0) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003298 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003299 "IPv4 sockaddr must be 2 tuple");
3300 goto fail;
3301 }
3302 break;
3303 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00003304#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003305 case AF_INET6:
3306 {
3307 struct sockaddr_in6 *sin6;
3308 sin6 = (struct sockaddr_in6 *)res->ai_addr;
3309 sin6->sin6_flowinfo = flowinfo;
3310 sin6->sin6_scope_id = scope_id;
3311 break;
3312 }
3313#endif
3314 }
3315 error = getnameinfo(res->ai_addr, res->ai_addrlen,
3316 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
3317 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003318 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003319 goto fail;
3320 }
3321 ret = Py_BuildValue("ss", hbuf, pbuf);
3322
3323fail:
3324 if (res)
3325 freeaddrinfo(res);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003326 return ret;
3327}
3328
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003329PyDoc_STRVAR(getnameinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003330"getnameinfo(sockaddr, flags) --> (host, port)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003331\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003332Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003333
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00003334
3335/* Python API to getting and setting the default timeout value. */
3336
3337static PyObject *
3338socket_getdefaulttimeout(PyObject *self)
3339{
3340 if (defaulttimeout < 0.0) {
3341 Py_INCREF(Py_None);
3342 return Py_None;
3343 }
3344 else
3345 return PyFloat_FromDouble(defaulttimeout);
3346}
3347
3348PyDoc_STRVAR(getdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003349"getdefaulttimeout() -> timeout\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00003350\n\
3351Returns the default timeout in floating seconds for new socket objects.\n\
3352A value of None indicates that new socket objects have no timeout.\n\
3353When the socket module is first imported, the default is None.");
3354
3355static PyObject *
3356socket_setdefaulttimeout(PyObject *self, PyObject *arg)
3357{
3358 double timeout;
3359
3360 if (arg == Py_None)
3361 timeout = -1.0;
3362 else {
3363 timeout = PyFloat_AsDouble(arg);
3364 if (timeout < 0.0) {
3365 if (!PyErr_Occurred())
3366 PyErr_SetString(PyExc_ValueError,
3367 "Timeout value out of range");
3368 return NULL;
3369 }
3370 }
3371
3372 defaulttimeout = timeout;
3373
3374 Py_INCREF(Py_None);
3375 return Py_None;
3376}
3377
3378PyDoc_STRVAR(setdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003379"setdefaulttimeout(timeout)\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00003380\n\
3381Set the default timeout in floating seconds for new socket objects.\n\
3382A value of None indicates that new socket objects have no timeout.\n\
3383When the socket module is first imported, the default is None.");
3384
3385
Guido van Rossum30a685f1991-06-27 15:51:29 +00003386/* List of functions exported by this module. */
3387
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003388static PyMethodDef socket_methods[] = {
3389 {"gethostbyname", socket_gethostbyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003390 METH_VARARGS, gethostbyname_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003391 {"gethostbyname_ex", socket_gethostbyname_ex,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003392 METH_VARARGS, ghbn_ex_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003393 {"gethostbyaddr", socket_gethostbyaddr,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003394 METH_VARARGS, gethostbyaddr_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003395 {"gethostname", socket_gethostname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003396 METH_VARARGS, gethostname_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003397 {"getservbyname", socket_getservbyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003398 METH_VARARGS, getservbyname_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003399 {"getprotobyname", socket_getprotobyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003400 METH_VARARGS,getprotobyname_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00003401#ifndef NO_DUP
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003402 {"fromfd", socket_fromfd,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003403 METH_VARARGS, fromfd_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00003404#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003405 {"ntohs", socket_ntohs,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003406 METH_VARARGS, ntohs_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003407 {"ntohl", socket_ntohl,
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003408 METH_O, ntohl_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003409 {"htons", socket_htons,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003410 METH_VARARGS, htons_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003411 {"htonl", socket_htonl,
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003412 METH_O, htonl_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003413 {"inet_aton", socket_inet_aton,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003414 METH_VARARGS, inet_aton_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003415 {"inet_ntoa", socket_inet_ntoa,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003416 METH_VARARGS, inet_ntoa_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003417#ifdef HAVE_INET_PTON
3418 {"inet_pton", socket_inet_pton,
3419 METH_VARARGS, inet_pton_doc},
3420 {"inet_ntop", socket_inet_ntop,
3421 METH_VARARGS, inet_ntop_doc},
3422#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003423 {"getaddrinfo", socket_getaddrinfo,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003424 METH_VARARGS, getaddrinfo_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003425 {"getnameinfo", socket_getnameinfo,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003426 METH_VARARGS, getnameinfo_doc},
Guido van Rossum1693ba82002-07-18 21:11:26 +00003427 {"getdefaulttimeout", (PyCFunction)socket_getdefaulttimeout,
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00003428 METH_NOARGS, getdefaulttimeout_doc},
3429 {"setdefaulttimeout", socket_setdefaulttimeout,
3430 METH_O, setdefaulttimeout_doc},
Guido van Rossum30a685f1991-06-27 15:51:29 +00003431 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003432};
3433
Guido van Rossum30a685f1991-06-27 15:51:29 +00003434
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003435#ifdef RISCOS
3436#define OS_INIT_DEFINED
Guido van Rossumbe32c891996-06-20 16:25:29 +00003437
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003438static int
3439os_init(void)
3440{
3441 _kernel_swi_regs r;
3442
3443 r.r[0] = 0;
3444 _kernel_swi(0x43380, &r, &r);
3445 taskwindow = r.r[0];
3446
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003447 return 1;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003448}
3449
3450#endif /* RISCOS */
3451
3452
3453#ifdef MS_WINDOWS
3454#define OS_INIT_DEFINED
3455
3456/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00003457
3458static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003459os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00003460{
3461 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00003462}
3463
3464static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003465os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00003466{
3467 WSADATA WSAData;
3468 int ret;
3469 char buf[100];
3470 ret = WSAStartup(0x0101, &WSAData);
3471 switch (ret) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003472 case 0: /* No error */
Mark Hammond14350ab2003-07-09 04:57:46 +00003473 Py_AtExit(os_cleanup);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003474 return 1; /* Success */
Guido van Rossumbe32c891996-06-20 16:25:29 +00003475 case WSASYSNOTREADY:
3476 PyErr_SetString(PyExc_ImportError,
3477 "WSAStartup failed: network not ready");
3478 break;
3479 case WSAVERNOTSUPPORTED:
3480 case WSAEINVAL:
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003481 PyErr_SetString(
3482 PyExc_ImportError,
3483 "WSAStartup failed: requested version not supported");
Guido van Rossumbe32c891996-06-20 16:25:29 +00003484 break;
3485 default:
Tim Peters885d4572001-11-28 20:27:42 +00003486 PyOS_snprintf(buf, sizeof(buf),
3487 "WSAStartup failed: error code %d", ret);
Guido van Rossumbe32c891996-06-20 16:25:29 +00003488 PyErr_SetString(PyExc_ImportError, buf);
3489 break;
3490 }
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003491 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00003492}
3493
Guido van Rossum8d665e61996-06-26 18:22:49 +00003494#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00003495
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003496
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003497#ifdef PYOS_OS2
3498#define OS_INIT_DEFINED
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003499
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003500/* Additional initialization for OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003501
3502static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003503os_init(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003504{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003505#ifndef PYCC_GCC
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003506 char reason[64];
3507 int rc = sock_init();
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003508
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003509 if (rc == 0) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003510 return 1; /* Success */
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003511 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003512
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003513 PyOS_snprintf(reason, sizeof(reason),
3514 "OS/2 TCP/IP Error# %d", sock_errno());
3515 PyErr_SetString(PyExc_ImportError, reason);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003516
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003517 return 0; /* Failure */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00003518#else
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003519 /* No need to initialise sockets with GCC/EMX */
3520 return 1; /* Success */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00003521#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003522}
3523
3524#endif /* PYOS_OS2 */
3525
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003526
3527#ifndef OS_INIT_DEFINED
3528static int
3529os_init(void)
3530{
3531 return 1; /* Success */
3532}
3533#endif
3534
3535
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00003536/* C API table - always add new things to the end for binary
3537 compatibility. */
3538static
3539PySocketModule_APIObject PySocketModuleAPI =
3540{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003541 &sock_type,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00003542};
3543
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003544
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003545/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003546
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003547 This module is actually called "_socket", and there's a wrapper
3548 "socket.py" which implements some additional functionality. On some
3549 platforms (e.g. Windows and OS/2), socket.py also implements a
3550 wrapper for the socket type that provides missing functionality such
3551 as makefile(), dup() and fromfd(). The import of "_socket" may fail
3552 with an ImportError exception if os-specific initialization fails.
3553 On Windows, this does WINSOCK initialization. When WINSOCK is
3554 initialized succesfully, a call to WSACleanup() is scheduled to be
3555 made at exit time.
3556*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003557
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003558PyDoc_STRVAR(socket_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003559"Implementation module for socket operations.\n\
3560\n\
3561See the socket module for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003562
Mark Hammondfe51c6d2002-08-02 02:27:13 +00003563PyMODINIT_FUNC
Thomas Wouters1e0c2f42000-07-24 16:06:23 +00003564init_socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003565{
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003566 PyObject *m, *has_ipv6;
Fred Drake4baedc12002-04-01 14:53:37 +00003567
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003568 if (!os_init())
Guido van Rossum0cb96de1997-10-01 04:29:29 +00003569 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003570
3571 sock_type.ob_type = &PyType_Type;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003572 m = Py_InitModule3(PySocket_MODULE_NAME,
3573 socket_methods,
3574 socket_doc);
3575
3576 socket_error = PyErr_NewException("socket.error", NULL, NULL);
3577 if (socket_error == NULL)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003578 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003579 Py_INCREF(socket_error);
3580 PyModule_AddObject(m, "error", socket_error);
3581 socket_herror = PyErr_NewException("socket.herror",
3582 socket_error, NULL);
3583 if (socket_herror == NULL)
3584 return;
3585 Py_INCREF(socket_herror);
3586 PyModule_AddObject(m, "herror", socket_herror);
3587 socket_gaierror = PyErr_NewException("socket.gaierror", socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003588 NULL);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003589 if (socket_gaierror == NULL)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003590 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003591 Py_INCREF(socket_gaierror);
3592 PyModule_AddObject(m, "gaierror", socket_gaierror);
Raymond Hettingeref7343c2003-06-29 03:08:05 +00003593 socket_timeout = PyErr_NewException("socket.timeout",
3594 socket_error, NULL);
3595 if (socket_timeout == NULL)
3596 return;
3597 Py_INCREF(socket_timeout);
3598 PyModule_AddObject(m, "timeout", socket_timeout);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003599 Py_INCREF((PyObject *)&sock_type);
Fred Drake4baedc12002-04-01 14:53:37 +00003600 if (PyModule_AddObject(m, "SocketType",
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003601 (PyObject *)&sock_type) != 0)
Guido van Rossum0cb96de1997-10-01 04:29:29 +00003602 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003603 Py_INCREF((PyObject *)&sock_type);
Fred Drake4baedc12002-04-01 14:53:37 +00003604 if (PyModule_AddObject(m, "socket",
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003605 (PyObject *)&sock_type) != 0)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003606 return;
Guido van Rossum09be4091999-08-09 14:40:40 +00003607
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003608#ifdef ENABLE_IPV6
3609 has_ipv6 = Py_True;
3610#else
3611 has_ipv6 = Py_False;
3612#endif
3613 Py_INCREF(has_ipv6);
3614 PyModule_AddObject(m, "has_ipv6", has_ipv6);
3615
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00003616 /* Export C API */
Fred Drake4baedc12002-04-01 14:53:37 +00003617 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00003618 PyCObject_FromVoidPtr((void *)&PySocketModuleAPI, NULL)
3619 ) != 0)
3620 return;
3621
Guido van Rossum09be4091999-08-09 14:40:40 +00003622 /* Address families (we only support AF_INET and AF_UNIX) */
3623#ifdef AF_UNSPEC
Fred Drake4baedc12002-04-01 14:53:37 +00003624 PyModule_AddIntConstant(m, "AF_UNSPEC", AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00003625#endif
Fred Drake4baedc12002-04-01 14:53:37 +00003626 PyModule_AddIntConstant(m, "AF_INET", AF_INET);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003627#ifdef AF_INET6
Fred Drake4baedc12002-04-01 14:53:37 +00003628 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003629#endif /* AF_INET6 */
Andrew MacIntyre34d3e2d2003-01-02 12:45:34 +00003630#if defined(AF_UNIX) && !defined(PYOS_OS2)
Fred Drake4baedc12002-04-01 14:53:37 +00003631 PyModule_AddIntConstant(m, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00003632#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00003633#ifdef AF_AX25
Fred Drake4baedc12002-04-01 14:53:37 +00003634 /* Amateur Radio AX.25 */
3635 PyModule_AddIntConstant(m, "AF_AX25", AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00003636#endif
3637#ifdef AF_IPX
Fred Drake4baedc12002-04-01 14:53:37 +00003638 PyModule_AddIntConstant(m, "AF_IPX", AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00003639#endif
3640#ifdef AF_APPLETALK
Fred Drake4baedc12002-04-01 14:53:37 +00003641 /* Appletalk DDP */
3642 PyModule_AddIntConstant(m, "AF_APPLETALK", AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00003643#endif
3644#ifdef AF_NETROM
Fred Drake4baedc12002-04-01 14:53:37 +00003645 /* Amateur radio NetROM */
3646 PyModule_AddIntConstant(m, "AF_NETROM", AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00003647#endif
3648#ifdef AF_BRIDGE
Fred Drake4baedc12002-04-01 14:53:37 +00003649 /* Multiprotocol bridge */
3650 PyModule_AddIntConstant(m, "AF_BRIDGE", AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00003651#endif
3652#ifdef AF_AAL5
Fred Drake4baedc12002-04-01 14:53:37 +00003653 /* Reserved for Werner's ATM */
3654 PyModule_AddIntConstant(m, "AF_AAL5", AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00003655#endif
3656#ifdef AF_X25
Fred Drake4baedc12002-04-01 14:53:37 +00003657 /* Reserved for X.25 project */
3658 PyModule_AddIntConstant(m, "AF_X25", AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00003659#endif
3660#ifdef AF_INET6
Fred Drake4baedc12002-04-01 14:53:37 +00003661 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00003662#endif
3663#ifdef AF_ROSE
Fred Drake4baedc12002-04-01 14:53:37 +00003664 /* Amateur Radio X.25 PLP */
3665 PyModule_AddIntConstant(m, "AF_ROSE", AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00003666#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00003667
3668#ifdef HAVE_BLUETOOTH_BLUETOOTH_H
3669 PyModule_AddIntConstant(m, "AF_BLUETOOTH", AF_BLUETOOTH);
3670 PyModule_AddIntConstant(m, "BTPROTO_L2CAP", BTPROTO_L2CAP);
3671 PyModule_AddIntConstant(m, "BTPROTO_SCO", BTPROTO_SCO);
3672 PyModule_AddIntConstant(m, "BTPROTO_RFCOMM", BTPROTO_RFCOMM);
3673 PyModule_AddObject(m, "BDADDR_ANY", Py_BuildValue( "iiiiii", 0,0,0,0,0,0 ) );
3674 PyModule_AddObject(m, "BDADDR_LOCAL", Py_BuildValue( "iiiiii", 0,0,0,0xff,0xff,0xff ) );
3675#endif
3676
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00003677#ifdef HAVE_NETPACKET_PACKET_H
Fred Drake4baedc12002-04-01 14:53:37 +00003678 PyModule_AddIntConstant(m, "AF_PACKET", AF_PACKET);
3679 PyModule_AddIntConstant(m, "PF_PACKET", PF_PACKET);
3680 PyModule_AddIntConstant(m, "PACKET_HOST", PACKET_HOST);
3681 PyModule_AddIntConstant(m, "PACKET_BROADCAST", PACKET_BROADCAST);
3682 PyModule_AddIntConstant(m, "PACKET_MULTICAST", PACKET_MULTICAST);
3683 PyModule_AddIntConstant(m, "PACKET_OTHERHOST", PACKET_OTHERHOST);
3684 PyModule_AddIntConstant(m, "PACKET_OUTGOING", PACKET_OUTGOING);
3685 PyModule_AddIntConstant(m, "PACKET_LOOPBACK", PACKET_LOOPBACK);
3686 PyModule_AddIntConstant(m, "PACKET_FASTROUTE", PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00003687#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00003688
3689 /* Socket types */
Fred Drake4baedc12002-04-01 14:53:37 +00003690 PyModule_AddIntConstant(m, "SOCK_STREAM", SOCK_STREAM);
3691 PyModule_AddIntConstant(m, "SOCK_DGRAM", SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00003692#ifndef __BEOS__
3693/* We have incomplete socket support. */
Fred Drake4baedc12002-04-01 14:53:37 +00003694 PyModule_AddIntConstant(m, "SOCK_RAW", SOCK_RAW);
3695 PyModule_AddIntConstant(m, "SOCK_SEQPACKET", SOCK_SEQPACKET);
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00003696#if defined(SOCK_RDM)
Fred Drake4baedc12002-04-01 14:53:37 +00003697 PyModule_AddIntConstant(m, "SOCK_RDM", SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00003698#endif
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00003699#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003700
3701#ifdef SO_DEBUG
Fred Drake4baedc12002-04-01 14:53:37 +00003702 PyModule_AddIntConstant(m, "SO_DEBUG", SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003703#endif
3704#ifdef SO_ACCEPTCONN
Fred Drake4baedc12002-04-01 14:53:37 +00003705 PyModule_AddIntConstant(m, "SO_ACCEPTCONN", SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003706#endif
3707#ifdef SO_REUSEADDR
Fred Drake4baedc12002-04-01 14:53:37 +00003708 PyModule_AddIntConstant(m, "SO_REUSEADDR", SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003709#endif
3710#ifdef SO_KEEPALIVE
Fred Drake4baedc12002-04-01 14:53:37 +00003711 PyModule_AddIntConstant(m, "SO_KEEPALIVE", SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003712#endif
3713#ifdef SO_DONTROUTE
Fred Drake4baedc12002-04-01 14:53:37 +00003714 PyModule_AddIntConstant(m, "SO_DONTROUTE", SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003715#endif
3716#ifdef SO_BROADCAST
Fred Drake4baedc12002-04-01 14:53:37 +00003717 PyModule_AddIntConstant(m, "SO_BROADCAST", SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003718#endif
3719#ifdef SO_USELOOPBACK
Fred Drake4baedc12002-04-01 14:53:37 +00003720 PyModule_AddIntConstant(m, "SO_USELOOPBACK", SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003721#endif
3722#ifdef SO_LINGER
Fred Drake4baedc12002-04-01 14:53:37 +00003723 PyModule_AddIntConstant(m, "SO_LINGER", SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003724#endif
3725#ifdef SO_OOBINLINE
Fred Drake4baedc12002-04-01 14:53:37 +00003726 PyModule_AddIntConstant(m, "SO_OOBINLINE", SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003727#endif
3728#ifdef SO_REUSEPORT
Fred Drake4baedc12002-04-01 14:53:37 +00003729 PyModule_AddIntConstant(m, "SO_REUSEPORT", SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003730#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003731#ifdef SO_SNDBUF
Fred Drake4baedc12002-04-01 14:53:37 +00003732 PyModule_AddIntConstant(m, "SO_SNDBUF", SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003733#endif
3734#ifdef SO_RCVBUF
Fred Drake4baedc12002-04-01 14:53:37 +00003735 PyModule_AddIntConstant(m, "SO_RCVBUF", SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003736#endif
3737#ifdef SO_SNDLOWAT
Fred Drake4baedc12002-04-01 14:53:37 +00003738 PyModule_AddIntConstant(m, "SO_SNDLOWAT", SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003739#endif
3740#ifdef SO_RCVLOWAT
Fred Drake4baedc12002-04-01 14:53:37 +00003741 PyModule_AddIntConstant(m, "SO_RCVLOWAT", SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003742#endif
3743#ifdef SO_SNDTIMEO
Fred Drake4baedc12002-04-01 14:53:37 +00003744 PyModule_AddIntConstant(m, "SO_SNDTIMEO", SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003745#endif
3746#ifdef SO_RCVTIMEO
Fred Drake4baedc12002-04-01 14:53:37 +00003747 PyModule_AddIntConstant(m, "SO_RCVTIMEO", SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003748#endif
3749#ifdef SO_ERROR
Fred Drake4baedc12002-04-01 14:53:37 +00003750 PyModule_AddIntConstant(m, "SO_ERROR", SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003751#endif
3752#ifdef SO_TYPE
Fred Drake4baedc12002-04-01 14:53:37 +00003753 PyModule_AddIntConstant(m, "SO_TYPE", SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003754#endif
3755
3756 /* Maximum number of connections for "listen" */
3757#ifdef SOMAXCONN
Fred Drake4baedc12002-04-01 14:53:37 +00003758 PyModule_AddIntConstant(m, "SOMAXCONN", SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003759#else
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003760 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003761#endif
3762
3763 /* Flags for send, recv */
3764#ifdef MSG_OOB
Fred Drake4baedc12002-04-01 14:53:37 +00003765 PyModule_AddIntConstant(m, "MSG_OOB", MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003766#endif
3767#ifdef MSG_PEEK
Fred Drake4baedc12002-04-01 14:53:37 +00003768 PyModule_AddIntConstant(m, "MSG_PEEK", MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003769#endif
3770#ifdef MSG_DONTROUTE
Fred Drake4baedc12002-04-01 14:53:37 +00003771 PyModule_AddIntConstant(m, "MSG_DONTROUTE", MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003772#endif
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00003773#ifdef MSG_DONTWAIT
Fred Drake4baedc12002-04-01 14:53:37 +00003774 PyModule_AddIntConstant(m, "MSG_DONTWAIT", MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00003775#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003776#ifdef MSG_EOR
Fred Drake4baedc12002-04-01 14:53:37 +00003777 PyModule_AddIntConstant(m, "MSG_EOR", MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003778#endif
3779#ifdef MSG_TRUNC
Fred Drake4baedc12002-04-01 14:53:37 +00003780 PyModule_AddIntConstant(m, "MSG_TRUNC", MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003781#endif
3782#ifdef MSG_CTRUNC
Fred Drake4baedc12002-04-01 14:53:37 +00003783 PyModule_AddIntConstant(m, "MSG_CTRUNC", MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003784#endif
3785#ifdef MSG_WAITALL
Fred Drake4baedc12002-04-01 14:53:37 +00003786 PyModule_AddIntConstant(m, "MSG_WAITALL", MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003787#endif
3788#ifdef MSG_BTAG
Fred Drake4baedc12002-04-01 14:53:37 +00003789 PyModule_AddIntConstant(m, "MSG_BTAG", MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003790#endif
3791#ifdef MSG_ETAG
Fred Drake4baedc12002-04-01 14:53:37 +00003792 PyModule_AddIntConstant(m, "MSG_ETAG", MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003793#endif
3794
3795 /* Protocol level and numbers, usable for [gs]etsockopt */
3796#ifdef SOL_SOCKET
Fred Drake4baedc12002-04-01 14:53:37 +00003797 PyModule_AddIntConstant(m, "SOL_SOCKET", SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003798#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00003799#ifdef SOL_IP
Fred Drake4baedc12002-04-01 14:53:37 +00003800 PyModule_AddIntConstant(m, "SOL_IP", SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00003801#else
Fred Drake4baedc12002-04-01 14:53:37 +00003802 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00003803#endif
3804#ifdef SOL_IPX
Fred Drake4baedc12002-04-01 14:53:37 +00003805 PyModule_AddIntConstant(m, "SOL_IPX", SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00003806#endif
3807#ifdef SOL_AX25
Fred Drake4baedc12002-04-01 14:53:37 +00003808 PyModule_AddIntConstant(m, "SOL_AX25", SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00003809#endif
3810#ifdef SOL_ATALK
Fred Drake4baedc12002-04-01 14:53:37 +00003811 PyModule_AddIntConstant(m, "SOL_ATALK", SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00003812#endif
3813#ifdef SOL_NETROM
Fred Drake4baedc12002-04-01 14:53:37 +00003814 PyModule_AddIntConstant(m, "SOL_NETROM", SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00003815#endif
3816#ifdef SOL_ROSE
Fred Drake4baedc12002-04-01 14:53:37 +00003817 PyModule_AddIntConstant(m, "SOL_ROSE", SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00003818#endif
3819#ifdef SOL_TCP
Fred Drake4baedc12002-04-01 14:53:37 +00003820 PyModule_AddIntConstant(m, "SOL_TCP", SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00003821#else
Fred Drake4baedc12002-04-01 14:53:37 +00003822 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00003823#endif
3824#ifdef SOL_UDP
Fred Drake4baedc12002-04-01 14:53:37 +00003825 PyModule_AddIntConstant(m, "SOL_UDP", SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00003826#else
Fred Drake4baedc12002-04-01 14:53:37 +00003827 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00003828#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003829#ifdef IPPROTO_IP
Fred Drake4baedc12002-04-01 14:53:37 +00003830 PyModule_AddIntConstant(m, "IPPROTO_IP", IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00003831#else
Fred Drake4baedc12002-04-01 14:53:37 +00003832 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003833#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003834#ifdef IPPROTO_HOPOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00003835 PyModule_AddIntConstant(m, "IPPROTO_HOPOPTS", IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003836#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003837#ifdef IPPROTO_ICMP
Fred Drake4baedc12002-04-01 14:53:37 +00003838 PyModule_AddIntConstant(m, "IPPROTO_ICMP", IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00003839#else
Fred Drake4baedc12002-04-01 14:53:37 +00003840 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003841#endif
3842#ifdef IPPROTO_IGMP
Fred Drake4baedc12002-04-01 14:53:37 +00003843 PyModule_AddIntConstant(m, "IPPROTO_IGMP", IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003844#endif
3845#ifdef IPPROTO_GGP
Fred Drake4baedc12002-04-01 14:53:37 +00003846 PyModule_AddIntConstant(m, "IPPROTO_GGP", IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003847#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003848#ifdef IPPROTO_IPV4
Fred Drake4baedc12002-04-01 14:53:37 +00003849 PyModule_AddIntConstant(m, "IPPROTO_IPV4", IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003850#endif
Martin v. Löwisa0f17342003-10-03 13:56:20 +00003851#ifdef IPPROTO_IPV6
3852 PyModule_AddIntConstant(m, "IPPROTO_IPV6", IPPROTO_IPV6);
3853#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003854#ifdef IPPROTO_IPIP
Fred Drake4baedc12002-04-01 14:53:37 +00003855 PyModule_AddIntConstant(m, "IPPROTO_IPIP", IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003856#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003857#ifdef IPPROTO_TCP
Fred Drake4baedc12002-04-01 14:53:37 +00003858 PyModule_AddIntConstant(m, "IPPROTO_TCP", IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00003859#else
Fred Drake4baedc12002-04-01 14:53:37 +00003860 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003861#endif
3862#ifdef IPPROTO_EGP
Fred Drake4baedc12002-04-01 14:53:37 +00003863 PyModule_AddIntConstant(m, "IPPROTO_EGP", IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003864#endif
3865#ifdef IPPROTO_PUP
Fred Drake4baedc12002-04-01 14:53:37 +00003866 PyModule_AddIntConstant(m, "IPPROTO_PUP", IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003867#endif
3868#ifdef IPPROTO_UDP
Fred Drake4baedc12002-04-01 14:53:37 +00003869 PyModule_AddIntConstant(m, "IPPROTO_UDP", IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00003870#else
Fred Drake4baedc12002-04-01 14:53:37 +00003871 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003872#endif
3873#ifdef IPPROTO_IDP
Fred Drake4baedc12002-04-01 14:53:37 +00003874 PyModule_AddIntConstant(m, "IPPROTO_IDP", IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003875#endif
3876#ifdef IPPROTO_HELLO
Fred Drake4baedc12002-04-01 14:53:37 +00003877 PyModule_AddIntConstant(m, "IPPROTO_HELLO", IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003878#endif
3879#ifdef IPPROTO_ND
Fred Drake4baedc12002-04-01 14:53:37 +00003880 PyModule_AddIntConstant(m, "IPPROTO_ND", IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003881#endif
3882#ifdef IPPROTO_TP
Fred Drake4baedc12002-04-01 14:53:37 +00003883 PyModule_AddIntConstant(m, "IPPROTO_TP", IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003884#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003885#ifdef IPPROTO_IPV6
Fred Drake4baedc12002-04-01 14:53:37 +00003886 PyModule_AddIntConstant(m, "IPPROTO_IPV6", IPPROTO_IPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003887#endif
3888#ifdef IPPROTO_ROUTING
Fred Drake4baedc12002-04-01 14:53:37 +00003889 PyModule_AddIntConstant(m, "IPPROTO_ROUTING", IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003890#endif
3891#ifdef IPPROTO_FRAGMENT
Fred Drake4baedc12002-04-01 14:53:37 +00003892 PyModule_AddIntConstant(m, "IPPROTO_FRAGMENT", IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003893#endif
3894#ifdef IPPROTO_RSVP
Fred Drake4baedc12002-04-01 14:53:37 +00003895 PyModule_AddIntConstant(m, "IPPROTO_RSVP", IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003896#endif
3897#ifdef IPPROTO_GRE
Fred Drake4baedc12002-04-01 14:53:37 +00003898 PyModule_AddIntConstant(m, "IPPROTO_GRE", IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003899#endif
3900#ifdef IPPROTO_ESP
Fred Drake4baedc12002-04-01 14:53:37 +00003901 PyModule_AddIntConstant(m, "IPPROTO_ESP", IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003902#endif
3903#ifdef IPPROTO_AH
Fred Drake4baedc12002-04-01 14:53:37 +00003904 PyModule_AddIntConstant(m, "IPPROTO_AH", IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003905#endif
3906#ifdef IPPROTO_MOBILE
Fred Drake4baedc12002-04-01 14:53:37 +00003907 PyModule_AddIntConstant(m, "IPPROTO_MOBILE", IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003908#endif
3909#ifdef IPPROTO_ICMPV6
Fred Drake4baedc12002-04-01 14:53:37 +00003910 PyModule_AddIntConstant(m, "IPPROTO_ICMPV6", IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003911#endif
3912#ifdef IPPROTO_NONE
Fred Drake4baedc12002-04-01 14:53:37 +00003913 PyModule_AddIntConstant(m, "IPPROTO_NONE", IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003914#endif
3915#ifdef IPPROTO_DSTOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00003916 PyModule_AddIntConstant(m, "IPPROTO_DSTOPTS", IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003917#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003918#ifdef IPPROTO_XTP
Fred Drake4baedc12002-04-01 14:53:37 +00003919 PyModule_AddIntConstant(m, "IPPROTO_XTP", IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003920#endif
3921#ifdef IPPROTO_EON
Fred Drake4baedc12002-04-01 14:53:37 +00003922 PyModule_AddIntConstant(m, "IPPROTO_EON", IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003923#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003924#ifdef IPPROTO_PIM
Fred Drake4baedc12002-04-01 14:53:37 +00003925 PyModule_AddIntConstant(m, "IPPROTO_PIM", IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003926#endif
3927#ifdef IPPROTO_IPCOMP
Fred Drake4baedc12002-04-01 14:53:37 +00003928 PyModule_AddIntConstant(m, "IPPROTO_IPCOMP", IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003929#endif
3930#ifdef IPPROTO_VRRP
Fred Drake4baedc12002-04-01 14:53:37 +00003931 PyModule_AddIntConstant(m, "IPPROTO_VRRP", IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003932#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003933#ifdef IPPROTO_BIP
Fred Drake4baedc12002-04-01 14:53:37 +00003934 PyModule_AddIntConstant(m, "IPPROTO_BIP", IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003935#endif
3936/**/
3937#ifdef IPPROTO_RAW
Fred Drake4baedc12002-04-01 14:53:37 +00003938 PyModule_AddIntConstant(m, "IPPROTO_RAW", IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00003939#else
Fred Drake4baedc12002-04-01 14:53:37 +00003940 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003941#endif
3942#ifdef IPPROTO_MAX
Fred Drake4baedc12002-04-01 14:53:37 +00003943 PyModule_AddIntConstant(m, "IPPROTO_MAX", IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003944#endif
3945
3946 /* Some port configuration */
3947#ifdef IPPORT_RESERVED
Fred Drake4baedc12002-04-01 14:53:37 +00003948 PyModule_AddIntConstant(m, "IPPORT_RESERVED", IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003949#else
Fred Drake4baedc12002-04-01 14:53:37 +00003950 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003951#endif
3952#ifdef IPPORT_USERRESERVED
Fred Drake4baedc12002-04-01 14:53:37 +00003953 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003954#else
Fred Drake4baedc12002-04-01 14:53:37 +00003955 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003956#endif
3957
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003958 /* Some reserved IP v.4 addresses */
3959#ifdef INADDR_ANY
Fred Drake4baedc12002-04-01 14:53:37 +00003960 PyModule_AddIntConstant(m, "INADDR_ANY", INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003961#else
Fred Drake4baedc12002-04-01 14:53:37 +00003962 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003963#endif
3964#ifdef INADDR_BROADCAST
Fred Drake4baedc12002-04-01 14:53:37 +00003965 PyModule_AddIntConstant(m, "INADDR_BROADCAST", INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003966#else
Fred Drake4baedc12002-04-01 14:53:37 +00003967 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003968#endif
3969#ifdef INADDR_LOOPBACK
Fred Drake4baedc12002-04-01 14:53:37 +00003970 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003971#else
Fred Drake4baedc12002-04-01 14:53:37 +00003972 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003973#endif
3974#ifdef INADDR_UNSPEC_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00003975 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003976#else
Fred Drake4baedc12002-04-01 14:53:37 +00003977 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003978#endif
3979#ifdef INADDR_ALLHOSTS_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00003980 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
3981 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003982#else
Fred Drake4baedc12002-04-01 14:53:37 +00003983 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003984#endif
3985#ifdef INADDR_MAX_LOCAL_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00003986 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP",
3987 INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003988#else
Fred Drake4baedc12002-04-01 14:53:37 +00003989 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003990#endif
3991#ifdef INADDR_NONE
Fred Drake4baedc12002-04-01 14:53:37 +00003992 PyModule_AddIntConstant(m, "INADDR_NONE", INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003993#else
Fred Drake4baedc12002-04-01 14:53:37 +00003994 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003995#endif
3996
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003997 /* IPv4 [gs]etsockopt options */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003998#ifdef IP_OPTIONS
Fred Drake4baedc12002-04-01 14:53:37 +00003999 PyModule_AddIntConstant(m, "IP_OPTIONS", IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004000#endif
4001#ifdef IP_HDRINCL
Fred Drake4baedc12002-04-01 14:53:37 +00004002 PyModule_AddIntConstant(m, "IP_HDRINCL", IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004003#endif
4004#ifdef IP_TOS
Fred Drake4baedc12002-04-01 14:53:37 +00004005 PyModule_AddIntConstant(m, "IP_TOS", IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004006#endif
4007#ifdef IP_TTL
Fred Drake4baedc12002-04-01 14:53:37 +00004008 PyModule_AddIntConstant(m, "IP_TTL", IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004009#endif
4010#ifdef IP_RECVOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00004011 PyModule_AddIntConstant(m, "IP_RECVOPTS", IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004012#endif
4013#ifdef IP_RECVRETOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00004014 PyModule_AddIntConstant(m, "IP_RECVRETOPTS", IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004015#endif
4016#ifdef IP_RECVDSTADDR
Fred Drake4baedc12002-04-01 14:53:37 +00004017 PyModule_AddIntConstant(m, "IP_RECVDSTADDR", IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004018#endif
4019#ifdef IP_RETOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00004020 PyModule_AddIntConstant(m, "IP_RETOPTS", IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004021#endif
4022#ifdef IP_MULTICAST_IF
Fred Drake4baedc12002-04-01 14:53:37 +00004023 PyModule_AddIntConstant(m, "IP_MULTICAST_IF", IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004024#endif
4025#ifdef IP_MULTICAST_TTL
Fred Drake4baedc12002-04-01 14:53:37 +00004026 PyModule_AddIntConstant(m, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004027#endif
4028#ifdef IP_MULTICAST_LOOP
Fred Drake4baedc12002-04-01 14:53:37 +00004029 PyModule_AddIntConstant(m, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004030#endif
4031#ifdef IP_ADD_MEMBERSHIP
Fred Drake4baedc12002-04-01 14:53:37 +00004032 PyModule_AddIntConstant(m, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004033#endif
4034#ifdef IP_DROP_MEMBERSHIP
Fred Drake4baedc12002-04-01 14:53:37 +00004035 PyModule_AddIntConstant(m, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004036#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00004037#ifdef IP_DEFAULT_MULTICAST_TTL
Fred Drake4baedc12002-04-01 14:53:37 +00004038 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_TTL",
4039 IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00004040#endif
4041#ifdef IP_DEFAULT_MULTICAST_LOOP
Fred Drake4baedc12002-04-01 14:53:37 +00004042 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_LOOP",
4043 IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00004044#endif
4045#ifdef IP_MAX_MEMBERSHIPS
Fred Drake4baedc12002-04-01 14:53:37 +00004046 PyModule_AddIntConstant(m, "IP_MAX_MEMBERSHIPS", IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00004047#endif
4048
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004049 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
4050#ifdef IPV6_JOIN_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00004051 PyModule_AddIntConstant(m, "IPV6_JOIN_GROUP", IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004052#endif
4053#ifdef IPV6_LEAVE_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00004054 PyModule_AddIntConstant(m, "IPV6_LEAVE_GROUP", IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004055#endif
4056#ifdef IPV6_MULTICAST_HOPS
Fred Drake4baedc12002-04-01 14:53:37 +00004057 PyModule_AddIntConstant(m, "IPV6_MULTICAST_HOPS", IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004058#endif
4059#ifdef IPV6_MULTICAST_IF
Fred Drake4baedc12002-04-01 14:53:37 +00004060 PyModule_AddIntConstant(m, "IPV6_MULTICAST_IF", IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004061#endif
4062#ifdef IPV6_MULTICAST_LOOP
Fred Drake4baedc12002-04-01 14:53:37 +00004063 PyModule_AddIntConstant(m, "IPV6_MULTICAST_LOOP", IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004064#endif
4065#ifdef IPV6_UNICAST_HOPS
Fred Drake4baedc12002-04-01 14:53:37 +00004066 PyModule_AddIntConstant(m, "IPV6_UNICAST_HOPS", IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004067#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00004068 /* Additional IPV6 socket options, defined in RFC 3493 */
4069#ifdef IPV6_V6ONLY
4070 PyModule_AddIntConstant(m, "IPV6_V6ONLY", IPV6_V6ONLY);
4071#endif
4072 /* Advanced IPV6 socket options, from RFC 3542 */
4073#ifdef IPV6_CHECKSUM
4074 PyModule_AddIntConstant(m, "IPV6_CHECKSUM", IPV6_CHECKSUM);
4075#endif
4076#ifdef IPV6_DONTFRAG
4077 PyModule_AddIntConstant(m, "IPV6_DONTFRAG", IPV6_DONTFRAG);
4078#endif
4079#ifdef IPV6_DSTOPTS
4080 PyModule_AddIntConstant(m, "IPV6_DSTOPTS", IPV6_DSTOPTS);
4081#endif
4082#ifdef IPV6_HOPLIMIT
4083 PyModule_AddIntConstant(m, "IPV6_HOPLIMIT", IPV6_HOPLIMIT);
4084#endif
4085#ifdef IPV6_HOPOPTS
4086 PyModule_AddIntConstant(m, "IPV6_HOPOPTS", IPV6_HOPOPTS);
4087#endif
4088#ifdef IPV6_NEXTHOP
4089 PyModule_AddIntConstant(m, "IPV6_NEXTHOP", IPV6_NEXTHOP);
4090#endif
4091#ifdef IPV6_PATHMTU
4092 PyModule_AddIntConstant(m, "IPV6_PATHMTU", IPV6_PATHMTU);
4093#endif
4094#ifdef IPV6_PKTINFO
4095 PyModule_AddIntConstant(m, "IPV6_PKTINFO", IPV6_PKTINFO);
4096#endif
4097#ifdef IPV6_RECVDSTOPTS
4098 PyModule_AddIntConstant(m, "IPV6_RECVDSTOPTS", IPV6_RECVDSTOPTS);
4099#endif
4100#ifdef IPV6_RECVHOPLIMIT
4101 PyModule_AddIntConstant(m, "IPV6_RECVHOPLIMIT", IPV6_RECVHOPLIMIT);
4102#endif
4103#ifdef IPV6_RECVHOPOPTS
4104 PyModule_AddIntConstant(m, "IPV6_RECVHOPOPTS", IPV6_RECVHOPOPTS);
4105#endif
4106#ifdef IPV6_RECVPKTINFO
4107 PyModule_AddIntConstant(m, "IPV6_RECVPKTINFO", IPV6_RECVPKTINFO);
4108#endif
4109#ifdef IPV6_RECVRTHDR
4110 PyModule_AddIntConstant(m, "IPV6_RECVRTHDR", IPV6_RECVRTHDR);
4111#endif
4112#ifdef IPV6_RECVTCLASS
4113 PyModule_AddIntConstant(m, "IPV6_RECVTCLASS", IPV6_RECVTCLASS);
4114#endif
4115#ifdef IPV6_RTHDR
4116 PyModule_AddIntConstant(m, "IPV6_RTHDR", IPV6_RTHDR);
4117#endif
4118#ifdef IPV6_RTHDRDSTOPTS
4119 PyModule_AddIntConstant(m, "IPV6_RTHDRDSTOPTS", IPV6_RTHDRDSTOPTS);
4120#endif
4121#ifdef IPV6_RTHDR_TYPE_0
4122 PyModule_AddIntConstant(m, "IPV6_RTHDR_TYPE_0", IPV6_RTHDR_TYPE_0);
4123#endif
4124#ifdef IPV6_RECVPATHMTU
4125 PyModule_AddIntConstant(m, "IPV6_RECVPATHMTU", IPV6_RECVPATHMTU);
4126#endif
4127#ifdef IPV6_TCLASS
4128 PyModule_AddIntConstant(m, "IPV6_TCLASS", IPV6_TCLASS);
4129#endif
4130#ifdef IPV6_USE_MIN_MTU
4131 PyModule_AddIntConstant(m, "IPV6_USE_MIN_MTU", IPV6_USE_MIN_MTU);
4132#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004133
Guido van Rossum09be4091999-08-09 14:40:40 +00004134 /* TCP options */
4135#ifdef TCP_NODELAY
Fred Drake4baedc12002-04-01 14:53:37 +00004136 PyModule_AddIntConstant(m, "TCP_NODELAY", TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00004137#endif
4138#ifdef TCP_MAXSEG
Fred Drake4baedc12002-04-01 14:53:37 +00004139 PyModule_AddIntConstant(m, "TCP_MAXSEG", TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00004140#endif
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004141#ifdef TCP_CORK
Fred Drake4baedc12002-04-01 14:53:37 +00004142 PyModule_AddIntConstant(m, "TCP_CORK", TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004143#endif
4144#ifdef TCP_KEEPIDLE
Fred Drake4baedc12002-04-01 14:53:37 +00004145 PyModule_AddIntConstant(m, "TCP_KEEPIDLE", TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004146#endif
4147#ifdef TCP_KEEPINTVL
Fred Drake4baedc12002-04-01 14:53:37 +00004148 PyModule_AddIntConstant(m, "TCP_KEEPINTVL", TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004149#endif
4150#ifdef TCP_KEEPCNT
Fred Drake4baedc12002-04-01 14:53:37 +00004151 PyModule_AddIntConstant(m, "TCP_KEEPCNT", TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004152#endif
4153#ifdef TCP_SYNCNT
Fred Drake4baedc12002-04-01 14:53:37 +00004154 PyModule_AddIntConstant(m, "TCP_SYNCNT", TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004155#endif
4156#ifdef TCP_LINGER2
Fred Drake4baedc12002-04-01 14:53:37 +00004157 PyModule_AddIntConstant(m, "TCP_LINGER2", TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004158#endif
4159#ifdef TCP_DEFER_ACCEPT
Fred Drake4baedc12002-04-01 14:53:37 +00004160 PyModule_AddIntConstant(m, "TCP_DEFER_ACCEPT", TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004161#endif
4162#ifdef TCP_WINDOW_CLAMP
Fred Drake4baedc12002-04-01 14:53:37 +00004163 PyModule_AddIntConstant(m, "TCP_WINDOW_CLAMP", TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004164#endif
4165#ifdef TCP_INFO
Fred Drake4baedc12002-04-01 14:53:37 +00004166 PyModule_AddIntConstant(m, "TCP_INFO", TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004167#endif
4168#ifdef TCP_QUICKACK
Fred Drake4baedc12002-04-01 14:53:37 +00004169 PyModule_AddIntConstant(m, "TCP_QUICKACK", TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004170#endif
4171
Guido van Rossum09be4091999-08-09 14:40:40 +00004172
4173 /* IPX options */
4174#ifdef IPX_TYPE
Fred Drake4baedc12002-04-01 14:53:37 +00004175 PyModule_AddIntConstant(m, "IPX_TYPE", IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00004176#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004177
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004178 /* get{addr,name}info parameters */
4179#ifdef EAI_ADDRFAMILY
Fred Drake4baedc12002-04-01 14:53:37 +00004180 PyModule_AddIntConstant(m, "EAI_ADDRFAMILY", EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004181#endif
4182#ifdef EAI_AGAIN
Fred Drake4baedc12002-04-01 14:53:37 +00004183 PyModule_AddIntConstant(m, "EAI_AGAIN", EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004184#endif
4185#ifdef EAI_BADFLAGS
Fred Drake4baedc12002-04-01 14:53:37 +00004186 PyModule_AddIntConstant(m, "EAI_BADFLAGS", EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004187#endif
4188#ifdef EAI_FAIL
Fred Drake4baedc12002-04-01 14:53:37 +00004189 PyModule_AddIntConstant(m, "EAI_FAIL", EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004190#endif
4191#ifdef EAI_FAMILY
Fred Drake4baedc12002-04-01 14:53:37 +00004192 PyModule_AddIntConstant(m, "EAI_FAMILY", EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004193#endif
4194#ifdef EAI_MEMORY
Fred Drake4baedc12002-04-01 14:53:37 +00004195 PyModule_AddIntConstant(m, "EAI_MEMORY", EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004196#endif
4197#ifdef EAI_NODATA
Fred Drake4baedc12002-04-01 14:53:37 +00004198 PyModule_AddIntConstant(m, "EAI_NODATA", EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004199#endif
4200#ifdef EAI_NONAME
Fred Drake4baedc12002-04-01 14:53:37 +00004201 PyModule_AddIntConstant(m, "EAI_NONAME", EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004202#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00004203#ifdef EAI_OVERFLOW
4204 PyModule_AddIntConstant(m, "EAI_OVERFLOW", EAI_OVERFLOW);
4205#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004206#ifdef EAI_SERVICE
Fred Drake4baedc12002-04-01 14:53:37 +00004207 PyModule_AddIntConstant(m, "EAI_SERVICE", EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004208#endif
4209#ifdef EAI_SOCKTYPE
Fred Drake4baedc12002-04-01 14:53:37 +00004210 PyModule_AddIntConstant(m, "EAI_SOCKTYPE", EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004211#endif
4212#ifdef EAI_SYSTEM
Fred Drake4baedc12002-04-01 14:53:37 +00004213 PyModule_AddIntConstant(m, "EAI_SYSTEM", EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004214#endif
4215#ifdef EAI_BADHINTS
Fred Drake4baedc12002-04-01 14:53:37 +00004216 PyModule_AddIntConstant(m, "EAI_BADHINTS", EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004217#endif
4218#ifdef EAI_PROTOCOL
Fred Drake4baedc12002-04-01 14:53:37 +00004219 PyModule_AddIntConstant(m, "EAI_PROTOCOL", EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004220#endif
4221#ifdef EAI_MAX
Fred Drake4baedc12002-04-01 14:53:37 +00004222 PyModule_AddIntConstant(m, "EAI_MAX", EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004223#endif
4224#ifdef AI_PASSIVE
Fred Drake4baedc12002-04-01 14:53:37 +00004225 PyModule_AddIntConstant(m, "AI_PASSIVE", AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004226#endif
4227#ifdef AI_CANONNAME
Fred Drake4baedc12002-04-01 14:53:37 +00004228 PyModule_AddIntConstant(m, "AI_CANONNAME", AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004229#endif
4230#ifdef AI_NUMERICHOST
Fred Drake4baedc12002-04-01 14:53:37 +00004231 PyModule_AddIntConstant(m, "AI_NUMERICHOST", AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004232#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00004233#ifdef AI_NUMERICSERV
4234 PyModule_AddIntConstant(m, "AI_NUMERICSERV", AI_NUMERICSERV);
4235#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004236#ifdef AI_MASK
Fred Drake4baedc12002-04-01 14:53:37 +00004237 PyModule_AddIntConstant(m, "AI_MASK", AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004238#endif
4239#ifdef AI_ALL
Fred Drake4baedc12002-04-01 14:53:37 +00004240 PyModule_AddIntConstant(m, "AI_ALL", AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004241#endif
4242#ifdef AI_V4MAPPED_CFG
Fred Drake4baedc12002-04-01 14:53:37 +00004243 PyModule_AddIntConstant(m, "AI_V4MAPPED_CFG", AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004244#endif
4245#ifdef AI_ADDRCONFIG
Fred Drake4baedc12002-04-01 14:53:37 +00004246 PyModule_AddIntConstant(m, "AI_ADDRCONFIG", AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004247#endif
4248#ifdef AI_V4MAPPED
Fred Drake4baedc12002-04-01 14:53:37 +00004249 PyModule_AddIntConstant(m, "AI_V4MAPPED", AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004250#endif
4251#ifdef AI_DEFAULT
Fred Drake4baedc12002-04-01 14:53:37 +00004252 PyModule_AddIntConstant(m, "AI_DEFAULT", AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004253#endif
4254#ifdef NI_MAXHOST
Fred Drake4baedc12002-04-01 14:53:37 +00004255 PyModule_AddIntConstant(m, "NI_MAXHOST", NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004256#endif
4257#ifdef NI_MAXSERV
Fred Drake4baedc12002-04-01 14:53:37 +00004258 PyModule_AddIntConstant(m, "NI_MAXSERV", NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004259#endif
4260#ifdef NI_NOFQDN
Fred Drake4baedc12002-04-01 14:53:37 +00004261 PyModule_AddIntConstant(m, "NI_NOFQDN", NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004262#endif
4263#ifdef NI_NUMERICHOST
Fred Drake4baedc12002-04-01 14:53:37 +00004264 PyModule_AddIntConstant(m, "NI_NUMERICHOST", NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004265#endif
4266#ifdef NI_NAMEREQD
Fred Drake4baedc12002-04-01 14:53:37 +00004267 PyModule_AddIntConstant(m, "NI_NAMEREQD", NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004268#endif
4269#ifdef NI_NUMERICSERV
Fred Drake4baedc12002-04-01 14:53:37 +00004270 PyModule_AddIntConstant(m, "NI_NUMERICSERV", NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004271#endif
4272#ifdef NI_DGRAM
Fred Drake4baedc12002-04-01 14:53:37 +00004273 PyModule_AddIntConstant(m, "NI_DGRAM", NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004274#endif
4275
Martin v. Löwis94681fc2003-11-27 19:40:22 +00004276 /* shutdown() parameters */
4277#ifdef SHUT_RD
4278 PyModule_AddIntConstant(m, "SHUT_RD", SHUT_RD);
4279#elif defined(SD_RECEIVE)
4280 PyModule_AddIntConstant(m, "SHUT_RD", SD_RECEIVE);
4281#else
4282 PyModule_AddIntConstant(m, "SHUT_RD", 0);
4283#endif
4284#ifdef SHUT_WR
4285 PyModule_AddIntConstant(m, "SHUT_WR", SHUT_WR);
4286#elif defined(SD_SEND)
4287 PyModule_AddIntConstant(m, "SHUT_WR", SD_SEND);
4288#else
4289 PyModule_AddIntConstant(m, "SHUT_WR", 1);
4290#endif
4291#ifdef SHUT_RDWR
4292 PyModule_AddIntConstant(m, "SHUT_RDWR", SHUT_RDWR);
4293#elif defined(SD_BOTH)
4294 PyModule_AddIntConstant(m, "SHUT_RDWR", SD_BOTH);
4295#else
4296 PyModule_AddIntConstant(m, "SHUT_RDWR", 2);
4297#endif
4298
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004299 /* Initialize gethostbyname lock */
Just van Rossum1040d2c2003-05-09 07:53:18 +00004300#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
4301 netdb_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004302#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004303}
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004304
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004305
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004306#ifndef HAVE_INET_PTON
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004307
4308/* Simplistic emulation code for inet_pton that only works for IPv4 */
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004309/* These are not exposed because they do not set errno properly */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004310
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004311int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004312inet_pton(int af, const char *src, void *dst)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004313{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004314 if (af == AF_INET) {
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004315 long packed_addr;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004316 packed_addr = inet_addr(src);
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004317 if (packed_addr == INADDR_NONE)
4318 return 0;
4319 memcpy(dst, &packed_addr, 4);
4320 return 1;
4321 }
4322 /* Should set errno to EAFNOSUPPORT */
4323 return -1;
4324}
4325
Martin v. Löwisc925b1532001-07-21 09:42:15 +00004326const char *
4327inet_ntop(int af, const void *src, char *dst, socklen_t size)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004328{
4329 if (af == AF_INET) {
4330 struct in_addr packed_addr;
4331 if (size < 16)
4332 /* Should set errno to ENOSPC. */
4333 return NULL;
4334 memcpy(&packed_addr, src, sizeof(packed_addr));
4335 return strncpy(dst, inet_ntoa(packed_addr), size);
4336 }
4337 /* Should set errno to EAFNOSUPPORT */
4338 return NULL;
4339}
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004340
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004341#endif