blob: 0884d9dcabcbc0bc797837c5a9e234543a18a4ad [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
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000108/* XXX This is a terrible mess of of platform-dependent preprocessor hacks.
109 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
197#ifndef ENABLE_IPV6
198#define INET_ADDRSTRLEN 16
199#endif
200
201#define HAVE_INET_PTON
202#include <netdb.h>
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000203#endif
204
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000205/* Generic includes */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000206#include <sys/types.h>
Guido van Rossum81194471991-07-27 21:42:02 +0000207#include <signal.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000208
Marc-André Lemburg976ade62002-02-16 18:47:07 +0000209/* Generic socket object definitions and includes */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000210#define PySocket_BUILDING_SOCKET
Marc-André Lemburgbb8b78b2002-02-16 18:44:52 +0000211#include "socketmodule.h"
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000212
213/* Addressing includes */
214
Guido van Rossum6f489d91996-06-28 20:15:15 +0000215#ifndef MS_WINDOWS
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000216
217/* Non-MS WINDOWS includes */
218# include <netdb.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000219
Guido van Rossum9376b741999-09-15 22:01:40 +0000220/* Headers needed for inet_ntoa() and inet_addr() */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000221# ifdef __BEOS__
222# include <net/netdb.h>
223# elif defined(PYOS_OS2) && defined(PYCC_VACPP)
224# include <netdb.h>
Tim Peters603c6832001-11-05 02:45:59 +0000225typedef size_t socklen_t;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000226# else
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000227# include <arpa/inet.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000228# endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000229
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000230# ifndef RISCOS
231# include <fcntl.h>
232# else
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000233# include <sys/ioctl.h>
234# include <socklib.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000235# define NO_DUP
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000236int h_errno; /* not used */
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000237# define INET_ADDRSTRLEN 16
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000238# endif
239
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000240#else
Guido van Rossum48a680c2001-03-02 06:34:14 +0000241
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000242/* MS_WINDOWS includes */
243# include <fcntl.h>
Guido van Rossum48a680c2001-03-02 06:34:14 +0000244
Jeremy Hylton22308652001-02-02 03:23:09 +0000245#endif
246
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000247#ifdef HAVE_STDDEF_H
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000248# include <stddef.h>
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000249#endif
250
251#ifndef offsetof
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000252# define offsetof(type, member) ((size_t)(&((type *)0)->member))
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000253#endif
254
Neal Norwitz39d22e52002-11-02 19:55:21 +0000255#ifndef O_NONBLOCK
256# define O_NONBLOCK O_NDELAY
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000257#endif
258
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000259#include "addrinfo.h"
260
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000261#ifndef HAVE_INET_PTON
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000262int inet_pton(int af, const char *src, void *dst);
Martin v. Löwisc925b1532001-07-21 09:42:15 +0000263const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000264#endif
265
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000266#ifdef __APPLE__
267/* On OS X, getaddrinfo returns no error indication of lookup
268 failure, so we must use the emulation instead of the libinfo
269 implementation. Unfortunately, performing an autoconf test
270 for this bug would require DNS access for the machine performing
271 the configuration, which is not acceptable. Therefore, we
272 determine the bug just by checking for __APPLE__. If this bug
273 gets ever fixed, perhaps checking for sys/version.h would be
274 appropriate, which is 10/0 on the system with the bug. */
Jack Jansen84262fb2002-07-02 14:40:42 +0000275#ifndef HAVE_GETNAMEINFO
276/* This bug seems to be fixed in Jaguar. Ths easiest way I could
277 Find to check for Jaguar is that it has getnameinfo(), which
278 older releases don't have */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000279#undef HAVE_GETADDRINFO
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000280#endif
Jack Jansen84262fb2002-07-02 14:40:42 +0000281#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000282
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000283/* I know this is a bad practice, but it is the easiest... */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000284#if !defined(HAVE_GETADDRINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000285/* avoid clashes with the C library definition of the symbol. */
286#define getaddrinfo fake_getaddrinfo
287#define gai_strerror fake_gai_strerror
288#define freeaddrinfo fake_freeaddrinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000289#include "getaddrinfo.c"
290#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000291#if !defined(HAVE_GETNAMEINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000292#define getnameinfo fake_getnameinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000293#include "getnameinfo.c"
294#endif
295
Guido van Rossumbcc20741998-08-04 22:53:56 +0000296#if defined(MS_WINDOWS) || defined(__BEOS__)
297/* BeOS suffers from the same socket dichotomy as Win32... - [cjh] */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000298/* seem to be a few differences in the API */
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000299#define SOCKETCLOSE closesocket
Guido van Rossumbe32c891996-06-20 16:25:29 +0000300#define NO_DUP /* Actually it exists on NT 3.5, but what the heck... */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000301#endif
302
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000303#ifdef MS_WIN32
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000304#define EAFNOSUPPORT WSAEAFNOSUPPORT
305#define snprintf _snprintf
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000306#endif
Fred Drakea04eaad2000-06-30 02:46:07 +0000307
Andrew MacIntyreba43e872002-03-03 03:03:52 +0000308#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000309#define SOCKETCLOSE soclose
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000310#define NO_DUP /* Sockets are Not Actual File Handles under OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000311#endif
312
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000313#ifndef SOCKETCLOSE
314#define SOCKETCLOSE close
315#endif
316
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000317#ifdef __VMS
318/* TCP/IP Services for VMS uses a maximum send/revc buffer length of 65535 */
319#define SEGMENT_SIZE 65535
320#endif
321
Martin v. Löwise9416172003-05-03 10:12:45 +0000322/*
323 * Constants for getnameinfo()
324 */
325#if !defined(NI_MAXHOST)
326#define NI_MAXHOST 1025
327#endif
328#if !defined(NI_MAXSERV)
329#define NI_MAXSERV 32
330#endif
331
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000332/* XXX There's a problem here: *static* functions are not supposed to have
333 a Py prefix (or use CapitalizedWords). Later... */
334
Guido van Rossum30a685f1991-06-27 15:51:29 +0000335/* Global variable holding the exception type for errors detected
336 by this module (but not argument type or memory errors, etc.). */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000337static PyObject *socket_error;
338static PyObject *socket_herror;
339static PyObject *socket_gaierror;
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000340static PyObject *socket_timeout;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000341
Guido van Rossum48a680c2001-03-02 06:34:14 +0000342#ifdef RISCOS
343/* Global variable which is !=0 if Python is running in a RISC OS taskwindow */
344static int taskwindow;
345#endif
346
Tim Peters643a7fc2002-02-17 04:13:21 +0000347/* A forward reference to the socket type object.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000348 The sock_type variable contains pointers to various functions,
349 some of which call new_sockobject(), which uses sock_type, so
Tim Peters643a7fc2002-02-17 04:13:21 +0000350 there has to be a circular reference. */
Jeremy Hylton938ace62002-07-17 16:30:39 +0000351static PyTypeObject sock_type;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000352
Guido van Rossum30a685f1991-06-27 15:51:29 +0000353/* Convenience function to raise an error according to errno
354 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000355
Guido van Rossum73624e91994-10-10 17:59:00 +0000356static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000357set_error(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000358{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000359#ifdef MS_WINDOWS
Mark Hammond46a733d2000-07-24 01:45:11 +0000360 int err_no = WSAGetLastError();
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000361 static struct {
362 int no;
363 const char *msg;
364 } *msgp, msgs[] = {
365 {WSAEINTR, "Interrupted system call"},
366 {WSAEBADF, "Bad file descriptor"},
367 {WSAEACCES, "Permission denied"},
368 {WSAEFAULT, "Bad address"},
369 {WSAEINVAL, "Invalid argument"},
370 {WSAEMFILE, "Too many open files"},
371 {WSAEWOULDBLOCK,
372 "The socket operation could not complete "
373 "without blocking"},
374 {WSAEINPROGRESS, "Operation now in progress"},
375 {WSAEALREADY, "Operation already in progress"},
376 {WSAENOTSOCK, "Socket operation on non-socket"},
377 {WSAEDESTADDRREQ, "Destination address required"},
378 {WSAEMSGSIZE, "Message too long"},
379 {WSAEPROTOTYPE, "Protocol wrong type for socket"},
380 {WSAENOPROTOOPT, "Protocol not available"},
381 {WSAEPROTONOSUPPORT, "Protocol not supported"},
382 {WSAESOCKTNOSUPPORT, "Socket type not supported"},
383 {WSAEOPNOTSUPP, "Operation not supported"},
384 {WSAEPFNOSUPPORT, "Protocol family not supported"},
385 {WSAEAFNOSUPPORT, "Address family not supported"},
386 {WSAEADDRINUSE, "Address already in use"},
387 {WSAEADDRNOTAVAIL, "Can't assign requested address"},
388 {WSAENETDOWN, "Network is down"},
389 {WSAENETUNREACH, "Network is unreachable"},
390 {WSAENETRESET, "Network dropped connection on reset"},
391 {WSAECONNABORTED, "Software caused connection abort"},
392 {WSAECONNRESET, "Connection reset by peer"},
393 {WSAENOBUFS, "No buffer space available"},
394 {WSAEISCONN, "Socket is already connected"},
395 {WSAENOTCONN, "Socket is not connected"},
396 {WSAESHUTDOWN, "Can't send after socket shutdown"},
397 {WSAETOOMANYREFS, "Too many references: can't splice"},
398 {WSAETIMEDOUT, "Operation timed out"},
399 {WSAECONNREFUSED, "Connection refused"},
400 {WSAELOOP, "Too many levels of symbolic links"},
401 {WSAENAMETOOLONG, "File name too long"},
402 {WSAEHOSTDOWN, "Host is down"},
403 {WSAEHOSTUNREACH, "No route to host"},
404 {WSAENOTEMPTY, "Directory not empty"},
405 {WSAEPROCLIM, "Too many processes"},
406 {WSAEUSERS, "Too many users"},
407 {WSAEDQUOT, "Disc quota exceeded"},
408 {WSAESTALE, "Stale NFS file handle"},
409 {WSAEREMOTE, "Too many levels of remote in path"},
410 {WSASYSNOTREADY, "Network subsystem is unvailable"},
411 {WSAVERNOTSUPPORTED, "WinSock version is not supported"},
412 {WSANOTINITIALISED,
413 "Successful WSAStartup() not yet performed"},
414 {WSAEDISCON, "Graceful shutdown in progress"},
415 /* Resolver errors */
416 {WSAHOST_NOT_FOUND, "No such host is known"},
417 {WSATRY_AGAIN, "Host not found, or server failed"},
418 {WSANO_RECOVERY, "Unexpected server error encountered"},
419 {WSANO_DATA, "Valid name without requested data"},
420 {WSANO_ADDRESS, "No address, look for MX record"},
421 {0, NULL}
422 };
Mark Hammond46a733d2000-07-24 01:45:11 +0000423 if (err_no) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000424 PyObject *v;
Mark Hammond46a733d2000-07-24 01:45:11 +0000425 const char *msg = "winsock error";
Guido van Rossum48a680c2001-03-02 06:34:14 +0000426
Mark Hammond46a733d2000-07-24 01:45:11 +0000427 for (msgp = msgs; msgp->msg; msgp++) {
428 if (err_no == msgp->no) {
429 msg = msgp->msg;
430 break;
431 }
432 }
433
434 v = Py_BuildValue("(is)", err_no, msg);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000435 if (v != NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000436 PyErr_SetObject(socket_error, v);
Guido van Rossum73624e91994-10-10 17:59:00 +0000437 Py_DECREF(v);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000438 }
439 return NULL;
440 }
441 else
442#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000443
Andrew MacIntyreba43e872002-03-03 03:03:52 +0000444#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000445 if (sock_errno() != NO_ERROR) {
446 APIRET rc;
447 ULONG msglen;
448 char outbuf[100];
449 int myerrorcode = sock_errno();
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000450
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000451 /* Retrieve socket-related error message from MPTN.MSG file */
452 rc = DosGetMessage(NULL, 0, outbuf, sizeof(outbuf),
453 myerrorcode - SOCBASEERR + 26,
454 "mptn.msg",
455 &msglen);
456 if (rc == NO_ERROR) {
457 PyObject *v;
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000458
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000459 /* OS/2 doesn't guarantee a terminator */
460 outbuf[msglen] = '\0';
461 if (strlen(outbuf) > 0) {
462 /* If non-empty msg, trim CRLF */
463 char *lastc = &outbuf[ strlen(outbuf)-1 ];
464 while (lastc > outbuf && isspace(*lastc)) {
465 /* Trim trailing whitespace (CRLF) */
466 *lastc-- = '\0';
467 }
468 }
469 v = Py_BuildValue("(is)", myerrorcode, outbuf);
470 if (v != NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000471 PyErr_SetObject(socket_error, v);
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000472 Py_DECREF(v);
473 }
474 return NULL;
475 }
476 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000477#endif
478
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000479#if defined(RISCOS)
480 if (_inet_error.errnum != NULL) {
481 PyObject *v;
482 v = Py_BuildValue("(is)", errno, _inet_err());
483 if (v != NULL) {
484 PyErr_SetObject(socket_error, v);
485 Py_DECREF(v);
486 }
487 return NULL;
488 }
489#endif
490
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000491 return PyErr_SetFromErrno(socket_error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000492}
493
Guido van Rossum30a685f1991-06-27 15:51:29 +0000494
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000495static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000496set_herror(int h_error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000497{
498 PyObject *v;
499
500#ifdef HAVE_HSTRERROR
501 v = Py_BuildValue("(is)", h_error, (char *)hstrerror(h_error));
502#else
503 v = Py_BuildValue("(is)", h_error, "host not found");
504#endif
505 if (v != NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000506 PyErr_SetObject(socket_herror, v);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000507 Py_DECREF(v);
508 }
509
510 return NULL;
511}
512
513
514static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000515set_gaierror(int error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000516{
517 PyObject *v;
518
Martin v. Löwis272cb402002-03-01 08:31:07 +0000519#ifdef EAI_SYSTEM
520 /* EAI_SYSTEM is not available on Windows XP. */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000521 if (error == EAI_SYSTEM)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000522 return set_error();
Martin v. Löwis272cb402002-03-01 08:31:07 +0000523#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000524
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000525#ifdef HAVE_GAI_STRERROR
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000526 v = Py_BuildValue("(is)", error, gai_strerror(error));
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000527#else
528 v = Py_BuildValue("(is)", error, "getaddrinfo failed");
529#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000530 if (v != NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000531 PyErr_SetObject(socket_gaierror, v);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000532 Py_DECREF(v);
533 }
534
535 return NULL;
536}
537
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000538/* Function to perform the setting of socket blocking mode
539 internally. block = (1 | 0). */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000540static int
541internal_setblocking(PySocketSockObject *s, int block)
542{
543#ifndef RISCOS
544#ifndef MS_WINDOWS
545 int delay_flag;
546#endif
547#endif
548
549 Py_BEGIN_ALLOW_THREADS
550#ifdef __BEOS__
551 block = !block;
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000552 setsockopt(s->sock_fd, SOL_SOCKET, SO_NONBLOCK,
553 (void *)(&block), sizeof(int));
Guido van Rossum67f7a382002-06-06 21:08:16 +0000554#else
555#ifndef RISCOS
556#ifndef MS_WINDOWS
557#if defined(PYOS_OS2) && !defined(PYCC_GCC)
558 block = !block;
559 ioctl(s->sock_fd, FIONBIO, (caddr_t)&block, sizeof(block));
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000560#elif defined(__VMS)
561 block = !block;
562 ioctl(s->sock_fd, FIONBIO, (char *)&block);
563#else /* !PYOS_OS2 && !_VMS */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000564 delay_flag = fcntl(s->sock_fd, F_GETFL, 0);
565 if (block)
Neal Norwitz39d22e52002-11-02 19:55:21 +0000566 delay_flag &= (~O_NONBLOCK);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000567 else
Neal Norwitz39d22e52002-11-02 19:55:21 +0000568 delay_flag |= O_NONBLOCK;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000569 fcntl(s->sock_fd, F_SETFL, delay_flag);
570#endif /* !PYOS_OS2 */
571#else /* MS_WINDOWS */
572 block = !block;
573 ioctlsocket(s->sock_fd, FIONBIO, (u_long*)&block);
574#endif /* MS_WINDOWS */
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000575#else /* RISCOS */
576 block = !block;
577 socketioctl(s->sock_fd, FIONBIO, (u_long*)&block);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000578#endif /* RISCOS */
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000579#endif /* __BEOS__ */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000580 Py_END_ALLOW_THREADS
581
582 /* Since these don't return anything */
583 return 1;
584}
585
Guido van Rossum11ba0942002-06-13 15:07:44 +0000586/* Do a select() on the socket, if necessary (sock_timeout > 0).
587 The argument writing indicates the direction.
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000588 This does not raise an exception; we'll let our caller do that
589 after they've reacquired the interpreter lock.
590 Returns 1 on timeout, 0 otherwise. */
591static int
Guido van Rossumb9e916a2002-06-07 01:42:47 +0000592internal_select(PySocketSockObject *s, int writing)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000593{
594 fd_set fds;
595 struct timeval tv;
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000596 int n;
Guido van Rossum11ba0942002-06-13 15:07:44 +0000597
Guido van Rossumad654902002-07-19 12:44:59 +0000598 /* Nothing to do unless we're in timeout mode (not non-blocking) */
Guido van Rossum11ba0942002-06-13 15:07:44 +0000599 if (s->sock_timeout <= 0.0)
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000600 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000601
Guido van Rossumad654902002-07-19 12:44:59 +0000602 /* Guard against closed socket */
603 if (s->sock_fd < 0)
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000604 return 0;
Guido van Rossumad654902002-07-19 12:44:59 +0000605
Guido van Rossum67f7a382002-06-06 21:08:16 +0000606 /* Construct the arguments to select */
607 tv.tv_sec = (int)s->sock_timeout;
Guido van Rossumb9e916a2002-06-07 01:42:47 +0000608 tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000609 FD_ZERO(&fds);
610 FD_SET(s->sock_fd, &fds);
611
612 /* See if the socket is ready */
Guido van Rossumb9e916a2002-06-07 01:42:47 +0000613 if (writing)
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000614 n = select(s->sock_fd+1, NULL, &fds, NULL, &tv);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000615 else
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000616 n = select(s->sock_fd+1, &fds, NULL, NULL, &tv);
617 if (n == 0)
618 return 1;
619 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000620}
621
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000622/* Initialize a new socket object. */
623
Tim Petersa12b4cf2002-07-18 22:38:44 +0000624static double defaulttimeout = -1.0; /* Default timeout for new sockets */
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000625
Mark Hammond62b1ab12002-07-23 06:31:15 +0000626PyMODINIT_FUNC
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000627init_sockobject(PySocketSockObject *s,
628 SOCKET_T fd, int family, int type, int proto)
629{
630#ifdef RISCOS
631 int block = 1;
632#endif
633 s->sock_fd = fd;
634 s->sock_family = family;
635 s->sock_type = type;
636 s->sock_proto = proto;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000637 s->sock_timeout = defaulttimeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000638
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000639 s->errorhandler = &set_error;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000640
641 if (defaulttimeout >= 0.0)
642 internal_setblocking(s, 0);
643
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000644#ifdef RISCOS
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000645 if (taskwindow)
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000646 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000647#endif
648}
649
650
Guido van Rossum30a685f1991-06-27 15:51:29 +0000651/* Create a new socket object.
652 This just creates the object and initializes it.
653 If the creation fails, return NULL and set an exception (implicit
654 in NEWOBJ()). */
655
Guido van Rossum73624e91994-10-10 17:59:00 +0000656static PySocketSockObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000657new_sockobject(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000658{
Guido van Rossum73624e91994-10-10 17:59:00 +0000659 PySocketSockObject *s;
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000660 s = (PySocketSockObject *)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000661 PyType_GenericNew(&sock_type, NULL, NULL);
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000662 if (s != NULL)
663 init_sockobject(s, fd, family, type, proto);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000664 return s;
665}
666
Guido van Rossum30a685f1991-06-27 15:51:29 +0000667
Guido van Rossum48a680c2001-03-02 06:34:14 +0000668/* Lock to allow python interpreter to continue, but only allow one
Just van Rossum1040d2c2003-05-09 07:53:18 +0000669 thread to be in gethostbyname or getaddrinfo */
670#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
671PyThread_type_lock netdb_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000672#endif
673
674
Guido van Rossum30a685f1991-06-27 15:51:29 +0000675/* Convert a string specifying a host name or one of a few symbolic
676 names to a numeric IP address. This usually calls gethostbyname()
677 to do the work; the names "" and "<broadcast>" are special.
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000678 Return the length (IPv4 should be 4 bytes), or negative if
Guido van Rossum30a685f1991-06-27 15:51:29 +0000679 an error occurred; then an exception is raised. */
680
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000681static int
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000682setipaddr(char *name, struct sockaddr *addr_ret, size_t addr_ret_size, int af)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000683{
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000684 struct addrinfo hints, *res;
685 int error;
Anthony Baxter0e85f9d2003-05-02 15:40:46 +0000686 int d1, d2, d3, d4;
687 char ch;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000688
Guido van Rossuma376cc51996-12-05 23:43:35 +0000689 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
Guido van Rossum30a685f1991-06-27 15:51:29 +0000690 if (name[0] == '\0') {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000691 int siz;
692 memset(&hints, 0, sizeof(hints));
693 hints.ai_family = af;
694 hints.ai_socktype = SOCK_DGRAM; /*dummy*/
695 hints.ai_flags = AI_PASSIVE;
Just van Rossum1040d2c2003-05-09 07:53:18 +0000696 Py_BEGIN_ALLOW_THREADS
697 ACQUIRE_GETADDRINFO_LOCK
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000698 error = getaddrinfo(NULL, "0", &hints, &res);
Just van Rossum1040d2c2003-05-09 07:53:18 +0000699 Py_END_ALLOW_THREADS
700 /* We assume that those thread-unsafe getaddrinfo() versions
701 *are* safe regarding their return value, ie. that a
702 subsequent call to getaddrinfo() does not destroy the
703 outcome of the first call. */
704 RELEASE_GETADDRINFO_LOCK
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000705 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000706 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000707 return -1;
708 }
709 switch (res->ai_family) {
710 case AF_INET:
711 siz = 4;
712 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000713#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000714 case AF_INET6:
715 siz = 16;
716 break;
717#endif
718 default:
719 freeaddrinfo(res);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000720 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000721 "unsupported address family");
722 return -1;
723 }
724 if (res->ai_next) {
Martin v. Löwisf0b11d22001-11-07 08:31:03 +0000725 freeaddrinfo(res);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000726 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000727 "wildcard resolved to multiple address");
728 return -1;
729 }
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000730 if (res->ai_addrlen < addr_ret_size)
731 addr_ret_size = res->ai_addrlen;
732 memcpy(addr_ret, res->ai_addr, addr_ret_size);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000733 freeaddrinfo(res);
734 return siz;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000735 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000736 if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000737 struct sockaddr_in *sin;
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +0000738 if (af != AF_INET && af != AF_UNSPEC) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000739 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000740 "address family mismatched");
741 return -1;
742 }
743 sin = (struct sockaddr_in *)addr_ret;
744 memset((void *) sin, '\0', sizeof(*sin));
745 sin->sin_family = AF_INET;
746#ifdef HAVE_SOCKADDR_SA_LEN
747 sin->sin_len = sizeof(*sin);
748#endif
749 sin->sin_addr.s_addr = INADDR_BROADCAST;
750 return sizeof(sin->sin_addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000751 }
Anthony Baxter0e85f9d2003-05-02 15:40:46 +0000752 if (sscanf(name, "%d.%d.%d.%d%c", &d1, &d2, &d3, &d4, &ch) == 4 &&
753 0 <= d1 && d1 <= 255 && 0 <= d2 && d2 <= 255 &&
754 0 <= d3 && d3 <= 255 && 0 <= d4 && d4 <= 255) {
755 struct sockaddr_in *sin;
756 sin = (struct sockaddr_in *)addr_ret;
757 sin->sin_addr.s_addr = htonl(
758 ((long) d1 << 24) | ((long) d2 << 16) |
759 ((long) d3 << 8) | ((long) d4 << 0));
760 sin->sin_family = AF_INET;
761#ifdef HAVE_SOCKADDR_SA_LEN
762 sin->sin_len = sizeof(*sin);
763#endif
764 return 4;
765 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000766 memset(&hints, 0, sizeof(hints));
767 hints.ai_family = af;
Just van Rossum1040d2c2003-05-09 07:53:18 +0000768 Py_BEGIN_ALLOW_THREADS
769 ACQUIRE_GETADDRINFO_LOCK
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000770 error = getaddrinfo(name, NULL, &hints, &res);
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000771#if defined(__digital__) && defined(__unix__)
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000772 if (error == EAI_NONAME && af == AF_UNSPEC) {
773 /* On Tru64 V5.1, numeric-to-addr conversion fails
774 if no address family is given. Assume IPv4 for now.*/
775 hints.ai_family = AF_INET;
776 error = getaddrinfo(name, NULL, &hints, &res);
777 }
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000778#endif
Just van Rossum1040d2c2003-05-09 07:53:18 +0000779 Py_END_ALLOW_THREADS
780 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000781 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000782 set_gaierror(error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000783 return -1;
784 }
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000785 if (res->ai_addrlen < addr_ret_size)
786 addr_ret_size = res->ai_addrlen;
787 memcpy((char *) addr_ret, res->ai_addr, addr_ret_size);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000788 freeaddrinfo(res);
789 switch (addr_ret->sa_family) {
790 case AF_INET:
791 return 4;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000792#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000793 case AF_INET6:
794 return 16;
Guido van Rossum955becc1999-03-22 20:14:53 +0000795#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000796 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000797 PyErr_SetString(socket_error, "unknown address family");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000798 return -1;
799 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000800}
801
Guido van Rossum30a685f1991-06-27 15:51:29 +0000802
Guido van Rossum30a685f1991-06-27 15:51:29 +0000803/* Create a string object representing an IP address.
804 This is always a string of the form 'dd.dd.dd.dd' (with variable
805 size numbers). */
806
Guido van Rossum73624e91994-10-10 17:59:00 +0000807static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000808makeipaddr(struct sockaddr *addr, int addrlen)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000809{
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000810 char buf[NI_MAXHOST];
811 int error;
812
813 error = getnameinfo(addr, addrlen, buf, sizeof(buf), NULL, 0,
814 NI_NUMERICHOST);
815 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000816 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000817 return NULL;
818 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000819 return PyString_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000820}
821
822
823/* Create an object representing the given socket address,
824 suitable for passing it back to bind(), connect() etc.
825 The family field of the sockaddr structure is inspected
826 to determine what kind of address it really is. */
827
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000828/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000829static PyObject *
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000830makesockaddr(int sockfd, struct sockaddr *addr, int addrlen)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000831{
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000832 if (addrlen == 0) {
833 /* No address -- may be recvfrom() from known socket */
Guido van Rossum73624e91994-10-10 17:59:00 +0000834 Py_INCREF(Py_None);
835 return Py_None;
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000836 }
837
Guido van Rossumbcc20741998-08-04 22:53:56 +0000838#ifdef __BEOS__
Guido van Rossum2c8bcb82000-04-25 21:34:53 +0000839 /* XXX: BeOS version of accept() doesn't set family correctly */
Guido van Rossumbcc20741998-08-04 22:53:56 +0000840 addr->sa_family = AF_INET;
841#endif
842
Guido van Rossum30a685f1991-06-27 15:51:29 +0000843 switch (addr->sa_family) {
844
845 case AF_INET:
846 {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000847 struct sockaddr_in *a;
848 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
Barry Warsaw752300b1997-01-03 17:18:10 +0000849 PyObject *ret = NULL;
850 if (addrobj) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000851 a = (struct sockaddr_in *)addr;
Barry Warsaw752300b1997-01-03 17:18:10 +0000852 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
853 Py_DECREF(addrobj);
854 }
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000855 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000856 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000857
Andrew MacIntyre34d3e2d2003-01-02 12:45:34 +0000858#if defined(AF_UNIX) && !defined(PYOS_OS2)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000859 case AF_UNIX:
860 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000861 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000862 return PyString_FromString(a->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000863 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000864#endif /* AF_UNIX */
865
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000866#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000867 case AF_INET6:
868 {
869 struct sockaddr_in6 *a;
870 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
871 PyObject *ret = NULL;
872 if (addrobj) {
873 a = (struct sockaddr_in6 *)addr;
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000874 ret = Py_BuildValue("Oiii",
875 addrobj,
876 ntohs(a->sin6_port),
877 a->sin6_flowinfo,
878 a->sin6_scope_id);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000879 Py_DECREF(addrobj);
880 }
881 return ret;
882 }
Jeremy Hylton22308652001-02-02 03:23:09 +0000883#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +0000884
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +0000885#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +0000886 case AF_PACKET:
887 {
888 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
889 char *ifname = "";
890 struct ifreq ifr;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000891 /* need to look up interface name give index */
892 if (a->sll_ifindex) {
Jeremy Hylton22308652001-02-02 03:23:09 +0000893 ifr.ifr_ifindex = a->sll_ifindex;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000894 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
Jeremy Hylton22308652001-02-02 03:23:09 +0000895 ifname = ifr.ifr_name;
Jeremy Hylton22308652001-02-02 03:23:09 +0000896 }
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000897 return Py_BuildValue("shbhs#",
898 ifname,
899 ntohs(a->sll_protocol),
900 a->sll_pkttype,
901 a->sll_hatype,
902 a->sll_addr,
903 a->sll_halen);
Jeremy Hylton22308652001-02-02 03:23:09 +0000904 }
905#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000906
Guido van Rossum30a685f1991-06-27 15:51:29 +0000907 /* More cases here... */
908
909 default:
Guido van Rossumaa948df1997-05-07 17:41:48 +0000910 /* If we don't know the address family, don't raise an
911 exception -- return it as a tuple. */
912 return Py_BuildValue("is#",
913 addr->sa_family,
914 addr->sa_data,
915 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000916
Guido van Rossum30a685f1991-06-27 15:51:29 +0000917 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000918}
919
Guido van Rossum30a685f1991-06-27 15:51:29 +0000920
921/* Parse a socket address argument according to the socket object's
922 address family. Return 1 if the address was in the proper format,
923 0 of not. The address is returned through addr_ret, its length
924 through len_ret. */
925
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000926static int
Guido van Rossum48a680c2001-03-02 06:34:14 +0000927getsockaddrarg(PySocketSockObject *s, PyObject *args,
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000928 struct sockaddr **addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000929{
Guido van Rossum30a685f1991-06-27 15:51:29 +0000930 switch (s->sock_family) {
931
Andrew MacIntyre34d3e2d2003-01-02 12:45:34 +0000932#if defined(AF_UNIX) && !defined(PYOS_OS2)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000933 case AF_UNIX:
934 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000935 struct sockaddr_un* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000936 char *path;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000937 int len;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000938 addr = (struct sockaddr_un*)&(s->sock_addr).un;
Guido van Rossum7e488981998-10-08 02:25:24 +0000939 if (!PyArg_Parse(args, "t#", &path, &len))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000940 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000941 if (len > sizeof addr->sun_path) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000942 PyErr_SetString(socket_error,
Barry Warsaw752300b1997-01-03 17:18:10 +0000943 "AF_UNIX path too long");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000944 return 0;
945 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000946 addr->sun_family = s->sock_family;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000947 memcpy(addr->sun_path, path, len);
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000948 addr->sun_path[len] = 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000949 *addr_ret = (struct sockaddr *) addr;
Guido van Rossum65af28a1996-06-11 18:36:33 +0000950 *len_ret = len + sizeof(*addr) - sizeof(addr->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000951 return 1;
952 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000953#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000954
Guido van Rossum30a685f1991-06-27 15:51:29 +0000955 case AF_INET:
956 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000957 struct sockaddr_in* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000958 char *host;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000959 int port;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000960 addr=(struct sockaddr_in*)&(s->sock_addr).in;
Guido van Rossume4dad902000-12-01 13:13:11 +0000961 if (!PyTuple_Check(args)) {
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000962 PyErr_Format(
963 PyExc_TypeError,
964 "getsockaddrarg: "
965 "AF_INET address must be tuple, not %.500s",
966 args->ob_type->tp_name);
Guido van Rossume4dad902000-12-01 13:13:11 +0000967 return 0;
968 }
Martin v. Löwis2548c732003-04-18 10:39:54 +0000969 if (!PyArg_ParseTuple(args, "eti:getsockaddrarg",
970 "idna", &host, &port))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000971 return 0;
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000972 if (setipaddr(host, (struct sockaddr *)addr, sizeof(*addr), AF_INET) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000973 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000974 addr->sin_family = AF_INET;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000975 addr->sin_port = htons((short)port);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000976 *addr_ret = (struct sockaddr *) addr;
977 *len_ret = sizeof *addr;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000978 return 1;
979 }
980
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000981#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000982 case AF_INET6:
983 {
984 struct sockaddr_in6* addr;
985 char *host;
986 int port, flowinfo, scope_id;
987 addr = (struct sockaddr_in6*)&(s->sock_addr).in6;
988 flowinfo = scope_id = 0;
Martin v. Löwis2548c732003-04-18 10:39:54 +0000989 if (!PyArg_ParseTuple(args, "eti|ii",
990 "idna", &host, &port, &flowinfo,
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000991 &scope_id)) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000992 return 0;
993 }
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000994 if (setipaddr(host, (struct sockaddr *)addr, sizeof(*addr), AF_INET6) < 0)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000995 return 0;
996 addr->sin6_family = s->sock_family;
997 addr->sin6_port = htons((short)port);
998 addr->sin6_flowinfo = flowinfo;
999 addr->sin6_scope_id = scope_id;
1000 *addr_ret = (struct sockaddr *) addr;
1001 *len_ret = sizeof *addr;
1002 return 1;
1003 }
1004#endif
1005
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00001006#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +00001007 case AF_PACKET:
1008 {
1009 struct sockaddr_ll* addr;
1010 struct ifreq ifr;
1011 char *interfaceName;
1012 int protoNumber;
1013 int hatype = 0;
1014 int pkttype = 0;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001015 char *haddr;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001016
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001017 if (!PyArg_ParseTuple(args, "si|iis", &interfaceName,
1018 &protoNumber, &pkttype, &hatype, &haddr))
Jeremy Hylton22308652001-02-02 03:23:09 +00001019 return 0;
1020 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
1021 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001022 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001023 s->errorhandler();
Jeremy Hylton22308652001-02-02 03:23:09 +00001024 return 0;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001025 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001026 addr = &(s->sock_addr.ll);
1027 addr->sll_family = AF_PACKET;
1028 addr->sll_protocol = htons((short)protoNumber);
1029 addr->sll_ifindex = ifr.ifr_ifindex;
1030 addr->sll_pkttype = pkttype;
1031 addr->sll_hatype = hatype;
1032 *addr_ret = (struct sockaddr *) addr;
1033 *len_ret = sizeof *addr;
1034 return 1;
1035 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00001036#endif
1037
Guido van Rossum30a685f1991-06-27 15:51:29 +00001038 /* More cases here... */
1039
1040 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001041 PyErr_SetString(socket_error, "getsockaddrarg: bad family");
Guido van Rossum30a685f1991-06-27 15:51:29 +00001042 return 0;
1043
1044 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001045}
1046
Guido van Rossum30a685f1991-06-27 15:51:29 +00001047
Guido van Rossum48a680c2001-03-02 06:34:14 +00001048/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +00001049 Return 1 if the family is known, 0 otherwise. The length is returned
1050 through len_ret. */
1051
1052static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +00001053getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +00001054{
1055 switch (s->sock_family) {
1056
Andrew MacIntyre34d3e2d2003-01-02 12:45:34 +00001057#if defined(AF_UNIX) && !defined(PYOS_OS2)
Guido van Rossum710e1df1992-06-12 10:39:36 +00001058 case AF_UNIX:
1059 {
1060 *len_ret = sizeof (struct sockaddr_un);
1061 return 1;
1062 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001063#endif /* AF_UNIX */
Guido van Rossum710e1df1992-06-12 10:39:36 +00001064
1065 case AF_INET:
1066 {
1067 *len_ret = sizeof (struct sockaddr_in);
1068 return 1;
1069 }
1070
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001071#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001072 case AF_INET6:
1073 {
1074 *len_ret = sizeof (struct sockaddr_in6);
1075 return 1;
1076 }
1077#endif
1078
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00001079#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +00001080 case AF_PACKET:
1081 {
1082 *len_ret = sizeof (struct sockaddr_ll);
1083 return 1;
1084 }
1085#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001086
Guido van Rossum710e1df1992-06-12 10:39:36 +00001087 /* More cases here... */
1088
1089 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001090 PyErr_SetString(socket_error, "getsockaddrlen: bad family");
Guido van Rossum710e1df1992-06-12 10:39:36 +00001091 return 0;
1092
1093 }
1094}
1095
1096
Guido van Rossum30a685f1991-06-27 15:51:29 +00001097/* s.accept() method */
1098
Guido van Rossum73624e91994-10-10 17:59:00 +00001099static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001100sock_accept(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001101{
1102 char addrbuf[256];
Fred Drakea04eaad2000-06-30 02:46:07 +00001103 SOCKET_T newfd;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001104 socklen_t addrlen;
Barry Warsaw752300b1997-01-03 17:18:10 +00001105 PyObject *sock = NULL;
1106 PyObject *addr = NULL;
1107 PyObject *res = NULL;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001108 int timeout;
Barry Warsaw752300b1997-01-03 17:18:10 +00001109
Guido van Rossum710e1df1992-06-12 10:39:36 +00001110 if (!getsockaddrlen(s, &addrlen))
1111 return NULL;
Fred Drakefd168342001-05-09 19:11:33 +00001112 memset(addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001113
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001114#ifdef MS_WINDOWS
1115 newfd = INVALID_SOCKET;
1116#else
1117 newfd = -1;
1118#endif
1119
Guido van Rossum73624e91994-10-10 17:59:00 +00001120 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001121 timeout = internal_select(s, 0);
1122 if (!timeout)
1123 newfd = accept(s->sock_fd, (struct sockaddr *) addrbuf,
1124 &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001125 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001126
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001127 if (timeout) {
1128 PyErr_SetString(socket_timeout, "timed out");
1129 return NULL;
1130 }
1131
Fred Drakea04eaad2000-06-30 02:46:07 +00001132#ifdef MS_WINDOWS
1133 if (newfd == INVALID_SOCKET)
1134#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001135 if (newfd < 0)
Fred Drakea04eaad2000-06-30 02:46:07 +00001136#endif
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001137 return s->errorhandler();
Barry Warsaw752300b1997-01-03 17:18:10 +00001138
Guido van Rossum30a685f1991-06-27 15:51:29 +00001139 /* Create the new object with unspecified family,
1140 to avoid calls to bind() etc. on it. */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001141 sock = (PyObject *) new_sockobject(newfd,
1142 s->sock_family,
1143 s->sock_type,
1144 s->sock_proto);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001145
Barry Warsaw752300b1997-01-03 17:18:10 +00001146 if (sock == NULL) {
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001147 SOCKETCLOSE(newfd);
Barry Warsaw752300b1997-01-03 17:18:10 +00001148 goto finally;
1149 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00001150 addr = makesockaddr(s->sock_fd, (struct sockaddr *)addrbuf,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001151 addrlen);
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001152 if (addr == NULL)
Barry Warsaw752300b1997-01-03 17:18:10 +00001153 goto finally;
1154
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001155 res = Py_BuildValue("OO", sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00001156
Guido van Rossum67f7a382002-06-06 21:08:16 +00001157finally:
Guido van Rossum73624e91994-10-10 17:59:00 +00001158 Py_XDECREF(sock);
1159 Py_XDECREF(addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001160 return res;
1161}
1162
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001163PyDoc_STRVAR(accept_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001164"accept() -> (socket object, address info)\n\
1165\n\
1166Wait for an incoming connection. Return a new socket representing the\n\
1167connection, and the address of the client. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001168info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001169
Guido van Rossum11ba0942002-06-13 15:07:44 +00001170/* s.setblocking(flag) method. Argument:
1171 False -- non-blocking mode; same as settimeout(0)
1172 True -- blocking mode; same as settimeout(None)
1173*/
Guido van Rossume4485b01994-09-07 14:32:49 +00001174
Guido van Rossum73624e91994-10-10 17:59:00 +00001175static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001176sock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00001177{
1178 int block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001179
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001180 block = PyInt_AsLong(arg);
1181 if (block == -1 && PyErr_Occurred())
Guido van Rossume4485b01994-09-07 14:32:49 +00001182 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001183
Guido van Rossum11ba0942002-06-13 15:07:44 +00001184 s->sock_timeout = block ? -1.0 : 0.0;
Guido van Rossume8008f02002-06-07 03:36:20 +00001185 internal_setblocking(s, block);
Guido van Rossume4485b01994-09-07 14:32:49 +00001186
Guido van Rossum73624e91994-10-10 17:59:00 +00001187 Py_INCREF(Py_None);
1188 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +00001189}
Guido van Rossume4485b01994-09-07 14:32:49 +00001190
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001191PyDoc_STRVAR(setblocking_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001192"setblocking(flag)\n\
1193\n\
1194Set the socket to blocking (flag is true) or non-blocking (false).\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00001195setblocking(True) is equivalent to settimeout(None);\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001196setblocking(False) is equivalent to settimeout(0.0).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001197
Guido van Rossum11ba0942002-06-13 15:07:44 +00001198/* s.settimeout(timeout) method. Argument:
1199 None -- no timeout, blocking mode; same as setblocking(True)
1200 0.0 -- non-blocking mode; same as setblocking(False)
1201 > 0 -- timeout mode; operations time out after timeout seconds
1202 < 0 -- illegal; raises an exception
1203*/
Guido van Rossum67f7a382002-06-06 21:08:16 +00001204static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001205sock_settimeout(PySocketSockObject *s, PyObject *arg)
Guido van Rossum67f7a382002-06-06 21:08:16 +00001206{
Guido van Rossum11ba0942002-06-13 15:07:44 +00001207 double timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001208
1209 if (arg == Py_None)
Guido van Rossum11ba0942002-06-13 15:07:44 +00001210 timeout = -1.0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001211 else {
Guido van Rossum11ba0942002-06-13 15:07:44 +00001212 timeout = PyFloat_AsDouble(arg);
1213 if (timeout < 0.0) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00001214 if (!PyErr_Occurred())
1215 PyErr_SetString(PyExc_ValueError,
Guido van Rossum11ba0942002-06-13 15:07:44 +00001216 "Timeout value out of range");
Guido van Rossum67f7a382002-06-06 21:08:16 +00001217 return NULL;
1218 }
1219 }
1220
Guido van Rossum11ba0942002-06-13 15:07:44 +00001221 s->sock_timeout = timeout;
1222 internal_setblocking(s, timeout < 0.0);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001223
1224 Py_INCREF(Py_None);
1225 return Py_None;
1226}
1227
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001228PyDoc_STRVAR(settimeout_doc,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001229"settimeout(timeout)\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00001230\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00001231Set a timeout on socket operations. 'timeout' can be a float,\n\
1232giving in seconds, or None. Setting a timeout of None disables\n\
1233the timeout feature and is equivalent to setblocking(1).\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001234Setting a timeout of zero is the same as setblocking(0).");
Guido van Rossum67f7a382002-06-06 21:08:16 +00001235
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001236/* s.gettimeout() method.
1237 Returns the timeout associated with a socket. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00001238static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001239sock_gettimeout(PySocketSockObject *s)
Guido van Rossum67f7a382002-06-06 21:08:16 +00001240{
1241 if (s->sock_timeout < 0.0) {
1242 Py_INCREF(Py_None);
1243 return Py_None;
1244 }
1245 else
1246 return PyFloat_FromDouble(s->sock_timeout);
1247}
1248
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001249PyDoc_STRVAR(gettimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00001250"gettimeout() -> timeout\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00001251\n\
1252Returns the timeout in floating seconds associated with socket \n\
1253operations. A timeout of None indicates that timeouts on socket \n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001254operations are disabled.");
Guido van Rossume4485b01994-09-07 14:32:49 +00001255
Guido van Rossum48a680c2001-03-02 06:34:14 +00001256#ifdef RISCOS
1257/* s.sleeptaskw(1 | 0) method */
1258
1259static PyObject *
Martin v. Löwisa94568a2003-05-10 07:36:56 +00001260sock_sleeptaskw(PySocketSockObject *s,PyObject *arg)
Guido van Rossum48a680c2001-03-02 06:34:14 +00001261{
Guido van Rossum67f7a382002-06-06 21:08:16 +00001262 int block;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00001263 block = PyInt_AsLong(arg);
1264 if (block == -1 && PyErr_Occurred())
Guido van Rossum67f7a382002-06-06 21:08:16 +00001265 return NULL;
1266 Py_BEGIN_ALLOW_THREADS
1267 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
1268 Py_END_ALLOW_THREADS
Guido van Rossum48a680c2001-03-02 06:34:14 +00001269
Guido van Rossum67f7a382002-06-06 21:08:16 +00001270 Py_INCREF(Py_None);
1271 return Py_None;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001272}
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001273PyDoc_STRVAR(sleeptaskw_doc,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001274"sleeptaskw(flag)\n\
1275\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001276Allow sleeps in taskwindows.");
Guido van Rossum48a680c2001-03-02 06:34:14 +00001277#endif
1278
1279
Guido van Rossumaee08791992-09-08 09:05:33 +00001280/* s.setsockopt() method.
1281 With an integer third argument, sets an integer option.
1282 With a string third argument, sets an option from a buffer;
1283 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001284
Guido van Rossum73624e91994-10-10 17:59:00 +00001285static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001286sock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001287{
1288 int level;
1289 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001290 int res;
Guido van Rossumaee08791992-09-08 09:05:33 +00001291 char *buf;
1292 int buflen;
1293 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001294
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001295 if (PyArg_ParseTuple(args, "iii:setsockopt",
1296 &level, &optname, &flag)) {
Guido van Rossumaee08791992-09-08 09:05:33 +00001297 buf = (char *) &flag;
1298 buflen = sizeof flag;
1299 }
1300 else {
Guido van Rossum73624e91994-10-10 17:59:00 +00001301 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001302 if (!PyArg_ParseTuple(args, "iis#:setsockopt",
1303 &level, &optname, &buf, &buflen))
Guido van Rossumaee08791992-09-08 09:05:33 +00001304 return NULL;
1305 }
Thomas Wouters334fb892000-07-25 12:56:38 +00001306 res = setsockopt(s->sock_fd, level, optname, (void *)buf, buflen);
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001307 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001308 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001309 Py_INCREF(Py_None);
1310 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001311}
1312
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001313PyDoc_STRVAR(setsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001314"setsockopt(level, option, value)\n\
1315\n\
1316Set a socket option. See the Unix manual for level and option.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001317The value argument can either be an integer or a string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001318
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001319
Guido van Rossumaee08791992-09-08 09:05:33 +00001320/* s.getsockopt() method.
1321 With two arguments, retrieves an integer option.
1322 With a third integer argument, retrieves a string buffer of that size;
1323 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001324
Guido van Rossum73624e91994-10-10 17:59:00 +00001325static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001326sock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001327{
1328 int level;
1329 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001330 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +00001331 PyObject *buf;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001332 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001333
Guido van Rossumbcc20741998-08-04 22:53:56 +00001334#ifdef __BEOS__
Fred Drake564a6cc2001-05-11 20:12:26 +00001335 /* We have incomplete socket support. */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001336 PyErr_SetString(socket_error, "getsockopt not supported");
Guido van Rossumbcc20741998-08-04 22:53:56 +00001337 return NULL;
1338#else
1339
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001340 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
1341 &level, &optname, &buflen))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001342 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001343
Guido van Rossumbe32c891996-06-20 16:25:29 +00001344 if (buflen == 0) {
Guido van Rossumaee08791992-09-08 09:05:33 +00001345 int flag = 0;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001346 socklen_t flagsize = sizeof flag;
Guido van Rossumb376a4a1993-11-23 17:53:17 +00001347 res = getsockopt(s->sock_fd, level, optname,
Thomas Wouters334fb892000-07-25 12:56:38 +00001348 (void *)&flag, &flagsize);
Guido van Rossumaee08791992-09-08 09:05:33 +00001349 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001350 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001351 return PyInt_FromLong(flag);
Guido van Rossumaee08791992-09-08 09:05:33 +00001352 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001353#ifdef __VMS
1354 if (buflen > 1024) {
1355#else
Guido van Rossumaee08791992-09-08 09:05:33 +00001356 if (buflen <= 0 || buflen > 1024) {
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001357#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001358 PyErr_SetString(socket_error,
Barry Warsaw752300b1997-01-03 17:18:10 +00001359 "getsockopt buflen out of range");
Guido van Rossumaee08791992-09-08 09:05:33 +00001360 return NULL;
1361 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001362 buf = PyString_FromStringAndSize((char *)NULL, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001363 if (buf == NULL)
1364 return NULL;
Guido van Rossumb376a4a1993-11-23 17:53:17 +00001365 res = getsockopt(s->sock_fd, level, optname,
Fred Drake564a6cc2001-05-11 20:12:26 +00001366 (void *)PyString_AS_STRING(buf), &buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001367 if (res < 0) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001368 Py_DECREF(buf);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001369 return s->errorhandler();
Guido van Rossumaee08791992-09-08 09:05:33 +00001370 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001371 _PyString_Resize(&buf, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001372 return buf;
Guido van Rossumbcc20741998-08-04 22:53:56 +00001373#endif /* __BEOS__ */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001374}
1375
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001376PyDoc_STRVAR(getsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001377"getsockopt(level, option[, buffersize]) -> value\n\
1378\n\
1379Get a socket option. See the Unix manual for level and option.\n\
1380If a nonzero buffersize argument is given, the return value is a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001381string of that length; otherwise it is an integer.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001382
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001383
Fred Drake728819a2000-07-01 03:40:12 +00001384/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001385
Guido van Rossum73624e91994-10-10 17:59:00 +00001386static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001387sock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001388{
1389 struct sockaddr *addr;
1390 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001391 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001392
Fred Drake728819a2000-07-01 03:40:12 +00001393 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001394 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001395 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001396 res = bind(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001397 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001398 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001399 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001400 Py_INCREF(Py_None);
1401 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001402}
1403
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001404PyDoc_STRVAR(bind_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001405"bind(address)\n\
1406\n\
1407Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00001408pair (host, port); the host must refer to the local host. For raw packet\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001409sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001410
Guido van Rossum30a685f1991-06-27 15:51:29 +00001411
1412/* s.close() method.
1413 Set the file descriptor to -1 so operations tried subsequently
1414 will surely fail. */
1415
Guido van Rossum73624e91994-10-10 17:59:00 +00001416static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001417sock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001418{
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001419 SOCKET_T fd;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001420
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001421 if ((fd = s->sock_fd) != -1) {
1422 s->sock_fd = -1;
Guido van Rossum08481461996-10-12 14:07:22 +00001423 Py_BEGIN_ALLOW_THREADS
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001424 (void) SOCKETCLOSE(fd);
Guido van Rossum08481461996-10-12 14:07:22 +00001425 Py_END_ALLOW_THREADS
1426 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001427 Py_INCREF(Py_None);
1428 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001429}
1430
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001431PyDoc_STRVAR(close_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001432"close()\n\
1433\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001434Close the socket. It cannot be used after this call.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001435
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001436static int
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001437internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen,
1438 int *timeoutp)
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001439{
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001440 int res, timeout;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001441
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001442 timeout = 0;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001443 res = connect(s->sock_fd, addr, addrlen);
1444
1445#ifdef MS_WINDOWS
1446
1447 if (s->sock_timeout > 0.0) {
1448 if (res < 0 && WSAGetLastError() == WSAEWOULDBLOCK) {
Guido van Rossumb76bdf82003-02-19 17:50:16 +00001449 /* This is a mess. Best solution: trust select */
1450 fd_set fds;
1451 struct timeval tv;
1452 tv.tv_sec = (int)s->sock_timeout;
1453 tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6);
1454 FD_ZERO(&fds);
1455 FD_SET(s->sock_fd, &fds);
1456 res = select(s->sock_fd+1, NULL, &fds, NULL, &tv);
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001457 if (res == 0) {
Guido van Rossumb76bdf82003-02-19 17:50:16 +00001458 res = WSAEWOULDBLOCK;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001459 timeout = 1;
1460 } else if (res > 0)
Guido van Rossumb76bdf82003-02-19 17:50:16 +00001461 res = 0;
1462 /* else if (res < 0) an error occurred */
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001463 }
1464 }
1465
1466 if (res < 0)
1467 res = WSAGetLastError();
1468
1469#else
1470
1471 if (s->sock_timeout > 0.0) {
1472 if (res < 0 && errno == EINPROGRESS) {
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001473 timeout = internal_select(s, 1);
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001474 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum12e3c712002-08-08 20:39:30 +00001475 if (res < 0 && errno == EISCONN)
1476 res = 0;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001477 }
1478 }
1479
1480 if (res < 0)
1481 res = errno;
1482
1483#endif
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001484 *timeoutp = timeout;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001485
1486 return res;
1487}
Guido van Rossum30a685f1991-06-27 15:51:29 +00001488
Fred Drake728819a2000-07-01 03:40:12 +00001489/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001490
Guido van Rossum73624e91994-10-10 17:59:00 +00001491static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001492sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001493{
1494 struct sockaddr *addr;
1495 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001496 int res;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001497 int timeout;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001498
Fred Drake728819a2000-07-01 03:40:12 +00001499 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001500 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001501
Guido van Rossum73624e91994-10-10 17:59:00 +00001502 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001503 res = internal_connect(s, addr, addrlen, &timeout);
Guido van Rossum11ba0942002-06-13 15:07:44 +00001504 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001505
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001506 if (timeout) {
1507 PyErr_SetString(socket_timeout, "timed out");
1508 return NULL;
1509 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001510 if (res != 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001511 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001512 Py_INCREF(Py_None);
1513 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001514}
1515
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001516PyDoc_STRVAR(connect_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001517"connect(address)\n\
1518\n\
1519Connect the socket to a remote address. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001520is a pair (host, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001521
Guido van Rossum30a685f1991-06-27 15:51:29 +00001522
Fred Drake728819a2000-07-01 03:40:12 +00001523/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001524
1525static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001526sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001527{
1528 struct sockaddr *addr;
1529 int addrlen;
1530 int res;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001531 int timeout;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001532
Fred Drake728819a2000-07-01 03:40:12 +00001533 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001534 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001535
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001536 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001537 res = internal_connect(s, addr, addrlen, &timeout);
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001538 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001539
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001540 return PyInt_FromLong((long) res);
1541}
1542
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001543PyDoc_STRVAR(connect_ex_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00001544"connect_ex(address) -> errno\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00001545\n\
1546This is like connect(address), but returns an error code (the errno value)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001547instead of raising an exception when an error occurs.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001548
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001549
Guido van Rossumed233a51992-06-23 09:07:03 +00001550/* s.fileno() method */
1551
Guido van Rossum73624e91994-10-10 17:59:00 +00001552static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001553sock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00001554{
Fred Drakea04eaad2000-06-30 02:46:07 +00001555#if SIZEOF_SOCKET_T <= SIZEOF_LONG
Guido van Rossum73624e91994-10-10 17:59:00 +00001556 return PyInt_FromLong((long) s->sock_fd);
Fred Drakea04eaad2000-06-30 02:46:07 +00001557#else
Martin v. Löwisb9a0f912003-03-29 10:06:18 +00001558 return PyLong_FromLongLong((PY_LONG_LONG)s->sock_fd);
Fred Drakea04eaad2000-06-30 02:46:07 +00001559#endif
Guido van Rossumed233a51992-06-23 09:07:03 +00001560}
1561
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001562PyDoc_STRVAR(fileno_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001563"fileno() -> integer\n\
1564\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001565Return the integer file descriptor of the socket.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001566
Guido van Rossumed233a51992-06-23 09:07:03 +00001567
Guido van Rossumbe32c891996-06-20 16:25:29 +00001568#ifndef NO_DUP
1569/* s.dup() method */
1570
1571static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001572sock_dup(PySocketSockObject *s)
Guido van Rossumbe32c891996-06-20 16:25:29 +00001573{
Fred Drakea04eaad2000-06-30 02:46:07 +00001574 SOCKET_T newfd;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001575 PyObject *sock;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001576
Guido van Rossumbe32c891996-06-20 16:25:29 +00001577 newfd = dup(s->sock_fd);
1578 if (newfd < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001579 return s->errorhandler();
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001580 sock = (PyObject *) new_sockobject(newfd,
1581 s->sock_family,
1582 s->sock_type,
1583 s->sock_proto);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001584 if (sock == NULL)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001585 SOCKETCLOSE(newfd);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001586 return sock;
1587}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001588
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001589PyDoc_STRVAR(dup_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001590"dup() -> socket object\n\
1591\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001592Return a new socket object connected to the same system resource.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001593
Guido van Rossumbe32c891996-06-20 16:25:29 +00001594#endif
1595
1596
Guido van Rossumc89705d1992-11-26 08:54:07 +00001597/* s.getsockname() method */
1598
Guido van Rossum73624e91994-10-10 17:59:00 +00001599static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001600sock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001601{
1602 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001603 int res;
1604 socklen_t addrlen;
1605
Guido van Rossumc89705d1992-11-26 08:54:07 +00001606 if (!getsockaddrlen(s, &addrlen))
1607 return NULL;
Guido van Rossumca42b161996-01-12 01:36:05 +00001608 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001609 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001610 res = getsockname(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001611 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001612 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001613 return s->errorhandler();
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001614 return makesockaddr(s->sock_fd, (struct sockaddr *) addrbuf, addrlen);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001615}
1616
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001617PyDoc_STRVAR(getsockname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001618"getsockname() -> address info\n\
1619\n\
1620Return the address of the local endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001621info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001622
Guido van Rossumc89705d1992-11-26 08:54:07 +00001623
Guido van Rossumb6775db1994-08-01 11:34:53 +00001624#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001625/* s.getpeername() method */
1626
Guido van Rossum73624e91994-10-10 17:59:00 +00001627static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001628sock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001629{
1630 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001631 int res;
1632 socklen_t addrlen;
1633
Guido van Rossumc89705d1992-11-26 08:54:07 +00001634 if (!getsockaddrlen(s, &addrlen))
1635 return NULL;
Fred Drakefd168342001-05-09 19:11:33 +00001636 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001637 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001638 res = getpeername(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001639 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001640 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001641 return s->errorhandler();
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001642 return makesockaddr(s->sock_fd, (struct sockaddr *) addrbuf, addrlen);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001643}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001644
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001645PyDoc_STRVAR(getpeername_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001646"getpeername() -> address info\n\
1647\n\
1648Return the address of the remote endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001649info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001650
Guido van Rossumb6775db1994-08-01 11:34:53 +00001651#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001652
1653
Guido van Rossum30a685f1991-06-27 15:51:29 +00001654/* s.listen(n) method */
1655
Guido van Rossum73624e91994-10-10 17:59:00 +00001656static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001657sock_listen(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001658{
1659 int backlog;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001660 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001661
1662 backlog = PyInt_AsLong(arg);
1663 if (backlog == -1 && PyErr_Occurred())
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001664 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001665 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +00001666 if (backlog < 1)
1667 backlog = 1;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001668 res = listen(s->sock_fd, backlog);
Guido van Rossum73624e91994-10-10 17:59:00 +00001669 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001670 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001671 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001672 Py_INCREF(Py_None);
1673 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001674}
1675
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001676PyDoc_STRVAR(listen_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001677"listen(backlog)\n\
1678\n\
1679Enable a server to accept connections. The backlog argument must be at\n\
1680least 1; it specifies the number of unaccepted connection that the system\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001681will allow before refusing new connections.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001682
1683
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001684#ifndef NO_DUP
Guido van Rossum30a685f1991-06-27 15:51:29 +00001685/* s.makefile(mode) method.
1686 Create a new open file object referring to a dupped version of
1687 the socket's file descriptor. (The dup() call is necessary so
1688 that the open file and socket objects may be closed independent
1689 of each other.)
1690 The mode argument specifies 'r' or 'w' passed to fdopen(). */
1691
Guido van Rossum73624e91994-10-10 17:59:00 +00001692static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001693sock_makefile(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001694{
Tim Petersdbd9ba62000-07-09 03:09:57 +00001695 extern int fclose(FILE *);
Guido van Rossum6b144911995-03-14 15:05:13 +00001696 char *mode = "r";
1697 int bufsize = -1;
Fred Drakea04eaad2000-06-30 02:46:07 +00001698#ifdef MS_WIN32
Tim Peters79248aa2001-08-29 21:37:10 +00001699 Py_intptr_t fd;
Fred Drakea04eaad2000-06-30 02:46:07 +00001700#else
Guido van Rossum30a685f1991-06-27 15:51:29 +00001701 int fd;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001702#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001703 FILE *fp;
Guido van Rossum6b144911995-03-14 15:05:13 +00001704 PyObject *f;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001705#ifdef __VMS
1706 char *mode_r = "r";
1707 char *mode_w = "w";
1708#endif
Guido van Rossum6b144911995-03-14 15:05:13 +00001709
Guido van Rossum43713e52000-02-29 13:59:29 +00001710 if (!PyArg_ParseTuple(args, "|si:makefile", &mode, &bufsize))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001711 return NULL;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001712#ifdef __VMS
1713 if (strcmp(mode,"rb") == 0) {
1714 mode = mode_r;
1715 }
1716 else {
1717 if (strcmp(mode,"wb") == 0) {
1718 mode = mode_w;
1719 }
1720 }
1721#endif
Guido van Rossum8d665e61996-06-26 18:22:49 +00001722#ifdef MS_WIN32
Guido van Rossum82a5c661998-07-07 20:45:43 +00001723 if (((fd = _open_osfhandle(s->sock_fd, _O_BINARY)) < 0) ||
1724 ((fd = dup(fd)) < 0) || ((fp = fdopen(fd, mode)) == NULL))
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001725#else
Guido van Rossum82a5c661998-07-07 20:45:43 +00001726 if ((fd = dup(s->sock_fd)) < 0 || (fp = fdopen(fd, mode)) == NULL)
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001727#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001728 {
Guido van Rossum6b144911995-03-14 15:05:13 +00001729 if (fd >= 0)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001730 SOCKETCLOSE(fd);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001731 return s->errorhandler();
Guido van Rossum6b144911995-03-14 15:05:13 +00001732 }
Jack Jansen6d8898b2002-03-25 15:32:01 +00001733#ifdef USE_GUSI2
1734 /* Workaround for bug in Metrowerks MSL vs. GUSI I/O library */
Guido van Rossum67f7a382002-06-06 21:08:16 +00001735 if (strchr(mode, 'b') != NULL)
Jack Jansen6d8898b2002-03-25 15:32:01 +00001736 bufsize = 0;
1737#endif
Guido van Rossum6b144911995-03-14 15:05:13 +00001738 f = PyFile_FromFile(fp, "<socket>", mode, fclose);
1739 if (f != NULL)
1740 PyFile_SetBufSize(f, bufsize);
1741 return f;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001742}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001743
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001744PyDoc_STRVAR(makefile_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001745"makefile([mode[, buffersize]]) -> file object\n\
1746\n\
1747Return a regular file object corresponding to the socket.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001748The mode and buffersize arguments are as for the built-in open() function.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001749
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001750#endif /* NO_DUP */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001751
Guido van Rossum48a680c2001-03-02 06:34:14 +00001752
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001753/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001754
Guido van Rossum73624e91994-10-10 17:59:00 +00001755static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001756sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001757{
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001758 int len, n = 0, flags = 0, timeout;
Guido van Rossum73624e91994-10-10 17:59:00 +00001759 PyObject *buf;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001760#ifdef __VMS
1761 int read_length;
1762 char *read_buf;
1763#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00001764
Guido van Rossum43713e52000-02-29 13:59:29 +00001765 if (!PyArg_ParseTuple(args, "i|i:recv", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001766 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001767
1768 if (len < 0) {
Martin v. Löwisfba64e12001-11-19 10:41:26 +00001769 PyErr_SetString(PyExc_ValueError,
Guido van Rossum11ba0942002-06-13 15:07:44 +00001770 "negative buffersize in recv");
Martin v. Löwisfba64e12001-11-19 10:41:26 +00001771 return NULL;
1772 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00001773
Guido van Rossum73624e91994-10-10 17:59:00 +00001774 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001775 if (buf == NULL)
1776 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001777
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001778#ifndef __VMS
Guido van Rossum73624e91994-10-10 17:59:00 +00001779 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001780 timeout = internal_select(s, 0);
1781 if (!timeout)
1782 n = recv(s->sock_fd, PyString_AS_STRING(buf), len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001783 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001784
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001785 if (timeout) {
1786 Py_DECREF(buf);
1787 PyErr_SetString(socket_timeout, "timed out");
1788 return NULL;
1789 }
Guido van Rossum7c53b771995-09-13 18:39:47 +00001790 if (n < 0) {
1791 Py_DECREF(buf);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001792 return s->errorhandler();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001793 }
Tim Peters5de98422002-04-27 18:44:32 +00001794 if (n != len)
1795 _PyString_Resize(&buf, n);
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001796#else
1797 read_buf = PyString_AsString(buf);
1798 read_length = len;
1799 while (read_length != 0) {
1800 unsigned int segment;
1801
1802 segment = read_length /SEGMENT_SIZE;
1803 if (segment != 0) {
1804 segment = SEGMENT_SIZE;
1805 }
1806 else {
1807 segment = read_length;
1808 }
1809
1810 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001811 timeout = internal_select(s, 0);
1812 if (!timeout)
1813 n = recv(s->sock_fd, read_buf, segment, flags);
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001814 Py_END_ALLOW_THREADS
1815
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001816 if (timeout) {
1817 Py_DECREF(buf);
1818 PyErr_SetString(socket_timeout, "timed out");
1819 return NULL;
1820 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001821 if (n < 0) {
1822 Py_DECREF(buf);
1823 return s->errorhandler();
1824 }
1825 if (n != read_length) {
1826 read_buf += n;
1827 break;
1828 }
1829
1830 read_length -= segment;
1831 read_buf += segment;
1832 }
1833 if (_PyString_Resize(&buf, (read_buf - PyString_AsString(buf))) < 0)
1834 {
1835 return NULL;
1836 }
1837#endif /* !__VMS */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001838 return buf;
1839}
1840
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001841PyDoc_STRVAR(recv_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001842"recv(buffersize[, flags]) -> data\n\
1843\n\
1844Receive up to buffersize bytes from the socket. For the optional flags\n\
1845argument, see the Unix manual. When no data is available, block until\n\
1846at least one byte is available or until the remote end is closed. When\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001847the remote end is closed and all data is read, return the empty string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001848
Guido van Rossum30a685f1991-06-27 15:51:29 +00001849
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001850/* s.recvfrom(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001851
Guido van Rossum73624e91994-10-10 17:59:00 +00001852static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001853sock_recvfrom(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001854{
1855 char addrbuf[256];
Barry Warsaw752300b1997-01-03 17:18:10 +00001856 PyObject *buf = NULL;
1857 PyObject *addr = NULL;
1858 PyObject *ret = NULL;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001859 int len, n = 0, flags = 0, timeout;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001860 socklen_t addrlen;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001861
Guido van Rossum43713e52000-02-29 13:59:29 +00001862 if (!PyArg_ParseTuple(args, "i|i:recvfrom", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001863 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001864
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001865 if (!getsockaddrlen(s, &addrlen))
1866 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001867 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001868 if (buf == NULL)
1869 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001870
Guido van Rossum73624e91994-10-10 17:59:00 +00001871 Py_BEGIN_ALLOW_THREADS
Fred Drakefd168342001-05-09 19:11:33 +00001872 memset(addrbuf, 0, addrlen);
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001873 timeout = internal_select(s, 0);
1874 if (!timeout)
1875 n = recvfrom(s->sock_fd, PyString_AS_STRING(buf), len, flags,
Guido van Rossum8d665e61996-06-26 18:22:49 +00001876#ifndef MS_WINDOWS
Andrew MacIntyreba43e872002-03-03 03:03:52 +00001877#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001878 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001879#else
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001880 (void *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001881#endif
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001882#else
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001883 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001884#endif
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001885 );
Guido van Rossum73624e91994-10-10 17:59:00 +00001886 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001887
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001888 if (timeout) {
1889 Py_DECREF(buf);
1890 PyErr_SetString(socket_timeout, "timed out");
1891 return NULL;
1892 }
Guido van Rossum7c53b771995-09-13 18:39:47 +00001893 if (n < 0) {
1894 Py_DECREF(buf);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001895 return s->errorhandler();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001896 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00001897
Guido van Rossum53a9bf81996-06-11 18:35:24 +00001898 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001899 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001900
Guido van Rossum67f7a382002-06-06 21:08:16 +00001901 if (!(addr = makesockaddr(s->sock_fd, (struct sockaddr *)addrbuf,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001902 addrlen)))
Barry Warsaw752300b1997-01-03 17:18:10 +00001903 goto finally;
1904
Guido van Rossum73624e91994-10-10 17:59:00 +00001905 ret = Py_BuildValue("OO", buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001906
1907finally:
Guido van Rossum73624e91994-10-10 17:59:00 +00001908 Py_XDECREF(addr);
1909 Py_XDECREF(buf);
Guido van Rossum6f5afc91993-02-05 09:46:15 +00001910 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001911}
1912
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001913PyDoc_STRVAR(recvfrom_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001914"recvfrom(buffersize[, flags]) -> (data, address info)\n\
1915\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001916Like recv(buffersize, flags) but also return the sender's address info.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001917
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001918/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001919
Guido van Rossum73624e91994-10-10 17:59:00 +00001920static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001921sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001922{
Guido van Rossumff4949e1992-08-05 19:58:53 +00001923 char *buf;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001924 int len, n = 0, flags = 0, timeout;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001925#ifdef __VMS
1926 int send_length;
1927#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00001928
Guido van Rossum43713e52000-02-29 13:59:29 +00001929 if (!PyArg_ParseTuple(args, "s#|i:send", &buf, &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001930 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001931
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001932#ifndef __VMS
Guido van Rossum73624e91994-10-10 17:59:00 +00001933 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001934 timeout = internal_select(s, 1);
1935 if (!timeout)
1936 n = send(s->sock_fd, buf, len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001937 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001938
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001939 if (timeout) {
1940 PyErr_SetString(socket_timeout, "timed out");
1941 return NULL;
1942 }
Guido van Rossum30a685f1991-06-27 15:51:29 +00001943 if (n < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001944 return s->errorhandler();
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001945#else
1946 /* Divide packet into smaller segments for */
1947 /* TCP/IP Services for OpenVMS */
1948 send_length = len;
1949 while (send_length != 0) {
1950 unsigned int segment;
1951
1952 segment = send_length / SEGMENT_SIZE;
1953 if (segment != 0) {
1954 segment = SEGMENT_SIZE;
1955 }
1956 else {
1957 segment = send_length;
1958 }
1959 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001960 timeout = internal_select(s, 1);
1961 if (!timeout)
1962 n = send(s->sock_fd, buf, segment, flags);
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001963 Py_END_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001964 if (timeout) {
1965 PyErr_SetString(socket_timeout, "timed out");
1966 return NULL;
1967 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001968 if (n < 0) {
1969 return s->errorhandler();
1970 }
1971 send_length -= segment;
1972 buf += segment;
1973 } /* end while */
1974#endif /* !__VMS */
Guido van Rossum73624e91994-10-10 17:59:00 +00001975 return PyInt_FromLong((long)n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001976}
1977
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001978PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001979"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00001980\n\
1981Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001982argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001983sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001984
1985
1986/* s.sendall(data [,flags]) method */
1987
1988static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001989sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001990{
1991 char *buf;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001992 int len, n = 0, flags = 0, timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001993
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001994 if (!PyArg_ParseTuple(args, "s#|i:sendall", &buf, &len, &flags))
1995 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001996
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001997 Py_BEGIN_ALLOW_THREADS
1998 do {
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001999 timeout = internal_select(s, 1);
2000 if (timeout)
2001 break;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002002 n = send(s->sock_fd, buf, len, flags);
2003 if (n < 0)
2004 break;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002005 buf += n;
2006 len -= n;
2007 } while (len > 0);
2008 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002009
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002010 if (timeout) {
2011 PyErr_SetString(socket_timeout, "timed out");
2012 return NULL;
2013 }
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002014 if (n < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002015 return s->errorhandler();
Guido van Rossum67f7a382002-06-06 21:08:16 +00002016
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002017 Py_INCREF(Py_None);
2018 return Py_None;
2019}
2020
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002021PyDoc_STRVAR(sendall_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002022"sendall(data[, flags])\n\
2023\n\
2024Send a data string to the socket. For the optional flags\n\
2025argument, see the Unix manual. This calls send() repeatedly\n\
2026until all data is sent. If an error occurs, it's impossible\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002027to tell how much data has been sent.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002028
Guido van Rossum30a685f1991-06-27 15:51:29 +00002029
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002030/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002031
Guido van Rossum73624e91994-10-10 17:59:00 +00002032static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002033sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002034{
Guido van Rossum73624e91994-10-10 17:59:00 +00002035 PyObject *addro;
Guido van Rossumff4949e1992-08-05 19:58:53 +00002036 char *buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002037 struct sockaddr *addr;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002038 int addrlen, len, n = 0, flags, timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002039
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002040 flags = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002041 if (!PyArg_ParseTuple(args, "s#O:sendto", &buf, &len, &addro)) {
Guido van Rossum73624e91994-10-10 17:59:00 +00002042 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002043 if (!PyArg_ParseTuple(args, "s#iO:sendto",
2044 &buf, &len, &flags, &addro))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002045 return NULL;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002046 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002047
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002048 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002049 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002050
Guido van Rossum73624e91994-10-10 17:59:00 +00002051 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002052 timeout = internal_select(s, 1);
2053 if (!timeout)
2054 n = sendto(s->sock_fd, buf, len, flags, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00002055 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002056
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002057 if (timeout) {
2058 PyErr_SetString(socket_timeout, "timed out");
2059 return NULL;
2060 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002061 if (n < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002062 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00002063 return PyInt_FromLong((long)n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002064}
2065
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002066PyDoc_STRVAR(sendto_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002067"sendto(data[, flags], address) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002068\n\
2069Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002070For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002071
Guido van Rossum30a685f1991-06-27 15:51:29 +00002072
2073/* s.shutdown(how) method */
2074
Guido van Rossum73624e91994-10-10 17:59:00 +00002075static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002076sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002077{
2078 int how;
Guido van Rossumff4949e1992-08-05 19:58:53 +00002079 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002080
2081 how = PyInt_AsLong(arg);
2082 if (how == -1 && PyErr_Occurred())
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002083 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00002084 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002085 res = shutdown(s->sock_fd, how);
Guido van Rossum73624e91994-10-10 17:59:00 +00002086 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002087 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002088 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00002089 Py_INCREF(Py_None);
2090 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002091}
2092
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002093PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002094"shutdown(flag)\n\
2095\n\
2096Shut down the reading side of the socket (flag == 0), the writing side\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002097of the socket (flag == 1), or both ends (flag == 2).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002098
Guido van Rossum30a685f1991-06-27 15:51:29 +00002099
2100/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002101
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002102static PyMethodDef sock_methods[] = {
2103 {"accept", (PyCFunction)sock_accept, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002104 accept_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002105 {"bind", (PyCFunction)sock_bind, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002106 bind_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002107 {"close", (PyCFunction)sock_close, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002108 close_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002109 {"connect", (PyCFunction)sock_connect, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002110 connect_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002111 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002112 connect_ex_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00002113#ifndef NO_DUP
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002114 {"dup", (PyCFunction)sock_dup, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002115 dup_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00002116#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002117 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002118 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00002119#ifdef HAVE_GETPEERNAME
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002120 {"getpeername", (PyCFunction)sock_getpeername,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002121 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00002122#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002123 {"getsockname", (PyCFunction)sock_getsockname,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002124 METH_NOARGS, getsockname_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002125 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002126 getsockopt_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002127 {"listen", (PyCFunction)sock_listen, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002128 listen_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002129#ifndef NO_DUP
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002130 {"makefile", (PyCFunction)sock_makefile, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002131 makefile_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002132#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002133 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002134 recv_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002135 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002136 recvfrom_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002137 {"send", (PyCFunction)sock_send, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002138 send_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002139 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002140 sendall_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002141 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002142 sendto_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002143 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002144 setblocking_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002145 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
Guido van Rossum67f7a382002-06-06 21:08:16 +00002146 settimeout_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002147 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
Guido van Rossum67f7a382002-06-06 21:08:16 +00002148 gettimeout_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002149 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002150 setsockopt_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002151 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002152 shutdown_doc},
2153#ifdef RISCOS
Martin v. Löwisa94568a2003-05-10 07:36:56 +00002154 {"sleeptaskw", (PyCFunction)sock_sleeptaskw, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002155 sleeptaskw_doc},
2156#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +00002157 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002158};
2159
Guido van Rossum30a685f1991-06-27 15:51:29 +00002160
Guido van Rossum73624e91994-10-10 17:59:00 +00002161/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00002162 First close the file description. */
2163
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002164static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002165sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002166{
Guido van Rossumfa972c92000-04-10 12:45:45 +00002167 if (s->sock_fd != -1)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00002168 (void) SOCKETCLOSE(s->sock_fd);
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002169 s->ob_type->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002170}
2171
Guido van Rossum30a685f1991-06-27 15:51:29 +00002172
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002173static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002174sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002175{
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002176 char buf[512];
Fred Drakea04eaad2000-06-30 02:46:07 +00002177#if SIZEOF_SOCKET_T > SIZEOF_LONG
2178 if (s->sock_fd > LONG_MAX) {
2179 /* this can occur on Win64, and actually there is a special
2180 ugly printf formatter for decimal pointer length integer
2181 printing, only bother if necessary*/
2182 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002183 "no printf formatter to display "
2184 "the socket descriptor in decimal");
Fred Drakea04eaad2000-06-30 02:46:07 +00002185 return NULL;
2186 }
2187#endif
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002188 PyOS_snprintf(
2189 buf, sizeof(buf),
2190 "<socket object, fd=%ld, family=%d, type=%d, protocol=%d>",
2191 (long)s->sock_fd, s->sock_family,
2192 s->sock_type,
2193 s->sock_proto);
Guido van Rossumdc1c64a1996-02-27 15:21:19 +00002194 return PyString_FromString(buf);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002195}
2196
2197
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002198/* Create a new, uninitialized socket object. */
2199
2200static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002201sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002202{
2203 PyObject *new;
2204
2205 new = type->tp_alloc(type, 0);
Guido van Rossume1c478f2002-06-06 20:08:25 +00002206 if (new != NULL) {
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002207 ((PySocketSockObject *)new)->sock_fd = -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002208 ((PySocketSockObject *)new)->sock_timeout = -1.0;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002209 ((PySocketSockObject *)new)->errorhandler = &set_error;
Guido van Rossume1c478f2002-06-06 20:08:25 +00002210 }
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002211 return new;
2212}
2213
2214
2215/* Initialize a new socket object. */
2216
2217/*ARGSUSED*/
2218static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00002219sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002220{
2221 PySocketSockObject *s = (PySocketSockObject *)self;
2222 SOCKET_T fd;
2223 int family = AF_INET, type = SOCK_STREAM, proto = 0;
2224 static char *keywords[] = {"family", "type", "proto", 0};
2225
2226 if (!PyArg_ParseTupleAndKeywords(args, kwds,
2227 "|iii:socket", keywords,
2228 &family, &type, &proto))
2229 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002230
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002231 Py_BEGIN_ALLOW_THREADS
2232 fd = socket(family, type, proto);
2233 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002234
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002235#ifdef MS_WINDOWS
2236 if (fd == INVALID_SOCKET)
2237#else
2238 if (fd < 0)
2239#endif
2240 {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002241 set_error();
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002242 return -1;
2243 }
2244 init_sockobject(s, fd, family, type, proto);
2245 /* From now on, ignore SIGPIPE and let the error checking
2246 do the work. */
2247#ifdef SIGPIPE
2248 (void) signal(SIGPIPE, SIG_IGN);
2249#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00002250
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002251 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002252
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002253}
2254
2255
Guido van Rossumb6775db1994-08-01 11:34:53 +00002256/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002257
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002258static PyTypeObject sock_type = {
Guido van Rossum55558541996-05-23 22:54:50 +00002259 PyObject_HEAD_INIT(0) /* Must fill in type value later */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002260 0, /* ob_size */
Guido van Rossumca6dfa52001-10-28 12:31:33 +00002261 "_socket.socket", /* tp_name */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002262 sizeof(PySocketSockObject), /* tp_basicsize */
2263 0, /* tp_itemsize */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002264 (destructor)sock_dealloc, /* tp_dealloc */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002265 0, /* tp_print */
2266 0, /* tp_getattr */
2267 0, /* tp_setattr */
2268 0, /* tp_compare */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002269 (reprfunc)sock_repr, /* tp_repr */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002270 0, /* tp_as_number */
2271 0, /* tp_as_sequence */
2272 0, /* tp_as_mapping */
2273 0, /* tp_hash */
2274 0, /* tp_call */
2275 0, /* tp_str */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002276 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002277 0, /* tp_setattro */
2278 0, /* tp_as_buffer */
2279 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002280 sock_doc, /* tp_doc */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002281 0, /* tp_traverse */
2282 0, /* tp_clear */
2283 0, /* tp_richcompare */
2284 0, /* tp_weaklistoffset */
2285 0, /* tp_iter */
2286 0, /* tp_iternext */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002287 sock_methods, /* tp_methods */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002288 0, /* tp_members */
2289 0, /* tp_getset */
2290 0, /* tp_base */
2291 0, /* tp_dict */
2292 0, /* tp_descr_get */
2293 0, /* tp_descr_set */
2294 0, /* tp_dictoffset */
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00002295 sock_initobj, /* tp_init */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002296 PyType_GenericAlloc, /* tp_alloc */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002297 sock_new, /* tp_new */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002298 PyObject_Del, /* tp_free */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002299};
2300
Guido van Rossum30a685f1991-06-27 15:51:29 +00002301
Guido van Rossum81194471991-07-27 21:42:02 +00002302/* Python interface to gethostname(). */
2303
2304/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002305static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002306socket_gethostname(PyObject *self, PyObject *args)
Guido van Rossum81194471991-07-27 21:42:02 +00002307{
2308 char buf[1024];
Guido van Rossumff4949e1992-08-05 19:58:53 +00002309 int res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002310 if (!PyArg_ParseTuple(args, ":gethostname"))
Guido van Rossum81194471991-07-27 21:42:02 +00002311 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00002312 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002313 res = gethostname(buf, (int) sizeof buf - 1);
Guido van Rossum73624e91994-10-10 17:59:00 +00002314 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002315 if (res < 0)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002316 return set_error();
Guido van Rossum81194471991-07-27 21:42:02 +00002317 buf[sizeof buf - 1] = '\0';
Guido van Rossum73624e91994-10-10 17:59:00 +00002318 return PyString_FromString(buf);
Guido van Rossum81194471991-07-27 21:42:02 +00002319}
Guido van Rossumff4949e1992-08-05 19:58:53 +00002320
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002321PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002322"gethostname() -> string\n\
2323\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002324Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002325
Guido van Rossumff4949e1992-08-05 19:58:53 +00002326
Guido van Rossum30a685f1991-06-27 15:51:29 +00002327/* Python interface to gethostbyname(name). */
2328
2329/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002330static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002331socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002332{
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002333 char *name;
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00002334#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002335 struct sockaddr_storage addrbuf;
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00002336#else
2337 struct sockaddr_in addrbuf;
2338#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002339
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002340 if (!PyArg_ParseTuple(args, "s:gethostbyname", &name))
Guido van Rossum30a685f1991-06-27 15:51:29 +00002341 return NULL;
Martin v. Löwisddc6f472002-07-28 16:10:31 +00002342 if (setipaddr(name, (struct sockaddr *)&addrbuf, sizeof(addrbuf), AF_INET) < 0)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002343 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002344 return makeipaddr((struct sockaddr *)&addrbuf,
2345 sizeof(struct sockaddr_in));
Guido van Rossum30a685f1991-06-27 15:51:29 +00002346}
2347
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002348PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002349"gethostbyname(host) -> address\n\
2350\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002351Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002352
2353
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002354/* Convenience function common to gethostbyname_ex and gethostbyaddr */
2355
2356static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002357gethost_common(struct hostent *h, struct sockaddr *addr, int alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002358{
2359 char **pch;
2360 PyObject *rtn_tuple = (PyObject *)NULL;
2361 PyObject *name_list = (PyObject *)NULL;
2362 PyObject *addr_list = (PyObject *)NULL;
2363 PyObject *tmp;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002364
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002365 if (h == NULL) {
Guido van Rossum48a680c2001-03-02 06:34:14 +00002366 /* Let's get real error message to return */
Guido van Rossume2ae77b2001-10-24 20:42:55 +00002367#ifndef RISCOS
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002368 set_herror(h_errno);
Guido van Rossume2ae77b2001-10-24 20:42:55 +00002369#else
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002370 PyErr_SetString(socket_error, "host not found");
Guido van Rossume2ae77b2001-10-24 20:42:55 +00002371#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002372 return NULL;
2373 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002374
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002375 if (h->h_addrtype != af) {
2376#ifdef HAVE_STRERROR
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002377 /* Let's get real error message to return */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002378 PyErr_SetString(socket_error,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002379 (char *)strerror(EAFNOSUPPORT));
2380#else
2381 PyErr_SetString(
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002382 socket_error,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002383 "Address family not supported by protocol family");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002384#endif
2385 return NULL;
2386 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002387
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002388 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00002389
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002390 case AF_INET:
2391 if (alen < sizeof(struct sockaddr_in))
2392 return NULL;
2393 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002394
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002395#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002396 case AF_INET6:
2397 if (alen < sizeof(struct sockaddr_in6))
2398 return NULL;
2399 break;
2400#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00002401
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002402 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002403
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002404 if ((name_list = PyList_New(0)) == NULL)
2405 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002406
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002407 if ((addr_list = PyList_New(0)) == NULL)
2408 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002409
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002410 for (pch = h->h_aliases; *pch != NULL; pch++) {
2411 int status;
2412 tmp = PyString_FromString(*pch);
2413 if (tmp == NULL)
2414 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002415
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002416 status = PyList_Append(name_list, tmp);
2417 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002418
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002419 if (status)
2420 goto err;
2421 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002422
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002423 for (pch = h->h_addr_list; *pch != NULL; pch++) {
2424 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002425
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002426 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00002427
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002428 case AF_INET:
2429 {
2430 struct sockaddr_in sin;
2431 memset(&sin, 0, sizeof(sin));
2432 sin.sin_family = af;
2433#ifdef HAVE_SOCKADDR_SA_LEN
2434 sin.sin_len = sizeof(sin);
2435#endif
2436 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
2437 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
Guido van Rossum67f7a382002-06-06 21:08:16 +00002438
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002439 if (pch == h->h_addr_list && alen >= sizeof(sin))
2440 memcpy((char *) addr, &sin, sizeof(sin));
2441 break;
2442 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002443
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002444#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002445 case AF_INET6:
2446 {
2447 struct sockaddr_in6 sin6;
2448 memset(&sin6, 0, sizeof(sin6));
2449 sin6.sin6_family = af;
2450#ifdef HAVE_SOCKADDR_SA_LEN
2451 sin6.sin6_len = sizeof(sin6);
2452#endif
2453 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
2454 tmp = makeipaddr((struct sockaddr *)&sin6,
2455 sizeof(sin6));
Guido van Rossum67f7a382002-06-06 21:08:16 +00002456
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002457 if (pch == h->h_addr_list && alen >= sizeof(sin6))
2458 memcpy((char *) addr, &sin6, sizeof(sin6));
2459 break;
2460 }
2461#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00002462
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002463 default: /* can't happen */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002464 PyErr_SetString(socket_error,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002465 "unsupported address family");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002466 return NULL;
2467 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002468
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002469 if (tmp == NULL)
2470 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002471
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002472 status = PyList_Append(addr_list, tmp);
2473 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002474
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002475 if (status)
2476 goto err;
2477 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002478
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002479 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002480
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002481 err:
2482 Py_XDECREF(name_list);
2483 Py_XDECREF(addr_list);
2484 return rtn_tuple;
2485}
2486
2487
2488/* Python interface to gethostbyname_ex(name). */
2489
2490/*ARGSUSED*/
2491static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002492socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002493{
2494 char *name;
2495 struct hostent *h;
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00002496#ifdef ENABLE_IPV6
2497 struct sockaddr_storage addr;
2498#else
2499 struct sockaddr_in addr;
2500#endif
Martin v. Löwis9db2f572001-07-23 01:30:10 +00002501 struct sockaddr *sa;
Guido van Rossum955becc1999-03-22 20:14:53 +00002502 PyObject *ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002503#ifdef HAVE_GETHOSTBYNAME_R
2504 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002505#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
2506 struct hostent_data data;
2507#else
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002508 char buf[16384];
2509 int buf_len = (sizeof buf) - 1;
2510 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002511#endif
2512#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002513 int result;
2514#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002515#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002516
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002517 if (!PyArg_ParseTuple(args, "s:gethostbyname_ex", &name))
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002518 return NULL;
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00002519 if (setipaddr(name, (struct sockaddr *)&addr, sizeof(addr), AF_INET) < 0)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002520 return NULL;
2521 Py_BEGIN_ALLOW_THREADS
2522#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002523#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002524 result = gethostbyname_r(name, &hp_allocated, buf, buf_len,
2525 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002526#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002527 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002528#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00002529 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002530 result = gethostbyname_r(name, &hp_allocated, &data);
2531 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002532#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002533#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00002534#ifdef USE_GETHOSTBYNAME_LOCK
Just van Rossum1040d2c2003-05-09 07:53:18 +00002535 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002536#endif
2537 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002538#endif /* HAVE_GETHOSTBYNAME_R */
2539 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002540 /* Some C libraries would require addr.__ss_family instead of
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002541 addr.ss_family.
2542 Therefore, we cast the sockaddr_storage into sockaddr to
2543 access sa_family. */
Martin v. Löwis9db2f572001-07-23 01:30:10 +00002544 sa = (struct sockaddr*)&addr;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002545 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr),
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002546 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00002547#ifdef USE_GETHOSTBYNAME_LOCK
Just van Rossum1040d2c2003-05-09 07:53:18 +00002548 PyThread_release_lock(netdb_lock);
Guido van Rossum955becc1999-03-22 20:14:53 +00002549#endif
2550 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002551}
2552
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002553PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002554"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
2555\n\
2556Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002557for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002558
2559
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002560/* Python interface to gethostbyaddr(IP). */
2561
2562/*ARGSUSED*/
2563static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002564socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002565{
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002566#ifdef ENABLE_IPV6
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002567 struct sockaddr_storage addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002568#else
Guido van Rossum48a680c2001-03-02 06:34:14 +00002569 struct sockaddr_in addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002570#endif
2571 struct sockaddr *sa = (struct sockaddr *)&addr;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002572 char *ip_num;
2573 struct hostent *h;
Guido van Rossum3baaa131999-03-22 21:44:51 +00002574 PyObject *ret;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002575#ifdef HAVE_GETHOSTBYNAME_R
2576 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002577#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
2578 struct hostent_data data;
2579#else
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002580 char buf[16384];
2581 int buf_len = (sizeof buf) - 1;
2582 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002583#endif
2584#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002585 int result;
2586#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002587#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002588 char *ap;
2589 int al;
2590 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002591
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002592 if (!PyArg_ParseTuple(args, "s:gethostbyaddr", &ip_num))
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002593 return NULL;
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00002594 af = AF_UNSPEC;
Martin v. Löwisddc6f472002-07-28 16:10:31 +00002595 if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002596 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002597 af = sa->sa_family;
2598 ap = NULL;
2599 al = 0;
2600 switch (af) {
2601 case AF_INET:
2602 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
2603 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
2604 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002605#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002606 case AF_INET6:
2607 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
2608 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
2609 break;
2610#endif
2611 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002612 PyErr_SetString(socket_error, "unsupported address family");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002613 return NULL;
2614 }
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002615 Py_BEGIN_ALLOW_THREADS
2616#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002617#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002618 result = gethostbyaddr_r(ap, al, af,
2619 &hp_allocated, buf, buf_len,
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002620 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002621#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002622 h = gethostbyaddr_r(ap, al, af,
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002623 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002624#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00002625 memset((void *) &data, '\0', sizeof(data));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002626 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002627 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002628#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002629#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00002630#ifdef USE_GETHOSTBYNAME_LOCK
Just van Rossum1040d2c2003-05-09 07:53:18 +00002631 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002632#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002633 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002634#endif /* HAVE_GETHOSTBYNAME_R */
2635 Py_END_ALLOW_THREADS
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002636 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00002637#ifdef USE_GETHOSTBYNAME_LOCK
Just van Rossum1040d2c2003-05-09 07:53:18 +00002638 PyThread_release_lock(netdb_lock);
Guido van Rossum3baaa131999-03-22 21:44:51 +00002639#endif
2640 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002641}
2642
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002643PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002644"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
2645\n\
2646Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002647for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002648
Guido van Rossum30a685f1991-06-27 15:51:29 +00002649
2650/* Python interface to getservbyname(name).
2651 This only returns the port number, since the other info is already
2652 known or not useful (like the list of aliases). */
2653
2654/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002655static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002656socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002657{
Guido van Rossumff4949e1992-08-05 19:58:53 +00002658 char *name, *proto;
Guido van Rossum30a685f1991-06-27 15:51:29 +00002659 struct servent *sp;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002660 if (!PyArg_ParseTuple(args, "ss:getservbyname", &name, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +00002661 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00002662 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002663 sp = getservbyname(name, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00002664 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00002665 if (sp == NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002666 PyErr_SetString(socket_error, "service/proto not found");
Guido van Rossum30a685f1991-06-27 15:51:29 +00002667 return NULL;
2668 }
Guido van Rossum73624e91994-10-10 17:59:00 +00002669 return PyInt_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00002670}
2671
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002672PyDoc_STRVAR(getservbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002673"getservbyname(servicename, protocolname) -> integer\n\
2674\n\
2675Return a port number from a service name and protocol name.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002676The protocol name should be 'tcp' or 'udp'.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002677
Guido van Rossum30a685f1991-06-27 15:51:29 +00002678
Guido van Rossum3901d851996-12-19 16:35:04 +00002679/* Python interface to getprotobyname(name).
2680 This only returns the protocol number, since the other info is
2681 already known or not useful (like the list of aliases). */
2682
2683/*ARGSUSED*/
2684static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002685socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00002686{
2687 char *name;
2688 struct protoent *sp;
Guido van Rossumbcc20741998-08-04 22:53:56 +00002689#ifdef __BEOS__
2690/* Not available in BeOS yet. - [cjh] */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002691 PyErr_SetString(socket_error, "getprotobyname not supported");
Guido van Rossumbcc20741998-08-04 22:53:56 +00002692 return NULL;
2693#else
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002694 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
Guido van Rossum3901d851996-12-19 16:35:04 +00002695 return NULL;
2696 Py_BEGIN_ALLOW_THREADS
2697 sp = getprotobyname(name);
2698 Py_END_ALLOW_THREADS
2699 if (sp == NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002700 PyErr_SetString(socket_error, "protocol not found");
Guido van Rossum3901d851996-12-19 16:35:04 +00002701 return NULL;
2702 }
2703 return PyInt_FromLong((long) sp->p_proto);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002704#endif
Guido van Rossum3901d851996-12-19 16:35:04 +00002705}
2706
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002707PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002708"getprotobyname(name) -> integer\n\
2709\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002710Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002711
Guido van Rossum3901d851996-12-19 16:35:04 +00002712
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002713#ifndef NO_DUP
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002714/* Create a socket object from a numeric file description.
2715 Useful e.g. if stdin is a socket.
2716 Additional arguments as for socket(). */
2717
2718/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002719static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002720socket_fromfd(PyObject *self, PyObject *args)
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002721{
Guido van Rossum73624e91994-10-10 17:59:00 +00002722 PySocketSockObject *s;
Fred Drakea04eaad2000-06-30 02:46:07 +00002723 SOCKET_T fd;
2724 int family, type, proto = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002725 if (!PyArg_ParseTuple(args, "iii|i:fromfd",
2726 &fd, &family, &type, &proto))
Guido van Rossumbe32c891996-06-20 16:25:29 +00002727 return NULL;
Guido van Rossum5f59d601992-12-14 16:59:51 +00002728 /* Dup the fd so it and the socket can be closed independently */
2729 fd = dup(fd);
2730 if (fd < 0)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002731 return set_error();
2732 s = new_sockobject(fd, family, type, proto);
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002733 /* From now on, ignore SIGPIPE and let the error checking
2734 do the work. */
Guido van Rossum48a680c2001-03-02 06:34:14 +00002735#ifdef SIGPIPE
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002736 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum48a680c2001-03-02 06:34:14 +00002737#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00002738 return (PyObject *) s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002739}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002740
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002741PyDoc_STRVAR(fromfd_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002742"fromfd(fd, family, type[, proto]) -> socket object\n\
2743\n\
2744Create a socket object from the given file descriptor.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002745The remaining arguments are the same as for socket().");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002746
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002747#endif /* NO_DUP */
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002748
Guido van Rossum82a5c661998-07-07 20:45:43 +00002749
Guido van Rossum006bf911996-06-12 04:04:55 +00002750static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002751socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002752{
2753 int x1, x2;
2754
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002755 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002756 return NULL;
2757 }
2758 x2 = (int)ntohs((short)x1);
2759 return PyInt_FromLong(x2);
2760}
2761
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002762PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002763"ntohs(integer) -> integer\n\
2764\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002765Convert a 16-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002766
2767
Guido van Rossum006bf911996-06-12 04:04:55 +00002768static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002769socket_ntohl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00002770{
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002771 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00002772
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002773 if (PyInt_Check(arg)) {
2774 x = PyInt_AS_LONG(arg);
Jeremy Hylton825e47b2002-07-25 16:37:51 +00002775 if (x == (unsigned long) -1 && PyErr_Occurred())
2776 return NULL;
Guido van Rossum006bf911996-06-12 04:04:55 +00002777 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002778 else if (PyLong_Check(arg)) {
2779 x = PyLong_AsUnsignedLong(arg);
Jeremy Hylton825e47b2002-07-25 16:37:51 +00002780 if (x == (unsigned long) -1 && PyErr_Occurred())
2781 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002782#if SIZEOF_LONG > 4
2783 {
2784 unsigned long y;
2785 /* only want the trailing 32 bits */
2786 y = x & 0xFFFFFFFFUL;
2787 if (y ^ x)
2788 return PyErr_Format(PyExc_OverflowError,
2789 "long int larger than 32 bits");
2790 x = y;
Tim Peters58141872002-08-06 22:25:02 +00002791 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002792#endif
2793 }
2794 else
Tim Peters58141872002-08-06 22:25:02 +00002795 return PyErr_Format(PyExc_TypeError,
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002796 "expected int/long, %s found",
2797 arg->ob_type->tp_name);
2798 if (x == (unsigned long) -1 && PyErr_Occurred())
2799 return NULL;
2800 return PyInt_FromLong(ntohl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00002801}
2802
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002803PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002804"ntohl(integer) -> integer\n\
2805\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002806Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002807
2808
Guido van Rossum006bf911996-06-12 04:04:55 +00002809static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002810socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002811{
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002812 unsigned long x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00002813
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002814 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002815 return NULL;
2816 }
2817 x2 = (int)htons((short)x1);
2818 return PyInt_FromLong(x2);
2819}
2820
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002821PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002822"htons(integer) -> integer\n\
2823\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002824Convert a 16-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002825
2826
Guido van Rossum006bf911996-06-12 04:04:55 +00002827static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002828socket_htonl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00002829{
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002830 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00002831
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002832 if (PyInt_Check(arg)) {
2833 x = PyInt_AS_LONG(arg);
Jeremy Hylton825e47b2002-07-25 16:37:51 +00002834 if (x == (unsigned long) -1 && PyErr_Occurred())
2835 return NULL;
Guido van Rossum006bf911996-06-12 04:04:55 +00002836 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002837 else if (PyLong_Check(arg)) {
2838 x = PyLong_AsUnsignedLong(arg);
Jeremy Hylton825e47b2002-07-25 16:37:51 +00002839 if (x == (unsigned long) -1 && PyErr_Occurred())
2840 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002841#if SIZEOF_LONG > 4
2842 {
2843 unsigned long y;
2844 /* only want the trailing 32 bits */
2845 y = x & 0xFFFFFFFFUL;
2846 if (y ^ x)
2847 return PyErr_Format(PyExc_OverflowError,
2848 "long int larger than 32 bits");
2849 x = y;
Tim Peters58141872002-08-06 22:25:02 +00002850 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002851#endif
2852 }
2853 else
Tim Peters58141872002-08-06 22:25:02 +00002854 return PyErr_Format(PyExc_TypeError,
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002855 "expected int/long, %s found",
2856 arg->ob_type->tp_name);
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002857 return PyInt_FromLong(htonl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00002858}
2859
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002860PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002861"htonl(integer) -> integer\n\
2862\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002863Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002864
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002865/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002866
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002867PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002868"inet_aton(string) -> packed 32-bit IP representation\n\
2869\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002870Convert 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 +00002871binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002872
2873static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002874socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002875{
Guido van Rossuma2e48551999-09-09 15:42:59 +00002876#ifndef INADDR_NONE
2877#define INADDR_NONE (-1)
2878#endif
Neal Norwitz88f115b2003-02-13 02:15:42 +00002879#ifdef HAVE_INET_ATON
Guido van Rossumad05cdf2003-02-12 23:08:22 +00002880 struct in_addr buf;
Tim Peters1df9fdd2003-02-13 03:13:40 +00002881#else
2882 /* Have to use inet_addr() instead */
2883 unsigned long packed_addr;
2884#endif
2885 char *ip_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002886
Tim Peters1df9fdd2003-02-13 03:13:40 +00002887 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002888 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00002889
Tim Peters1df9fdd2003-02-13 03:13:40 +00002890
2891#ifdef HAVE_INET_ATON
Guido van Rossumad05cdf2003-02-12 23:08:22 +00002892 if (inet_aton(ip_addr, &buf))
2893 return PyString_FromStringAndSize((char *)(&buf),
2894 sizeof(buf));
2895
2896 PyErr_SetString(socket_error,
2897 "illegal IP address string passed to inet_aton");
2898 return NULL;
2899
Tim Peters1df9fdd2003-02-13 03:13:40 +00002900#else /* ! HAVE_INET_ATON */
Guido van Rossumad05cdf2003-02-12 23:08:22 +00002901 /* XXX Problem here: inet_aton('255.255.255.255') raises
2902 an exception while it should be a valid address. */
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002903 packed_addr = inet_addr(ip_addr);
2904
2905 if (packed_addr == INADDR_NONE) { /* invalid address */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002906 PyErr_SetString(socket_error,
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002907 "illegal IP address string passed to inet_aton");
2908 return NULL;
2909 }
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002910 return PyString_FromStringAndSize((char *) &packed_addr,
2911 sizeof(packed_addr));
Guido van Rossumad05cdf2003-02-12 23:08:22 +00002912#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002913}
2914
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002915PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00002916"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002917\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002918Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002919
2920static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002921socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002922{
2923 char *packed_str;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002924 int addr_len;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002925 struct in_addr packed_addr;
2926
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002927 if (!PyArg_ParseTuple(args, "s#:inet_ntoa", &packed_str, &addr_len)) {
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002928 return NULL;
2929 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00002930
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002931 if (addr_len != sizeof(packed_addr)) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002932 PyErr_SetString(socket_error,
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002933 "packed IP wrong length for inet_ntoa");
2934 return NULL;
2935 }
2936
2937 memcpy(&packed_addr, packed_str, addr_len);
2938
2939 return PyString_FromString(inet_ntoa(packed_addr));
2940}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002941
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00002942#ifdef HAVE_INET_PTON
2943
2944PyDoc_STRVAR(inet_pton_doc,
2945"inet_pton(af, ip) -> packed IP address string\n\
2946\n\
2947Convert an IP address from string format to a packed string suitable\n\
2948for use with low-level network functions.");
2949
2950static PyObject *
2951socket_inet_pton(PyObject *self, PyObject *args)
2952{
2953 int af;
2954 char* ip;
2955 int retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00002956#ifdef ENABLE_IPV6
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00002957 char packed[MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00002958#else
2959 char packed[sizeof(struct in_addr)];
2960#endif
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00002961 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
2962 return NULL;
2963 }
2964
2965 retval = inet_pton(af, ip, packed);
2966 if (retval < 0) {
2967 PyErr_SetFromErrno(socket_error);
2968 return NULL;
2969 } else if (retval == 0) {
2970 PyErr_SetString(socket_error,
2971 "illegal IP address string passed to inet_pton");
2972 return NULL;
2973 } else if (af == AF_INET) {
2974 return PyString_FromStringAndSize(packed,
2975 sizeof(struct in_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00002976#ifdef ENABLE_IPV6
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00002977 } else if (af == AF_INET6) {
2978 return PyString_FromStringAndSize(packed,
2979 sizeof(struct in6_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00002980#endif
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00002981 } else {
2982 PyErr_SetString(socket_error, "unknown address family");
2983 return NULL;
2984 }
2985}
2986
2987PyDoc_STRVAR(inet_ntop_doc,
2988"inet_ntop(af, packed_ip) -> string formatted IP address\n\
2989\n\
2990Convert a packed IP address of the given family to string format.");
2991
2992static PyObject *
2993socket_inet_ntop(PyObject *self, PyObject *args)
2994{
2995 int af;
2996 char* packed;
2997 int len;
2998 const char* retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00002999#ifdef ENABLE_IPV6
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003000 char ip[MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003001#else
3002 char ip[INET_ADDRSTRLEN + 1];
3003#endif
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003004
3005 /* Guarantee NUL-termination for PyString_FromString() below */
3006 memset((void *) &ip[0], '\0', sizeof(ip) + 1);
3007
3008 if (!PyArg_ParseTuple(args, "is#:inet_ntop", &af, &packed, &len)) {
3009 return NULL;
3010 }
3011
3012 if (af == AF_INET) {
3013 if (len != sizeof(struct in_addr)) {
3014 PyErr_SetString(PyExc_ValueError,
3015 "invalid length of packed IP address string");
3016 return NULL;
3017 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003018#ifdef ENABLE_IPV6
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003019 } else if (af == AF_INET6) {
3020 if (len != sizeof(struct in6_addr)) {
3021 PyErr_SetString(PyExc_ValueError,
3022 "invalid length of packed IP address string");
3023 return NULL;
3024 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003025#endif
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003026 } else {
3027 PyErr_Format(PyExc_ValueError,
3028 "unknown address family %d", af);
3029 return NULL;
3030 }
3031
3032 retval = inet_ntop(af, packed, ip, sizeof(ip));
3033 if (!retval) {
3034 PyErr_SetFromErrno(socket_error);
3035 return NULL;
3036 } else {
3037 return PyString_FromString(retval);
3038 }
3039
3040 /* NOTREACHED */
3041 PyErr_SetString(PyExc_RuntimeError, "invalid handling of inet_ntop");
3042 return NULL;
3043}
3044
3045#endif /* HAVE_INET_PTON */
3046
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003047/* Python interface to getaddrinfo(host, port). */
3048
3049/*ARGSUSED*/
3050static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003051socket_getaddrinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003052{
Martin v. Löwisf0b11d22001-11-07 08:31:03 +00003053 struct addrinfo hints, *res;
3054 struct addrinfo *res0 = NULL;
Martin v. Löwis2548c732003-04-18 10:39:54 +00003055 PyObject *hobj = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003056 PyObject *pobj = (PyObject *)NULL;
Martin v. Löwisf65b1a12001-08-12 09:28:40 +00003057 char pbuf[30];
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003058 char *hptr, *pptr;
3059 int family, socktype, protocol, flags;
3060 int error;
3061 PyObject *all = (PyObject *)NULL;
3062 PyObject *single = (PyObject *)NULL;
Martin v. Löwis2548c732003-04-18 10:39:54 +00003063 PyObject *idna = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003064
3065 family = socktype = protocol = flags = 0;
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00003066 family = AF_UNSPEC;
Martin v. Löwis2548c732003-04-18 10:39:54 +00003067 if (!PyArg_ParseTuple(args, "OO|iiii:getaddrinfo",
3068 &hobj, &pobj, &family, &socktype,
3069 &protocol, &flags)) {
3070 return NULL;
3071 }
3072 if (hobj == Py_None) {
3073 hptr = NULL;
3074 } else if (PyUnicode_Check(hobj)) {
3075 idna = PyObject_CallMethod(hobj, "encode", "s", "idna");
3076 if (!idna)
3077 return NULL;
3078 hptr = PyString_AsString(idna);
3079 } else if (PyString_Check(hobj)) {
3080 hptr = PyString_AsString(hobj);
3081 } else {
3082 PyErr_SetString(PyExc_TypeError,
3083 "getaddrinfo() argument 1 must be string or None");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003084 return NULL;
3085 }
3086 if (PyInt_Check(pobj)) {
Marc-André Lemburg03d1b182001-07-31 18:05:33 +00003087 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", PyInt_AsLong(pobj));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003088 pptr = pbuf;
3089 } else if (PyString_Check(pobj)) {
3090 pptr = PyString_AsString(pobj);
3091 } else if (pobj == Py_None) {
3092 pptr = (char *)NULL;
3093 } else {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003094 PyErr_SetString(socket_error, "Int or String expected");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003095 return NULL;
3096 }
3097 memset(&hints, 0, sizeof(hints));
3098 hints.ai_family = family;
3099 hints.ai_socktype = socktype;
3100 hints.ai_protocol = protocol;
3101 hints.ai_flags = flags;
Just van Rossum1040d2c2003-05-09 07:53:18 +00003102 Py_BEGIN_ALLOW_THREADS
3103 ACQUIRE_GETADDRINFO_LOCK
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003104 error = getaddrinfo(hptr, pptr, &hints, &res0);
Just van Rossum1040d2c2003-05-09 07:53:18 +00003105 Py_END_ALLOW_THREADS
3106 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003107 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003108 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003109 return NULL;
3110 }
3111
3112 if ((all = PyList_New(0)) == NULL)
3113 goto err;
3114 for (res = res0; res; res = res->ai_next) {
Guido van Rossum716aac02001-10-12 18:59:27 +00003115 PyObject *addr =
3116 makesockaddr(-1, res->ai_addr, res->ai_addrlen);
3117 if (addr == NULL)
3118 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003119 single = Py_BuildValue("iiisO", res->ai_family,
3120 res->ai_socktype, res->ai_protocol,
3121 res->ai_canonname ? res->ai_canonname : "",
Guido van Rossum716aac02001-10-12 18:59:27 +00003122 addr);
3123 Py_DECREF(addr);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003124 if (single == NULL)
3125 goto err;
3126
3127 if (PyList_Append(all, single))
3128 goto err;
3129 Py_XDECREF(single);
3130 }
Martin v. Löwis2548c732003-04-18 10:39:54 +00003131 Py_XDECREF(idna);
Neal Norwitz90128ba2002-08-09 03:37:42 +00003132 if (res0)
3133 freeaddrinfo(res0);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003134 return all;
3135 err:
3136 Py_XDECREF(single);
3137 Py_XDECREF(all);
Martin v. Löwis2548c732003-04-18 10:39:54 +00003138 Py_XDECREF(idna);
Martin v. Löwisf0b11d22001-11-07 08:31:03 +00003139 if (res0)
3140 freeaddrinfo(res0);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003141 return (PyObject *)NULL;
3142}
3143
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003144PyDoc_STRVAR(getaddrinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003145"getaddrinfo(host, port [, family, socktype, proto, flags])\n\
3146 -> list of (family, socktype, proto, canonname, sockaddr)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003147\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003148Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003149
3150/* Python interface to getnameinfo(sa, flags). */
3151
3152/*ARGSUSED*/
3153static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003154socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003155{
3156 PyObject *sa = (PyObject *)NULL;
3157 int flags;
3158 char *hostp;
Martin v. Löwis06b1d212001-11-02 23:34:52 +00003159 int port, flowinfo, scope_id;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003160 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
3161 struct addrinfo hints, *res = NULL;
3162 int error;
3163 PyObject *ret = (PyObject *)NULL;
3164
3165 flags = flowinfo = scope_id = 0;
Martin v. Löwis06b1d212001-11-02 23:34:52 +00003166 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003167 return NULL;
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003168 if (!PyArg_ParseTuple(sa, "si|ii",
3169 &hostp, &port, &flowinfo, &scope_id))
Martin v. Löwis06b1d212001-11-02 23:34:52 +00003170 return NULL;
Marc-André Lemburg03d1b182001-07-31 18:05:33 +00003171 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003172 memset(&hints, 0, sizeof(hints));
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00003173 hints.ai_family = AF_UNSPEC;
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003174 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Just van Rossum1040d2c2003-05-09 07:53:18 +00003175 Py_BEGIN_ALLOW_THREADS
3176 ACQUIRE_GETADDRINFO_LOCK
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003177 error = getaddrinfo(hostp, pbuf, &hints, &res);
Just van Rossum1040d2c2003-05-09 07:53:18 +00003178 Py_END_ALLOW_THREADS
3179 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003180 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003181 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003182 goto fail;
3183 }
3184 if (res->ai_next) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003185 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003186 "sockaddr resolved to multiple addresses");
3187 goto fail;
3188 }
3189 switch (res->ai_family) {
3190 case AF_INET:
3191 {
3192 char *t1;
3193 int t2;
3194 if (PyArg_ParseTuple(sa, "si", &t1, &t2) == 0) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003195 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003196 "IPv4 sockaddr must be 2 tuple");
3197 goto fail;
3198 }
3199 break;
3200 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00003201#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003202 case AF_INET6:
3203 {
3204 struct sockaddr_in6 *sin6;
3205 sin6 = (struct sockaddr_in6 *)res->ai_addr;
3206 sin6->sin6_flowinfo = flowinfo;
3207 sin6->sin6_scope_id = scope_id;
3208 break;
3209 }
3210#endif
3211 }
3212 error = getnameinfo(res->ai_addr, res->ai_addrlen,
3213 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
3214 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003215 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003216 goto fail;
3217 }
3218 ret = Py_BuildValue("ss", hbuf, pbuf);
3219
3220fail:
3221 if (res)
3222 freeaddrinfo(res);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003223 return ret;
3224}
3225
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003226PyDoc_STRVAR(getnameinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003227"getnameinfo(sockaddr, flags) --> (host, port)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003228\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003229Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003230
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00003231
3232/* Python API to getting and setting the default timeout value. */
3233
3234static PyObject *
3235socket_getdefaulttimeout(PyObject *self)
3236{
3237 if (defaulttimeout < 0.0) {
3238 Py_INCREF(Py_None);
3239 return Py_None;
3240 }
3241 else
3242 return PyFloat_FromDouble(defaulttimeout);
3243}
3244
3245PyDoc_STRVAR(getdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003246"getdefaulttimeout() -> timeout\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00003247\n\
3248Returns the default timeout in floating seconds for new socket objects.\n\
3249A value of None indicates that new socket objects have no timeout.\n\
3250When the socket module is first imported, the default is None.");
3251
3252static PyObject *
3253socket_setdefaulttimeout(PyObject *self, PyObject *arg)
3254{
3255 double timeout;
3256
3257 if (arg == Py_None)
3258 timeout = -1.0;
3259 else {
3260 timeout = PyFloat_AsDouble(arg);
3261 if (timeout < 0.0) {
3262 if (!PyErr_Occurred())
3263 PyErr_SetString(PyExc_ValueError,
3264 "Timeout value out of range");
3265 return NULL;
3266 }
3267 }
3268
3269 defaulttimeout = timeout;
3270
3271 Py_INCREF(Py_None);
3272 return Py_None;
3273}
3274
3275PyDoc_STRVAR(setdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003276"setdefaulttimeout(timeout)\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00003277\n\
3278Set the default timeout in floating seconds for new socket objects.\n\
3279A value of None indicates that new socket objects have no timeout.\n\
3280When the socket module is first imported, the default is None.");
3281
3282
Guido van Rossum30a685f1991-06-27 15:51:29 +00003283/* List of functions exported by this module. */
3284
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003285static PyMethodDef socket_methods[] = {
3286 {"gethostbyname", socket_gethostbyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003287 METH_VARARGS, gethostbyname_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003288 {"gethostbyname_ex", socket_gethostbyname_ex,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003289 METH_VARARGS, ghbn_ex_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003290 {"gethostbyaddr", socket_gethostbyaddr,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003291 METH_VARARGS, gethostbyaddr_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003292 {"gethostname", socket_gethostname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003293 METH_VARARGS, gethostname_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003294 {"getservbyname", socket_getservbyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003295 METH_VARARGS, getservbyname_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003296 {"getprotobyname", socket_getprotobyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003297 METH_VARARGS,getprotobyname_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00003298#ifndef NO_DUP
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003299 {"fromfd", socket_fromfd,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003300 METH_VARARGS, fromfd_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00003301#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003302 {"ntohs", socket_ntohs,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003303 METH_VARARGS, ntohs_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003304 {"ntohl", socket_ntohl,
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003305 METH_O, ntohl_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003306 {"htons", socket_htons,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003307 METH_VARARGS, htons_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003308 {"htonl", socket_htonl,
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003309 METH_O, htonl_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003310 {"inet_aton", socket_inet_aton,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003311 METH_VARARGS, inet_aton_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003312 {"inet_ntoa", socket_inet_ntoa,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003313 METH_VARARGS, inet_ntoa_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003314#ifdef HAVE_INET_PTON
3315 {"inet_pton", socket_inet_pton,
3316 METH_VARARGS, inet_pton_doc},
3317 {"inet_ntop", socket_inet_ntop,
3318 METH_VARARGS, inet_ntop_doc},
3319#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003320 {"getaddrinfo", socket_getaddrinfo,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003321 METH_VARARGS, getaddrinfo_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003322 {"getnameinfo", socket_getnameinfo,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003323 METH_VARARGS, getnameinfo_doc},
Guido van Rossum1693ba82002-07-18 21:11:26 +00003324 {"getdefaulttimeout", (PyCFunction)socket_getdefaulttimeout,
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00003325 METH_NOARGS, getdefaulttimeout_doc},
3326 {"setdefaulttimeout", socket_setdefaulttimeout,
3327 METH_O, setdefaulttimeout_doc},
Guido van Rossum30a685f1991-06-27 15:51:29 +00003328 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003329};
3330
Guido van Rossum30a685f1991-06-27 15:51:29 +00003331
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003332#ifdef RISCOS
3333#define OS_INIT_DEFINED
Guido van Rossumbe32c891996-06-20 16:25:29 +00003334
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003335static int
3336os_init(void)
3337{
3338 _kernel_swi_regs r;
3339
3340 r.r[0] = 0;
3341 _kernel_swi(0x43380, &r, &r);
3342 taskwindow = r.r[0];
3343
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003344 return 1;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003345}
3346
3347#endif /* RISCOS */
3348
3349
3350#ifdef MS_WINDOWS
3351#define OS_INIT_DEFINED
3352
3353/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00003354
3355static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003356os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00003357{
3358 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00003359}
3360
3361static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003362os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00003363{
3364 WSADATA WSAData;
3365 int ret;
3366 char buf[100];
3367 ret = WSAStartup(0x0101, &WSAData);
3368 switch (ret) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003369 case 0: /* No error */
Mark Hammond14350ab2003-07-09 04:57:46 +00003370 Py_AtExit(os_cleanup);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003371 return 1; /* Success */
Guido van Rossumbe32c891996-06-20 16:25:29 +00003372 case WSASYSNOTREADY:
3373 PyErr_SetString(PyExc_ImportError,
3374 "WSAStartup failed: network not ready");
3375 break;
3376 case WSAVERNOTSUPPORTED:
3377 case WSAEINVAL:
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003378 PyErr_SetString(
3379 PyExc_ImportError,
3380 "WSAStartup failed: requested version not supported");
Guido van Rossumbe32c891996-06-20 16:25:29 +00003381 break;
3382 default:
Tim Peters885d4572001-11-28 20:27:42 +00003383 PyOS_snprintf(buf, sizeof(buf),
3384 "WSAStartup failed: error code %d", ret);
Guido van Rossumbe32c891996-06-20 16:25:29 +00003385 PyErr_SetString(PyExc_ImportError, buf);
3386 break;
3387 }
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003388 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00003389}
3390
Guido van Rossum8d665e61996-06-26 18:22:49 +00003391#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00003392
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003393
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003394#ifdef PYOS_OS2
3395#define OS_INIT_DEFINED
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003396
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003397/* Additional initialization for OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003398
3399static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003400os_init(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003401{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003402#ifndef PYCC_GCC
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003403 char reason[64];
3404 int rc = sock_init();
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003405
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003406 if (rc == 0) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003407 return 1; /* Success */
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003408 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003409
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003410 PyOS_snprintf(reason, sizeof(reason),
3411 "OS/2 TCP/IP Error# %d", sock_errno());
3412 PyErr_SetString(PyExc_ImportError, reason);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003413
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003414 return 0; /* Failure */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00003415#else
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003416 /* No need to initialise sockets with GCC/EMX */
3417 return 1; /* Success */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00003418#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003419}
3420
3421#endif /* PYOS_OS2 */
3422
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003423
3424#ifndef OS_INIT_DEFINED
3425static int
3426os_init(void)
3427{
3428 return 1; /* Success */
3429}
3430#endif
3431
3432
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00003433/* C API table - always add new things to the end for binary
3434 compatibility. */
3435static
3436PySocketModule_APIObject PySocketModuleAPI =
3437{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003438 &sock_type,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00003439};
3440
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003441
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003442/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003443
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003444 This module is actually called "_socket", and there's a wrapper
3445 "socket.py" which implements some additional functionality. On some
3446 platforms (e.g. Windows and OS/2), socket.py also implements a
3447 wrapper for the socket type that provides missing functionality such
3448 as makefile(), dup() and fromfd(). The import of "_socket" may fail
3449 with an ImportError exception if os-specific initialization fails.
3450 On Windows, this does WINSOCK initialization. When WINSOCK is
3451 initialized succesfully, a call to WSACleanup() is scheduled to be
3452 made at exit time.
3453*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003454
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003455PyDoc_STRVAR(socket_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003456"Implementation module for socket operations.\n\
3457\n\
3458See the socket module for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003459
Mark Hammondfe51c6d2002-08-02 02:27:13 +00003460PyMODINIT_FUNC
Thomas Wouters1e0c2f42000-07-24 16:06:23 +00003461init_socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003462{
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003463 PyObject *m, *has_ipv6;
Fred Drake4baedc12002-04-01 14:53:37 +00003464
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003465 if (!os_init())
Guido van Rossum0cb96de1997-10-01 04:29:29 +00003466 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003467
3468 sock_type.ob_type = &PyType_Type;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003469 m = Py_InitModule3(PySocket_MODULE_NAME,
3470 socket_methods,
3471 socket_doc);
3472
3473 socket_error = PyErr_NewException("socket.error", NULL, NULL);
3474 if (socket_error == NULL)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003475 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003476 Py_INCREF(socket_error);
3477 PyModule_AddObject(m, "error", socket_error);
3478 socket_herror = PyErr_NewException("socket.herror",
3479 socket_error, NULL);
3480 if (socket_herror == NULL)
3481 return;
3482 Py_INCREF(socket_herror);
3483 PyModule_AddObject(m, "herror", socket_herror);
3484 socket_gaierror = PyErr_NewException("socket.gaierror", socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003485 NULL);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003486 if (socket_gaierror == NULL)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003487 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003488 Py_INCREF(socket_gaierror);
3489 PyModule_AddObject(m, "gaierror", socket_gaierror);
Raymond Hettingeref7343c2003-06-29 03:08:05 +00003490 socket_timeout = PyErr_NewException("socket.timeout",
3491 socket_error, NULL);
3492 if (socket_timeout == NULL)
3493 return;
3494 Py_INCREF(socket_timeout);
3495 PyModule_AddObject(m, "timeout", socket_timeout);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003496 Py_INCREF((PyObject *)&sock_type);
Fred Drake4baedc12002-04-01 14:53:37 +00003497 if (PyModule_AddObject(m, "SocketType",
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003498 (PyObject *)&sock_type) != 0)
Guido van Rossum0cb96de1997-10-01 04:29:29 +00003499 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003500 Py_INCREF((PyObject *)&sock_type);
Fred Drake4baedc12002-04-01 14:53:37 +00003501 if (PyModule_AddObject(m, "socket",
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003502 (PyObject *)&sock_type) != 0)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003503 return;
Guido van Rossum09be4091999-08-09 14:40:40 +00003504
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003505#ifdef ENABLE_IPV6
3506 has_ipv6 = Py_True;
3507#else
3508 has_ipv6 = Py_False;
3509#endif
3510 Py_INCREF(has_ipv6);
3511 PyModule_AddObject(m, "has_ipv6", has_ipv6);
3512
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00003513 /* Export C API */
Fred Drake4baedc12002-04-01 14:53:37 +00003514 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00003515 PyCObject_FromVoidPtr((void *)&PySocketModuleAPI, NULL)
3516 ) != 0)
3517 return;
3518
Guido van Rossum09be4091999-08-09 14:40:40 +00003519 /* Address families (we only support AF_INET and AF_UNIX) */
3520#ifdef AF_UNSPEC
Fred Drake4baedc12002-04-01 14:53:37 +00003521 PyModule_AddIntConstant(m, "AF_UNSPEC", AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00003522#endif
Fred Drake4baedc12002-04-01 14:53:37 +00003523 PyModule_AddIntConstant(m, "AF_INET", AF_INET);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003524#ifdef AF_INET6
Fred Drake4baedc12002-04-01 14:53:37 +00003525 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003526#endif /* AF_INET6 */
Andrew MacIntyre34d3e2d2003-01-02 12:45:34 +00003527#if defined(AF_UNIX) && !defined(PYOS_OS2)
Fred Drake4baedc12002-04-01 14:53:37 +00003528 PyModule_AddIntConstant(m, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00003529#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00003530#ifdef AF_AX25
Fred Drake4baedc12002-04-01 14:53:37 +00003531 /* Amateur Radio AX.25 */
3532 PyModule_AddIntConstant(m, "AF_AX25", AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00003533#endif
3534#ifdef AF_IPX
Fred Drake4baedc12002-04-01 14:53:37 +00003535 PyModule_AddIntConstant(m, "AF_IPX", AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00003536#endif
3537#ifdef AF_APPLETALK
Fred Drake4baedc12002-04-01 14:53:37 +00003538 /* Appletalk DDP */
3539 PyModule_AddIntConstant(m, "AF_APPLETALK", AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00003540#endif
3541#ifdef AF_NETROM
Fred Drake4baedc12002-04-01 14:53:37 +00003542 /* Amateur radio NetROM */
3543 PyModule_AddIntConstant(m, "AF_NETROM", AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00003544#endif
3545#ifdef AF_BRIDGE
Fred Drake4baedc12002-04-01 14:53:37 +00003546 /* Multiprotocol bridge */
3547 PyModule_AddIntConstant(m, "AF_BRIDGE", AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00003548#endif
3549#ifdef AF_AAL5
Fred Drake4baedc12002-04-01 14:53:37 +00003550 /* Reserved for Werner's ATM */
3551 PyModule_AddIntConstant(m, "AF_AAL5", AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00003552#endif
3553#ifdef AF_X25
Fred Drake4baedc12002-04-01 14:53:37 +00003554 /* Reserved for X.25 project */
3555 PyModule_AddIntConstant(m, "AF_X25", AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00003556#endif
3557#ifdef AF_INET6
Fred Drake4baedc12002-04-01 14:53:37 +00003558 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00003559#endif
3560#ifdef AF_ROSE
Fred Drake4baedc12002-04-01 14:53:37 +00003561 /* Amateur Radio X.25 PLP */
3562 PyModule_AddIntConstant(m, "AF_ROSE", AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00003563#endif
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00003564#ifdef HAVE_NETPACKET_PACKET_H
Fred Drake4baedc12002-04-01 14:53:37 +00003565 PyModule_AddIntConstant(m, "AF_PACKET", AF_PACKET);
3566 PyModule_AddIntConstant(m, "PF_PACKET", PF_PACKET);
3567 PyModule_AddIntConstant(m, "PACKET_HOST", PACKET_HOST);
3568 PyModule_AddIntConstant(m, "PACKET_BROADCAST", PACKET_BROADCAST);
3569 PyModule_AddIntConstant(m, "PACKET_MULTICAST", PACKET_MULTICAST);
3570 PyModule_AddIntConstant(m, "PACKET_OTHERHOST", PACKET_OTHERHOST);
3571 PyModule_AddIntConstant(m, "PACKET_OUTGOING", PACKET_OUTGOING);
3572 PyModule_AddIntConstant(m, "PACKET_LOOPBACK", PACKET_LOOPBACK);
3573 PyModule_AddIntConstant(m, "PACKET_FASTROUTE", PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00003574#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00003575
3576 /* Socket types */
Fred Drake4baedc12002-04-01 14:53:37 +00003577 PyModule_AddIntConstant(m, "SOCK_STREAM", SOCK_STREAM);
3578 PyModule_AddIntConstant(m, "SOCK_DGRAM", SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00003579#ifndef __BEOS__
3580/* We have incomplete socket support. */
Fred Drake4baedc12002-04-01 14:53:37 +00003581 PyModule_AddIntConstant(m, "SOCK_RAW", SOCK_RAW);
3582 PyModule_AddIntConstant(m, "SOCK_SEQPACKET", SOCK_SEQPACKET);
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00003583#if defined(SOCK_RDM)
Fred Drake4baedc12002-04-01 14:53:37 +00003584 PyModule_AddIntConstant(m, "SOCK_RDM", SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00003585#endif
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00003586#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003587
3588#ifdef SO_DEBUG
Fred Drake4baedc12002-04-01 14:53:37 +00003589 PyModule_AddIntConstant(m, "SO_DEBUG", SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003590#endif
3591#ifdef SO_ACCEPTCONN
Fred Drake4baedc12002-04-01 14:53:37 +00003592 PyModule_AddIntConstant(m, "SO_ACCEPTCONN", SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003593#endif
3594#ifdef SO_REUSEADDR
Fred Drake4baedc12002-04-01 14:53:37 +00003595 PyModule_AddIntConstant(m, "SO_REUSEADDR", SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003596#endif
3597#ifdef SO_KEEPALIVE
Fred Drake4baedc12002-04-01 14:53:37 +00003598 PyModule_AddIntConstant(m, "SO_KEEPALIVE", SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003599#endif
3600#ifdef SO_DONTROUTE
Fred Drake4baedc12002-04-01 14:53:37 +00003601 PyModule_AddIntConstant(m, "SO_DONTROUTE", SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003602#endif
3603#ifdef SO_BROADCAST
Fred Drake4baedc12002-04-01 14:53:37 +00003604 PyModule_AddIntConstant(m, "SO_BROADCAST", SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003605#endif
3606#ifdef SO_USELOOPBACK
Fred Drake4baedc12002-04-01 14:53:37 +00003607 PyModule_AddIntConstant(m, "SO_USELOOPBACK", SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003608#endif
3609#ifdef SO_LINGER
Fred Drake4baedc12002-04-01 14:53:37 +00003610 PyModule_AddIntConstant(m, "SO_LINGER", SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003611#endif
3612#ifdef SO_OOBINLINE
Fred Drake4baedc12002-04-01 14:53:37 +00003613 PyModule_AddIntConstant(m, "SO_OOBINLINE", SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003614#endif
3615#ifdef SO_REUSEPORT
Fred Drake4baedc12002-04-01 14:53:37 +00003616 PyModule_AddIntConstant(m, "SO_REUSEPORT", SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003617#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003618#ifdef SO_SNDBUF
Fred Drake4baedc12002-04-01 14:53:37 +00003619 PyModule_AddIntConstant(m, "SO_SNDBUF", SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003620#endif
3621#ifdef SO_RCVBUF
Fred Drake4baedc12002-04-01 14:53:37 +00003622 PyModule_AddIntConstant(m, "SO_RCVBUF", SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003623#endif
3624#ifdef SO_SNDLOWAT
Fred Drake4baedc12002-04-01 14:53:37 +00003625 PyModule_AddIntConstant(m, "SO_SNDLOWAT", SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003626#endif
3627#ifdef SO_RCVLOWAT
Fred Drake4baedc12002-04-01 14:53:37 +00003628 PyModule_AddIntConstant(m, "SO_RCVLOWAT", SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003629#endif
3630#ifdef SO_SNDTIMEO
Fred Drake4baedc12002-04-01 14:53:37 +00003631 PyModule_AddIntConstant(m, "SO_SNDTIMEO", SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003632#endif
3633#ifdef SO_RCVTIMEO
Fred Drake4baedc12002-04-01 14:53:37 +00003634 PyModule_AddIntConstant(m, "SO_RCVTIMEO", SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003635#endif
3636#ifdef SO_ERROR
Fred Drake4baedc12002-04-01 14:53:37 +00003637 PyModule_AddIntConstant(m, "SO_ERROR", SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003638#endif
3639#ifdef SO_TYPE
Fred Drake4baedc12002-04-01 14:53:37 +00003640 PyModule_AddIntConstant(m, "SO_TYPE", SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003641#endif
3642
3643 /* Maximum number of connections for "listen" */
3644#ifdef SOMAXCONN
Fred Drake4baedc12002-04-01 14:53:37 +00003645 PyModule_AddIntConstant(m, "SOMAXCONN", SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003646#else
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003647 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003648#endif
3649
3650 /* Flags for send, recv */
3651#ifdef MSG_OOB
Fred Drake4baedc12002-04-01 14:53:37 +00003652 PyModule_AddIntConstant(m, "MSG_OOB", MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003653#endif
3654#ifdef MSG_PEEK
Fred Drake4baedc12002-04-01 14:53:37 +00003655 PyModule_AddIntConstant(m, "MSG_PEEK", MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003656#endif
3657#ifdef MSG_DONTROUTE
Fred Drake4baedc12002-04-01 14:53:37 +00003658 PyModule_AddIntConstant(m, "MSG_DONTROUTE", MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003659#endif
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00003660#ifdef MSG_DONTWAIT
Fred Drake4baedc12002-04-01 14:53:37 +00003661 PyModule_AddIntConstant(m, "MSG_DONTWAIT", MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00003662#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003663#ifdef MSG_EOR
Fred Drake4baedc12002-04-01 14:53:37 +00003664 PyModule_AddIntConstant(m, "MSG_EOR", MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003665#endif
3666#ifdef MSG_TRUNC
Fred Drake4baedc12002-04-01 14:53:37 +00003667 PyModule_AddIntConstant(m, "MSG_TRUNC", MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003668#endif
3669#ifdef MSG_CTRUNC
Fred Drake4baedc12002-04-01 14:53:37 +00003670 PyModule_AddIntConstant(m, "MSG_CTRUNC", MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003671#endif
3672#ifdef MSG_WAITALL
Fred Drake4baedc12002-04-01 14:53:37 +00003673 PyModule_AddIntConstant(m, "MSG_WAITALL", MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003674#endif
3675#ifdef MSG_BTAG
Fred Drake4baedc12002-04-01 14:53:37 +00003676 PyModule_AddIntConstant(m, "MSG_BTAG", MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003677#endif
3678#ifdef MSG_ETAG
Fred Drake4baedc12002-04-01 14:53:37 +00003679 PyModule_AddIntConstant(m, "MSG_ETAG", MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003680#endif
3681
3682 /* Protocol level and numbers, usable for [gs]etsockopt */
3683#ifdef SOL_SOCKET
Fred Drake4baedc12002-04-01 14:53:37 +00003684 PyModule_AddIntConstant(m, "SOL_SOCKET", SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003685#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00003686#ifdef SOL_IP
Fred Drake4baedc12002-04-01 14:53:37 +00003687 PyModule_AddIntConstant(m, "SOL_IP", SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00003688#else
Fred Drake4baedc12002-04-01 14:53:37 +00003689 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00003690#endif
3691#ifdef SOL_IPX
Fred Drake4baedc12002-04-01 14:53:37 +00003692 PyModule_AddIntConstant(m, "SOL_IPX", SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00003693#endif
3694#ifdef SOL_AX25
Fred Drake4baedc12002-04-01 14:53:37 +00003695 PyModule_AddIntConstant(m, "SOL_AX25", SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00003696#endif
3697#ifdef SOL_ATALK
Fred Drake4baedc12002-04-01 14:53:37 +00003698 PyModule_AddIntConstant(m, "SOL_ATALK", SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00003699#endif
3700#ifdef SOL_NETROM
Fred Drake4baedc12002-04-01 14:53:37 +00003701 PyModule_AddIntConstant(m, "SOL_NETROM", SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00003702#endif
3703#ifdef SOL_ROSE
Fred Drake4baedc12002-04-01 14:53:37 +00003704 PyModule_AddIntConstant(m, "SOL_ROSE", SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00003705#endif
3706#ifdef SOL_TCP
Fred Drake4baedc12002-04-01 14:53:37 +00003707 PyModule_AddIntConstant(m, "SOL_TCP", SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00003708#else
Fred Drake4baedc12002-04-01 14:53:37 +00003709 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00003710#endif
3711#ifdef SOL_UDP
Fred Drake4baedc12002-04-01 14:53:37 +00003712 PyModule_AddIntConstant(m, "SOL_UDP", SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00003713#else
Fred Drake4baedc12002-04-01 14:53:37 +00003714 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00003715#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003716#ifdef IPPROTO_IP
Fred Drake4baedc12002-04-01 14:53:37 +00003717 PyModule_AddIntConstant(m, "IPPROTO_IP", IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00003718#else
Fred Drake4baedc12002-04-01 14:53:37 +00003719 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003720#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003721#ifdef IPPROTO_HOPOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00003722 PyModule_AddIntConstant(m, "IPPROTO_HOPOPTS", IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003723#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003724#ifdef IPPROTO_ICMP
Fred Drake4baedc12002-04-01 14:53:37 +00003725 PyModule_AddIntConstant(m, "IPPROTO_ICMP", IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00003726#else
Fred Drake4baedc12002-04-01 14:53:37 +00003727 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003728#endif
3729#ifdef IPPROTO_IGMP
Fred Drake4baedc12002-04-01 14:53:37 +00003730 PyModule_AddIntConstant(m, "IPPROTO_IGMP", IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003731#endif
3732#ifdef IPPROTO_GGP
Fred Drake4baedc12002-04-01 14:53:37 +00003733 PyModule_AddIntConstant(m, "IPPROTO_GGP", IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003734#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003735#ifdef IPPROTO_IPV4
Fred Drake4baedc12002-04-01 14:53:37 +00003736 PyModule_AddIntConstant(m, "IPPROTO_IPV4", IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003737#endif
3738#ifdef IPPROTO_IPIP
Fred Drake4baedc12002-04-01 14:53:37 +00003739 PyModule_AddIntConstant(m, "IPPROTO_IPIP", IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003740#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003741#ifdef IPPROTO_TCP
Fred Drake4baedc12002-04-01 14:53:37 +00003742 PyModule_AddIntConstant(m, "IPPROTO_TCP", IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00003743#else
Fred Drake4baedc12002-04-01 14:53:37 +00003744 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003745#endif
3746#ifdef IPPROTO_EGP
Fred Drake4baedc12002-04-01 14:53:37 +00003747 PyModule_AddIntConstant(m, "IPPROTO_EGP", IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003748#endif
3749#ifdef IPPROTO_PUP
Fred Drake4baedc12002-04-01 14:53:37 +00003750 PyModule_AddIntConstant(m, "IPPROTO_PUP", IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003751#endif
3752#ifdef IPPROTO_UDP
Fred Drake4baedc12002-04-01 14:53:37 +00003753 PyModule_AddIntConstant(m, "IPPROTO_UDP", IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00003754#else
Fred Drake4baedc12002-04-01 14:53:37 +00003755 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003756#endif
3757#ifdef IPPROTO_IDP
Fred Drake4baedc12002-04-01 14:53:37 +00003758 PyModule_AddIntConstant(m, "IPPROTO_IDP", IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003759#endif
3760#ifdef IPPROTO_HELLO
Fred Drake4baedc12002-04-01 14:53:37 +00003761 PyModule_AddIntConstant(m, "IPPROTO_HELLO", IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003762#endif
3763#ifdef IPPROTO_ND
Fred Drake4baedc12002-04-01 14:53:37 +00003764 PyModule_AddIntConstant(m, "IPPROTO_ND", IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003765#endif
3766#ifdef IPPROTO_TP
Fred Drake4baedc12002-04-01 14:53:37 +00003767 PyModule_AddIntConstant(m, "IPPROTO_TP", IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003768#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003769#ifdef IPPROTO_IPV6
Fred Drake4baedc12002-04-01 14:53:37 +00003770 PyModule_AddIntConstant(m, "IPPROTO_IPV6", IPPROTO_IPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003771#endif
3772#ifdef IPPROTO_ROUTING
Fred Drake4baedc12002-04-01 14:53:37 +00003773 PyModule_AddIntConstant(m, "IPPROTO_ROUTING", IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003774#endif
3775#ifdef IPPROTO_FRAGMENT
Fred Drake4baedc12002-04-01 14:53:37 +00003776 PyModule_AddIntConstant(m, "IPPROTO_FRAGMENT", IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003777#endif
3778#ifdef IPPROTO_RSVP
Fred Drake4baedc12002-04-01 14:53:37 +00003779 PyModule_AddIntConstant(m, "IPPROTO_RSVP", IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003780#endif
3781#ifdef IPPROTO_GRE
Fred Drake4baedc12002-04-01 14:53:37 +00003782 PyModule_AddIntConstant(m, "IPPROTO_GRE", IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003783#endif
3784#ifdef IPPROTO_ESP
Fred Drake4baedc12002-04-01 14:53:37 +00003785 PyModule_AddIntConstant(m, "IPPROTO_ESP", IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003786#endif
3787#ifdef IPPROTO_AH
Fred Drake4baedc12002-04-01 14:53:37 +00003788 PyModule_AddIntConstant(m, "IPPROTO_AH", IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003789#endif
3790#ifdef IPPROTO_MOBILE
Fred Drake4baedc12002-04-01 14:53:37 +00003791 PyModule_AddIntConstant(m, "IPPROTO_MOBILE", IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003792#endif
3793#ifdef IPPROTO_ICMPV6
Fred Drake4baedc12002-04-01 14:53:37 +00003794 PyModule_AddIntConstant(m, "IPPROTO_ICMPV6", IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003795#endif
3796#ifdef IPPROTO_NONE
Fred Drake4baedc12002-04-01 14:53:37 +00003797 PyModule_AddIntConstant(m, "IPPROTO_NONE", IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003798#endif
3799#ifdef IPPROTO_DSTOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00003800 PyModule_AddIntConstant(m, "IPPROTO_DSTOPTS", IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003801#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003802#ifdef IPPROTO_XTP
Fred Drake4baedc12002-04-01 14:53:37 +00003803 PyModule_AddIntConstant(m, "IPPROTO_XTP", IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003804#endif
3805#ifdef IPPROTO_EON
Fred Drake4baedc12002-04-01 14:53:37 +00003806 PyModule_AddIntConstant(m, "IPPROTO_EON", IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003807#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003808#ifdef IPPROTO_PIM
Fred Drake4baedc12002-04-01 14:53:37 +00003809 PyModule_AddIntConstant(m, "IPPROTO_PIM", IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003810#endif
3811#ifdef IPPROTO_IPCOMP
Fred Drake4baedc12002-04-01 14:53:37 +00003812 PyModule_AddIntConstant(m, "IPPROTO_IPCOMP", IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003813#endif
3814#ifdef IPPROTO_VRRP
Fred Drake4baedc12002-04-01 14:53:37 +00003815 PyModule_AddIntConstant(m, "IPPROTO_VRRP", IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003816#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003817#ifdef IPPROTO_BIP
Fred Drake4baedc12002-04-01 14:53:37 +00003818 PyModule_AddIntConstant(m, "IPPROTO_BIP", IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003819#endif
3820/**/
3821#ifdef IPPROTO_RAW
Fred Drake4baedc12002-04-01 14:53:37 +00003822 PyModule_AddIntConstant(m, "IPPROTO_RAW", IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00003823#else
Fred Drake4baedc12002-04-01 14:53:37 +00003824 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003825#endif
3826#ifdef IPPROTO_MAX
Fred Drake4baedc12002-04-01 14:53:37 +00003827 PyModule_AddIntConstant(m, "IPPROTO_MAX", IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003828#endif
3829
3830 /* Some port configuration */
3831#ifdef IPPORT_RESERVED
Fred Drake4baedc12002-04-01 14:53:37 +00003832 PyModule_AddIntConstant(m, "IPPORT_RESERVED", IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003833#else
Fred Drake4baedc12002-04-01 14:53:37 +00003834 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003835#endif
3836#ifdef IPPORT_USERRESERVED
Fred Drake4baedc12002-04-01 14:53:37 +00003837 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003838#else
Fred Drake4baedc12002-04-01 14:53:37 +00003839 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003840#endif
3841
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003842 /* Some reserved IP v.4 addresses */
3843#ifdef INADDR_ANY
Fred Drake4baedc12002-04-01 14:53:37 +00003844 PyModule_AddIntConstant(m, "INADDR_ANY", INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003845#else
Fred Drake4baedc12002-04-01 14:53:37 +00003846 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003847#endif
3848#ifdef INADDR_BROADCAST
Fred Drake4baedc12002-04-01 14:53:37 +00003849 PyModule_AddIntConstant(m, "INADDR_BROADCAST", INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003850#else
Fred Drake4baedc12002-04-01 14:53:37 +00003851 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003852#endif
3853#ifdef INADDR_LOOPBACK
Fred Drake4baedc12002-04-01 14:53:37 +00003854 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003855#else
Fred Drake4baedc12002-04-01 14:53:37 +00003856 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003857#endif
3858#ifdef INADDR_UNSPEC_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00003859 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003860#else
Fred Drake4baedc12002-04-01 14:53:37 +00003861 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003862#endif
3863#ifdef INADDR_ALLHOSTS_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00003864 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
3865 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003866#else
Fred Drake4baedc12002-04-01 14:53:37 +00003867 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003868#endif
3869#ifdef INADDR_MAX_LOCAL_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00003870 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP",
3871 INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003872#else
Fred Drake4baedc12002-04-01 14:53:37 +00003873 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003874#endif
3875#ifdef INADDR_NONE
Fred Drake4baedc12002-04-01 14:53:37 +00003876 PyModule_AddIntConstant(m, "INADDR_NONE", INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003877#else
Fred Drake4baedc12002-04-01 14:53:37 +00003878 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003879#endif
3880
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003881 /* IPv4 [gs]etsockopt options */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003882#ifdef IP_OPTIONS
Fred Drake4baedc12002-04-01 14:53:37 +00003883 PyModule_AddIntConstant(m, "IP_OPTIONS", IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003884#endif
3885#ifdef IP_HDRINCL
Fred Drake4baedc12002-04-01 14:53:37 +00003886 PyModule_AddIntConstant(m, "IP_HDRINCL", IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003887#endif
3888#ifdef IP_TOS
Fred Drake4baedc12002-04-01 14:53:37 +00003889 PyModule_AddIntConstant(m, "IP_TOS", IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003890#endif
3891#ifdef IP_TTL
Fred Drake4baedc12002-04-01 14:53:37 +00003892 PyModule_AddIntConstant(m, "IP_TTL", IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003893#endif
3894#ifdef IP_RECVOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00003895 PyModule_AddIntConstant(m, "IP_RECVOPTS", IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003896#endif
3897#ifdef IP_RECVRETOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00003898 PyModule_AddIntConstant(m, "IP_RECVRETOPTS", IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003899#endif
3900#ifdef IP_RECVDSTADDR
Fred Drake4baedc12002-04-01 14:53:37 +00003901 PyModule_AddIntConstant(m, "IP_RECVDSTADDR", IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003902#endif
3903#ifdef IP_RETOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00003904 PyModule_AddIntConstant(m, "IP_RETOPTS", IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003905#endif
3906#ifdef IP_MULTICAST_IF
Fred Drake4baedc12002-04-01 14:53:37 +00003907 PyModule_AddIntConstant(m, "IP_MULTICAST_IF", IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003908#endif
3909#ifdef IP_MULTICAST_TTL
Fred Drake4baedc12002-04-01 14:53:37 +00003910 PyModule_AddIntConstant(m, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003911#endif
3912#ifdef IP_MULTICAST_LOOP
Fred Drake4baedc12002-04-01 14:53:37 +00003913 PyModule_AddIntConstant(m, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003914#endif
3915#ifdef IP_ADD_MEMBERSHIP
Fred Drake4baedc12002-04-01 14:53:37 +00003916 PyModule_AddIntConstant(m, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003917#endif
3918#ifdef IP_DROP_MEMBERSHIP
Fred Drake4baedc12002-04-01 14:53:37 +00003919 PyModule_AddIntConstant(m, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003920#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00003921#ifdef IP_DEFAULT_MULTICAST_TTL
Fred Drake4baedc12002-04-01 14:53:37 +00003922 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_TTL",
3923 IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00003924#endif
3925#ifdef IP_DEFAULT_MULTICAST_LOOP
Fred Drake4baedc12002-04-01 14:53:37 +00003926 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_LOOP",
3927 IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00003928#endif
3929#ifdef IP_MAX_MEMBERSHIPS
Fred Drake4baedc12002-04-01 14:53:37 +00003930 PyModule_AddIntConstant(m, "IP_MAX_MEMBERSHIPS", IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00003931#endif
3932
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003933 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
3934#ifdef IPV6_JOIN_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00003935 PyModule_AddIntConstant(m, "IPV6_JOIN_GROUP", IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003936#endif
3937#ifdef IPV6_LEAVE_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00003938 PyModule_AddIntConstant(m, "IPV6_LEAVE_GROUP", IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003939#endif
3940#ifdef IPV6_MULTICAST_HOPS
Fred Drake4baedc12002-04-01 14:53:37 +00003941 PyModule_AddIntConstant(m, "IPV6_MULTICAST_HOPS", IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003942#endif
3943#ifdef IPV6_MULTICAST_IF
Fred Drake4baedc12002-04-01 14:53:37 +00003944 PyModule_AddIntConstant(m, "IPV6_MULTICAST_IF", IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003945#endif
3946#ifdef IPV6_MULTICAST_LOOP
Fred Drake4baedc12002-04-01 14:53:37 +00003947 PyModule_AddIntConstant(m, "IPV6_MULTICAST_LOOP", IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003948#endif
3949#ifdef IPV6_UNICAST_HOPS
Fred Drake4baedc12002-04-01 14:53:37 +00003950 PyModule_AddIntConstant(m, "IPV6_UNICAST_HOPS", IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003951#endif
3952
Guido van Rossum09be4091999-08-09 14:40:40 +00003953 /* TCP options */
3954#ifdef TCP_NODELAY
Fred Drake4baedc12002-04-01 14:53:37 +00003955 PyModule_AddIntConstant(m, "TCP_NODELAY", TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00003956#endif
3957#ifdef TCP_MAXSEG
Fred Drake4baedc12002-04-01 14:53:37 +00003958 PyModule_AddIntConstant(m, "TCP_MAXSEG", TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00003959#endif
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003960#ifdef TCP_CORK
Fred Drake4baedc12002-04-01 14:53:37 +00003961 PyModule_AddIntConstant(m, "TCP_CORK", TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003962#endif
3963#ifdef TCP_KEEPIDLE
Fred Drake4baedc12002-04-01 14:53:37 +00003964 PyModule_AddIntConstant(m, "TCP_KEEPIDLE", TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003965#endif
3966#ifdef TCP_KEEPINTVL
Fred Drake4baedc12002-04-01 14:53:37 +00003967 PyModule_AddIntConstant(m, "TCP_KEEPINTVL", TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003968#endif
3969#ifdef TCP_KEEPCNT
Fred Drake4baedc12002-04-01 14:53:37 +00003970 PyModule_AddIntConstant(m, "TCP_KEEPCNT", TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003971#endif
3972#ifdef TCP_SYNCNT
Fred Drake4baedc12002-04-01 14:53:37 +00003973 PyModule_AddIntConstant(m, "TCP_SYNCNT", TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003974#endif
3975#ifdef TCP_LINGER2
Fred Drake4baedc12002-04-01 14:53:37 +00003976 PyModule_AddIntConstant(m, "TCP_LINGER2", TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003977#endif
3978#ifdef TCP_DEFER_ACCEPT
Fred Drake4baedc12002-04-01 14:53:37 +00003979 PyModule_AddIntConstant(m, "TCP_DEFER_ACCEPT", TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003980#endif
3981#ifdef TCP_WINDOW_CLAMP
Fred Drake4baedc12002-04-01 14:53:37 +00003982 PyModule_AddIntConstant(m, "TCP_WINDOW_CLAMP", TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003983#endif
3984#ifdef TCP_INFO
Fred Drake4baedc12002-04-01 14:53:37 +00003985 PyModule_AddIntConstant(m, "TCP_INFO", TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003986#endif
3987#ifdef TCP_QUICKACK
Fred Drake4baedc12002-04-01 14:53:37 +00003988 PyModule_AddIntConstant(m, "TCP_QUICKACK", TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003989#endif
3990
Guido van Rossum09be4091999-08-09 14:40:40 +00003991
3992 /* IPX options */
3993#ifdef IPX_TYPE
Fred Drake4baedc12002-04-01 14:53:37 +00003994 PyModule_AddIntConstant(m, "IPX_TYPE", IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00003995#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003996
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003997 /* get{addr,name}info parameters */
3998#ifdef EAI_ADDRFAMILY
Fred Drake4baedc12002-04-01 14:53:37 +00003999 PyModule_AddIntConstant(m, "EAI_ADDRFAMILY", EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004000#endif
4001#ifdef EAI_AGAIN
Fred Drake4baedc12002-04-01 14:53:37 +00004002 PyModule_AddIntConstant(m, "EAI_AGAIN", EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004003#endif
4004#ifdef EAI_BADFLAGS
Fred Drake4baedc12002-04-01 14:53:37 +00004005 PyModule_AddIntConstant(m, "EAI_BADFLAGS", EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004006#endif
4007#ifdef EAI_FAIL
Fred Drake4baedc12002-04-01 14:53:37 +00004008 PyModule_AddIntConstant(m, "EAI_FAIL", EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004009#endif
4010#ifdef EAI_FAMILY
Fred Drake4baedc12002-04-01 14:53:37 +00004011 PyModule_AddIntConstant(m, "EAI_FAMILY", EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004012#endif
4013#ifdef EAI_MEMORY
Fred Drake4baedc12002-04-01 14:53:37 +00004014 PyModule_AddIntConstant(m, "EAI_MEMORY", EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004015#endif
4016#ifdef EAI_NODATA
Fred Drake4baedc12002-04-01 14:53:37 +00004017 PyModule_AddIntConstant(m, "EAI_NODATA", EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004018#endif
4019#ifdef EAI_NONAME
Fred Drake4baedc12002-04-01 14:53:37 +00004020 PyModule_AddIntConstant(m, "EAI_NONAME", EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004021#endif
4022#ifdef EAI_SERVICE
Fred Drake4baedc12002-04-01 14:53:37 +00004023 PyModule_AddIntConstant(m, "EAI_SERVICE", EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004024#endif
4025#ifdef EAI_SOCKTYPE
Fred Drake4baedc12002-04-01 14:53:37 +00004026 PyModule_AddIntConstant(m, "EAI_SOCKTYPE", EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004027#endif
4028#ifdef EAI_SYSTEM
Fred Drake4baedc12002-04-01 14:53:37 +00004029 PyModule_AddIntConstant(m, "EAI_SYSTEM", EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004030#endif
4031#ifdef EAI_BADHINTS
Fred Drake4baedc12002-04-01 14:53:37 +00004032 PyModule_AddIntConstant(m, "EAI_BADHINTS", EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004033#endif
4034#ifdef EAI_PROTOCOL
Fred Drake4baedc12002-04-01 14:53:37 +00004035 PyModule_AddIntConstant(m, "EAI_PROTOCOL", EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004036#endif
4037#ifdef EAI_MAX
Fred Drake4baedc12002-04-01 14:53:37 +00004038 PyModule_AddIntConstant(m, "EAI_MAX", EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004039#endif
4040#ifdef AI_PASSIVE
Fred Drake4baedc12002-04-01 14:53:37 +00004041 PyModule_AddIntConstant(m, "AI_PASSIVE", AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004042#endif
4043#ifdef AI_CANONNAME
Fred Drake4baedc12002-04-01 14:53:37 +00004044 PyModule_AddIntConstant(m, "AI_CANONNAME", AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004045#endif
4046#ifdef AI_NUMERICHOST
Fred Drake4baedc12002-04-01 14:53:37 +00004047 PyModule_AddIntConstant(m, "AI_NUMERICHOST", AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004048#endif
4049#ifdef AI_MASK
Fred Drake4baedc12002-04-01 14:53:37 +00004050 PyModule_AddIntConstant(m, "AI_MASK", AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004051#endif
4052#ifdef AI_ALL
Fred Drake4baedc12002-04-01 14:53:37 +00004053 PyModule_AddIntConstant(m, "AI_ALL", AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004054#endif
4055#ifdef AI_V4MAPPED_CFG
Fred Drake4baedc12002-04-01 14:53:37 +00004056 PyModule_AddIntConstant(m, "AI_V4MAPPED_CFG", AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004057#endif
4058#ifdef AI_ADDRCONFIG
Fred Drake4baedc12002-04-01 14:53:37 +00004059 PyModule_AddIntConstant(m, "AI_ADDRCONFIG", AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004060#endif
4061#ifdef AI_V4MAPPED
Fred Drake4baedc12002-04-01 14:53:37 +00004062 PyModule_AddIntConstant(m, "AI_V4MAPPED", AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004063#endif
4064#ifdef AI_DEFAULT
Fred Drake4baedc12002-04-01 14:53:37 +00004065 PyModule_AddIntConstant(m, "AI_DEFAULT", AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004066#endif
4067#ifdef NI_MAXHOST
Fred Drake4baedc12002-04-01 14:53:37 +00004068 PyModule_AddIntConstant(m, "NI_MAXHOST", NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004069#endif
4070#ifdef NI_MAXSERV
Fred Drake4baedc12002-04-01 14:53:37 +00004071 PyModule_AddIntConstant(m, "NI_MAXSERV", NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004072#endif
4073#ifdef NI_NOFQDN
Fred Drake4baedc12002-04-01 14:53:37 +00004074 PyModule_AddIntConstant(m, "NI_NOFQDN", NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004075#endif
4076#ifdef NI_NUMERICHOST
Fred Drake4baedc12002-04-01 14:53:37 +00004077 PyModule_AddIntConstant(m, "NI_NUMERICHOST", NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004078#endif
4079#ifdef NI_NAMEREQD
Fred Drake4baedc12002-04-01 14:53:37 +00004080 PyModule_AddIntConstant(m, "NI_NAMEREQD", NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004081#endif
4082#ifdef NI_NUMERICSERV
Fred Drake4baedc12002-04-01 14:53:37 +00004083 PyModule_AddIntConstant(m, "NI_NUMERICSERV", NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004084#endif
4085#ifdef NI_DGRAM
Fred Drake4baedc12002-04-01 14:53:37 +00004086 PyModule_AddIntConstant(m, "NI_DGRAM", NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004087#endif
4088
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004089 /* Initialize gethostbyname lock */
Just van Rossum1040d2c2003-05-09 07:53:18 +00004090#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
4091 netdb_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004092#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004093}
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004094
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004095
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004096#ifndef HAVE_INET_PTON
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004097
4098/* Simplistic emulation code for inet_pton that only works for IPv4 */
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004099/* These are not exposed because they do not set errno properly */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004100
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004101int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004102inet_pton(int af, const char *src, void *dst)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004103{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004104 if (af == AF_INET) {
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004105 long packed_addr;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004106 packed_addr = inet_addr(src);
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004107 if (packed_addr == INADDR_NONE)
4108 return 0;
4109 memcpy(dst, &packed_addr, 4);
4110 return 1;
4111 }
4112 /* Should set errno to EAFNOSUPPORT */
4113 return -1;
4114}
4115
Martin v. Löwisc925b1532001-07-21 09:42:15 +00004116const char *
4117inet_ntop(int af, const void *src, char *dst, socklen_t size)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004118{
4119 if (af == AF_INET) {
4120 struct in_addr packed_addr;
4121 if (size < 16)
4122 /* Should set errno to ENOSPC. */
4123 return NULL;
4124 memcpy(&packed_addr, src, sizeof(packed_addr));
4125 return strncpy(dst, inet_ntoa(packed_addr), size);
4126 }
4127 /* Should set errno to EAFNOSUPPORT */
4128 return NULL;
4129}
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004130
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004131#endif